diff --git a/packages/cli/jest.ts.config.js b/packages/cli/jest.ts.config.js new file mode 100644 index 0000000000..dd996c05c9 --- /dev/null +++ b/packages/cli/jest.ts.config.js @@ -0,0 +1,22 @@ +module.exports = { + collectCoverage: true, + preset: "ts-jest", + testEnvironment: "node", + globals: { + "ts-jest": { + diagnostics: false + }, + }, + modulePathIgnorePatterns: [ + "/build", + "/src/__tests__/project/.polywrap" + ], + testPathIgnorePatterns: [ + "/src/__tests__/project/.polywrap" + ], + transformIgnorePatterns: [ + "/src/__tests__/project/.polywrap" + ], + setupFilesAfterEnv: ["./jest.setup.js"], + testMatch: ["**/build-ts.spec.ts"] +}; diff --git a/packages/cli/package.json b/packages/cli/package.json index 633602ed58..cfda3f8f23 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -33,6 +33,7 @@ "test:e2e:p2": "yarn test:cmd -- ./src/__tests__/e2e/p2/*.spec.ts", "test:rust": "yarn test:cmd -- --config ./jest.rs.config.js", "test:golang": "yarn test:cmd -- --config ./jest.go.config.js", + "test:typescript": "yarn test:cmd -- --config ./jest.ts.config.js", "test:watch": "yarn test -- --watch", "test:pkg": "PKG_CLI=true yarn test:e2e:p1 && yarn test:e2e:p2", "pkg:prod": "pkg . --compress Brotli", diff --git a/packages/cli/src/__tests__/e2e/build-ts.spec.ts b/packages/cli/src/__tests__/e2e/build-ts.spec.ts new file mode 100644 index 0000000000..0a0fdbd996 --- /dev/null +++ b/packages/cli/src/__tests__/e2e/build-ts.spec.ts @@ -0,0 +1,72 @@ +import { polywrapCli } from "./utils"; +import { Commands } from "@polywrap/cli-js"; +import { GetPathToCliTestFiles } from "@polywrap/test-cases"; +import fs from "fs"; +import path from "path"; + +jest.setTimeout(1500000); + +describe("e2e tests for build command", () => { + const testCaseRoot = path.join(GetPathToCliTestFiles(), "build-cmd/wasm/typescript"); + const testCases = fs + .readdirSync(testCaseRoot, { withFileTypes: true }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + + const getTestCaseDir = (index: number) => + path.join(testCaseRoot, testCases[index]); + + describe("Image strategy", () => { + it("Builds for typescript", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "image", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) + + // NOTE: Skipped because CI needs system prequisites: pwr CLI + describe.skip("Local strategy", () => { + it("Builds for typescript", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "local", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) + + describe("VM strategy", () => { + it("Builds for typescript", async () => { + const { exitCode: code, stdout: output } = await Commands.build({ + strategy: "vm", + verbose: true + }, { + cwd: getTestCaseDir(0), + cli: polywrapCli, + }); + + const buildDir = `./build`; + + expect(code).toEqual(0); + expect(output).toContain(`Artifacts written to ${buildDir}`); + expect(output).toContain(`WRAP manifest written in ${buildDir}/wrap.info`); + }); + }) +}); diff --git a/packages/cli/src/__tests__/e2e/p1/create.spec.ts b/packages/cli/src/__tests__/e2e/p1/create.spec.ts index 5a1dca6da7..890ec62fb6 100644 --- a/packages/cli/src/__tests__/e2e/p1/create.spec.ts +++ b/packages/cli/src/__tests__/e2e/p1/create.spec.ts @@ -17,7 +17,8 @@ Options: Commands: wasm [options] Create a Polywrap wasm wrapper. langs: - assemblyscript, rust, golang, interface + assemblyscript, rust, golang, typescript, + interface app [options] Create a Polywrap application. langs: typescript, python, rust, android, ios plugin [options] Create a Polywrap plugin. langs: diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index 439b20fc67..75e522e1df 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -27,7 +27,13 @@ const pathStr = intlMsg.commands_create_options_o_path(); const urlStr = intlMsg.commands_create_options_t_url(); export const supportedLangs = { - wasm: ["assemblyscript", "rust", "golang", "interface"] as const, + wasm: [ + "assemblyscript", + "rust", + "golang", + "typescript", + "interface", + ] as const, app: ["typescript", "python", "rust", "android", "ios"] as const, plugin: ["typescript", "rust", "python"] as const, }; diff --git a/packages/cli/src/lib/build-strategies/BuildOverrides.ts b/packages/cli/src/lib/build-strategies/BuildOverrides.ts index 8ba5de7c82..a5e59c1d4f 100644 --- a/packages/cli/src/lib/build-strategies/BuildOverrides.ts +++ b/packages/cli/src/lib/build-strategies/BuildOverrides.ts @@ -1,4 +1,4 @@ -import { PolywrapManifestLanguage } from "../"; +import { PolywrapBuildLanguage } from "../"; import { PolywrapManifest } from "@polywrap/polywrap-manifest-types-js"; import path from "path"; @@ -11,7 +11,7 @@ export interface BuildOverrides { } export async function tryGetBuildOverrides( - language: PolywrapManifestLanguage + language: PolywrapBuildLanguage ): Promise { const modulePath = path.join( __dirname, diff --git a/packages/cli/src/lib/build-strategies/BuildStrategy.ts b/packages/cli/src/lib/build-strategies/BuildStrategy.ts index 3792cddc5c..332cf4d22f 100644 --- a/packages/cli/src/lib/build-strategies/BuildStrategy.ts +++ b/packages/cli/src/lib/build-strategies/BuildStrategy.ts @@ -24,7 +24,7 @@ export abstract class BuildStrategy { abstract getStrategyName(): string; async build(): Promise { - const language = await this.project.getManifestLanguage(); + const language = await this.project.getBuildLanguage(); const buildStrategyDir = path.join( __dirname, "..", diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts index d200659b5a..815c13714f 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerImageStrategy.ts @@ -53,7 +53,7 @@ export class DockerImageBuildStrategy extends BuildStrategy { buildManifest?.strategies?.image?.name || generateDockerImageName(await this.project.getBuildUuid()); - const language = await this.project.getManifestLanguage(); + const language = await this.project.getBuildLanguage(); const dockerfileTemplatePath = path.join( __dirname, diff --git a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts index 178d50ec23..01d5dd0caf 100644 --- a/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/DockerVMStrategy.ts @@ -8,7 +8,7 @@ import { BuildStrategyConfig, BuildStrategy } from "../BuildStrategy"; import { intlMsg } from "../../intl"; import { BuildManifestConfig, - PolywrapManifestLanguage, + BuildableLanguage, PolywrapProject, } from "../../project"; import { logActivity } from "../../logging"; @@ -17,7 +17,6 @@ import fse from "fs-extra"; import path from "path"; import Mustache from "mustache"; -type BuildableLanguage = Exclude; const DEFAULTS_DIR = path.join( __dirname, "..", @@ -48,6 +47,11 @@ const CONFIGS: Record = { baseImage: "polywrap/vm-base-go", version: "0.1.6", }, + "wasm/javascript": { + defaultIncludes: [], + baseImage: "polywrap/vm-base-js", + version: "0.1.6", + }, }; export class DockerVMBuildStrategy extends BuildStrategy { @@ -98,7 +102,7 @@ export class DockerVMBuildStrategy extends BuildStrategy { ); }); - const language = (await this.project.getManifestLanguage()) as BuildableLanguage; + const language = (await this.project.getBuildLanguage()) as BuildableLanguage; if (buildManifestConfig.polywrap_linked_packages) { if (fse.existsSync(this._volumePaths.linkedPackages)) { @@ -138,14 +142,28 @@ export class DockerVMBuildStrategy extends BuildStrategy { // Copy sources and build if (buildManifestConfig.polywrap_module) { - const sourcesSubDirectory = - this.overrides?.sourcesSubDirectory || - buildManifestConfig.polywrap_module.dir; + // TODO: find more general solution: sources array or glob + // JS needs to copy a single file; others may need several or dirs + if (language === "wasm/javascript") { + const moduleFilePath = + buildManifestConfig.polywrap_module.moduleFilePath; + const outputPath = path.join( + this._volumePaths.project, + moduleFilePath + ); + const outputDir = path.dirname(outputPath); + fse.mkdirSync(outputDir, { recursive: true }); + fse.copyFileSync(moduleFilePath, outputPath); + } else { + const sourcesSubDirectory = + this.overrides?.sourcesSubDirectory || + buildManifestConfig.polywrap_module.dir; - fse.copySync( - path.join(manifestDir, sourcesSubDirectory), - path.join(this._volumePaths.project, sourcesSubDirectory) - ); + fse.copySync( + path.join(manifestDir, sourcesSubDirectory), + path.join(this._volumePaths.project, sourcesSubDirectory) + ); + } const scriptTemplate = fse.readFileSync( path.join( diff --git a/packages/cli/src/lib/build-strategies/strategies/LocalStrategy.ts b/packages/cli/src/lib/build-strategies/strategies/LocalStrategy.ts index 7813527a98..44f7096c2a 100644 --- a/packages/cli/src/lib/build-strategies/strategies/LocalStrategy.ts +++ b/packages/cli/src/lib/build-strategies/strategies/LocalStrategy.ts @@ -11,12 +11,15 @@ export class LocalBuildStrategy extends BuildStrategy { public async buildSources(): Promise { const run = async () => { - const bindLanguage = await this.project.getManifestLanguage(); + const bindLanguage = await this.project.getBuildLanguage(); + const buildManifest = await this.project.getBuildManifest(); const buildManifestConfig = buildManifest.config as BuildManifestConfig; if (buildManifestConfig.polywrap_module) { const polywrapModuleDir = buildManifestConfig.polywrap_module.dir; + const polywrapModuleFilePath = + buildManifestConfig.polywrap_module.moduleFilePath; let scriptPath = `${__dirname}/../../defaults/build-strategies/${bindLanguage}/${this.getStrategyName()}/local.sh`; if (bindLanguage.startsWith("wasm")) { @@ -39,7 +42,13 @@ export class LocalBuildStrategy extends BuildStrategy { ).then(() => runCommand( scriptPath, - [polywrapModuleDir, this.outputDir], + [ + polywrapModuleDir, + this.outputDir, + // TODO: this is an arg for JS wraps only. This should be + // removed in favor of a more general sources passing solution + polywrapModuleFilePath, + ], logger, undefined, process.cwd() diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/default.build.yaml b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/default.build.yaml new file mode 100644 index 0000000000..4640c17575 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/default.build.yaml @@ -0,0 +1 @@ +format: 0.3.0 diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/image/Dockerfile.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/image/Dockerfile.mustache new file mode 100644 index 0000000000..72ad587529 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/image/Dockerfile.mustache @@ -0,0 +1,14 @@ +FROM ubuntu:latest +# Install curl and git +RUN apt-get update && apt-get install -y curl git + +# Download and install pwrup +RUN curl -L https://raw.githubusercontent.com/polywrap/pwr/main/pwrup/install | bash +# Source bash and use pwrup to install pwr +RUN /bin/bash -i -c "source ~/.bashrc; pwrup" + +WORKDIR /project +# Copy the script file to build +COPY {{#polywrap_module}}{{moduleFilePath}}{{/polywrap_module}} ./wrap.js +# Use pwr to build the script +RUN /bin/bash -i -c "pwr js build -f ./wrap.js -o build" \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/local/local.sh b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/local/local.sh new file mode 100644 index 0000000000..9a927fda37 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/local/local.sh @@ -0,0 +1,8 @@ +# Assumes user has curl and git installed +# Install pwrup +curl -L https://raw.githubusercontent.com/polywrap/pwr/main/pwrup/install | bash + +# Use pwrup to install pwr +$HOME/.pwr/bin/pwrup +# Use pwr to build the script +$HOME/.pwr/bin/pwr js build -f $3 -o build \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/manifest.ext.json b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/manifest.ext.json new file mode 100644 index 0000000000..4abcdfd7b0 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/manifest.ext.json @@ -0,0 +1,14 @@ +{ + "properties": { + "config": { + "type": "object", + "required": ["scriptFile"], + "properties": { + "scriptFile": { + "description": "Path to the JS file to build the wrap from", + "type": "string" + } + } + } + } +} \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/Dockerfile b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/Dockerfile new file mode 100644 index 0000000000..009aded1b4 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/Dockerfile @@ -0,0 +1,8 @@ +FROM ubuntu:latest +# Install curl and git +RUN apt-get update && apt-get install -y curl git + +# Download and install pwrup and then use it to install pwr +RUN curl -L https://raw.githubusercontent.com/polywrap/pwr/main/pwrup/install | bash && /root/.pwr/bin/pwrup + +WORKDIR /project diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/NAME b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/NAME new file mode 100644 index 0000000000..5cf9c2db68 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/NAME @@ -0,0 +1 @@ +polywrap/vm-base-js \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/VERSION b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/VERSION new file mode 100644 index 0000000000..8a9ecc2ea9 --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/VERSION @@ -0,0 +1 @@ +0.0.1 \ No newline at end of file diff --git a/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/vm-script.mustache b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/vm-script.mustache new file mode 100644 index 0000000000..44c73a9f7d --- /dev/null +++ b/packages/cli/src/lib/defaults/build-strategies/wasm/javascript/vm/vm-script.mustache @@ -0,0 +1,4 @@ +set -e + +{{! Use pwr to build the script }} +/root/.pwr/bin/pwr js build -f {{#polywrap_module}}{{moduleFilePath}}{{/polywrap_module}} -o build \ No newline at end of file diff --git a/packages/cli/src/lib/project/PolywrapProject.ts b/packages/cli/src/lib/project/PolywrapProject.ts index a15688aa8e..299cc69205 100644 --- a/packages/cli/src/lib/project/PolywrapProject.ts +++ b/packages/cli/src/lib/project/PolywrapProject.ts @@ -6,6 +6,7 @@ import { isPolywrapManifestLanguage, loadBuildManifest, loadPolywrapManifest, + PolywrapBuildLanguage, PolywrapManifestLanguage, polywrapManifestLanguages, polywrapManifestLanguageToBindLanguage, @@ -43,6 +44,7 @@ export interface BuildManifestConfig { polywrap_module?: { name: string; dir: string; + moduleFilePath: string; }; // eslint-disable-next-line @typescript-eslint/naming-convention polywrap_linked_packages?: { @@ -128,6 +130,18 @@ export class PolywrapProject extends Project { return language as PolywrapManifestLanguage; } + public async getBuildLanguage(): Promise { + const manifestLanguage = await this.getManifestLanguage(); + + if (manifestLanguage === "interface") { + throw new Error(`Cannot build an interface project.`); + } + + return manifestLanguage === "wasm/typescript" + ? "wasm/javascript" + : manifestLanguage; + } + /// Schema public async getSchemaNamedPath(): Promise { @@ -206,7 +220,7 @@ export class PolywrapProject extends Project { public async getBuildManifest(): Promise { if (!this._buildManifest) { const buildManifestPath = await this.getBuildManifestPath(); - const language = await this.getManifestLanguage(); + const language = await this.getBuildLanguage(); this._buildManifest = await loadBuildManifest( language, @@ -242,10 +256,12 @@ export class PolywrapProject extends Project { }) ), }; + if (module) { defaultConfig["polywrap_module"] = { name: "module", - dir: normalizePath(module), + dir: normalizePath(module.dir), + moduleFilePath: module.moduleFilePath, }; } @@ -345,11 +361,16 @@ export class PolywrapProject extends Project { /// Private Helpers - private async _getModule(): Promise { + private async _getModule(): Promise< + { moduleFilePath: string; dir: string } | undefined + > { const manifest = await this.getManifest(); if (manifest.source.module) { - return path.dirname(manifest.source.module).replace("./", ""); + return { + moduleFilePath: manifest.source.module, + dir: path.dirname(manifest.source.module).replace("./", ""), + }; } return undefined; diff --git a/packages/cli/src/lib/project/manifests/language.ts b/packages/cli/src/lib/project/manifests/language.ts index 6214ade0c7..52a3149c1c 100644 --- a/packages/cli/src/lib/project/manifests/language.ts +++ b/packages/cli/src/lib/project/manifests/language.ts @@ -8,3 +8,7 @@ export type AnyProjectManifestLanguage = | PolywrapManifestLanguage | PluginManifestLanguage | AppManifestLanguage; + +export type BuildableLanguage = + | Exclude + | "wasm/javascript"; diff --git a/packages/cli/src/lib/project/manifests/polywrap/languages.ts b/packages/cli/src/lib/project/manifests/polywrap/languages.ts index 055aa479cc..883ba1232b 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/languages.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/languages.ts @@ -6,13 +6,25 @@ export const polywrapManifestLanguages = { "wasm/assemblyscript": "wasm/assemblyscript", "wasm/rust": "wasm/rust", "wasm/golang": "wasm/golang", + "wasm/typescript": "wasm/typescript", interface: "interface", }; +export const polywrapBuildLanguages = { + "wasm/assemblyscript": "wasm/assemblyscript", + "wasm/rust": "wasm/rust", + "wasm/golang": "wasm/golang", + "wasm/javascript": "wasm/javascript", +}; + export type PolywrapManifestLanguages = typeof polywrapManifestLanguages; export type PolywrapManifestLanguage = keyof PolywrapManifestLanguages; +export type PolywrapBuildLanguages = typeof polywrapBuildLanguages; + +export type PolywrapBuildLanguage = keyof PolywrapBuildLanguages; + export function isPolywrapManifestLanguage( language: string ): language is PolywrapManifestLanguage { @@ -29,6 +41,8 @@ export function polywrapManifestLanguageToBindLanguage( return "wrap-rs"; case "wasm/golang": return "wrap-go"; + case "wasm/typescript": + return "wrap-ts"; case "interface": throw Error(intlMsg.lib_language_noInterfaceCodegen()); default: @@ -51,6 +65,8 @@ export function polywrapManifestOverrideCodegenDir( // the codegen directory to be `./src/wrap` case "wasm/rust": return "./src/wrap"; + case "wasm/typescript": + return "./src/wrap"; case "wasm/golang": return "./module/wrap"; default: diff --git a/packages/cli/src/lib/project/manifests/polywrap/load.ts b/packages/cli/src/lib/project/manifests/polywrap/load.ts index eaf18b2db2..c5f226e0c2 100644 --- a/packages/cli/src/lib/project/manifests/polywrap/load.ts +++ b/packages/cli/src/lib/project/manifests/polywrap/load.ts @@ -2,9 +2,9 @@ import { displayPath, intlMsg, loadEnvironmentVariables, - PolywrapManifestLanguage, Logger, logActivity, + PolywrapBuildLanguage, } from "../../../"; import { @@ -67,7 +67,7 @@ export const defaultBuildManifestFiles = [ ]; export async function loadBuildManifest( - language: PolywrapManifestLanguage, + language: PolywrapBuildLanguage, manifestPath: string, logger: Logger ): Promise { diff --git a/packages/schema/bind/src/bindings/index.ts b/packages/schema/bind/src/bindings/index.ts index a330b9aa23..0905ea210b 100644 --- a/packages/schema/bind/src/bindings/index.ts +++ b/packages/schema/bind/src/bindings/index.ts @@ -21,6 +21,10 @@ export function getGenerateBindingFn( ); case "wrap-go": return Golang.Wasm.generateBinding; + case "wrap-ts": + return WrapBindgen.getGenerateBindingFn( + "wrapscan.io/polywrap/wrap-typescript-abi-bindgen@1" + ); case "plugin-ts": return WrapBindgen.getGenerateBindingFn( "wrapscan.io/polywrap/plugin-typescript-abi-bindgen@1" diff --git a/packages/schema/bind/src/types.ts b/packages/schema/bind/src/types.ts index 87ebc41815..339d2b9960 100644 --- a/packages/schema/bind/src/types.ts +++ b/packages/schema/bind/src/types.ts @@ -5,6 +5,7 @@ export const bindLanguage = { "wrap-as": "wrap-as", "wrap-rs": "wrap-rs", "wrap-go": "wrap-go", + "wrap-ts": "wrap-ts", "plugin-ts": "plugin-ts", "plugin-rs": "plugin-rs", "plugin-py": "plugin-py", diff --git a/packages/templates/polywrap.wasm-typescript-linked.yaml b/packages/templates/polywrap.wasm-typescript-linked.yaml new file mode 100644 index 0000000000..ed4ab92a64 --- /dev/null +++ b/packages/templates/polywrap.wasm-typescript-linked.yaml @@ -0,0 +1,7 @@ +format: 0.5.0 +project: + name: ts-wrap-template + type: wasm/typescript +source: + schema: ./polywrap.graphql + module: ./src/index.ts diff --git a/packages/templates/tests.spec.ts b/packages/templates/tests.spec.ts index b7b6b381b1..15621d6978 100644 --- a/packages/templates/tests.spec.ts +++ b/packages/templates/tests.spec.ts @@ -34,6 +34,11 @@ describe("Templates", () => { build: "yarn build", test: "yarn test", }, + "wasm/typescript": { + codegen: "yarn codegen", + build: "yarn build", + test: "yarn test", + }, "plugin/rust": { codegen: "npx polywrap codegen", build: "cargo build", @@ -103,7 +108,11 @@ describe("Templates", () => { beforeAll(() => { // Copy test configs - if (projectType === "wasm" && language !== "interface" && language !== "golang") { + if ( + projectType === "wasm" && + language !== "interface" && + language !== "golang" + ) { execSync( `cp ${rootDir}/polywrap.${projectType}-${language}-linked* ${rootDir}/${projectType}/${language}/` ); diff --git a/packages/templates/wasm/typescript/.gitignore b/packages/templates/wasm/typescript/.gitignore new file mode 100644 index 0000000000..94ea4a0d5b --- /dev/null +++ b/packages/templates/wasm/typescript/.gitignore @@ -0,0 +1,12 @@ +node_modules +build +yarn-error.log +coverage +.vscode +*.log +.polywrap +.DS_Store +src/wrap +report.* +.env +bundled \ No newline at end of file diff --git a/packages/templates/wasm/typescript/README.md b/packages/templates/wasm/typescript/README.md new file mode 100644 index 0000000000..5936379ebf --- /dev/null +++ b/packages/templates/wasm/typescript/README.md @@ -0,0 +1 @@ +# TS Wrap Template diff --git a/packages/templates/wasm/typescript/jest.config.js b/packages/templates/wasm/typescript/jest.config.js new file mode 100644 index 0000000000..4a4c022f7b --- /dev/null +++ b/packages/templates/wasm/typescript/jest.config.js @@ -0,0 +1,15 @@ +module.exports = { + collectCoverage: false, + preset: "ts-jest", + testEnvironment: "node", + testMatch: ["**/__tests__/**/?(*.)+(spec|test).[jt]s?(x)"], + globals: { + "ts-jest": { + tsconfig: "tsconfig.json", + diagnostics: false, + }, + }, + testPathIgnorePatterns: [ + "/.polywrap/" + ], +}; diff --git a/packages/templates/wasm/typescript/package.json b/packages/templates/wasm/typescript/package.json new file mode 100644 index 0000000000..9775505f8a --- /dev/null +++ b/packages/templates/wasm/typescript/package.json @@ -0,0 +1,28 @@ +{ + "name": "template-wasm-ts", + "description": "", + "private": true, + "version": "0.11.2", + "main": "build/index.js", + "scripts": { + "bundle": "rollup -c", + "codegen": "polywrap codegen --verbose", + "build": "yarn bundle && npx polywrap build --no-codegen", + "test": "jest --passWithNoTests --runInBand --verbose", + "deploy": "polywrap deploy" + }, + "dependencies": { + "tslib": "^2.6.2" + }, + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.4", + "@rollup/plugin-node-resolve": "^15.2.0", + "@rollup/plugin-terser": "^0.4.3", + "@rollup/plugin-typescript": "^11.1.2", + "@types/jest": "26.0.8", + "jest": "26.6.3", + "polywrap": "~0.11.3", + "rollup": "^3.28.0", + "typescript": "^5.1.6" + } +} diff --git a/packages/templates/wasm/typescript/polywrap.build.yaml b/packages/templates/wasm/typescript/polywrap.build.yaml new file mode 100644 index 0000000000..4bdc6dc166 --- /dev/null +++ b/packages/templates/wasm/typescript/polywrap.build.yaml @@ -0,0 +1,3 @@ +format: 0.3.0 +config: + scriptFile: ./bundled/wrap.js \ No newline at end of file diff --git a/packages/templates/wasm/typescript/polywrap.graphql b/packages/templates/wasm/typescript/polywrap.graphql new file mode 100644 index 0000000000..a527c058c2 --- /dev/null +++ b/packages/templates/wasm/typescript/polywrap.graphql @@ -0,0 +1,3 @@ +type Module { + foo(bar: String!): String! +} diff --git a/packages/templates/wasm/typescript/polywrap.yaml b/packages/templates/wasm/typescript/polywrap.yaml new file mode 100644 index 0000000000..8df1debb95 --- /dev/null +++ b/packages/templates/wasm/typescript/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.5.0 +project: + name: ts-wrap-template + type: wasm/typescript +source: + schema: ./polywrap.graphql + module: ./bundled/wrap.js diff --git a/packages/templates/wasm/typescript/rollup.config.mjs b/packages/templates/wasm/typescript/rollup.config.mjs new file mode 100644 index 0000000000..f89156e9a8 --- /dev/null +++ b/packages/templates/wasm/typescript/rollup.config.mjs @@ -0,0 +1,21 @@ +import typescript from "@rollup/plugin-typescript"; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from "@rollup/plugin-commonjs"; +import terser from "@rollup/plugin-terser"; +import shims from "./shims.js"; + +export default { + input: "src/wrap/entry.ts", + output: { + file: "bundled/wrap.js", + format: "cjs", + }, + plugins: [ + typescript(), + resolve(), + commonjs(), + shims(), + terser() + ], + treeshake: false, +}; diff --git a/packages/templates/wasm/typescript/shims.js b/packages/templates/wasm/typescript/shims.js new file mode 100644 index 0000000000..0e8d008b65 --- /dev/null +++ b/packages/templates/wasm/typescript/shims.js @@ -0,0 +1,253 @@ +const packagesShim = +` +// HACK: This is a hack because undefined, null, and functions are not supported by the JS Engine +function clean(obj, root = true) { + if (obj === undefined) { + return root ? "undefined" : undefined; + } else if (obj === null) { + return root ? "null" : undefined; + } else if (Array.isArray(obj)) { + return obj.map(x => clean(x, false)).filter(x => x !== undefined); + } else if (obj instanceof Error) { + return { message: obj.message }; + } else if (typeof obj === 'function') { + return root ? "function" : undefined; + } else if (typeof obj !== 'object') { + return obj; + } + + for (let key in obj) { + let value = clean(obj[key], false); + if (value === undefined) { + delete obj[key]; + } else { + obj[key] = value; + } + } + return obj; +} + +const console = { + log: function(...args) { + __wrap_subinvoke("plugin/console", "log", { args: clean(args) }); + }, + error: function(...args) { + __wrap_subinvoke("plugin/console", "error", { args: clean(args) }); + }, +}; + +function require(lib) { + function wrap(objName, obj) { + const origin = {}; + return new Proxy(origin, { + get(_, name) { + if (obj[name]) { + return obj[name]; + } else { + throw new Error(\`No method \${name} in \${objName}\`); + } + }, + }); + } + + const fs = { + readFileSync: (path) => { + return __wrap_subinvoke("plugin/fs", "readFileSync", clean({ path })).value; + }, + readFile: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "readFileSync", clean({ path: args[0] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + writeFileSync: (path, data) => { + return __wrap_subinvoke("plugin/fs", "writeFileSync", clean({ path, data })).value; + }, + writeFile: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "writeFileSync", clean({ path: args[0], data: args[1] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + appendFileSync: (path, data) => { + return __wrap_subinvoke("plugin/fs", "appendFileSync", clean({ path, data })).value; + }, + appendFile: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "appendFileSync", clean({ path: args[0], data: args[1] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + existsSync: (path) => { + return __wrap_subinvoke("plugin/fs", "existsSync", clean({ path })).value; + }, + exists: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "existsSync", clean({ path: args[0] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + renameSync: (oldPath, newPath) => { + return __wrap_subinvoke("plugin/fs", "renameSync", clean({ oldPath, newPath })).value; + }, + rename: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "renameSync", clean({ oldPath: args[0], newPath: args[1] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + mkdirSync: (path) => { + return __wrap_subinvoke("plugin/fs", "mkdirSync", clean({ path })).value; + }, + mkdir: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "mkdirSync", clean({ path: args[0] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + readdirSync: (path) => { + return __wrap_subinvoke("plugin/fs", "readdirSync", clean({ path })).value; + }, + readdir: (...args) => { + const callback = args[args.length - 1]; + const result = __wrap_subinvoke("plugin/fs", "readdirSync", clean({ path: args[0] })); + callback && callback(result.error ? new Error(result.error) : undefined, result.value); + }, + }; + + const fsPromises = { + readFile: (path) => { + return Promise.resolve(fs.readFileSync(path)); + }, + writeFile: (path, data) => { + return Promise.resolve(fs.writeFileSync(path, data)); + }, + appendFile: (path, data) => { + return Promise.resolve(fs.appendFileSync(path, data)); + }, + exists: (path) => { + return Promise.resolve(fs.existsSync(path)); + }, + rename: (oldPath, newPath) => { + return Promise.resolve(fs.renameSync(oldPath, newPath)); + }, + mkdir: (path) => { + return Promise.resolve(fs.mkdirSync(path)); + }, + readdir: (path) => { + return Promise.resolve(fs.readdirSync(path)); + } + }; + + const axios = { + get: (url, config) => { + return Promise.resolve(__wrap_subinvoke("plugin/axios", "get", clean({ url, config })).value); + }, + post: (url, data, config) => { + return Promise.resolve(__wrap_subinvoke("plugin/axios", "post", clean({ url, data, config })).value); + }, + put: (url, data, config) => { + return Promise.resolve(__wrap_subinvoke("plugin/axios", "put", clean({ url, data, config })).value); + }, + delete: (url, config) => { + return Promise.resolve(__wrap_subinvoke("plugin/axios", "delete", clean({ url, config })).value); + }, + head: (url, config) => { + return Promise.resolve(__wrap_subinvoke("plugin/axios", "head", clean({ url, config })).value); + }, + }; + + const util = (function() { + const exports = {}; + + var getOwnPropertyDescriptors = + function getOwnPropertyDescriptors(obj) { + var keys = Object.keys(obj); + var descriptors = {}; + for (var i = 0; i < keys.length; i++) { + descriptors[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i]); + } + return descriptors; + }; + + var kCustomPromisifiedSymbol = undefined; + + exports.promisify = function promisify(original) { + if (typeof original !== 'function') + throw new TypeError('The "original" argument must be of type Function'); + + if (kCustomPromisifiedSymbol && original[kCustomPromisifiedSymbol]) { + var fn = original[kCustomPromisifiedSymbol]; + if (typeof fn !== 'function') { + throw new TypeError('The "util.promisify.custom" argument must be of type Function'); + } + Object.defineProperty(fn, kCustomPromisifiedSymbol, { + value: fn, enumerable: false, writable: false, configurable: true + }); + return fn; + } + + function fn() { + var promiseResolve, promiseReject; + var promise = new Promise(function (resolve, reject) { + promiseResolve = resolve; + promiseReject = reject; + }); + + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + args.push(function (err, value) { + if (err) { + promiseReject(err); + } else { + promiseResolve(value); + } + }); + + try { + original.apply(this, args); + } catch (err) { + promiseReject(err); + } + + return promise; + } + + Object.setPrototypeOf(fn, Object.getPrototypeOf(original)); + + if (kCustomPromisifiedSymbol) Object.defineProperty(fn, kCustomPromisifiedSymbol, { + value: fn, enumerable: false, writable: false, configurable: true + }); + return Object.defineProperties( + fn, + getOwnPropertyDescriptors(original) + ); + } + + return exports; + })(); + + switch (lib) { + case "fs": + return wrap("fs", { + ...fs, + promises: fsPromises, + }); + case "util": + return wrap("util", util); + case "axios": + return wrap("axios", axios); + default: + throw new Error(\`Cannot do require('\${lib}'), '\${lib}' is an unknown import.\`); + } +} +`; + +const wrapCode = (code) => { + return `${packagesShim}\nconst __temp = (function () { \n${code}\n return __main(); })();\nclean(__temp)` +} + +module.exports = () => { + return { + name: 'wrap-shims', + renderChunk(code) { + return `${wrapCode(code)}`; + }, + } +} \ No newline at end of file diff --git a/packages/templates/wasm/typescript/src/__tests__/integration.spec.ts b/packages/templates/wasm/typescript/src/__tests__/integration.spec.ts new file mode 100644 index 0000000000..5793310246 --- /dev/null +++ b/packages/templates/wasm/typescript/src/__tests__/integration.spec.ts @@ -0,0 +1,22 @@ +import { PolywrapClient } from "@polywrap/client-js"; +import path from "path"; + +jest.setTimeout(60000); + +describe("Template Wrapper End to End Tests", () => { + + const client: PolywrapClient = new PolywrapClient(); + let wrapUri = `file://${path.join(__dirname, "../../build")}`; + + it("invoke foo", async () => { + const result = await client.invoke({ + uri: wrapUri, + method: "foo", + args: { bar: "bar" } + }); + + expect(result.ok).toBeFalsy(); + if (result.ok) return; + expect(result.error?.toString()).toContain("Not implemented"); + }); +}); diff --git a/packages/templates/wasm/typescript/src/index.ts b/packages/templates/wasm/typescript/src/index.ts new file mode 100644 index 0000000000..fb25fe8ea7 --- /dev/null +++ b/packages/templates/wasm/typescript/src/index.ts @@ -0,0 +1,7 @@ +import { Args_foo, ModuleBase } from "./wrap"; + +export class Module extends ModuleBase { + foo(args: Args_foo): string { + throw new Error("Not implemented"); + } +} diff --git a/packages/templates/wasm/typescript/tsconfig.json b/packages/templates/wasm/typescript/tsconfig.json new file mode 100644 index 0000000000..bcd39950ad --- /dev/null +++ b/packages/templates/wasm/typescript/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "lib": ["es2020"], + "importHelpers": true, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "declaration": false, + "preserveSymlinks": true, + "preserveWatchOutput": true, + "pretty": false, + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "sourceMap": true, + "outDir": "build", + "module": "ESNext", + "target": "ESNext", + "resolveJsonModule": true, + "strictNullChecks": true, + }, + "include": ["./src/**/*.ts"], + "exclude": [ + "./src/__tests__/**/*.ts" + ] +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/.gitignore b/packages/test-cases/cases/cli/build-cmd/wasm/.gitignore index c795b054e5..8ab9284d7a 100644 --- a/packages/test-cases/cases/cli/build-cmd/wasm/.gitignore +++ b/packages/test-cases/cases/cli/build-cmd/wasm/.gitignore @@ -1 +1,2 @@ -build \ No newline at end of file +build +bundled \ No newline at end of file diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/expected/output.json b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/expected/output.json new file mode 100644 index 0000000000..d91a8e5545 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/expected/output.json @@ -0,0 +1,4 @@ +[ + "wrap.wasm", + "wrap.info" +] \ No newline at end of file diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/expected/stdout.json b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/expected/stdout.json new file mode 100644 index 0000000000..6cbc97b938 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/expected/stdout.json @@ -0,0 +1,7 @@ +{ + "stdout": [ + "Artifacts written to ./build", + "WRAP manifest written in ./build" + ], + "exitCode": 0 +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/package.json b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/package.json new file mode 100644 index 0000000000..94c149fe48 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/package.json @@ -0,0 +1,12 @@ +{ + "name": "@polywrap/test-project", + "version": "1.0.0", + "scripts": { + "build": "polywrap build" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "polywrap": "0.11.2" + } +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/polywrap.graphql b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/polywrap.graphql new file mode 100644 index 0000000000..325e224971 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/polywrap.graphql @@ -0,0 +1,5 @@ +type Module { + method( + arg: String! + ): String! +} diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/polywrap.yaml b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/polywrap.yaml new file mode 100644 index 0000000000..14bc8c3e33 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/polywrap.yaml @@ -0,0 +1,7 @@ +format: 0.5.0 +project: + name: ObjectTypes + type: wasm/typescript +source: + schema: ./polywrap.graphql + module: ./wrap.js diff --git a/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/wrap.js b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/wrap.js new file mode 100644 index 0000000000..0dc576c633 --- /dev/null +++ b/packages/test-cases/cases/cli/build-cmd/wasm/typescript/001-sanity/wrap.js @@ -0,0 +1 @@ +function e(r,t=!0){if(void 0===r)return t?"undefined":void 0;if(null===r)return t?"null":void 0;if(Array.isArray(r))return r.map((r=>e(r,!1))).filter((e=>void 0!==e));if(r instanceof Error)return{message:r.message};if("function"==typeof r)return t?"function":void 0;if("object"!=typeof r)return r;for(let t in r){let n=e(r[t],!1);void 0===n?delete r[t]:r[t]=n}return r}e(function(){"use strict";class e{}class r extends e{method(e){return"Method called"}}return(new r)[__wrap_method](__wrap_args)}()); diff --git a/yarn.lock b/yarn.lock index 8662fe7fa7..a387616f36 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1167,7 +1167,15 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -2373,6 +2381,56 @@ ajv "8.12.0" semver "~7.5.4" +"@rollup/plugin-commonjs@^25.0.4": + version "25.0.4" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.4.tgz#a7547a0c4ec3fa79818eb313e1de0023e548f4e6" + integrity sha512-L92Vz9WUZXDnlQQl3EwbypJR4+DM2EbsO+/KOcEkP4Mc6Ct453EeDB2uH9lgRwj4w5yflgNpq9pHOiY8aoUXBQ== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + glob "^8.0.3" + is-reference "1.2.1" + magic-string "^0.27.0" + +"@rollup/plugin-node-resolve@^15.2.0": + version "15.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz#a15b14fb7969229e26a30feff2816d39eff503f0" + integrity sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-builtin-module "^3.2.1" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-terser@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-0.4.3.tgz#c2bde2fe3a85e45fa68a454d48f4e73e57f98b30" + integrity sha512-EF0oejTMtkyhrkwCdg0HJ0IpkcaVg1MMSf2olHb2Jp+1mnLM04OhjpJWGma4HobiDTF0WCyViWuvadyE9ch2XA== + dependencies: + serialize-javascript "^6.0.1" + smob "^1.0.0" + terser "^5.17.4" + +"@rollup/plugin-typescript@^11.1.2": + version "11.1.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-11.1.3.tgz#8172858a1e5f4c181aebc61f8920002fd5e04b91" + integrity sha512-8o6cNgN44kQBcpsUJTbTXMTtb87oR1O0zgP3Dxm71hrNgparap3VujgofEilTYJo+ivf2ke6uy3/E5QEaiRlDA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + resolve "^1.22.1" + +"@rollup/pluginutils@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.4.tgz#74f808f9053d33bafec0cc98e7b835c9667d32ba" + integrity sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + "@sinclair/typebox@^0.24.1": version "0.24.51" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" @@ -2491,7 +2549,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": +"@types/estree@*", "@types/estree@^1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== @@ -2646,6 +2704,11 @@ "@types/prop-types" "*" csstype "^2.2.0" +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + "@types/rimraf@3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.0.tgz#b9d03f090ece263671898d57bb7bb007023ac19f" @@ -2838,7 +2901,7 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1: +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.8.2: version "8.10.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== @@ -3351,6 +3414,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -3431,6 +3501,11 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" @@ -3782,11 +3857,16 @@ commander@9.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== -commander@^2.19.0: +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" @@ -4699,6 +4779,11 @@ estraverse@^5.1.0, estraverse@^5.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5137,7 +5222,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^2.1.2, fsevents@~2.3.1: +fsevents@^2.1.2, fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -5345,6 +5430,17 @@ glob@^7.0.0, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -5833,6 +5929,13 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -5949,6 +6052,11 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + is-negated-glob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" @@ -6015,6 +6123,13 @@ is-promise@^2.2.2: resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -7014,6 +7129,13 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" +magic-string@^0.27.0: + version "0.27.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" + integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.4.13" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -7241,6 +7363,13 @@ minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -8443,6 +8572,13 @@ randexp@0.4.6: discontinuous-range "1.0.0" ret "~0.1.10" +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -8754,7 +8890,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.22.0, resolve@^1.22.4: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.22.0, resolve@^1.22.1, resolve@^1.22.4: version "1.22.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== @@ -8800,6 +8936,13 @@ rimraf@^2.6.3: dependencies: glob "^7.1.3" +rollup@^3.28.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.0.tgz#1b40e64818afc979c7e5bef93de675829288986b" + integrity sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w== + optionalDependencies: + fsevents "~2.3.2" + rsvp@^4.8.4: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" @@ -8834,7 +8977,7 @@ safe-array-concat@^1.0.0: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -8916,6 +9059,13 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -9033,6 +9183,11 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +smob@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.0.tgz#ac9751fe54b1fc1fc8286a628d4e7f824273b95a" + integrity sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -9114,7 +9269,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.20, source-map-support@^0.5.6: +source-map-support@^0.5.20, source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -9498,6 +9653,16 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" +terser@^5.17.4: + version "5.19.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" + integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -9717,7 +9882,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: +tslib@^2.1.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -9844,6 +10009,11 @@ typescript@4.9.5, typescript@^4.0: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.1.6: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + uglify-js@^3.1.4: version "3.17.4" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c"