From a49671344e8a5a12df53c14464d30495e41a791e Mon Sep 17 00:00:00 2001 From: Chris Rybicki Date: Thu, 5 Oct 2023 17:57:34 -0400 Subject: [PATCH] feat(cli): `wing pack` (#3938) Introduces the `wing pack` command - a standard way to package libraries in Wing. `wing pack` can be run in any Wing project directory that has a `package.json` in it. `wing pack` will validate your `package.json` produce a tarball that contains the libraries source files. For more documentation, see https://winglang.io/docs/libraries. ## Implementation When you `bring "foo"`, the parser now performs some Node module resolution to look up the `foo` package and see if it's a JSII library or a Wing library based on its `package.json`. If `bring "foo"` refers to a Wing library, then it's equivalent to bringing that library's root directory, per https://github.com/winglang/wing/pull/4210. ## Future related work - https://github.com/winglang/wing/issues/4415 - https://github.com/winglang/wing/issues/4294 - https://github.com/winglang/wing/issues/2171 ## Checklist - [x] Title matches [Winglang's style guide](https://www.winglang.io/contributing/start-here/pull_requests#how-are-pull-request-titles-formatted) - [x] Description explains motivation and solution - [x] Tests added (always) - [x] Docs updated (only required for features) - [ ] Added `pr/e2e-full` label if this feature requires end-to-end testing *By submitting this pull request, I confirm that my contribution is made under the terms of the [Wing Cloud Contribution License](https://github.com/winglang/wing/blob/main/CONTRIBUTION_LICENSE.md)*. --- apps/wing/fixtures/.gitignore | 1 + apps/wing/fixtures/invalid1/main.w | 3 + apps/wing/fixtures/invalid2/main.w | 3 + apps/wing/fixtures/invalid2/package.json | 6 + apps/wing/fixtures/invalid3/file1.w | 6 + apps/wing/package.json | 7 + apps/wing/src/cli.ts | 7 + apps/wing/src/commands/pack.test.ts | 133 ++++ apps/wing/src/commands/pack.ts | 196 +++++ apps/wing/src/util.ts | 10 + docs/docs/05-libraries.md | 72 ++ docs/docs/06-tools/01-cli.md | 14 + .../tests/valid/bring_wing_library.test.w | 4 + examples/tests/valid/package.json | 3 +- examples/wing-fixture/.gitignore | 1 + examples/wing-fixture/README.md | 1 + examples/wing-fixture/enums.w | 4 + examples/wing-fixture/index.js | 1 + examples/wing-fixture/package.json | 25 + examples/wing-fixture/store.w | 13 + examples/wing-fixture/subdir/util.w | 5 + examples/wing-fixture/turbo.json | 5 + libs/wingc/src/ast.rs | 3 + libs/wingc/src/file_graph.rs | 2 +- libs/wingc/src/fold.rs | 1 + libs/wingc/src/jsify.rs | 11 + libs/wingc/src/lib.rs | 2 +- libs/wingc/src/lsp/document_symbols.rs | 1 + libs/wingc/src/lsp/hover.rs | 8 - libs/wingc/src/parser.rs | 72 +- libs/wingc/src/type_check.rs | 37 +- libs/wingc/src/type_check/symbol_env.rs | 6 + libs/wingc/src/visit.rs | 1 + libs/wingii/src/lib.rs | 4 +- pnpm-lock.yaml | 705 ++++++++++++++++-- pnpm-workspace.yaml | 1 + tools/hangar/__snapshots__/invalid.ts.snap | 4 +- ...ring_wing_library.test.w_compile_tf-aws.md | 222 ++++++ .../bring_wing_library.test.w_test_sim.md | 12 + .../bring_wing_library.w_compile_tf-aws.md | 194 +++++ .../valid/bring_wing_library.w_test_sim.md | 12 + 41 files changed, 1717 insertions(+), 101 deletions(-) create mode 100644 apps/wing/fixtures/.gitignore create mode 100644 apps/wing/fixtures/invalid1/main.w create mode 100644 apps/wing/fixtures/invalid2/main.w create mode 100644 apps/wing/fixtures/invalid2/package.json create mode 100644 apps/wing/fixtures/invalid3/file1.w create mode 100644 apps/wing/src/commands/pack.test.ts create mode 100644 apps/wing/src/commands/pack.ts create mode 100644 docs/docs/05-libraries.md create mode 100644 examples/tests/valid/bring_wing_library.test.w create mode 100644 examples/wing-fixture/.gitignore create mode 100644 examples/wing-fixture/README.md create mode 100644 examples/wing-fixture/enums.w create mode 100644 examples/wing-fixture/index.js create mode 100644 examples/wing-fixture/package.json create mode 100644 examples/wing-fixture/store.w create mode 100644 examples/wing-fixture/subdir/util.w create mode 100644 examples/wing-fixture/turbo.json create mode 100644 tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md create mode 100644 tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_test_sim.md create mode 100644 tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_compile_tf-aws.md create mode 100644 tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_test_sim.md diff --git a/apps/wing/fixtures/.gitignore b/apps/wing/fixtures/.gitignore new file mode 100644 index 00000000000..aa1ec1ea061 --- /dev/null +++ b/apps/wing/fixtures/.gitignore @@ -0,0 +1 @@ +*.tgz diff --git a/apps/wing/fixtures/invalid1/main.w b/apps/wing/fixtures/invalid1/main.w new file mode 100644 index 00000000000..9e38bfdb930 --- /dev/null +++ b/apps/wing/fixtures/invalid1/main.w @@ -0,0 +1,3 @@ +// example of a project missing a package.json file +bring cloud; +new cloud.Bucket(); diff --git a/apps/wing/fixtures/invalid2/main.w b/apps/wing/fixtures/invalid2/main.w new file mode 100644 index 00000000000..e81fd9a20e8 --- /dev/null +++ b/apps/wing/fixtures/invalid2/main.w @@ -0,0 +1,3 @@ +// example of a project missing "license" in package.json +bring cloud; +new cloud.Bucket(); diff --git a/apps/wing/fixtures/invalid2/package.json b/apps/wing/fixtures/invalid2/package.json new file mode 100644 index 00000000000..caaaa6636a6 --- /dev/null +++ b/apps/wing/fixtures/invalid2/package.json @@ -0,0 +1,6 @@ +{ + "name": "invalid2", + "version": "0.0.0", + "description": "description", + "author": "author" +} diff --git a/apps/wing/fixtures/invalid3/file1.w b/apps/wing/fixtures/invalid3/file1.w new file mode 100644 index 00000000000..50fff1b23d3 --- /dev/null +++ b/apps/wing/fixtures/invalid3/file1.w @@ -0,0 +1,6 @@ +// example of a project that doesn't compile +class A { + init() { + log("Hello world!") // missing ';' + } +} diff --git a/apps/wing/package.json b/apps/wing/package.json index 75f308fe0f7..3666d735909 100644 --- a/apps/wing/package.json +++ b/apps/wing/package.json @@ -31,6 +31,7 @@ "package": "bump-pack -b" }, "dependencies": { + "@npmcli/arborist": "^7.2.0", "@segment/analytics-node": "^1.1.0", "@wingconsole/app": "workspace:^", "@wingconsole/server": "workspace:^", @@ -41,9 +42,12 @@ "commander": "^10.0.1", "compare-versions": "^5.0.3", "debug": "^4.3.4", + "minimatch": "^9.0.3", "nanoid": "^3.3.6", + "npm-packlist": "^8.0.0", "open": "^8.4.2", "ora": "^5.4.1", + "tar": "^6.2.0", "tiny-updater": "^3.5.1", "uuid": "^8.3.2", "vscode-languageserver": "^8.1.0" @@ -52,6 +56,9 @@ "@types/debug": "^4.1.8", "@types/node": "^18.17.13", "@types/node-persist": "^3.1.4", + "@types/npmcli__arborist": "^5.6.2", + "@types/npm-packlist": "^7.0.1", + "@types/tar": "^6.1.6", "@types/semver-utils": "^1.1.1", "@types/uuid": "^8.3.4", "@typescript-eslint/eslint-plugin": "^6.7.4", diff --git a/apps/wing/src/cli.ts b/apps/wing/src/cli.ts index c56db763bfa..84f74827dc5 100644 --- a/apps/wing/src/cli.ts +++ b/apps/wing/src/cli.ts @@ -163,6 +163,13 @@ async function main() { .hook("preAction", collectAnalyticsHook) .action(runSubCommand("test")); + program + .command("pack") + .description("Package the current directory into an npm library (gzipped tarball).") + .addOption(new Option("-o --out-file ", "Output filename")) + .hook("preAction", collectAnalyticsHook) + .action(runSubCommand("pack")); + program .command("docs") .description("Open the Wing documentation") diff --git a/apps/wing/src/commands/pack.test.ts b/apps/wing/src/commands/pack.test.ts new file mode 100644 index 00000000000..74e0483d4e4 --- /dev/null +++ b/apps/wing/src/commands/pack.test.ts @@ -0,0 +1,133 @@ +import * as fs from "fs/promises"; +import { join } from "path"; +import { describe, it, expect, afterEach, vi } from "vitest"; +import { pack } from "./pack"; +import { exec, generateTmpDir } from "src/util"; + +const fixturesDir = join(__dirname, "..", "..", "fixtures"); +const goodFixtureDir = join(__dirname, "..", "..", "..", "..", "examples", "wing-fixture"); + +console.log = vi.fn(); + +describe("wing pack", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("throws an error if a project is missing package.json", async () => { + const projectDir = join(fixturesDir, "invalid1"); + const outdir = await generateTmpDir(); + process.chdir(projectDir); + await expect(pack({ outfile: join(outdir, "tarball.tgz") })).rejects.toThrow( + /No package.json found in the current directory./ + ); + await expectNoTarball(outdir); + }); + + it("throws an error if package.json is missing a required field", async () => { + const projectDir = join(fixturesDir, "invalid2"); + const outdir = await generateTmpDir(); + process.chdir(projectDir); + + await expect(pack({ outfile: join(outdir, "tarball.tgz") })).rejects.toThrow( + /Missing required field "license" in package.json/ + ); + await expectNoTarball(outdir); + }); + + it("throws an error if the project doesn't compile", async () => { + const projectDir = join(fixturesDir, "invalid3"); + const outdir = await generateTmpDir(); + process.chdir(projectDir); + + await expect(pack({ outfile: join(outdir, "tarball.tgz") })).rejects.toThrow(/Expected ';'/); + await expectNoTarball(outdir); + }); + + it("packages a valid Wing project to a default path", async () => { + // GIVEN + const outdir = await generateTmpDir(); + // copy everything to the output directory to sandbox this test + await exec(`cp -r ${goodFixtureDir}/* ${outdir}`); + process.chdir(outdir); + + // WHEN + await pack(); + + // THEN + const files = await fs.readdir(outdir); + expect(files.filter((path) => path.endsWith(".tgz")).length).toEqual(1); + const tarballPath = files.find((path) => path.endsWith(".tgz"))!; + const tarballContents = await extractTarball(join(outdir, tarballPath), outdir); + + const expectedFiles = ["index.js", "README.md", "package.json", "store.w"]; + for (const file of expectedFiles) { + expect(tarballContents[file]).toBeDefined(); + } + + const pkgJson = JSON.parse(tarballContents["package.json"]); + expect(pkgJson.name).toEqual("wing-fixture"); + expect(pkgJson.keywords.includes("winglang")).toBe(true); + expect(pkgJson.engines.wing).toEqual("*"); + expect(pkgJson.wing).toEqual(true); + }); + + it("packages a valid Wing project to a user-specified path", async () => { + // GIVEN + const projectDir = goodFixtureDir; + const outdir = await generateTmpDir(); + process.chdir(projectDir); + + // WHEN + await pack({ outfile: join(outdir, "tarball.tgz") }); + + // THEN + const files = await fs.readdir(outdir); + expect(files.filter((path) => path.endsWith(".tgz")).length).toEqual(1); + const tarballPath = files.find((path) => path.endsWith(".tgz"))!; + const tarballContents = await extractTarball(join(outdir, tarballPath), outdir); + + const expectedFiles = ["index.js", "README.md", "package.json", "store.w"]; + for (const file of expectedFiles) { + expect(tarballContents[file]).toBeDefined(); + } + + const pkgJson = JSON.parse(tarballContents["package.json"]); + expect(pkgJson.name).toEqual("wing-fixture"); + expect(pkgJson.keywords.includes("winglang")).toBe(true); + expect(pkgJson.engines.wing).toEqual("*"); + expect(pkgJson.wing).toEqual(true); + }); +}); + +/** + * Asserts that no tarball was created in the specified directory. + */ +async function expectNoTarball(projectDir: string) { + const files = await fs.readdir(projectDir); + expect(files.findIndex((path) => path.endsWith(".tgz"))).toEqual(-1); +} + +async function extractTarball(src: string, outdir: string): Promise> { + await exec(`tar -xzf ${src} -C ${outdir}`); + const contents: Record = {}; + + // when you extract an npm tarball, it creates a directory called "package" + const base = join(outdir, "package"); + + async function readDir(dir: string) { + const files = await fs.readdir(join(base, dir)); + for (const file of files) { + const path = join(base, dir, file); + const stat = await fs.stat(path); + if (stat.isDirectory()) { + await readDir(join(dir, file)); + } else { + contents[join(dir, file)] = (await fs.readFile(path)).toString(); + } + } + } + await readDir("."); + + return contents; +} diff --git a/apps/wing/src/commands/pack.ts b/apps/wing/src/commands/pack.ts new file mode 100644 index 00000000000..e023a7b2f09 --- /dev/null +++ b/apps/wing/src/commands/pack.ts @@ -0,0 +1,196 @@ +import { constants } from "fs"; +import * as fs from "fs/promises"; +import * as os from "os"; +import * as path from "path"; +import { resolve } from "path"; +import Arborist from "@npmcli/arborist"; +import { Target } from "@winglang/compiler"; +import { minimatch } from "minimatch"; +import packlist from "npm-packlist"; +import * as tar from "tar"; +import { compile } from "./compile"; + +// TODO: add --dry-run option? +// TODO: let the user specify library's supported targets in package.json, and compile to each before packaging +// TODO: print information about the generated library? (e.g. size, dependencies, number of public APIs) + +export interface PackageOptions { + /** + * Output filename. + */ + readonly outfile?: string; +} + +export async function pack(options: PackageOptions = {}): Promise { + // check that the library compiles to the "sim" target + console.log('Compiling to the "sim" target...'); + + // TODO: workaround for https://github.com/winglang/wing/issues/4431 + // await compile(".", { target: Target.SIM }); + await compile(path.join("..", path.basename(process.cwd())), { target: Target.SIM }); + + const userDir = process.cwd(); + const outfile = options.outfile ? resolve(options.outfile) : undefined; + const outdir = outfile ? path.dirname(outfile) : userDir; + + // check package.json exists + const originalPkgJsonPath = path.join(userDir, "package.json"); + if (!(await exists(originalPkgJsonPath))) { + throw new Error(`No package.json found in the current directory. Run \`npm init\` first.`); + } + + const originalPkgJson = JSON.parse(await fs.readFile(originalPkgJsonPath, "utf8")); + const originalPkgJsonFiles: Set = new Set(originalPkgJson.files ?? []); + + // perform our work in a staging directory to avoid making a mess in the user's current directory + return withTempDir(async (workdir) => { + const excludeGlobs = ["/target/**", "/node_modules/**", "/.git/**", "/.wing/**"]; + const includeGlobs = [ + ...originalPkgJsonFiles, + "README*", + "package.json", + "**/*.w", + "**/*.js", + "LICENSE*", + ]; + + // copy the user's directory to the staging directory + await copyDir(userDir, workdir, excludeGlobs, includeGlobs); + + // check package.json exists + const pkgJsonPath = path.join(workdir, "package.json"); + if (!(await exists(pkgJsonPath))) { + throw new Error(`No package.json found in the current directory. Run \`npm init\` first.`); + } + + const pkgJson = JSON.parse(await fs.readFile(pkgJsonPath, "utf8")); + + // check package.json has required fields + const requiredFields = ["name", "version", "description", "author", "license"]; + for (const field of requiredFields) { + if (pkgJson[field] === undefined) { + throw new Error(`Missing required field "${field}" in package.json.`); + } + } + + // check that Wing source files will be included in the tarball + const pkgJsonFiles = new Set(pkgJson.files ?? []); + const expectedGlobs = ["**/*.js", "**/*.w"]; + for (const glob of expectedGlobs) { + if (!pkgJsonFiles.has(glob)) { + pkgJsonFiles.add(glob); + } + } + pkgJson.files = [...pkgJsonFiles]; + + // check if "main" points to a valid file, and if not, create a dummy file + let main = pkgJson.main ?? "index.js"; + if (!(await exists(main))) { + const lines = []; + lines.push("// This file was generated by `wing pack`"); + lines.push( + `console.log("${pkgJson.name} is a winglang library and cannot be used from javascript (yet). See winglang.io/docs/libraries")` + ); + lines.push(); + await fs.writeFile(main, lines.join("\n")); + } + pkgJson.main = main; + + // add "winglang" to "keywords" + const keywords = new Set(pkgJson.keywords ?? []); + keywords.add("winglang"); + pkgJson.keywords = [...keywords]; + + // add "wing" to "engines" + pkgJson.engines = { wing: "*" }; + + // add "wing" top-level field + pkgJson.wing = true; + + // write package.json + await fs.writeFile(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n"); + + // make the tarball + const arborist = new Arborist({ path: workdir }); + const tree = await arborist.loadActual(); + const pkg = tree.package; + const tarballPath = outfile ?? path.join(outdir, `${pkg.name}-${pkg.version}.tgz`); + const files = await packlist(tree); + await tar.create( + { + gzip: true, + file: tarballPath, + cwd: workdir, + prefix: "package/", + portable: true, + noPax: true, + }, + files + ); + + console.log("Created tarball:", tarballPath); + return tarballPath; + }); +} + +async function copyDir(src: string, dest: string, excludeGlobs: string[], includeGlobs: string[]) { + const files = await fs.readdir(src); + for (const file of files) { + const srcPath = path.join(src, file); + const destPath = path.join(dest, file); + const stat = await fs.stat(srcPath); + if (stat.isDirectory()) { + if (shouldInclude(srcPath, excludeGlobs, includeGlobs)) { + await copyDir(srcPath, destPath, excludeGlobs, includeGlobs); + } + } else { + await fs.copyFile(srcPath, destPath); + } + } +} + +function shouldInclude(srcPath: string, excludeGlobs: string[], includeGlobs: string[]): boolean { + for (const glob of excludeGlobs) { + if (minimatch(srcPath, glob)) { + return false; + } + } + for (const glob of includeGlobs) { + if (minimatch(srcPath, glob)) { + return true; + } + } + return false; +} + +/** + * Run some work in a temporary directory. + */ +async function withTempDir(work: (workdir: string) => Promise): Promise { + const workdir = await fs.mkdtemp(path.join(os.tmpdir(), "wing-pack-")); + const cwd = process.cwd(); + try { + process.chdir(workdir); + // wait for the work to be completed before + // we cleanup the work environment. + return await work(workdir); + } finally { + process.chdir(cwd); + await fs.rm(workdir, { recursive: true }); + } +} + +/** + * Check if a file exists for an specific path + */ +export async function exists(filePath: string): Promise { + try { + await fs.access( + filePath, + constants.F_OK | constants.R_OK | constants.W_OK //eslint-disable-line no-bitwise + ); + return true; + } catch (er) { + return false; + } +} diff --git a/apps/wing/src/util.ts b/apps/wing/src/util.ts index e58693f6b09..0633c90a007 100644 --- a/apps/wing/src/util.ts +++ b/apps/wing/src/util.ts @@ -1,6 +1,8 @@ +import * as cp from "child_process"; import { copyFileSync, promises as fsPromise } from "fs"; import { tmpdir } from "os"; import { join } from "path"; +import { promisify } from "util"; /** * Normalize windows paths to be posix-like. @@ -51,6 +53,14 @@ export async function copyDir(src: string, dest: string) { } } +/** + * Execute a command and return its stdout. + */ +export async function exec(command: string): Promise { + const output = await promisify(cp.exec)(command); + return output.stdout.trim(); +} + /** * Creates a clean environment for each test by copying the example file to a temporary directory. */ diff --git a/docs/docs/05-libraries.md b/docs/docs/05-libraries.md new file mode 100644 index 00000000000..28367cbbe91 --- /dev/null +++ b/docs/docs/05-libraries.md @@ -0,0 +1,72 @@ +--- +title: Wing Libraries +id: libraries +description: Documentation about Wing libraries +sidebar_label: Libraries +keywords: [Wing reference, Wing libraries, libraries, packaging, packages] +--- + +As you write larger Wing applications, organizing your code becomes increasingly important. +By grouping related functionality and separating code with distinct features, you'll make it easier to find code that implements a particular feature and where to go to change how a feature works. +As the project grows further, you can extract parts into separate libraries that become external dependencies. + +Any Wing project can be packaged as a library, which will export all public types (like classes and structs) so that they can be used by multiple applications. + +> Note: today all types in libraries are public by default, but there is a planned breaking change to make types private by default. Follow for more information. + +Let's first start with how to consume a Wing library. + +## Using a Wing library + +Wing libraries can be installed using the npm command line tool. + +``` +npm i wing-redis +``` + +Then in your Wing source code, the library can be imported by name using a `bring` statement: + +```js +bring "wing-redis" as redis; + +new redis.Redis(); +``` + +Libraries can expose the following kinds of API elements: + +- Classes +- Structs +- Interfaces +- Enums +- Constants (coming soon - see https://github.com/winglang/wing/issues/3606 to track) + +APIs in libraries can also be organized hierarchically for better organization. +For example, a library may split up its API elements between multiple modules (also sometimes called "namespaces"): + +```js +bring "my-wing-payments-library" as payments; + +new payments.charges.Charge(); +new payments.customer.Customer(); +``` + +### Creating a Wing library + +Packaging your own Wing code as a library is straightforward. +Let's walk through it step by step. + +First, check that your project is organized based on how you want to structure your library. +There are two main rules to be aware of: + +1. APIs can only be exported from non-entrypoint files (files that do not end in `.main.w` or `.test.w`). + Entrypoint files are perfect for writing tests and deployment scenarios that can be executed as-is - but if you have classes and other APIs you want to share, they have to be defined in non-entrypoint files (also known as module files). + +2. APIs are organized based on the project's directory structure. + If you want a group of classes to be part of a namespace named "storage", define them in a directory named "storage" (for example, some classes could be defined in `storage/file1.w`, several more in `storage/file2.w`, and so on). + All public APIs defined at the root of your project will be available at top-level namespace in your library. + +Next, run `npm init` to create a `package.json` file with information about your library. +Make sure you fill out the "name", "version", "description", "author", and "license" fields. + +Finally, run `wing pack` at the root of your project directory. +`wing pack` will compile your project and create a .tgz file that can be published to [npm](https://www.npmjs.com/), [GitHub Packages](https://github.com/features/packages), or any other Node.js package managing service. diff --git a/docs/docs/06-tools/01-cli.md b/docs/docs/06-tools/01-cli.md index 393420c9a64..5c4b298caf1 100644 --- a/docs/docs/06-tools/01-cli.md +++ b/docs/docs/06-tools/01-cli.md @@ -200,3 +200,17 @@ pass | test_bucket.w | root/test:put ``` We will see that both functions were invoked and that the tests passed. + +## Package: `wing pack` + +The `wing pack` command can be used to package your project as a Wing library. + +Usage: + +```sh +$ wing pack +``` + +This will compile your current Wing directory, and bundle it as a tarball that can be published to [GitHub packages](https://github.com/features/packages) or [npm](https://www.npmjs.com/). + +See [Libraries](../05-libraries.md) for more details on packaging and consuming Wing libraries. diff --git a/examples/tests/valid/bring_wing_library.test.w b/examples/tests/valid/bring_wing_library.test.w new file mode 100644 index 00000000000..4fd665e57ac --- /dev/null +++ b/examples/tests/valid/bring_wing_library.test.w @@ -0,0 +1,4 @@ +bring "wing-fixture" as fixture; + +new fixture.Store(); +let fave_num = fixture.FavoriteNumbers.SEVEN; diff --git a/examples/tests/valid/package.json b/examples/tests/valid/package.json index 3b365f5b094..f572e3537c1 100644 --- a/examples/tests/valid/package.json +++ b/examples/tests/valid/package.json @@ -13,7 +13,8 @@ "constructs": "^10.2.70", "jsii-code-samples": "1.7.0", "projen": "^0.71.163", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "wing-fixture": "workspace:^" }, "volta": { "extends": "../../../package.json" diff --git a/examples/wing-fixture/.gitignore b/examples/wing-fixture/.gitignore new file mode 100644 index 00000000000..aa1ec1ea061 --- /dev/null +++ b/examples/wing-fixture/.gitignore @@ -0,0 +1 @@ +*.tgz diff --git a/examples/wing-fixture/README.md b/examples/wing-fixture/README.md new file mode 100644 index 00000000000..5fb89a6b97e --- /dev/null +++ b/examples/wing-fixture/README.md @@ -0,0 +1 @@ +A Wing library that can be used for any Wing library testing needs. diff --git a/examples/wing-fixture/enums.w b/examples/wing-fixture/enums.w new file mode 100644 index 00000000000..a494d80ec6f --- /dev/null +++ b/examples/wing-fixture/enums.w @@ -0,0 +1,4 @@ +enum FavoriteNumbers { + SEVEN, + FORTY_TWO, +} diff --git a/examples/wing-fixture/index.js b/examples/wing-fixture/index.js new file mode 100644 index 00000000000..ff7bd09c0cf --- /dev/null +++ b/examples/wing-fixture/index.js @@ -0,0 +1 @@ +// placeholder diff --git a/examples/wing-fixture/package.json b/examples/wing-fixture/package.json new file mode 100644 index 00000000000..1347b6a2b25 --- /dev/null +++ b/examples/wing-fixture/package.json @@ -0,0 +1,25 @@ +{ + "name": "wing-fixture", + "version": "0.0.0", + "description": "A fake library just for testing stuff out", + "author": { + "name": "Wing Cloud", + "email": "ping@monada.co", + "url": "https://wing.cloud", + "organization": true + }, + "license": "MIT", + "engines": { + "node": ">=v18.0.0" + }, + "main": "index.js", + "repository": { + "type": "git", + "url": "git+https://github.com/winglang/wing.git" + }, + "private": true, + "wing": true, + "volta": { + "extends": "../../package.json" + } +} diff --git a/examples/wing-fixture/store.w b/examples/wing-fixture/store.w new file mode 100644 index 00000000000..098981cda7c --- /dev/null +++ b/examples/wing-fixture/store.w @@ -0,0 +1,13 @@ +bring cloud; +bring "./subdir/util.w" as myutil; + +class Store { + data: cloud.Bucket; + init() { + this.data = new cloud.Bucket(); + } + + inflight set(message: str) { + this.data.put("data.txt", myutil.double(message)); + } +} diff --git a/examples/wing-fixture/subdir/util.w b/examples/wing-fixture/subdir/util.w new file mode 100644 index 00000000000..9cbac66cbc1 --- /dev/null +++ b/examples/wing-fixture/subdir/util.w @@ -0,0 +1,5 @@ +class Util { + pub static inflight double(msg: str): str { + return "${msg}${msg}"; + } +} diff --git a/examples/wing-fixture/turbo.json b/examples/wing-fixture/turbo.json new file mode 100644 index 00000000000..25c2b7f7dca --- /dev/null +++ b/examples/wing-fixture/turbo.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://turborepo.org/schema.json", + "extends": ["//"], + "pipeline": {} + } diff --git a/libs/wingc/src/ast.rs b/libs/wingc/src/ast.rs index 78530de2f7f..70c7106ab3e 100644 --- a/libs/wingc/src/ast.rs +++ b/libs/wingc/src/ast.rs @@ -2,6 +2,7 @@ use std::fmt::{Debug, Display}; use std::hash::{Hash, Hasher}; use std::sync::atomic::{AtomicUsize, Ordering}; +use camino::Utf8PathBuf; use indexmap::{Equivalent, IndexMap, IndexSet}; use itertools::Itertools; @@ -425,6 +426,8 @@ pub struct Interface { #[derive(Debug)] pub enum BringSource { BuiltinModule(Symbol), + /// The name of the library, and the path to the library (usually inside node_modules) + WingLibrary(Symbol, Utf8PathBuf), JsiiModule(Symbol), /// Refers to a relative path to a file WingFile(Symbol), diff --git a/libs/wingc/src/file_graph.rs b/libs/wingc/src/file_graph.rs index b479901ec4a..b7ac4521298 100644 --- a/libs/wingc/src/file_graph.rs +++ b/libs/wingc/src/file_graph.rs @@ -19,7 +19,7 @@ impl FileGraph { /// For example, if the current graph has file A depending on B, and /// `update_file(pathA, &[pathC])` was called, then this function will remove the edge /// from A to B, and add an edge from A to C. - pub fn update_file(&mut self, from_path: &Utf8Path, to_paths: &[Utf8PathBuf]) { + pub fn update_file<'a, I: IntoIterator>(&mut self, from_path: &Utf8Path, to_paths: I) { let from_node_index = self.get_or_insert_node_index(from_path); // remove all current outcoming edges from this node diff --git a/libs/wingc/src/fold.rs b/libs/wingc/src/fold.rs index 71ebd695faf..19428b15382 100644 --- a/libs/wingc/src/fold.rs +++ b/libs/wingc/src/fold.rs @@ -84,6 +84,7 @@ where StmtKind::Bring { source, identifier } => StmtKind::Bring { source: match source { BringSource::BuiltinModule(name) => BringSource::BuiltinModule(f.fold_symbol(name)), + BringSource::WingLibrary(name, module_dir) => BringSource::WingLibrary(f.fold_symbol(name), module_dir), BringSource::JsiiModule(name) => BringSource::JsiiModule(f.fold_symbol(name)), BringSource::WingFile(name) => BringSource::WingFile(f.fold_symbol(name)), BringSource::Directory(name) => BringSource::Directory(f.fold_symbol(name)), diff --git a/libs/wingc/src/jsify.rs b/libs/wingc/src/jsify.rs index f0fe6079323..8916ee9fc27 100644 --- a/libs/wingc/src/jsify.rs +++ b/libs/wingc/src/jsify.rs @@ -772,6 +772,17 @@ impl<'a> JSifier<'a> { identifier.as_ref().expect("bring jsii module requires an alias"), name )), + BringSource::WingLibrary(_, module_dir) => { + let preflight_file_map = self.preflight_file_map.borrow(); + let preflight_file_name = preflight_file_map.get(module_dir).unwrap(); + CodeMaker::one_line(format!( + "const {} = require(\"./{}\")({{ {} }});", + // checked during type checking + identifier.as_ref().expect("bring wing file requires an alias"), + preflight_file_name, + STDLIB, + )) + } BringSource::WingFile(name) => { let preflight_file_map = self.preflight_file_map.borrow(); let preflight_file_name = preflight_file_map.get(Utf8Path::new(&name.name)).unwrap(); diff --git a/libs/wingc/src/lib.rs b/libs/wingc/src/lib.rs index bb2a8fe2057..14d1c9fd672 100644 --- a/libs/wingc/src/lib.rs +++ b/libs/wingc/src/lib.rs @@ -244,7 +244,7 @@ pub fn type_check( let mut scope_env = types.get_scope_env(&scope); let mut tc = TypeChecker::new(types, file_path, file_graph, jsii_types, jsii_imports); - tc.add_module_to_env( + tc.add_jsii_module_to_env( &mut scope_env, WINGSDK_ASSEMBLY_NAME.to_string(), vec![WINGSDK_STD_MODULE.to_string()], diff --git a/libs/wingc/src/lsp/document_symbols.rs b/libs/wingc/src/lsp/document_symbols.rs index 50f48c040b2..c3586c59f80 100644 --- a/libs/wingc/src/lsp/document_symbols.rs +++ b/libs/wingc/src/lsp/document_symbols.rs @@ -37,6 +37,7 @@ impl Visit<'_> for DocumentSymbolVisitor { } // in these cases, an alias is required (like "bring foo as bar;") // so we don't need to add a symbol for the module itself + BringSource::WingLibrary(_, _) => {} BringSource::JsiiModule(_) => {} BringSource::WingFile(_) => {} BringSource::Directory(_) => {} diff --git a/libs/wingc/src/lsp/hover.rs b/libs/wingc/src/lsp/hover.rs index 2b4df9e9497..d8b4571e4be 100644 --- a/libs/wingc/src/lsp/hover.rs +++ b/libs/wingc/src/lsp/hover.rs @@ -709,14 +709,6 @@ bring cloud; "# ); - test_hover_list!( - test_bring_library, - r#" -bring "@winglang/sdk" as bar; - //^ -"# - ); - test_hover_list!( test_var, r#" diff --git a/libs/wingc/src/parser.rs b/libs/wingc/src/parser.rs index 3c4d38ed91a..a1cbba3ba5a 100644 --- a/libs/wingc/src/parser.rs +++ b/libs/wingc/src/parser.rs @@ -276,7 +276,7 @@ fn parse_wing_directory( && path.file_name() != Some("node_modules") && path.file_name() != Some(".git") && path.extension() != Some("tmp")) - || path.extension() == Some("w") + || path.extension() == Some("w") && !is_entrypoint_file(&path) { files_and_dirs.push(path); } @@ -888,10 +888,55 @@ impl<'s> Parser<'s> { } if module_name.name.starts_with("\"") && module_name.name.ends_with("\"") { + // we need to inspect the npm dependency to figure out if it's a JSII library or a Wing library + // first, find where the package.json is located + let module_name_parsed = module_name.name[1..module_name.name.len() - 1].to_string(); + let source_dir = Utf8Path::new(&self.source_name).parent().unwrap(); + let module_dir = wingii::util::package_json::find_dependency_directory(&module_name_parsed, &source_dir) + .ok_or_else(|| { + self + .with_error::( + format!( + "Unable to load {}: Module not found in \"{}\"", + module_name, self.source_name + ), + &statement_node, + ) + .err(); + })?; + + // If the package.json has a `wing` field, then we treat it as a Wing library + if is_wing_library(&Utf8Path::new(&module_dir)) { + return if let Some(alias) = alias { + // make sure the Wing library is also parsed + self.referenced_wing_paths.borrow_mut().push(module_dir.clone()); + + Ok(StmtKind::Bring { + source: BringSource::WingLibrary( + Symbol { + name: module_name_parsed, + span: module_name.span, + }, + module_dir, + ), + identifier: Some(alias), + }) + } else { + self.with_error::( + format!( + "bring {} must be assigned to an identifier (e.g. bring \"foo\" as foo)", + module_name + ), + statement_node, + ) + }; + } + + // otherwise, we treat it as a JSII library return if let Some(alias) = alias { Ok(StmtKind::Bring { source: BringSource::JsiiModule(Symbol { - name: module_name.name[1..module_name.name.len() - 1].to_string(), + name: module_name_parsed, span: module_name.span, }), identifier: Some(alias), @@ -2258,6 +2303,29 @@ impl<'s> Parser<'s> { } } +/// Check if the package.json in the given directory has a `wing` field +fn is_wing_library(module_dir: &Utf8Path) -> bool { + let package_json_path = Utf8Path::new(module_dir).join("package.json"); + if !package_json_path.exists() { + return false; + } + + let package_json = match fs::read_to_string(package_json_path) { + Ok(package_json) => package_json, + Err(_) => return false, + }; + + let package_json: serde_json::Value = match serde_json::from_str(&package_json) { + Ok(package_json) => package_json, + Err(_) => return false, + }; + + match package_json.get("wing") { + Some(_) => true, + None => false, + } +} + pub fn is_entrypoint_file(path: &Utf8Path) -> bool { path .file_name() diff --git a/libs/wingc/src/type_check.rs b/libs/wingc/src/type_check.rs index 12e85e83471..b186bc07ed3 100644 --- a/libs/wingc/src/type_check.rs +++ b/libs/wingc/src/type_check.rs @@ -1272,7 +1272,8 @@ struct ResolvedExpression { /// Then when a file at "src/main.w" has a statement `bring "./subdir" as subdir;`, /// it retrieves NS2 from the types.source_file_envs map and adds it to the main file's symbol environment /// under the symbol "subdir". -enum SymbolEnvOrNamespace { +#[derive(Debug)] +pub enum SymbolEnvOrNamespace { SymbolEnv(SymbolEnvRef), Namespace(NamespaceRef), Error(Diagnostic), @@ -3840,6 +3841,36 @@ impl<'a> TypeChecker<'a> { } return; } + BringSource::WingLibrary(name, module_dir) => { + let brought_ns = match self.types.source_file_envs.get(module_dir) { + Some(SymbolEnvOrNamespace::SymbolEnv(_)) => { + panic!("Expected a namespace to be associated with the library") + } + Some(SymbolEnvOrNamespace::Namespace(ns)) => ns, + Some(SymbolEnvOrNamespace::Error(diagnostic)) => { + report_diagnostic(Diagnostic { + span: Some(stmt.span()), + ..diagnostic.clone() + }); + return; + } + None => { + self.spanned_error( + stmt, + format!("Could not type check \"{}\" due to cyclic bring statements", name), + ); + return; + } + }; + if let Err(e) = env.define( + identifier.as_ref().unwrap(), + SymbolKind::Namespace(*brought_ns), + StatementIdx::Top, + ) { + self.type_error(e); + } + return; + } BringSource::Directory(name) => { let brought_ns = match self.types.source_file_envs.get(Utf8Path::new(&name.name)) { Some(SymbolEnvOrNamespace::SymbolEnv(_)) => { @@ -3871,7 +3902,7 @@ impl<'a> TypeChecker<'a> { return; } } - self.add_module_to_env(env, library_name, namespace_filter, alias, Some(&stmt)); + self.add_jsii_module_to_env(env, library_name, namespace_filter, alias, Some(&stmt)); // library_name is the name of the library we are importing from the JSII world // namespace_filter describes what types we are importing from the library // e.g. [] means we are importing everything from `mylib` @@ -4391,7 +4422,7 @@ impl<'a> TypeChecker<'a> { }; } - pub fn add_module_to_env( + pub fn add_jsii_module_to_env( &mut self, env: &mut SymbolEnv, library_name: String, diff --git a/libs/wingc/src/type_check/symbol_env.rs b/libs/wingc/src/type_check/symbol_env.rs index c450e91b978..068ad49cc07 100644 --- a/libs/wingc/src/type_check/symbol_env.rs +++ b/libs/wingc/src/type_check/symbol_env.rs @@ -17,6 +17,12 @@ use super::{UnsafeRef, VariableInfo}; pub type SymbolEnvRef = UnsafeRef; +impl Debug for SymbolEnvRef { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", &**self) + } +} + pub struct SymbolEnv { // We use a BTreeMaps here so that we can iterate over the symbols in a deterministic order (snapshot tests) pub(crate) symbol_map: BTreeMap, diff --git a/libs/wingc/src/visit.rs b/libs/wingc/src/visit.rs index de57063c24e..ddc9a63336a 100644 --- a/libs/wingc/src/visit.rs +++ b/libs/wingc/src/visit.rs @@ -97,6 +97,7 @@ where StmtKind::Bring { source, identifier } => { match &source { BringSource::BuiltinModule(name) => v.visit_symbol(name), + BringSource::WingLibrary(name, _module_dir) => v.visit_symbol(name), BringSource::JsiiModule(name) => v.visit_symbol(name), BringSource::WingFile(name) => v.visit_symbol(name), BringSource::Directory(name) => v.visit_symbol(name), diff --git a/libs/wingii/src/lib.rs b/libs/wingii/src/lib.rs index c96e40ab6dc..9e687fefdbd 100644 --- a/libs/wingii/src/lib.rs +++ b/libs/wingii/src/lib.rs @@ -16,7 +16,7 @@ pub mod fqn; pub mod jsii; pub mod node_resolve; -mod util; +pub mod util; pub type Result = std::result::Result>; @@ -236,7 +236,7 @@ pub mod type_system { pub fn load_dep(&mut self, dep: &str, search_start: &Utf8Path) -> Result { let module_dir = package_json::find_dependency_directory(dep, search_start).ok_or(format!( "Unable to load \"{}\": Module not found in \"{}\"", - dep, search_start + dep, search_start, ))?; self.load_module(&module_dir) } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4201fe258b6..67209dbb7dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -270,6 +270,9 @@ importers: apps/wing: dependencies: + '@npmcli/arborist': + specifier: ^7.2.0 + version: 7.2.0 '@segment/analytics-node': specifier: ^1.1.0 version: 1.1.0 @@ -300,15 +303,24 @@ importers: debug: specifier: ^4.3.4 version: 4.3.4 + minimatch: + specifier: ^9.0.3 + version: 9.0.3 nanoid: specifier: ^3.3.6 version: 3.3.6 + npm-packlist: + specifier: ^8.0.0 + version: 8.0.0 open: specifier: ^8.4.2 version: 8.4.2 ora: specifier: ^5.4.1 version: 5.4.1 + tar: + specifier: ^6.2.0 + version: 6.2.0 tiny-updater: specifier: ^3.5.1 version: 3.5.1 @@ -328,9 +340,18 @@ importers: '@types/node-persist': specifier: ^3.1.4 version: 3.1.4 + '@types/npm-packlist': + specifier: ^7.0.1 + version: 7.0.1 + '@types/npmcli__arborist': + specifier: ^5.6.2 + version: 5.6.2 '@types/semver-utils': specifier: ^1.1.1 version: 1.1.1 + '@types/tar': + specifier: ^6.1.6 + version: 6.1.6 '@types/uuid': specifier: ^8.3.4 version: 8.3.4 @@ -1061,6 +1082,11 @@ importers: uuid: specifier: ^9.0.0 version: 9.0.0 + wing-fixture: + specifier: workspace:^ + version: link:../../wing-fixture + + examples/wing-fixture: {} libs/tree-sitter-wing: dependencies: @@ -5089,7 +5115,10 @@ packages: strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: true + + /@isaacs/string-locale-compare@1.1.0: + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} + dev: false /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -5667,6 +5696,66 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@npm/types@1.0.2: + resolution: {integrity: sha512-KXZccTDEnWqNrrx6JjpJKU/wJvNeg9BDgjS0XhmlZab7br921HtyVbsYzJr4L+xIvjdJ20Wh9dgxgCI2a5CEQw==} + dev: true + + /@npmcli/agent@2.2.0: + resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + agent-base: 7.1.0 + http-proxy-agent: 7.0.0 + https-proxy-agent: 7.0.2 + lru-cache: 10.0.1 + socks-proxy-agent: 8.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@npmcli/arborist@7.2.0: + resolution: {integrity: sha512-J6XCan+5nV6F94E0+9z//OnZADcqHw6HGDO0ynX+Ayd6GEopK0odq99V+UQjb8P1zexTmCWGvxp4jU5OM6NTtg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/fs': 3.1.0 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/map-workspaces': 3.0.4 + '@npmcli/metavuln-calculator': 7.0.0 + '@npmcli/name-from-folder': 2.0.0 + '@npmcli/node-gyp': 3.0.0 + '@npmcli/package-json': 5.0.0 + '@npmcli/query': 3.0.1 + '@npmcli/run-script': 7.0.1 + bin-links: 4.0.2 + cacache: 18.0.0 + common-ancestor-path: 1.0.1 + hosted-git-info: 7.0.1 + json-parse-even-better-errors: 3.0.0 + json-stringify-nice: 1.1.4 + minimatch: 9.0.3 + nopt: 7.2.0 + npm-install-checks: 6.2.0 + npm-package-arg: 11.0.1 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.0.0 + npmlog: 7.0.1 + pacote: 17.0.4 + parse-conflict-json: 3.0.1 + proc-log: 3.0.0 + promise-all-reject-late: 1.0.1 + promise-call-limit: 1.0.2 + read-package-json-fast: 3.0.2 + semver: 7.5.4 + ssri: 10.0.5 + treeverse: 3.0.0 + walk-up-path: 3.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + /@npmcli/ci-detect@1.4.0: resolution: {integrity: sha512-3BGrt6FLjqM6br5AhWRKTr3u5GIVkjRYeAFrMp3HjnfICrg4xOrVRwFavKT6tsp++bq5dluL5t8ME/Nha/6c1Q==} deprecated: this package has been deprecated, use `ci-info` instead @@ -5677,7 +5766,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 - dev: true /@npmcli/git@4.1.0: resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} @@ -5695,6 +5783,22 @@ packages: - bluebird dev: true + /@npmcli/git@5.0.3: + resolution: {integrity: sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 7.0.0 + lru-cache: 10.0.1 + npm-pick-manifest: 9.0.0 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.5.4 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + dev: false + /@npmcli/installed-package-contents@2.0.2: resolution: {integrity: sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5702,12 +5806,53 @@ packages: dependencies: npm-bundled: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: true + + /@npmcli/map-workspaces@3.0.4: + resolution: {integrity: sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.3.4 + minimatch: 9.0.3 + read-package-json-fast: 3.0.2 + dev: false + + /@npmcli/metavuln-calculator@7.0.0: + resolution: {integrity: sha512-Pw0tyX02VkpqlIQlG2TeiJNsdrecYeUU0ubZZa9pi3N37GCsxI+en43u4hYFdq+eSx1A9a9vwFAUyqEtKFsbHQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + cacache: 18.0.0 + json-parse-even-better-errors: 3.0.0 + pacote: 17.0.4 + semver: 7.5.4 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /@npmcli/name-from-folder@2.0.0: + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false /@npmcli/node-gyp@3.0.0: resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + + /@npmcli/package-json@5.0.0: + resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/git': 5.0.3 + glob: 10.3.4 + hosted-git-info: 7.0.1 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + proc-log: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - bluebird + dev: false /@npmcli/promise-spawn@6.0.2: resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} @@ -5716,6 +5861,20 @@ packages: which: 3.0.1 dev: true + /@npmcli/promise-spawn@7.0.0: + resolution: {integrity: sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + which: 4.0.0 + dev: false + + /@npmcli/query@3.0.1: + resolution: {integrity: sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + postcss-selector-parser: 6.0.13 + dev: false + /@npmcli/run-script@6.0.2: resolution: {integrity: sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -5729,6 +5888,19 @@ packages: - supports-color dev: true + /@npmcli/run-script@7.0.1: + resolution: {integrity: sha512-Od/JMrgkjZ8alyBE0IzeqZDiF1jgMez9Gkc/OYrCkHHiXNwM0wc6s7+h+xM7kYDZkS0tAoOLr9VvygyE5+2F7g==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/node-gyp': 3.0.0 + '@npmcli/promise-spawn': 7.0.0 + node-gyp: 9.4.0 + read-package-json-fast: 3.0.2 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /@octokit/app@14.0.0: resolution: {integrity: sha512-g/zDXttroZ9Se08shK0d0d/j0cgSA+h4WV7qGUevNEM0piNBkIlfb4Fm6bSwCNAZhNf72mBgERmYOoxicPkqdw==} engines: {node: '>= 18'} @@ -6132,7 +6304,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} requiresBuild: true - dev: true optional: true /@playwright/test@1.37.1: @@ -7329,10 +7500,16 @@ packages: '@sigstore/protobuf-specs': 0.2.1 dev: true + /@sigstore/bundle@2.1.0: + resolution: {integrity: sha512-89uOo6yh/oxaU8AeOUnVrTdVMcGk9Q1hJa7Hkvalc6G3Z3CupWk4Xe9djSgJm9fMkH69s0P0cVHUoKSOemLdng==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + dev: false + /@sigstore/protobuf-specs@0.2.1: resolution: {integrity: sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true /@sigstore/sign@1.0.0: resolution: {integrity: sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==} @@ -7345,6 +7522,17 @@ packages: - supports-color dev: true + /@sigstore/sign@2.1.0: + resolution: {integrity: sha512-4VRpfJxs+8eLqzLVrZngVNExVA/zAhVbi4UT4zmtLi4xRd7vz5qie834OgkrGsLlLB1B2nz/3wUxT1XAUBe8gw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.0 + '@sigstore/protobuf-specs': 0.2.1 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /@sigstore/tuf@1.0.3: resolution: {integrity: sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7355,6 +7543,16 @@ packages: - supports-color dev: true + /@sigstore/tuf@2.2.0: + resolution: {integrity: sha512-KKATZ5orWfqd9ZG6MN8PtCIx4eevWSuGRKQvofnWXRpyMyUEpmrzg5M5BrCpjM+NfZ0RbNGOh5tCz/P2uoRqOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/protobuf-specs': 0.2.1 + tuf-js: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /@sinclair/typebox@0.24.51: resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} dev: true @@ -9007,6 +9205,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /@tufjs/canonical-json@2.0.0: + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + dev: false + /@tufjs/models@1.0.4: resolution: {integrity: sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -9015,6 +9218,14 @@ packages: minimatch: 9.0.3 dev: true + /@tufjs/models@2.0.0: + resolution: {integrity: sha512-c8nj8BaOExmZKO2DXhDfegyhSGcG9E/mPN3U13L+/PsoWm1uaGiHHjxqSHQiasDBQwDA3aHuw9+9spYAP1qvvg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 9.0.3 + dev: false + /@types/aria-query@5.0.1: resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} dev: true @@ -9062,6 +9273,12 @@ packages: resolution: {integrity: sha512-wJsiX1tosQ+J5+bY5LrSahHxr2wT+uME5UDwdN1kg4frt40euqA+wzECkmq4t5QbveHiJepfdThgQrPw6KiSlg==} dev: true + /@types/cacache@17.0.0: + resolution: {integrity: sha512-4BfoYFzkHdmINTyUIX9MSbKUkntVPR082FRnNc+5KlvvebrcxWWhfP3MRQ28QgfFncP3fTKCuemDYJqFjmWEAA==} + dependencies: + '@types/node': 18.17.13 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -9228,6 +9445,12 @@ packages: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: true + /@types/ignore-walk@4.0.1: + resolution: {integrity: sha512-jve9GxuPfapQBNbsmLB4yTUV/uT16xJTxgnlcEWKcA9D5i1uMqokpyq7eKjrTH0zb1sBx1SAY3xRXSbxqj0fAg==} + dependencies: + '@types/node': 18.17.13 + dev: true + /@types/istanbul-lib-coverage@2.0.4: resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} dev: true @@ -9380,6 +9603,53 @@ packages: /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + /@types/npm-package-arg@6.1.2: + resolution: {integrity: sha512-K7TdZq7dTZKKgxaFGLR6VPAeNMDM7GwTELlVNyzQ0KKc6Du3+SYYRXFNEDrsCptpEpMjMNKVlb/5/ZNS/MeHjw==} + dev: true + + /@types/npm-packlist@7.0.1: + resolution: {integrity: sha512-yXDRMaiBWpn7ZrWU95DSQwsEMOfPCWgOkJlQzLsDToRzNhRW3v6GxZXGjqMEwq5juziJleS6hNfjvwhTAuNZxQ==} + dependencies: + '@types/ignore-walk': 4.0.1 + '@types/npmcli__arborist': 5.6.2 + dev: true + + /@types/npm-registry-fetch@8.0.5: + resolution: {integrity: sha512-mAyQmKTF/4dhXTeSicltEtMO+Vj/LEUoBkMgDn9tS2fGp8IsrZPkYv2GH0KKBcbFLXUq67wuzYwl0DCZGeRcpw==} + dependencies: + '@types/node': 18.17.13 + '@types/node-fetch': 2.6.4 + '@types/npm-package-arg': 6.1.2 + '@types/npmlog': 4.1.4 + '@types/ssri': 7.1.1 + dev: true + + /@types/npmcli__arborist@5.6.2: + resolution: {integrity: sha512-WoQds2QiNPxMCOiQXVwfTiHNOSEUyTR0DY2mev+sMMY1c6AxjCFEnbiZsHLDJnIGL363W9IAZz1GD0kQuKvoRg==} + dependencies: + '@npm/types': 1.0.2 + '@types/cacache': 17.0.0 + '@types/npmcli__package-json': 4.0.1 + '@types/pacote': 11.1.6 + dev: true + + /@types/npmcli__package-json@4.0.1: + resolution: {integrity: sha512-KgMyvMpqwQVVF3GuIb9rEEfrs7LQUuOeUMeqFJOI3NzhBI2HMnSMFxSRgrkj6WHac+NkbYjxkEugJocKr3L7rw==} + dev: true + + /@types/npmlog@4.1.4: + resolution: {integrity: sha512-WKG4gTr8przEZBiJ5r3s8ZIAoMXNbOgQ+j/d5O4X3x6kZJRLNvyUJuUK/KoG3+8BaOHPhp2m7WC6JKKeovDSzQ==} + dev: true + + /@types/pacote@11.1.6: + resolution: {integrity: sha512-Uh0+ivCS2p+pMFZmU1u20sGi7O8BJnBOCuNXsBaAMD/6/NIcbI/CcnBUNpTeVhOuFmOwn9/z8BxprpPhL+UkVg==} + dependencies: + '@types/node': 18.17.13 + '@types/npm-registry-fetch': 8.0.5 + '@types/npmlog': 4.1.4 + '@types/ssri': 7.1.1 + dev: true + /@types/prettier@2.6.0: resolution: {integrity: sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==} dev: true @@ -9466,12 +9736,18 @@ packages: resolution: {integrity: sha512-DPP/jkDaqGiyU75MyMURxLWyYLwKSjnAuGe9ZCsLp9QZOpXmDfuevk769F0BS86TmRuD5krnp06qw9nSoNO+0g==} dependencies: '@types/node': 18.17.13 - dev: false /@types/stack-utils@2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true + /@types/tar@6.1.6: + resolution: {integrity: sha512-HQ06kiiDXz9uqtmE9ksQUn1ovcPr1gGV9EgaCWo6FGYKD0onNBCetBzL0kfcS8Kbj1EFxJWY9jL2W4ZvvtGI8Q==} + dependencies: + '@types/node': 18.17.13 + minipass: 4.2.8 + dev: true + /@types/triple-beam@1.3.2: resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} requiresBuild: true @@ -10367,7 +10643,18 @@ packages: /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true + + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -10449,12 +10736,20 @@ packages: transitivePeerDependencies: - supports-color + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /agentkeepalive@4.5.0: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} dependencies: humanize-ms: 1.2.1 - dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -10527,7 +10822,6 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: true /ansi-split@1.0.1: resolution: {integrity: sha512-RRxQym4DFtDNmHIkW6aeFVvrXURb11lGAEPXNiryjCe8bK8RsANjzJ0M2aGOkvBYwP4Bl/xZ8ijtr6D3j1x/eg==} @@ -10555,7 +10849,6 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: true /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -10573,7 +10866,6 @@ packages: /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true /archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} @@ -10625,7 +10917,14 @@ packages: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: true + + /are-we-there-yet@4.0.1: + resolution: {integrity: sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 4.4.2 + dev: false /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -11149,6 +11448,16 @@ packages: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} engines: {node: '>=0.6'} + /bin-links@4.0.2: + resolution: {integrity: sha512-jxJ0PbXR8eQyPlExCvCs3JFnikvs1Yp4gUJt6nmgathdOwvur+q22KWC3h20gvWl4T/14DXKj2IlkJwwZkZPOw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + cmd-shim: 6.0.1 + npm-normalize-package-bin: 3.0.1 + read-cmd-shim: 4.0.0 + write-file-atomic: 5.0.1 + dev: false + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -11326,7 +11635,6 @@ packages: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: semver: 7.5.4 - dev: true /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} @@ -11419,9 +11727,26 @@ packages: minipass-pipeline: 1.2.4 p-map: 4.0.0 ssri: 10.0.5 - tar: 6.1.15 + tar: 6.2.0 unique-filename: 3.0.0 - dev: true + + /cacache@18.0.0: + resolution: {integrity: sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.0 + fs-minipass: 3.0.3 + glob: 10.3.4 + lru-cache: 10.0.1 + minipass: 7.0.3 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.5 + tar: 6.2.0 + unique-filename: 3.0.0 + dev: false /cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} @@ -11858,6 +12183,11 @@ packages: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} + /cmd-shim@6.0.1: + resolution: {integrity: sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -11920,7 +12250,6 @@ packages: /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true - dev: true /color@3.2.1: resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} @@ -11979,6 +12308,10 @@ packages: has-own-prop: 2.0.0 repeat-string: 1.6.1 + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: false + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true @@ -12114,7 +12447,6 @@ packages: /console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true /constructs@10.2.70: resolution: {integrity: sha512-z6zr1E8K/9tzJbCQzY0UGX0/oVKPFKu9C/mzEnghCG6TAJINnvlq0CMKm63XqqeMleadZYm5T3sZGJKcxJS/Pg==} @@ -12737,7 +13069,6 @@ packages: /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true /denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} @@ -12938,7 +13269,7 @@ packages: dependencies: semver: 7.5.4 shelljs: 0.8.5 - typescript: 5.3.0-dev.20231003 + typescript: 5.3.0-dev.20231005 dev: true /dset@3.1.2: @@ -12957,7 +13288,6 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -13026,7 +13356,6 @@ packages: requiresBuild: true dependencies: iconv-lite: 0.6.3 - dev: true optional: true /end-of-stream@1.4.4: @@ -13056,7 +13385,6 @@ packages: /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - dev: true /env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} @@ -13071,7 +13399,6 @@ packages: /err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: true /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -14013,6 +14340,11 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -14104,7 +14436,6 @@ packages: /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: true /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} @@ -14411,7 +14742,6 @@ packages: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: true /form-data-encoder@2.1.4: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} @@ -14524,7 +14854,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: minipass: 7.0.3 - dev: true /fs-monkey@1.0.4: resolution: {integrity: sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==} @@ -14575,7 +14904,20 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: true + + /gauge@5.0.1: + resolution: {integrity: sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 4.1.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false /generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} @@ -14688,7 +15030,7 @@ packages: mri: 1.2.0 node-fetch-native: 1.4.0 pathe: 1.1.1 - tar: 6.1.15 + tar: 6.2.0 transitivePeerDependencies: - supports-color @@ -14781,7 +15123,6 @@ packages: minimatch: 9.0.3 minipass: 7.0.3 path-scurry: 1.10.1 - dev: true /glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} @@ -14989,7 +15330,6 @@ packages: /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true /has-yarn@3.0.0: resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} @@ -15029,6 +15369,13 @@ packages: dependencies: lru-cache: 7.18.3 + /hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.0.1 + dev: false + /html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -15056,7 +15403,6 @@ packages: /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} @@ -15089,6 +15435,16 @@ packages: transitivePeerDependencies: - supports-color + /http-proxy-agent@7.0.0: + resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /http2-wrapper@2.2.0: resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} engines: {node: '>=10.19.0'} @@ -15116,6 +15472,16 @@ packages: transitivePeerDependencies: - supports-color + /https-proxy-agent@7.0.2: + resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -15133,7 +15499,6 @@ packages: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: ms: 2.1.3 - dev: true /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -15146,7 +15511,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: true /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -15160,7 +15524,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: minimatch: 9.0.3 - dev: true /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} @@ -15393,7 +15756,6 @@ packages: /ip@2.0.0: resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -15565,7 +15927,6 @@ packages: /is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: true /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} @@ -15756,7 +16117,6 @@ packages: /isexe@3.1.1: resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} engines: {node: '>=16'} - dev: true /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} @@ -15838,7 +16198,6 @@ packages: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: true /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} @@ -17164,7 +17523,6 @@ packages: /json-parse-even-better-errors@3.0.0: resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true /json-parse-helpfulerror@1.0.3: resolution: {integrity: sha512-XgP0FGR77+QhUxjXkwOMkC94k3WtqEBfcnjWqhRd82qTat4SWKRE+9kUnynz/shm3I4ea2+qISvTIeGTNU7kJg==} @@ -17190,6 +17548,10 @@ packages: dependencies: jsonify: 0.0.1 + /json-stringify-nice@1.1.4: + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} + dev: false + /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -17229,7 +17591,6 @@ packages: /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - dev: true /jsonschema@1.4.1: resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} @@ -17269,6 +17630,14 @@ packages: setimmediate: 1.0.5 dev: false + /just-diff-apply@5.5.0: + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} + dev: false + + /just-diff@6.0.2: + resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} + dev: false + /just-extend@4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} dev: true @@ -17606,7 +17975,6 @@ packages: /lru-cache@10.0.1: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} engines: {node: 14 || >=16.14} - dev: true /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -17698,7 +18066,25 @@ packages: ssri: 10.0.5 transitivePeerDependencies: - supports-color - dev: true + + /make-fetch-happen@13.0.0: + resolution: {integrity: sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/agent': 2.2.0 + cacache: 18.0.0 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.0.3 + minipass-fetch: 3.0.4 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + ssri: 10.0.5 + transitivePeerDependencies: + - supports-color + dev: false /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -18129,7 +18515,6 @@ packages: engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: true /minipass-fetch@3.0.4: resolution: {integrity: sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==} @@ -18140,35 +18525,30 @@ packages: minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: true /minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: true /minipass-json-stream@1.0.1: resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} dependencies: jsonparse: 1.3.1 minipass: 3.3.6 - dev: true /minipass-pipeline@1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: minipass: 3.3.6 - dev: true /minipass-sized@1.0.3: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} dependencies: minipass: 3.3.6 - dev: true /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} @@ -18176,6 +18556,11 @@ packages: dependencies: yallist: 4.0.0 + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true + /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} @@ -18183,7 +18568,6 @@ packages: /minipass@7.0.3: resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} engines: {node: '>=16 || 14 >=14.17'} - dev: true /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -18379,11 +18763,10 @@ packages: npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.5.4 - tar: 6.1.15 + tar: 6.2.0 which: 2.0.2 transitivePeerDependencies: - supports-color - dev: true /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -18423,7 +18806,14 @@ packages: hasBin: true dependencies: abbrev: 1.1.1 - dev: true + + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: false /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -18452,6 +18842,16 @@ packages: semver: 7.5.4 validate-npm-package-license: 3.0.4 + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + is-core-module: 2.13.0 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: false + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -18475,7 +18875,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: npm-normalize-package-bin: 3.0.1 - dev: true /npm-check-updates@16.13.2: resolution: {integrity: sha512-0pQI+k1y0JVwenB2gBc69tXFYfkckSVrNrlcn7TIrZfis4LnfdzakY/LYzZKt/lx37edN2isk3d2Zw4csptu/w==} @@ -18523,12 +18922,10 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: semver: 7.5.4 - dev: true /npm-normalize-package-bin@3.0.1: resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true /npm-package-arg@10.1.0: resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} @@ -18540,6 +18937,16 @@ packages: validate-npm-package-name: 5.0.0 dev: true + /npm-package-arg@11.0.1: + resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + proc-log: 3.0.0 + semver: 7.5.4 + validate-npm-package-name: 5.0.0 + dev: false + /npm-packlist@7.0.4: resolution: {integrity: sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -18547,6 +18954,13 @@ packages: ignore-walk: 6.0.3 dev: true + /npm-packlist@8.0.0: + resolution: {integrity: sha512-ErAGFB5kJUciPy1mmx/C2YFbvxoJ0QJ9uwkCZOeR6CqLLISPZBOiFModAbSXnjjlwW5lOhuhXva+fURsSGJqyw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + ignore-walk: 6.0.3 + dev: false + /npm-path@2.0.4: resolution: {integrity: sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==} engines: {node: '>=0.8'} @@ -18565,6 +18979,16 @@ packages: semver: 7.5.4 dev: true + /npm-pick-manifest@9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.2.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.1 + semver: 7.5.4 + dev: false + /npm-registry-fetch@14.0.5: resolution: {integrity: sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -18580,6 +19004,21 @@ packages: - supports-color dev: true + /npm-registry-fetch@16.0.0: + resolution: {integrity: sha512-JFCpAPUpvpwfSydv99u85yhP68rNIxSFmDpNbNnRWKSe3gpjHnWL8v320gATwRzjtgmZ9Jfe37+ZPOLZPwz6BQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + make-fetch-happen: 13.0.0 + minipass: 7.0.3 + minipass-fetch: 3.0.4 + minipass-json-stream: 1.0.1 + minizlib: 2.1.2 + npm-package-arg: 11.0.1 + proc-log: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -18685,7 +19124,16 @@ packages: console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - dev: true + + /npmlog@7.0.1: + resolution: {integrity: sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + are-we-there-yet: 4.0.1 + console-control-strings: 1.1.0 + gauge: 5.0.1 + set-blocking: 2.0.0 + dev: false /nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -19026,12 +19474,40 @@ packages: read-package-json-fast: 3.0.2 sigstore: 1.9.0 ssri: 10.0.5 - tar: 6.1.15 + tar: 6.2.0 transitivePeerDependencies: - bluebird - supports-color dev: true + /pacote@17.0.4: + resolution: {integrity: sha512-eGdLHrV/g5b5MtD5cTPyss+JxOlaOloSMG3UwPMAvL8ywaLJ6beONPF40K4KKl/UI6q5hTKCJq5rCu8tkF+7Dg==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + '@npmcli/git': 5.0.3 + '@npmcli/installed-package-contents': 2.0.2 + '@npmcli/promise-spawn': 7.0.0 + '@npmcli/run-script': 7.0.1 + cacache: 18.0.0 + fs-minipass: 3.0.3 + minipass: 7.0.3 + npm-package-arg: 11.0.1 + npm-packlist: 8.0.0 + npm-pick-manifest: 9.0.0 + npm-registry-fetch: 16.0.0 + proc-log: 3.0.0 + promise-retry: 2.0.1 + read-package-json: 7.0.0 + read-package-json-fast: 3.0.2 + sigstore: 2.1.0 + ssri: 10.0.5 + tar: 6.2.0 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} dev: true @@ -19046,6 +19522,15 @@ packages: dependencies: callsites: 3.1.0 + /parse-conflict-json@3.0.1: + resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + just-diff: 6.0.2 + just-diff-apply: 5.5.0 + dev: false + /parse-github-url@1.0.2: resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} engines: {node: '>=0.10.0'} @@ -19154,7 +19639,6 @@ packages: dependencies: lru-cache: 10.0.1 minipass: 7.0.3 - dev: true /path-temp@2.1.0: resolution: {integrity: sha512-cMMJTAZlion/RWRRC48UbrDymEIt+/YSD/l8NqjneyDw2rDOBQcP5yRkMB4CYGn47KMhZvbblBP7Z79OsMw72w==} @@ -19480,7 +19964,6 @@ packages: /proc-log@3.0.0: resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -19527,6 +20010,14 @@ packages: - yaml - yargs + /promise-all-reject-late@1.0.1: + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} + dev: false + + /promise-call-limit@1.0.2: + resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} + dev: false + /promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -19534,7 +20025,6 @@ packages: peerDependenciesMeta: bluebird: optional: true - dev: true /promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} @@ -19542,7 +20032,6 @@ packages: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: true /prompts-ncu@3.0.0: resolution: {integrity: sha512-qyz9UxZ5MlPKWVhWrCmSZ1ahm2GVYdjLb8og2sg0IPth1KRuhcggHGuijz0e41dkx35p1t1q3GRISGH7QGALFA==} @@ -19967,6 +20456,11 @@ packages: dependencies: pify: 2.3.0 + /read-cmd-shim@4.0.0: + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /read-ini-file@4.0.0: resolution: {integrity: sha512-zz4qv/sKETv7nAkATqSJ9YMbKD8NXRPuA8d17VdYCuNYrVstB1S6UAMU6aytf5vRa9MESbZN7jLZdcmrOxz4gg==} engines: {node: '>=14.6'} @@ -19981,7 +20475,6 @@ packages: dependencies: json-parse-even-better-errors: 3.0.0 npm-normalize-package-bin: 3.0.1 - dev: true /read-package-json@6.0.4: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} @@ -19993,6 +20486,16 @@ packages: npm-normalize-package-bin: 3.0.1 dev: true + /read-package-json@7.0.0: + resolution: {integrity: sha512-uL4Z10OKV4p6vbdvIXB+OzhInYtIozl/VxUBPgNkBuUi2DeRonnuspmaVAMcrkmfjKGNmRndyQAbE7/AmzGwFg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + glob: 10.3.4 + json-parse-even-better-errors: 3.0.0 + normalize-package-data: 6.0.0 + npm-normalize-package-bin: 3.0.1 + dev: false + /read-pkg-up@3.0.0: resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} engines: {node: '>=4'} @@ -20061,6 +20564,17 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + dev: false + /readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} dependencies: @@ -20358,7 +20872,6 @@ packages: /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -20619,7 +21132,6 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} @@ -20697,6 +21209,18 @@ packages: - supports-color dev: true + /sigstore@2.1.0: + resolution: {integrity: sha512-kPIj+ZLkyI3QaM0qX8V/nSsweYND3W448pwkDgS6CQ74MfhEkIR8ToK5Iyx46KJYRjseVcD3Rp9zAmUAj6ZjPw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@sigstore/bundle': 2.1.0 + '@sigstore/protobuf-specs': 0.2.1 + '@sigstore/sign': 2.1.0 + '@sigstore/tuf': 2.2.0 + transitivePeerDependencies: + - supports-color + dev: false + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: true @@ -20763,7 +21287,6 @@ packages: /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: true /socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} @@ -20774,7 +21297,17 @@ packages: socks: 2.7.1 transitivePeerDependencies: - supports-color - dev: true + + /socks-proxy-agent@8.0.2: + resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false /socks@2.7.1: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} @@ -20782,7 +21315,6 @@ packages: dependencies: ip: 2.0.0 smart-buffer: 4.2.0 - dev: true /sort-json@2.0.1: resolution: {integrity: sha512-s8cs2bcsQCzo/P2T/uoU6Js4dS/jnX8+4xunziNoq9qmSpZNCrRIAIvp4avsz0ST18HycV4z/7myJ7jsHWB2XQ==} @@ -20893,7 +21425,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: minipass: 7.0.3 - dev: true /stack-trace@0.0.10: resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} @@ -21028,7 +21559,6 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: true /string.prototype.matchall@4.0.9: resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} @@ -21094,7 +21624,6 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: true /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} @@ -21271,8 +21800,8 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} dependencies: chownr: 2.0.0 @@ -21537,6 +22066,11 @@ packages: requiresBuild: true dev: true + /treeverse@3.0.0: + resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: true @@ -21947,6 +22481,17 @@ packages: - supports-color dev: true + /tuf-js@2.1.0: + resolution: {integrity: sha512-eD7YPPjVlMzdggrOeE8zwoegUaG/rt6Bt3jwoQPunRiNVzgcCE009UDFJKJjG+Gk9wFu6W/Vi+P5d/5QpdD9jA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@tufjs/models': 2.0.0 + debug: 4.3.4 + make-fetch-happen: 13.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: @@ -22159,8 +22704,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typescript@5.3.0-dev.20231003: - resolution: {integrity: sha512-OyUdPjo1wNYs+PVDr9ARcEPs0aOqdxterOFzQzWK6DR4tsadKPbrOx8JgTOvSUwhkNOxBOEh7BonqV2uNsTxvA==} + /typescript@5.3.0-dev.20231005: + resolution: {integrity: sha512-Twm3wBauTO94CSWbjXFMpsHsbaOUVssreq6pUo4wr8YsaIp0jim8EeCa9LfawFetQ+P4PODMmiM+uBhhWRVX0Q==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -22236,14 +22781,12 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: unique-slug: 4.0.0 - dev: true /unique-slug@4.0.0: resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: imurmurhash: 0.1.4 - dev: true /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -22528,7 +23071,6 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: builtins: 5.0.1 - dev: true /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} @@ -22981,6 +23523,10 @@ packages: xml-name-validator: 3.0.0 dev: true + /walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + dev: false + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -23228,7 +23774,6 @@ packages: hasBin: true dependencies: isexe: 3.1.1 - dev: true /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} @@ -23243,7 +23788,6 @@ packages: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 - dev: true /widest-line@3.1.0: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} @@ -23318,7 +23862,6 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ee1a2596cb9..429bbbf8a59 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,4 +7,5 @@ packages: - "apps/wing-console/console/*" - "apps/wing-console/tools/*" - "examples/tests/*" + - "examples/*" - "apps/jsii-docgen/test/__fixtures__/**" diff --git a/tools/hangar/__snapshots__/invalid.ts.snap b/tools/hangar/__snapshots__/invalid.ts.snap index 11524ac12b6..d6918913fe7 100644 --- a/tools/hangar/__snapshots__/invalid.ts.snap +++ b/tools/hangar/__snapshots__/invalid.ts.snap @@ -309,11 +309,11 @@ exports[`bring_jsii.test.w 1`] = ` | ^^^^^^^^^^^^^^^^^^^^^^^^^^ bring \\"jsii-code-samples\\" must be assigned to an identifier (e.g. bring \\"foo\\" as foo) -error: Cannot find jsii module \\"foobar\\" in source directory: Unable to load \\"foobar\\": Module not found in \\"../../../examples/tests/invalid\\" +error: Unable to load \\"foobar\\": Module not found in \\"../../../examples/tests/invalid/bring_jsii.test.w\\" --> ../../../examples/tests/invalid/bring_jsii.test.w:4:1 | 4 | bring \\"foobar\\" as baz; - | ^^^^^^^^^^^^^^^^^^^^^^ Cannot find jsii module \\"foobar\\" in source directory: Unable to load \\"foobar\\": Module not found in \\"../../../examples/tests/invalid\\" + | ^^^^^^^^^^^^^^^^^^^^^^ Unable to load \\"foobar\\": Module not found in \\"../../../examples/tests/invalid/bring_jsii.test.w\\" diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md new file mode 100644 index 00000000000..16bee721538 --- /dev/null +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md @@ -0,0 +1,222 @@ +# [bring_wing_library.test.w](../../../../../examples/tests/valid/bring_wing_library.test.w) | compile | tf-aws + +## inflight.Store-2.js +```js +module.exports = function({ $myutil_Util }) { + class Store { + constructor({ $this_data }) { + this.$this_data = $this_data; + } + async set(message) { + (await this.$this_data.put("data.txt",(await $myutil_Util.double(message)))); + } + } + return Store; +} + +``` + +## inflight.Util-1.js +```js +module.exports = function({ }) { + class Util { + constructor({ }) { + } + static async double(msg) { + return String.raw({ raw: ["", "", ""] }, msg, msg); + } + } + return Util; +} + +``` + +## main.tf.json +```json +{ + "//": { + "metadata": { + "backend": "local", + "stackName": "root", + "version": "0.17.0" + }, + "outputs": { + "root": { + "Default": { + "cloud.TestRunner": { + "TestFunctionArns": "WING_TEST_RUNNER_FUNCTION_ARNS" + } + } + } + } + }, + "output": { + "WING_TEST_RUNNER_FUNCTION_ARNS": { + "value": "[]" + } + }, + "provider": { + "aws": [ + {} + ] + }, + "resource": { + "aws_s3_bucket": { + "fixtureStore_cloudBucket_0EE75A93": { + "//": { + "metadata": { + "path": "root/Default/Default/fixture.Store/cloud.Bucket/Default", + "uniqueId": "fixtureStore_cloudBucket_0EE75A93" + } + }, + "bucket_prefix": "cloud-bucket-c8afb3a9-", + "force_destroy": false + } + } + } +} +``` + +## preflight.enums-1.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + const FavoriteNumbers = + (function (tmp) { + tmp[tmp["SEVEN"] = 0] = "SEVEN"; + tmp[tmp["FORTY_TWO"] = 1] = "FORTY_TWO"; + return tmp; + })({}) + ; + return { FavoriteNumbers }; +}; + +``` + +## preflight.js +```js +const $stdlib = require('@winglang/sdk'); +const $plugins = ((s) => !s ? [] : s.split(';'))(process.env.WING_PLUGIN_PATHS); +const $outdir = process.env.WING_SYNTH_DIR ?? "."; +const $wing_is_test = process.env.WING_IS_TEST === "true"; +const std = $stdlib.std; +const fixture = require("./preflight.wingfixture-5.js")({ $stdlib }); +class $Root extends $stdlib.std.Resource { + constructor(scope, id) { + super(scope, id); + new fixture.Store(this,"fixture.Store"); + const fave_num = fixture.FavoriteNumbers.SEVEN; + } +} +const $App = $stdlib.core.App.for(process.env.WING_TARGET); +new $App({ outdir: $outdir, name: "bring_wing_library.test", rootConstruct: $Root, plugins: $plugins, isTestEnvironment: $wing_is_test, entrypointDir: process.env['WING_SOURCE_DIR'], rootId: process.env['WING_ROOT_ID'] }).synth(); + +``` + +## preflight.store-3.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + const cloud = $stdlib.cloud; + const myutil = require("./preflight.util-2.js")({ $stdlib }); + class Store extends $stdlib.std.Resource { + constructor(scope, id, ) { + super(scope, id); + this.data = this.node.root.newAbstract("@winglang/sdk.cloud.Bucket",this,"cloud.Bucket"); + } + static _toInflightType(context) { + return ` + require("./inflight.Store-2.js")({ + $myutil_Util: ${context._lift($stdlib.core.toLiftableModuleType(myutil.Util, "", "Util"))}, + }) + `; + } + _toInflight() { + return ` + (await (async () => { + const StoreClient = ${Store._toInflightType(this)}; + const client = new StoreClient({ + $this_data: ${this._lift(this.data)}, + }); + if (client.$inflight_init) { await client.$inflight_init(); } + return client; + })()) + `; + } + _getInflightOps() { + return ["set", "$inflight_init"]; + } + _registerBind(host, ops) { + if (ops.includes("$inflight_init")) { + Store._registerBindObject(this.data, host, []); + } + if (ops.includes("set")) { + Store._registerBindObject($stdlib.core.toLiftableModuleType(myutil.Util, "", "Util"), host, ["double"]); + Store._registerBindObject(this.data, host, ["put"]); + } + super._registerBind(host, ops); + } + } + return { Store }; +}; + +``` + +## preflight.subdir-4.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + return { + ...require("./preflight.util-2.js")({ $stdlib }), + }; +}; + +``` + +## preflight.util-2.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + class Util extends $stdlib.std.Resource { + constructor(scope, id, ) { + super(scope, id); + } + static _toInflightType(context) { + return ` + require("./inflight.Util-1.js")({ + }) + `; + } + _toInflight() { + return ` + (await (async () => { + const UtilClient = ${Util._toInflightType(this)}; + const client = new UtilClient({ + }); + if (client.$inflight_init) { await client.$inflight_init(); } + return client; + })()) + `; + } + _getInflightOps() { + return ["double", "$inflight_init"]; + } + } + return { Util }; +}; + +``` + +## preflight.wingfixture-5.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + return { + subdir: require("./preflight.subdir-4.js")({ $stdlib }), + ...require("./preflight.store-3.js")({ $stdlib }), + ...require("./preflight.enums-1.js")({ $stdlib }), + }; +}; + +``` + diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_test_sim.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_test_sim.md new file mode 100644 index 00000000000..54bd5c5e6d9 --- /dev/null +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_test_sim.md @@ -0,0 +1,12 @@ +# [bring_wing_library.test.w](../../../../../examples/tests/valid/bring_wing_library.test.w) | test | sim + +## stdout.log +```log +pass ─ bring_wing_library.test.wsim (no tests) + + +Tests 1 passed (1) +Test Files 1 passed (1) +Duration +``` + diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_compile_tf-aws.md new file mode 100644 index 00000000000..34cdd0fb29e --- /dev/null +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_compile_tf-aws.md @@ -0,0 +1,194 @@ +# [bring_wing_library.w](../../../../../examples/tests/valid/bring_wing_library.w) | compile | tf-aws + +## inflight.Store-2.js +```js +module.exports = function({ $myutil_Util }) { + class Store { + constructor({ $this_data }) { + this.$this_data = $this_data; + } + async set(message) { + (await this.$this_data.put("data.txt",(await $myutil_Util.double(message)))); + } + } + return Store; +} + +``` + +## inflight.Util-1.js +```js +module.exports = function({ }) { + class Util { + constructor({ }) { + } + static async double(msg) { + return String.raw({ raw: ["", "", ""] }, msg, msg); + } + } + return Util; +} + +``` + +## main.tf.json +```json +{ + "//": { + "metadata": { + "backend": "local", + "stackName": "root", + "version": "0.17.0" + }, + "outputs": { + "root": { + "Default": { + "cloud.TestRunner": { + "TestFunctionArns": "WING_TEST_RUNNER_FUNCTION_ARNS" + } + } + } + } + }, + "output": { + "WING_TEST_RUNNER_FUNCTION_ARNS": { + "value": "[]" + } + }, + "provider": { + "aws": [ + {} + ] + }, + "resource": { + "aws_s3_bucket": { + "fixtureStore_cloudBucket_0EE75A93": { + "//": { + "metadata": { + "path": "root/Default/Default/fixture.Store/cloud.Bucket/Default", + "uniqueId": "fixtureStore_cloudBucket_0EE75A93" + } + }, + "bucket_prefix": "cloud-bucket-c8afb3a9-", + "force_destroy": false + } + }, + "aws_s3_bucket_server_side_encryption_configuration": { + "fixtureStore_cloudBucket_Encryption_6A8FAEBA": { + "//": { + "metadata": { + "path": "root/Default/Default/fixture.Store/cloud.Bucket/Encryption", + "uniqueId": "fixtureStore_cloudBucket_Encryption_6A8FAEBA" + } + }, + "bucket": "${aws_s3_bucket.fixtureStore_cloudBucket_0EE75A93.bucket}", + "rule": [ + { + "apply_server_side_encryption_by_default": { + "sse_algorithm": "AES256" + } + } + ] + } + } + } +} +``` + +## preflight.js +```js +const $stdlib = require('@winglang/sdk'); +const $outdir = process.env.WING_SYNTH_DIR ?? "."; +const $wing_is_test = process.env.WING_IS_TEST === "true"; +const std = $stdlib.std; +const fixture = require("./preflight.lib-2.js")({ $stdlib }); +class $Root extends $stdlib.std.Resource { + constructor(scope, id) { + super(scope, id); + new fixture.Store(this,"fixture.Store"); + } +} +const $App = $stdlib.core.App.for(process.env.WING_TARGET); +new $App({ outdir: $outdir, name: "bring_wing_library", rootConstruct: $Root, plugins: $plugins, isTestEnvironment: $wing_is_test, entrypointDir: process.env['WING_SOURCE_DIR'], rootId: process.env['WING_ROOT_ID'] }).synth(); + +``` + +## preflight.lib-2.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + const cloud = $stdlib.cloud; + const myutil = require("./preflight.util-1.js")({ $stdlib }); + class Store extends $stdlib.std.Resource { + constructor(scope, id, ) { + super(scope, id); + this._addInflightOps("set", "$inflight_init"); + this.data = this.node.root.newAbstract("@winglang/sdk.cloud.Bucket",this,"cloud.Bucket"); + } + static _toInflightType(context) { + return $stdlib.core.NodeJsCode.fromInline(` + require("./inflight.Store-2.js")({ + $myutil_Util: ${context._lift(myutil.Util)}, + }) + `); + } + _toInflight() { + return $stdlib.core.NodeJsCode.fromInline(` + (await (async () => { + const StoreClient = ${Store._toInflightType(this).text}; + const client = new StoreClient({ + $this_data: ${this._lift(this.data)}, + }); + if (client.$inflight_init) { await client.$inflight_init(); } + return client; + })()) + `); + } + _registerBind(host, ops) { + if (ops.includes("$inflight_init")) { + Store._registerBindObject(this.data, host, []); + } + if (ops.includes("set")) { + Store._registerBindObject(myutil.Util, host, ["double"]); + Store._registerBindObject(this.data, host, ["put"]); + } + super._registerBind(host, ops); + } + } + return { Store }; +}; + +``` + +## preflight.util-1.js +```js +module.exports = function({ $stdlib }) { + const std = $stdlib.std; + class Util extends $stdlib.std.Resource { + constructor(scope, id, ) { + super(scope, id); + this._addInflightOps("double", "$inflight_init"); + } + static _toInflightType(context) { + return $stdlib.core.NodeJsCode.fromInline(` + require("./inflight.Util-1.js")({ + }) + `); + } + _toInflight() { + return $stdlib.core.NodeJsCode.fromInline(` + (await (async () => { + const UtilClient = ${Util._toInflightType(this).text}; + const client = new UtilClient({ + }); + if (client.$inflight_init) { await client.$inflight_init(); } + return client; + })()) + `); + } + } + return { Util }; +}; + +``` + diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_test_sim.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_test_sim.md new file mode 100644 index 00000000000..42af2f408ac --- /dev/null +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.w_test_sim.md @@ -0,0 +1,12 @@ +# [bring_wing_library.w](../../../../../examples/tests/valid/bring_wing_library.w) | test | sim + +## stdout.log +```log +pass ─ bring_wing_library.wsim (no tests) + + +Tests 1 passed (1) +Test Files 1 passed (1) +Duration +``` +