├── .gitignore ├── tests ├── resolve_error │ ├── testdata │ │ ├── main.ts │ │ ├── deno.json │ │ ├── package.json │ │ └── node_modules │ │ │ ├── optional-dep │ │ │ ├── index.js │ │ │ ├── sub │ │ │ │ ├── index.js │ │ │ │ └── package.json │ │ │ └── package.json │ │ │ ├── optional-peer │ │ │ ├── index.js │ │ │ └── package.json │ │ │ ├── open-package │ │ │ ├── package.json │ │ │ └── index.js │ │ │ └── export-package │ │ │ ├── index.js │ │ │ └── package.json │ └── main.test.ts ├── invalid_graph │ ├── testdata │ │ ├── deno.json │ │ └── main.ts │ └── main.test.ts ├── jsx │ ├── testdata │ │ ├── main.jsx │ │ ├── main.tsx │ │ └── deno.json │ └── main.test.ts ├── platform_browser │ ├── testdata │ │ ├── deno.json │ │ ├── package.json │ │ └── node_modules │ │ │ ├── package │ │ │ ├── browser.js │ │ │ └── package.json │ │ │ └── browser-main │ │ │ ├── browser.js │ │ │ └── package.json │ └── main.test.ts ├── bytes_and_text_npm │ ├── testdata │ │ ├── package.json │ │ ├── data_utf8_bom.txt │ │ ├── node_modules │ │ │ └── package │ │ │ │ ├── data.txt │ │ │ │ └── package.json │ │ ├── deno.json │ │ └── main.ts │ └── main.test.ts ├── bytes_and_text │ ├── testdata │ │ ├── data_utf8_bom.txt │ │ ├── deno.json │ │ └── main.ts │ └── main.test.ts ├── resolve_async │ ├── testdata │ │ ├── deno.json │ │ └── deno.manual_install.json │ └── main.test.ts ├── link_jsr_entrypoint │ ├── testdata │ │ ├── main │ │ │ ├── deno.json │ │ │ └── main.ts │ │ └── add │ │ │ ├── deno.json │ │ │ └── mod.ts │ └── main.test.ts ├── http_no_ext.test.ts └── helpers.ts ├── src ├── rs_lib │ ├── .rustfmt.toml │ ├── rust-toolchain.toml │ ├── helpers.js │ ├── Cargo.toml │ ├── http_client.rs │ ├── lib.rs │ └── Cargo.lock ├── mod.test.ts └── mod.ts ├── .gitmodules ├── README.md ├── .vscode └── settings.json ├── scripts ├── commit.ts └── update-deps.ts ├── deno.json ├── LICENSE ├── .github └── workflows │ ├── update_deps.yml │ └── ci.yml └── deno.lock /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | src/lib 3 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/main.ts: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/deno.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /tests/invalid_graph/testdata/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /tests/jsx/testdata/main.jsx: -------------------------------------------------------------------------------- 1 | console.log(
); 2 | -------------------------------------------------------------------------------- /tests/platform_browser/testdata/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/package.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/testdata/package.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /tests/invalid_graph/testdata/main.ts: -------------------------------------------------------------------------------- 1 | import "unknown"; 2 | -------------------------------------------------------------------------------- /tests/platform_browser/testdata/package.json: -------------------------------------------------------------------------------- 1 | { 2 | } 3 | -------------------------------------------------------------------------------- /tests/bytes_and_text/testdata/data_utf8_bom.txt: -------------------------------------------------------------------------------- 1 | Hello there! -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/testdata/data_utf8_bom.txt: -------------------------------------------------------------------------------- 1 | Hello there! -------------------------------------------------------------------------------- /tests/platform_browser/testdata/node_modules/package/browser.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/optional-dep/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/platform_browser/testdata/node_modules/browser-main/browser.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/optional-dep/sub/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/optional-peer/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/resolve_async/testdata/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "lock": false 3 | } 4 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/optional-dep/sub/package.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/testdata/node_modules/package/data.txt: -------------------------------------------------------------------------------- 1 | Hello there! -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/testdata/node_modules/package/package.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/open-package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /src/rs_lib/.rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 80 2 | tab_spaces = 2 3 | edition = "2024" 4 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/open-package/index.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /src/rs_lib/rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "1.89.0" 3 | profile = "default" 4 | -------------------------------------------------------------------------------- /tests/jsx/testdata/main.tsx: -------------------------------------------------------------------------------- 1 | const value: string = ""; 2 | console.log(
, value); 3 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/export-package/index.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /tests/resolve_async/testdata/deno.manual_install.json: -------------------------------------------------------------------------------- 1 | { 2 | "nodeModulesDir": "manual" 3 | } 4 | -------------------------------------------------------------------------------- /tests/bytes_and_text/testdata/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "unstable": [ 3 | "raw-imports" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /tests/link_jsr_entrypoint/testdata/main/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "links": [ 3 | "../add" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/testdata/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "unstable": [ 3 | "raw-imports" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /tests/platform_browser/testdata/node_modules/browser-main/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "browser": "./browser.js" 3 | } 4 | -------------------------------------------------------------------------------- /tests/link_jsr_entrypoint/testdata/add/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@denotest/add", 3 | "exports": "./mod.ts" 4 | } 5 | -------------------------------------------------------------------------------- /tests/link_jsr_entrypoint/testdata/add/mod.ts: -------------------------------------------------------------------------------- 1 | export function add(a: number, b: number) { 2 | return a + b; 3 | } 4 | -------------------------------------------------------------------------------- /tests/link_jsr_entrypoint/testdata/main/main.ts: -------------------------------------------------------------------------------- 1 | import { add } from "@denotest/add"; 2 | 3 | console.log(add(1, 2)); 4 | -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/export-package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "exports": { 3 | "./test": "./index.js" 4 | } 5 | } -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/optional-dep/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "optionalDependencies": { 3 | "optional": "*" 4 | } 5 | } -------------------------------------------------------------------------------- /tests/resolve_error/testdata/node_modules/optional-peer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "peerDependenciesMeta": { 3 | "optional": { 4 | "optional": true 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /tests/platform_browser/testdata/node_modules/package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "exports": { 3 | ".": { 4 | "node": "./node.js", 5 | "import": "./browser.js" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tests/jsx/testdata/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "precompile", 4 | "jsxImportSource": "react" 5 | }, 6 | "lock": false, 7 | "imports": { 8 | "react": "npm:react@^19.1.0" 9 | } 10 | } -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/testdata/main.ts: -------------------------------------------------------------------------------- 1 | import dataBytes from "package/data.txt" with { type: "bytes" }; 2 | import dataText from "package/data.txt" with { type: "text" }; 3 | 4 | console.log(dataBytes); 5 | console.log(dataText); 6 | -------------------------------------------------------------------------------- /tests/bytes_and_text/testdata/main.ts: -------------------------------------------------------------------------------- 1 | import dataBytes from "./data_utf8_bom.txt" with { type: "bytes" }; 2 | import dataText from "./data_utf8_bom.txt" with { type: "text" }; 3 | 4 | console.log(dataBytes); 5 | console.log(dataText); 6 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | # We're using a submodule instead of a git dependency because cargo errors 2 | # on Windows when installing the Deno repo due to the submodules within 3 | # the Deno repo due to long paths 4 | [submodule "deno"] 5 | path = deno 6 | url = https://github.com/denoland/deno 7 | shallow = true 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `@deno/loader` 2 | 3 | [![JSR](https://jsr.io/badges/@deno/loader)](https://jsr.io/@deno/loader) 4 | 5 | Resolver and loader for Deno code. 6 | 7 | This can be used to create bundler plugins or libraries that use deno 8 | resolution. 9 | 10 | [Docs](https://jsr.io/@deno/loader) 11 | -------------------------------------------------------------------------------- /src/rs_lib/helpers.js: -------------------------------------------------------------------------------- 1 | export async function fetch_specifier(specifier, headers) { 2 | try { 3 | console.error("Downloading", specifier); 4 | const response = await fetch(specifier, { 5 | headers, 6 | redirect: "manual", 7 | }); 8 | const status = response.status; 9 | const body = await response.bytes(); 10 | return { 11 | status, 12 | body, 13 | headers: response.headers, 14 | }; 15 | } catch (err) { 16 | return { 17 | error: err.toString(), 18 | }; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "[rust]": { 4 | "editor.defaultFormatter": "rust-lang.rust-analyzer" 5 | }, 6 | "[typescript]": { 7 | "editor.defaultFormatter": "denoland.vscode-deno" 8 | }, 9 | "[json]": { 10 | "editor.defaultFormatter": "denoland.vscode-deno" 11 | }, 12 | "[yaml]": { 13 | "editor.defaultFormatter": "denoland.vscode-deno" 14 | }, 15 | // generally I wouldn't commit this file to source control, but 16 | // this setting is necessary in order to get this repo working 17 | // in vscode 18 | "rust-analyzer.linkedProjects": [ 19 | "./src/rs_lib/Cargo.toml" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /scripts/commit.ts: -------------------------------------------------------------------------------- 1 | import $ from "@david/dax"; 2 | 3 | const rootDir = $.path(import.meta.dirname!).parentOrThrow(); 4 | const denoDir = rootDir.join("deno"); 5 | 6 | const hasGitChanges = 7 | (await $`git status --porcelain`.text()).trim().length > 0; 8 | if (!hasGitChanges) { 9 | $.log("Had no git changes. Exiting."); 10 | Deno.exit(0); 11 | } 12 | 13 | const newCommit = (await $`git rev-parse HEAD`.cwd(denoDir).text()).trim(); 14 | $.logStep("Updating to", newCommit); 15 | 16 | await $`git add .`.cwd(rootDir); 17 | const commitMessage = `chore: Deno ${newCommit.substring(0, 7)}`; 18 | await $`git commit -m ${commitMessage}`; 19 | await $`git push`; 20 | -------------------------------------------------------------------------------- /tests/invalid_graph/main.test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "@std/assert"; 2 | import { createLoaderWithDiagnostics } from "../helpers.ts"; 3 | 4 | Deno.test("surfaces graph diagnostic", async () => { 5 | const mainFile = import.meta.dirname + "/testdata/main.ts"; 6 | const { diagnostics } = await createLoaderWithDiagnostics({ 7 | configPath: import.meta.dirname + "/testdata/deno.json", 8 | }, { 9 | entrypoints: [mainFile], 10 | }); 11 | 12 | assertEquals(diagnostics.length, 1); 13 | const expectedMessage = 'Import "unknown" not a dependency'; 14 | assertEquals( 15 | diagnostics[0].message.substring(0, expectedMessage.length), 16 | expectedMessage, 17 | ); 18 | }); 19 | -------------------------------------------------------------------------------- /tests/http_no_ext.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | assertResponseText, 3 | createLoader, 4 | RequestedModuleType, 5 | } from "./helpers.ts"; 6 | 7 | Deno.test("loads from http server", async () => { 8 | await using server = Deno.serve((_request) => { 9 | return new Response("console.log(1);", { 10 | headers: { 11 | "content-type": "application/javascript", 12 | }, 13 | }); 14 | }); 15 | 16 | const url = `http://localhost:${server.addr.port}/no-extension`; 17 | const { loader } = await createLoader({}, { 18 | entrypoints: [url], 19 | }); 20 | 21 | const response = await loader.load(url, RequestedModuleType.Default); 22 | assertResponseText( 23 | response, 24 | `console.log(1);`, 25 | ); 26 | }); 27 | -------------------------------------------------------------------------------- /tests/link_jsr_entrypoint/main.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | assertResponseText, 3 | createLoader, 4 | RequestedModuleType, 5 | ResolutionMode, 6 | } from "../helpers.ts"; 7 | 8 | Deno.test("loads linked entrypoint", async () => { 9 | const mainFile = import.meta.dirname + "/testdata/main/main.ts"; 10 | const { loader } = await createLoader({ 11 | configPath: import.meta.resolve("./testdata/main/deno.json"), 12 | }, { 13 | entrypoints: [mainFile], 14 | }); 15 | 16 | const response = await loader.load( 17 | loader.resolveSync("@denotest/add", undefined, ResolutionMode.Import), 18 | RequestedModuleType.Default, 19 | ); 20 | assertResponseText( 21 | response, 22 | `export function add(a, b) { 23 | return a + b; 24 | } 25 | `, 26 | { skipSourceMap: true }, 27 | ); 28 | }); 29 | -------------------------------------------------------------------------------- /tests/platform_browser/main.test.ts: -------------------------------------------------------------------------------- 1 | import { ResolutionMode } from "@deno/loader"; 2 | import { createLoader } from "../helpers.ts"; 3 | import { assert } from "@std/assert"; 4 | 5 | Deno.test("resolves to browser locations", async () => { 6 | const { loader } = await createLoader({ 7 | configPath: import.meta.dirname + "/testdata/deno.json", 8 | platform: "browser", 9 | }, { 10 | entrypoints: [], 11 | }); 12 | 13 | assert( 14 | loader.resolveSync( 15 | "package", 16 | import.meta.resolve("./testdata/main.js"), 17 | ResolutionMode.Import, 18 | ).endsWith("browser.js"), 19 | ); 20 | assert( 21 | loader.resolveSync( 22 | "browser-main", 23 | import.meta.resolve("./testdata/main.js"), 24 | ResolutionMode.Import, 25 | ).endsWith("browser.js"), 26 | ); 27 | }); 28 | -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@deno/loader", 3 | "tasks": { 4 | "build": "cd src/rs_lib && deno run -A jsr:@deno/wasmbuild@0.20.0 --out ../lib" 5 | }, 6 | "fmt": { 7 | "exclude": [ 8 | "src/lib" 9 | ] 10 | }, 11 | "lint": { 12 | "rules": { 13 | "exclude": ["no-explicit-any"] 14 | } 15 | }, 16 | "publish": { 17 | "exclude": [ 18 | ".github", 19 | ".vscode", 20 | ".gitmodules", 21 | "deno.lock", 22 | "!./src/lib", 23 | "scripts", 24 | "tests/" 25 | ] 26 | }, 27 | "exports": "./src/mod.ts", 28 | "exclude": [ 29 | "deno", 30 | "src/rs_lib/target", 31 | "target", 32 | "tests/**/testdata" 33 | ], 34 | "imports": { 35 | "@david/dax": "jsr:@david/dax@^0.43.2", 36 | "@std/assert": "jsr:@std/assert@^1.0.13", 37 | "@std/toml": "jsr:@std/toml@^1.0.7" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2025 the Deno authors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tests/bytes_and_text/main.test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "@std/assert"; 2 | import { 3 | assertResponseText, 4 | createLoader, 5 | RequestedModuleType, 6 | ResolutionMode, 7 | type WorkspaceOptions, 8 | } from "../helpers.ts"; 9 | 10 | Deno.test("loads bytes and text", async () => { 11 | const mainTs = import.meta.dirname + "/testdata/main.ts"; 12 | const createWorkspace = async (options?: WorkspaceOptions) => { 13 | return await createLoader({ 14 | configPath: import.meta.dirname + "/testdata/deno.json", 15 | ...(options ?? {}), 16 | }, { 17 | entrypoints: [mainTs], 18 | }); 19 | }; 20 | const { loader } = await createWorkspace(); 21 | 22 | const mainTsUrl = loader.resolveSync( 23 | mainTs, 24 | undefined, 25 | ResolutionMode.Import, 26 | ); 27 | const dataFileUrl = loader.resolveSync( 28 | "./data_utf8_bom.txt", 29 | mainTsUrl, 30 | ResolutionMode.Import, 31 | ); 32 | 33 | assertResponseText( 34 | await loader.load(dataFileUrl, RequestedModuleType.Text), 35 | `Hello there!`, 36 | ); 37 | const bytesResponse = await loader.load( 38 | dataFileUrl, 39 | RequestedModuleType.Bytes, 40 | ); 41 | if (bytesResponse.kind !== "module") { 42 | throw new Error("Fail"); 43 | } 44 | assertEquals(bytesResponse.code, Deno.readFileSync(new URL(dataFileUrl))); 45 | }); 46 | -------------------------------------------------------------------------------- /tests/bytes_and_text_npm/main.test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "@std/assert"; 2 | import { 3 | assertResponseText, 4 | createLoader, 5 | RequestedModuleType, 6 | ResolutionMode, 7 | type WorkspaceOptions, 8 | } from "../helpers.ts"; 9 | 10 | Deno.test("loads bytes and text in npm packages", async () => { 11 | const mainTs = import.meta.dirname + "/testdata/main.ts"; 12 | const createWorkspace = async (options?: WorkspaceOptions) => { 13 | return await createLoader({ 14 | configPath: import.meta.dirname + "/testdata/deno.json", 15 | ...(options ?? {}), 16 | }, { 17 | entrypoints: [mainTs], 18 | }); 19 | }; 20 | const { loader } = await createWorkspace(); 21 | 22 | const mainTsUrl = loader.resolveSync( 23 | mainTs, 24 | undefined, 25 | ResolutionMode.Import, 26 | ); 27 | const dataFileUrl = loader.resolveSync( 28 | "package/data.txt", 29 | mainTsUrl, 30 | ResolutionMode.Import, 31 | ); 32 | 33 | assertResponseText( 34 | await loader.load(dataFileUrl, RequestedModuleType.Text), 35 | `Hello there!`, 36 | ); 37 | const bytesResponse = await loader.load( 38 | dataFileUrl, 39 | RequestedModuleType.Bytes, 40 | ); 41 | if (bytesResponse.kind !== "module") { 42 | throw new Error("Fail"); 43 | } 44 | assertEquals(bytesResponse.code, Deno.readFileSync(new URL(dataFileUrl))); 45 | }); 46 | -------------------------------------------------------------------------------- /.github/workflows/update_deps.yml: -------------------------------------------------------------------------------- 1 | name: check_updates 2 | 3 | on: 4 | workflow_dispatch: 5 | # run this monday to thursday 6 | schedule: 7 | - cron: "0 11 * * 1-4" 8 | 9 | jobs: 10 | build: 11 | name: check updates 12 | if: github.repository == 'denoland/deno-js-loader' 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 45 15 | 16 | steps: 17 | - name: Clone repository 18 | uses: actions/checkout@v4 19 | with: 20 | submodules: true 21 | token: ${{ secrets.DENOBOT_PAT }} 22 | 23 | - uses: denoland/setup-deno@v2 24 | 25 | - name: Run script 26 | env: 27 | GITHUB_TOKEN: ${{ secrets.DENOBOT_PAT }} 28 | GH_WORKFLOW_ACTOR: ${{ github.actor }} 29 | run: | 30 | git config user.email "denobot@users.noreply.github.com" 31 | git config user.name "denobot" 32 | deno run -A ./scripts/update-deps.ts 33 | deno task build 34 | deno test -A 35 | deno run -A ./scripts/commit.ts 36 | 37 | # This is necessary to prevent GH automatically disabling this workflow after 60 days. 38 | workflow-keepalive: 39 | if: github.event_name == 'schedule' 40 | runs-on: ubuntu-latest 41 | permissions: 42 | actions: write 43 | steps: 44 | - uses: liskin/gh-workflow-keepalive@f72ff1a1336129f29bf0166c0fd0ca6cf1bcb38c 45 | -------------------------------------------------------------------------------- /tests/resolve_async/main.test.ts: -------------------------------------------------------------------------------- 1 | import { ResolutionMode } from "@deno/loader"; 2 | import { createLoader } from "../helpers.ts"; 3 | import { assert, assertRejects } from "@std/assert"; 4 | 5 | Deno.test("resolves npm specifiers and jsr specifiers on demand with resolveAsync", async () => { 6 | const { loader } = await createLoader({ 7 | configPath: import.meta.dirname + "/testdata/deno.json", 8 | }, { 9 | entrypoints: [], 10 | }); 11 | 12 | { 13 | const jsrUrl = await loader.resolve( 14 | "jsr:@david/code-block-writer", 15 | import.meta.url, 16 | ResolutionMode.Import, 17 | ); 18 | assert(jsrUrl.startsWith("https://")); 19 | } 20 | { 21 | const npmUrl = await loader.resolve( 22 | "npm:code-block-writer", 23 | import.meta.url, 24 | ResolutionMode.Import, 25 | ); 26 | assert(npmUrl.startsWith("file:///")); 27 | } 28 | }); 29 | 30 | Deno.test("errors when using nodeModulesDir: manual and npm package is not installed", async () => { 31 | const { loader } = await createLoader({ 32 | configPath: import.meta.dirname + "/testdata/deno.manual_install.json", 33 | }, { 34 | entrypoints: [], 35 | }); 36 | 37 | { 38 | await assertRejects( 39 | () => 40 | loader.resolve( 41 | "npm:code-block-writer", 42 | import.meta.url, 43 | ResolutionMode.Import, 44 | ), 45 | Error, 46 | "Could not find a matching package for 'npm:code-block-writer' in the node_modules directory.", 47 | ); 48 | } 49 | }); 50 | -------------------------------------------------------------------------------- /tests/helpers.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type LoadResponse, 3 | type ModuleLoadResponse, 4 | Workspace, 5 | type WorkspaceOptions, 6 | } from "@deno/loader"; 7 | import { assertEquals } from "@std/assert"; 8 | 9 | export * from "@deno/loader"; 10 | 11 | export async function createLoader( 12 | workspaceOptions: WorkspaceOptions, 13 | loaderOptions: { entrypoints: string[] }, 14 | ) { 15 | const { loader, workspace, diagnostics } = await createLoaderWithDiagnostics( 16 | workspaceOptions, 17 | loaderOptions, 18 | ); 19 | assertEquals(diagnostics, []); 20 | return { 21 | loader, 22 | workspace, 23 | }; 24 | } 25 | 26 | export async function createLoaderWithDiagnostics( 27 | workspaceOptions: WorkspaceOptions, 28 | loaderOptions: { entrypoints: string[] }, 29 | ) { 30 | const workspace = new Workspace(workspaceOptions); 31 | const loader = await workspace.createLoader(); 32 | const diagnostics = await loader.addEntrypoints(loaderOptions.entrypoints); 33 | return { 34 | loader, 35 | workspace, 36 | diagnostics, 37 | }; 38 | } 39 | 40 | export function assertResponseText( 41 | response: LoadResponse, 42 | text: string, 43 | opts?: { skipSourceMap?: boolean }, 44 | ) { 45 | assertEquals(response.kind, "module"); 46 | const moduleResponse = response as ModuleLoadResponse; 47 | let actualText = new TextDecoder().decode(moduleResponse.code); 48 | if (opts?.skipSourceMap) { 49 | actualText = actualText.replace( 50 | /\/\/# sourceMappingURL=.*$/, 51 | "", 52 | ); 53 | } 54 | assertEquals(actualText, text); 55 | } 56 | -------------------------------------------------------------------------------- /src/rs_lib/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rs_lib" 3 | version = "0.0.0" 4 | edition = "2024" 5 | 6 | [lib] 7 | crate-type = ["cdylib"] 8 | path = "lib.rs" 9 | 10 | # update this by running ./scripts/update-deps.ts 11 | [dependencies] 12 | anyhow = "1.0.57" 13 | console_error_panic_hook = "0.1.6" 14 | js-sys = "=0.3.82" 15 | log = "0.4.28" 16 | serde = "1.0.149" 17 | serde-wasm-bindgen = "=0.6.5" 18 | wasm-bindgen = "=0.2.105" 19 | wasm-bindgen-futures = "=0.4.55" 20 | async-trait = "0.1.73" 21 | deno_error = "=0.7.1" 22 | deno_path_util = "=0.6.4" 23 | deno_semver = "=0.9.1" 24 | url = "2.5" 25 | 26 | [dependencies.chrono] 27 | version = "0.4" 28 | default-features = false 29 | 30 | [dependencies.flate2] 31 | version = "1.0.30" 32 | default-features = false 33 | features = ["rust_backend"] 34 | 35 | [dependencies.deno_ast] 36 | version = "=0.52.0" 37 | features = ["transpiling"] 38 | 39 | [dependencies.deno_cache_dir] 40 | version = "=0.26.3" 41 | features = ["sync"] 42 | 43 | [dependencies.deno_config] 44 | path = "../../deno/libs/config" 45 | features = ["workspace","sync"] 46 | 47 | [dependencies.deno_graph] 48 | version = "=0.105.0" 49 | features = ["swc"] 50 | default-features = false 51 | 52 | [dependencies.deno_npm_cache] 53 | path = "../../deno/libs/npm_cache" 54 | 55 | [dependencies.deno_npm_installer] 56 | path = "../../deno/libs/npm_installer" 57 | default-features = false 58 | 59 | [dependencies.deno_resolver] 60 | path = "../../deno/libs/resolver" 61 | features = ["deno_ast","graph","sync"] 62 | 63 | [dependencies.deno_unsync] 64 | version = "0.4.4" 65 | default-features = false 66 | 67 | [dependencies.node_resolver] 68 | path = "../../deno/libs/node_resolver" 69 | features = ["sync"] 70 | 71 | [dependencies.sys_traits] 72 | version = "=0.1.17" 73 | features = ["real"] 74 | 75 | [target."cfg(target_arch = \"wasm32\")".dependencies.sys_traits] 76 | version = "=0.1.17" 77 | features = ["real","wasm"] 78 | 79 | [profile.release] 80 | codegen-units = 1 81 | incremental = true 82 | lto = true 83 | opt-level = "z" 84 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: [push, pull_request] 4 | 5 | concurrency: 6 | group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" 7 | cancel-in-progress: true 8 | 9 | jobs: 10 | deno: 11 | if: | 12 | github.event_name == 'push' || 13 | !startsWith(github.event.pull_request.head.label, 'denoland:') 14 | runs-on: ${{ matrix.os }} 15 | timeout-minutes: 30 16 | 17 | strategy: 18 | matrix: 19 | os: [macOS-latest, ubuntu-latest, windows-latest] 20 | 21 | steps: 22 | - name: Change Windows git settings 23 | if: contains(matrix.os, 'windows') 24 | run: | 25 | git config --global core.autocrlf false 26 | git config --global core.eol native 27 | - uses: actions/checkout@v4 28 | with: 29 | submodules: true 30 | 31 | - uses: denoland/setup-deno@v2 32 | with: 33 | cache: true 34 | deno-version: canary 35 | 36 | - uses: Swatinem/rust-cache@v2 37 | with: 38 | workspaces: src/rs_lib 39 | 40 | - name: build 41 | run: deno task build 42 | 43 | - name: fmt 44 | if: contains(matrix.os, 'ubuntu') 45 | run: deno fmt --check 46 | 47 | - name: lint 48 | if: contains(matrix.os, 'ubuntu') 49 | run: | 50 | deno lint 51 | cd src/rs_lib && cargo clippy 52 | 53 | - name: check 54 | run: deno check --doc 55 | 56 | - name: test 57 | run: deno test -A 58 | 59 | jsr: 60 | runs-on: ubuntu-latest 61 | permissions: 62 | contents: read 63 | id-token: write 64 | steps: 65 | - uses: actions/checkout@v4 66 | with: 67 | submodules: true 68 | - uses: denoland/setup-deno@v2 69 | with: 70 | deno-version: canary 71 | - uses: Swatinem/rust-cache@v2 72 | with: 73 | workspaces: src/rs_lib 74 | - name: build 75 | run: deno task build 76 | - name: Publish to JSR on tag 77 | run: deno run -A jsr:@david/publish-on-tag@0.2.0 78 | -------------------------------------------------------------------------------- /scripts/update-deps.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env -S deno run -A 2 | import $ from "@david/dax"; 3 | import * as toml from "@std/toml"; 4 | 5 | const rootDir = $.path(import.meta.dirname!).parentOrThrow(); 6 | const denoDir = rootDir.join("deno"); 7 | 8 | const oldCommit = (await $`git rev-parse HEAD`.cwd(denoDir).text()).trim(); 9 | $.logLight("Previous commit", oldCommit); 10 | await $`git fetch --depth=1 origin`.cwd(denoDir); 11 | await $`git checkout origin/HEAD`.cwd(denoDir); 12 | const newCommit = (await $`git rev-parse HEAD`.cwd(denoDir).text()).trim(); 13 | $.logLight("New commit", newCommit); 14 | 15 | const denoCargoTomlPath = denoDir.join("Cargo.toml"); 16 | const denoCargoToml = toml.parse(denoCargoTomlPath.readTextSync()) as any; 17 | const denoDependencies = denoCargoToml.workspace.dependencies; 18 | 19 | const localCargoTomlPath = rootDir.join("src/rs_lib/Cargo.toml"); 20 | const localCargoToml = toml.parse(localCargoTomlPath.readTextSync()) as any; 21 | 22 | for (const [key, value] of Object.entries(localCargoToml.dependencies)) { 23 | const newVersion = getVersion(denoDependencies[key]); 24 | if (newVersion == null) { 25 | continue; 26 | } 27 | if (typeof value === "string") { 28 | if (value !== newVersion) { 29 | $.logLight(`Updating ${key}@${value} to ${newVersion}`); 30 | localCargoToml.dependencies[key] = newVersion; 31 | } 32 | } else if (value != null && typeof value === "object" && "version" in value) { 33 | if (value.version !== newVersion) { 34 | $.logLight(`Updating ${key}@${value.version} to ${newVersion}`); 35 | value.version = newVersion; 36 | } 37 | } 38 | } 39 | 40 | localCargoTomlPath.writeTextSync( 41 | toml.stringify(localCargoToml) 42 | .trimStart() 43 | .replace( 44 | "[dependencies]", 45 | "# update this by running ./scripts/update-deps.ts\n[dependencies]", 46 | ), 47 | ); 48 | 49 | function getVersion(dep: any): string | undefined { 50 | if (typeof dep === "string") { 51 | return dep; 52 | } else if (dep != null && typeof dep.version === "string") { 53 | return dep.version; 54 | } else { 55 | return undefined; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/mod.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | MediaType, 3 | RequestedModuleType, 4 | ResolutionMode, 5 | Workspace, 6 | } from "./mod.ts"; 7 | import { assert, assertEquals, assertRejects } from "@std/assert"; 8 | 9 | Deno.test("should resolve, load and get graph", async () => { 10 | const workspace = new Workspace({ 11 | nodeConditions: undefined, // ensure doesn't error 12 | }); 13 | const modFileUrl = import.meta.resolve("./mod.ts"); 14 | const loader = await workspace.createLoader(); 15 | const diagnostics = await loader.addEntrypoints([modFileUrl]); 16 | assertEquals(diagnostics.length, 0); 17 | const graph = loader.getGraphUnstable(); 18 | assertEquals((graph as any).roots[0], modFileUrl); 19 | const resolvedUrl = loader.resolveSync( 20 | "./mod.test.ts", 21 | modFileUrl, 22 | ResolutionMode.Import, 23 | ); 24 | assertEquals(resolvedUrl, import.meta.url); 25 | { 26 | const loadResponse = await loader.load( 27 | import.meta.url, 28 | RequestedModuleType.Default, 29 | ); 30 | if (loadResponse.kind !== "module") { 31 | throw new Error("Fail"); 32 | } 33 | assertEquals(typeof loadResponse.specifier, "string"); 34 | assert(loadResponse.code instanceof Uint8Array); 35 | assertEquals(loadResponse.mediaType, MediaType.TypeScript); 36 | } 37 | // node: specifier 38 | { 39 | const loadResponse = await loader.load( 40 | "node:events", 41 | RequestedModuleType.Default, 42 | ); 43 | if (loadResponse.kind !== "external") { 44 | throw new Error("Fail"); 45 | } 46 | assertEquals(typeof loadResponse.specifier, "string"); 47 | assertEquals(loadResponse.specifier, "node:events"); 48 | } 49 | }); 50 | 51 | Deno.test("resolving a jsr specifier should fail with explanatory message", async () => { 52 | const workspace = new Workspace({}); 53 | const modFileUrl = import.meta.resolve("./mod.ts"); 54 | const loader = await workspace.createLoader(); 55 | const diagnostics = await loader.addEntrypoints([modFileUrl]); 56 | assertEquals(diagnostics.length, 0); 57 | assertRejects( 58 | async () => { 59 | await loader.load( 60 | "jsr:@scope/version", 61 | RequestedModuleType.Default, 62 | ); 63 | }, 64 | Error, 65 | "Failed loading 'jsr:@scope/version'. jsr: specifiers must be resolved to an https: specifier before being loaded.", 66 | ); 67 | }); 68 | -------------------------------------------------------------------------------- /tests/resolve_error/main.test.ts: -------------------------------------------------------------------------------- 1 | import { assert, assertEquals, assertRejects, assertThrows } from "@std/assert"; 2 | import { createLoader, ResolutionMode, ResolveError } from "../helpers.ts"; 3 | 4 | Deno.test("error has extra properties", async (t) => { 5 | const mainFile = import.meta.dirname + "/testdata/main.ts"; 6 | const { loader } = await createLoader({ 7 | configPath: import.meta.dirname + "/testdata/deno.json", 8 | }, { 9 | entrypoints: [mainFile], 10 | }); 11 | 12 | await t.step("code", () => { 13 | const err = assertThrows(() => 14 | loader.resolveSync( 15 | "export-package/non-existent", 16 | import.meta.resolve("./testdata/main.ts"), 17 | ResolutionMode.Import, 18 | ), ResolveError); 19 | assertEquals(err.code, "ERR_PACKAGE_PATH_NOT_EXPORTED"); 20 | assert(!err.isOptionalDependency); 21 | }); 22 | 23 | await t.step("specifier", async () => { 24 | const err = await assertRejects( 25 | () => 26 | loader.resolve( 27 | "open-package/non-existent.js", 28 | import.meta.resolve("./testdata/main.ts"), 29 | ResolutionMode.Import, 30 | ), 31 | ResolveError, 32 | ); 33 | assertEquals(err.code, "ERR_MODULE_NOT_FOUND"); 34 | assertEquals( 35 | err.specifier, 36 | import.meta.resolve( 37 | "./testdata/node_modules/open-package/non-existent.js", 38 | ), 39 | ); 40 | assert(!err.isOptionalDependency); 41 | }); 42 | 43 | await t.step("isOptionalDependency - optional dep", async () => { 44 | const err = await assertRejects( 45 | () => 46 | loader.resolve( 47 | "optional", 48 | import.meta.resolve("./testdata/node_modules/optional-dep/index.js"), 49 | ResolutionMode.Import, 50 | ), 51 | ResolveError, 52 | ); 53 | assertEquals(err.code, "ERR_MODULE_NOT_FOUND"); 54 | assert(err.isOptionalDependency); 55 | }); 56 | 57 | await t.step("isOptionalDependency - optional peer", async () => { 58 | const err = await assertRejects( 59 | () => 60 | loader.resolve( 61 | "optional", 62 | import.meta.resolve("./testdata/node_modules/optional-peer/index.js"), 63 | ResolutionMode.Import, 64 | ), 65 | ResolveError, 66 | ); 67 | assertEquals(err.code, "ERR_MODULE_NOT_FOUND"); 68 | assert(err.isOptionalDependency); 69 | }); 70 | 71 | await t.step("isOptionalDependency - folder package json", () => { 72 | const err = assertThrows( 73 | () => 74 | loader.resolveSync( 75 | "optional", 76 | import.meta.resolve( 77 | "./testdata/node_modules/optional-dep/sub/index.js", 78 | ), 79 | ResolutionMode.Import, 80 | ), 81 | ResolveError, 82 | ); 83 | assertEquals(err.code, "ERR_MODULE_NOT_FOUND"); 84 | assert(err.isOptionalDependency); 85 | }); 86 | }); 87 | -------------------------------------------------------------------------------- /tests/jsx/main.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | assertResponseText, 3 | createLoader, 4 | RequestedModuleType, 5 | ResolutionMode, 6 | type WorkspaceOptions, 7 | } from "../helpers.ts"; 8 | import { assert, assertEquals } from "@std/assert"; 9 | 10 | Deno.test("loads jsx transpiled", async () => { 11 | const mainJsx = import.meta.dirname + "/testdata/main.jsx"; 12 | const mainTsx = import.meta.dirname + "/testdata/main.tsx"; 13 | const createWorkspace = async (options?: WorkspaceOptions) => { 14 | return await createLoader({ 15 | configPath: import.meta.dirname + "/testdata/deno.json", 16 | ...(options ?? {}), 17 | }, { 18 | entrypoints: [mainJsx], 19 | }); 20 | }; 21 | const { loader } = await createWorkspace(); 22 | 23 | const mainJsxSourceMappingURL = 24 | "//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanN4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnNvbGUubG9nKDxkaXYgLz4pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxRQUFRLEdBQUcifQ=="; 25 | const mainTsxSourceMappingURL = 26 | "//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4udHN4Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IHZhbHVlOiBzdHJpbmcgPSBcIlwiO1xuY29uc29sZS5sb2coPGRpdiAvPiwgdmFsdWUpO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sUUFBZ0I7QUFDdEIsUUFBUSxHQUFHLEVBQUUsT0FBUSJ9"; 27 | const mainJsxUrl = loader.resolveSync( 28 | mainJsx, 29 | undefined, 30 | ResolutionMode.Import, 31 | ); 32 | const mainTsxUrl = loader.resolveSync( 33 | mainTsx, 34 | undefined, 35 | ResolutionMode.Import, 36 | ); 37 | 38 | assertResponseText( 39 | await loader.load(mainJsxUrl, RequestedModuleType.Default), 40 | `import { jsxTemplate as _jsxTemplate } from "react/jsx-runtime"; 41 | const $$_tpl_1 = [ 42 | "
" 43 | ]; 44 | console.log(_jsxTemplate($$_tpl_1)); 45 | ${mainJsxSourceMappingURL}`, 46 | ); 47 | 48 | // resolves jsx-dev 49 | const jsx = loader.resolveSync( 50 | "react/jsx-dev-runtime", 51 | mainTsx, 52 | ResolutionMode.Import, 53 | ); 54 | assert(jsx.startsWith("file:")); 55 | 56 | { 57 | const { workspace } = await createWorkspace({ preserveJsx: true }); 58 | const newLoader = await workspace.createLoader(); 59 | const diagnostics = await newLoader.addEntrypoints([mainJsx, mainTsxUrl]); 60 | assertEquals(diagnostics, []); 61 | assertResponseText( 62 | await newLoader.load(mainJsxUrl, RequestedModuleType.Default), 63 | "console.log(
);\n", 64 | ); 65 | assertResponseText( 66 | await newLoader.load(mainTsxUrl, RequestedModuleType.Default), 67 | `const value = "";\nconsole.log(
, value);\n${mainTsxSourceMappingURL}`, 68 | ); 69 | } 70 | { 71 | const { workspace } = await createWorkspace({ noTranspile: true }); 72 | const newLoader = await workspace.createLoader(); 73 | const diagnostics = await newLoader.addEntrypoints([mainJsx, mainTsx]); 74 | assertEquals(diagnostics, []); 75 | assertResponseText( 76 | await newLoader.load(mainJsxUrl, RequestedModuleType.Default), 77 | `console.log(
);\n`, 78 | ); 79 | assertResponseText( 80 | await newLoader.load(mainTsxUrl, RequestedModuleType.Default), 81 | `const value: string = "";\nconsole.log(
, value);\n`, 82 | ); 83 | } 84 | }); 85 | -------------------------------------------------------------------------------- /src/rs_lib/http_client.rs: -------------------------------------------------------------------------------- 1 | use deno_cache_dir::file_fetcher::HeaderMap; 2 | use deno_cache_dir::file_fetcher::HeaderName; 3 | use deno_cache_dir::file_fetcher::HeaderValue; 4 | use deno_cache_dir::file_fetcher::SendError; 5 | use deno_cache_dir::file_fetcher::SendResponse; 6 | use deno_cache_dir::file_fetcher::StatusCode; 7 | use deno_error::JsErrorBox; 8 | use deno_npm_cache::NpmCacheHttpClientResponse; 9 | use js_sys::Array; 10 | use js_sys::Object; 11 | use js_sys::Reflect; 12 | use serde::Deserialize; 13 | use url::Url; 14 | use wasm_bindgen::JsCast; 15 | use wasm_bindgen::JsValue; 16 | use wasm_bindgen::prelude::wasm_bindgen; 17 | 18 | #[wasm_bindgen(module = "/helpers.js")] 19 | extern "C" { 20 | async fn fetch_specifier(specifier: String, headers: JsValue) -> JsValue; 21 | } 22 | 23 | enum FetchResult { 24 | Response(Response), 25 | Error(FetchError), 26 | } 27 | 28 | #[derive(Deserialize)] 29 | struct FetchError { 30 | pub error: String, 31 | } 32 | 33 | struct Response { 34 | pub status: u16, 35 | pub body: Vec, 36 | pub headers: HeaderMap, 37 | } 38 | 39 | async fn fetch_specifier_typed( 40 | specifier: &str, 41 | headers: Vec<(String, String)>, 42 | ) -> Result { 43 | let headers = headers_to_js_object(&headers); 44 | let response = fetch_specifier(specifier.to_string(), headers).await; 45 | parse_fetch_result(response).map_err(|err| { 46 | if let Some(s) = err.as_string() { 47 | anyhow::anyhow!(s) 48 | } else { 49 | // Optionally stringify complex JS error objects 50 | anyhow::anyhow!(format!("{:?}", err)) 51 | } 52 | }) 53 | } 54 | 55 | #[derive(Debug, Default, Clone)] 56 | pub struct WasmHttpClient { 57 | pub cached_only: bool, 58 | } 59 | 60 | #[async_trait::async_trait(?Send)] 61 | impl deno_cache_dir::file_fetcher::HttpClient for WasmHttpClient { 62 | async fn send_no_follow( 63 | &self, 64 | url: &Url, 65 | headers: HeaderMap, 66 | ) -> Result { 67 | if self.cached_only { 68 | return Err(SendError::Failed(Box::new(std::io::Error::other( 69 | "Cannot download because --cached-only was specified.", 70 | )))); 71 | } 72 | let headers = headers 73 | .into_iter() 74 | .filter_map(|(k, v)| Some((k?.to_string(), v.to_str().ok()?.to_string()))) 75 | .collect::>(); 76 | let result = 77 | fetch_specifier_typed(url.as_str(), headers) 78 | .await 79 | .map_err(|err| { 80 | SendError::Failed(Box::new(std::io::Error::other( 81 | err.to_string(), 82 | ))) 83 | })?; 84 | let response = match result { 85 | FetchResult::Response(response) => response, 86 | FetchResult::Error(fetch_error) => { 87 | return Err(SendError::Failed(fetch_error.error.into())); 88 | } 89 | }; 90 | match response.status { 91 | 304 => Ok(SendResponse::NotModified), 92 | 300..=399 => Ok(SendResponse::Redirect(response.headers)), 93 | 404 => Err(SendError::NotFound), 94 | 200..=299 => Ok(SendResponse::Success(response.headers, response.body)), 95 | _ => Err(SendError::StatusCode( 96 | StatusCode::from_u16(response.status).unwrap(), 97 | )), 98 | } 99 | } 100 | } 101 | 102 | #[async_trait::async_trait(?Send)] 103 | impl deno_npm_cache::NpmCacheHttpClient for WasmHttpClient { 104 | // todo: implement retrying 105 | async fn download_with_retries_on_any_tokio_runtime( 106 | &self, 107 | url: Url, 108 | maybe_auth: Option, 109 | maybe_etag: Option, 110 | ) -> Result { 111 | let mut headers = Vec::new(); 112 | if let Some(auth) = maybe_auth { 113 | headers.push(("authorization".to_string(), auth)); 114 | } 115 | if let Some(etag) = maybe_etag { 116 | headers.push(("if-none-match".to_string(), etag)); 117 | } 118 | 119 | let result = 120 | fetch_specifier_typed(url.as_str(), headers) 121 | .await 122 | .map_err(|err| deno_npm_cache::DownloadError { 123 | status_code: None, 124 | error: JsErrorBox::generic(err.to_string()), 125 | })?; 126 | 127 | let response = match result { 128 | FetchResult::Response(res) => res, 129 | FetchResult::Error(fetch_error) => { 130 | return Err(deno_npm_cache::DownloadError { 131 | status_code: None, 132 | error: JsErrorBox::generic(fetch_error.error), 133 | }); 134 | } 135 | }; 136 | 137 | match response.status { 138 | 200..=299 => { 139 | let etag = response.headers.iter().find_map(|(k, v)| { 140 | if k.as_str().eq_ignore_ascii_case("etag") { 141 | Some(v.to_str().ok()?.to_string()) 142 | } else { 143 | None 144 | } 145 | }); 146 | 147 | Ok(NpmCacheHttpClientResponse::Bytes( 148 | deno_npm_cache::NpmCacheHttpClientBytesResponse { 149 | etag, 150 | bytes: response.body, 151 | }, 152 | )) 153 | } 154 | 304 => Ok(NpmCacheHttpClientResponse::NotModified), 155 | 404 => Ok(NpmCacheHttpClientResponse::NotFound), 156 | code => Err(deno_npm_cache::DownloadError { 157 | status_code: Some(code), 158 | error: JsErrorBox::generic(format!("Unexpected status: {code}")), 159 | }), 160 | } 161 | } 162 | } 163 | 164 | fn headers_to_js_object(headers: &[(String, String)]) -> JsValue { 165 | let obj = Object::new(); 166 | for (key, value) in headers { 167 | Reflect::set(&obj, &JsValue::from_str(key), &JsValue::from_str(value)) 168 | .unwrap(); 169 | } 170 | obj.into() 171 | } 172 | 173 | fn parse_fetch_result(js_value: JsValue) -> Result { 174 | let has_error = Reflect::has(&js_value, &JsValue::from_str("error"))?; 175 | if has_error { 176 | let error: FetchError = serde_wasm_bindgen::from_value(js_value)?; 177 | return Ok(FetchResult::Error(error)); 178 | } 179 | Ok(FetchResult::Response(parse_response(js_value)?)) 180 | } 181 | 182 | fn parse_response(js_value: JsValue) -> Result { 183 | let status = Reflect::get(&js_value, &JsValue::from_str("status"))? 184 | .as_f64() 185 | .ok_or_else(|| JsValue::from_str("status must be a number"))? 186 | as u16; 187 | 188 | let body_js = Reflect::get(&js_value, &JsValue::from_str("body"))?; 189 | let body: Vec = serde_wasm_bindgen::from_value(body_js)?; 190 | 191 | let headers_js = Reflect::get(&js_value, &JsValue::from_str("headers"))?; 192 | let headers = response_headers_to_headermap(headers_js); 193 | 194 | Ok(Response { 195 | status, 196 | body, 197 | headers, 198 | }) 199 | } 200 | 201 | fn response_headers_to_headermap(headers: JsValue) -> HeaderMap { 202 | let mut map = HeaderMap::new(); 203 | let entries_fn = Reflect::get(&headers, &JsValue::from_str("entries")); 204 | let Ok(entries_fn) = entries_fn else { 205 | return map; 206 | }; 207 | 208 | let entries_iter = js_sys::Function::from(entries_fn) 209 | .call0(&headers) 210 | .ok() 211 | .and_then(|iter| iter.dyn_into::().ok()); 212 | 213 | let Some(iter) = entries_iter else { 214 | return map; 215 | }; 216 | 217 | while let Ok(next) = iter.next() { 218 | if next.done() { 219 | break; 220 | } 221 | 222 | let val = next.value(); 223 | let pair = Array::from(&val); 224 | if pair.length() != 2 { 225 | continue; 226 | } 227 | 228 | let key = pair.get(0).as_string(); 229 | let value = pair.get(1).as_string(); 230 | 231 | if let (Some(k), Some(v)) = (key, value) 232 | && let (Ok(name), Ok(val)) = ( 233 | HeaderName::from_bytes(k.as_bytes()), 234 | HeaderValue::from_str(&v), 235 | ) { 236 | map.append(name, val); 237 | } 238 | } 239 | 240 | map 241 | } 242 | -------------------------------------------------------------------------------- /src/mod.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Resolver and loader for Deno code. 3 | * 4 | * This can be used to create bundler plugins or libraries that use deno resolution. 5 | * 6 | * @example 7 | * ```ts 8 | * import { Workspace, ResolutionMode, type LoadResponse, RequestedModuleType } from "@deno/loader"; 9 | * 10 | * const workspace = new Workspace({ 11 | * // optional options 12 | * }); 13 | * const loader = await workspace.createLoader(); 14 | * const diagnostics = await loader.addEntrypoints(["./mod.ts"]) 15 | * if (diagnostics.length > 0) { 16 | * throw new Error(diagnostics[0].message); 17 | * } 18 | * // alternatively use resolve to resolve npm/jsr specifiers not found 19 | * // in the entrypoints or if not being able to provide entrypoints 20 | * const resolvedUrl = loader.resolveSync( 21 | * "./mod.test.ts", 22 | * "https://deno.land/mod.ts", // referrer 23 | * ResolutionMode.Import, 24 | * ); 25 | * const response = await loader.load(resolvedUrl, RequestedModuleType.Default); 26 | * if (response.kind === "module") { 27 | * console.log(response.specifier); 28 | * console.log(response.code); 29 | * console.log(response.mediaType); 30 | * } else if (response.kind === "external") { 31 | * console.log(response.specifier) 32 | * } else { 33 | * const _assertNever = response; 34 | * throw new Error(`Unhandled kind: ${(response as LoadResponse).kind}`); 35 | * } 36 | * ``` 37 | * @module 38 | */ 39 | 40 | import { 41 | DenoLoader as WasmLoader, 42 | DenoWorkspace as WasmWorkspace, 43 | } from "./lib/rs_lib.js"; 44 | 45 | /** Options for creating a workspace. */ 46 | export interface WorkspaceOptions { 47 | /** Do not do config file discovery. */ 48 | noConfig?: boolean; 49 | /** Do not respect the lockfile. */ 50 | noLock?: boolean; 51 | /** Path or file: URL to the config file if you do not want to do config file discovery. */ 52 | configPath?: string; 53 | /** Node resolution conditions to use for resolving package.json exports. */ 54 | nodeConditions?: string[]; 55 | /** Date for the newest allowed dependency. */ 56 | newestDependencyDate?: Date; 57 | /** 58 | * Platform to bundle for. 59 | * @default "node" 60 | */ 61 | platform?: "node" | "browser"; 62 | /** Whether to force using the cache. */ 63 | cachedOnly?: boolean; 64 | /** 65 | * Enable debug logs. 66 | * 67 | * @remarks Note that the Rust debug logs are enabled globally 68 | * and can only be enabled by the first workspace that gets 69 | * created. This is a limitation of how the Rust logging works. 70 | */ 71 | debug?: boolean; 72 | /** Whether to preserve JSX syntax in the loaded output. */ 73 | preserveJsx?: boolean; 74 | /** Skip transpiling TypeScript and JSX. */ 75 | noTranspile?: boolean; 76 | } 77 | 78 | export class ResolveError extends Error { 79 | /** 80 | * Possible specifier this would resolve to if the error did not occur. 81 | * 82 | * This is useful for implementing something like `import.meta.resolve` where 83 | * you want the resolution to always occur and not error. 84 | */ 85 | specifier?: string; 86 | /** Node.js error code. */ 87 | code?: string; 88 | /** 89 | * If the specifier being resolved was an optional npm dependency. 90 | * 91 | * @remarks This will only be true when the error code is 92 | * `ERR_MODULE_NOT_FOUND`. 93 | */ 94 | isOptionalDependency?: boolean; 95 | } 96 | 97 | /** File type. */ 98 | export enum MediaType { 99 | JavaScript = 0, 100 | Jsx = 1, 101 | Mjs = 2, 102 | Cjs = 3, 103 | TypeScript = 4, 104 | Mts = 5, 105 | Cts = 6, 106 | Dts = 7, 107 | Dmts = 8, 108 | Dcts = 9, 109 | Tsx = 10, 110 | Css = 11, 111 | Json = 12, 112 | Jsonc = 13, 113 | Json5 = 14, 114 | Html = 15, 115 | Sql = 16, 116 | Wasm = 17, 117 | SourceMap = 18, 118 | Unknown = 19, 119 | } 120 | 121 | /** A response received from a load. */ 122 | export type LoadResponse = ModuleLoadResponse | ExternalLoadResponse; 123 | 124 | /** A response that indicates the module is external. 125 | * 126 | * This will occur for `node:` specifiers for example. 127 | */ 128 | export interface ExternalLoadResponse { 129 | /** Kind of response. */ 130 | kind: "external"; 131 | /** 132 | * Fully resolved URL. 133 | * 134 | * This may be different than the provided specifier. For example, during loading 135 | * it may encounter redirects and this specifier is the redirected to final specifier. 136 | */ 137 | specifier: string; 138 | } 139 | 140 | /** A response that loads a module. */ 141 | export interface ModuleLoadResponse { 142 | /** Kind of response. */ 143 | kind: "module"; 144 | /** 145 | * Fully resolved URL. 146 | * 147 | * This may be different than the provided specifier. For example, during loading 148 | * it may encounter redirects and this specifier is the redirected to final specifier. 149 | */ 150 | specifier: string; 151 | /** Content that was loaded. */ 152 | mediaType: MediaType; 153 | /** Code that was loaded. */ 154 | code: Uint8Array; 155 | } 156 | 157 | /** Kind of resolution. */ 158 | export enum ResolutionMode { 159 | /** Resolving from an ESM file. */ 160 | Import = 0, 161 | /** Resolving from a CJS file. */ 162 | Require = 1, 163 | } 164 | 165 | /** Resolves the workspace. */ 166 | export class Workspace implements Disposable { 167 | #inner: WasmWorkspace; 168 | #debug: boolean; 169 | 170 | /** Creates a `DenoWorkspace` with the provided options. */ 171 | constructor(options: WorkspaceOptions = {}) { 172 | this.#inner = new WasmWorkspace(options); 173 | this.#debug = options.debug ?? false; 174 | } 175 | 176 | [Symbol.dispose]() { 177 | this.#inner.free(); 178 | } 179 | 180 | /** Creates a loader that uses this this workspace. */ 181 | async createLoader(): Promise { 182 | const wasmLoader = await this.#inner.create_loader(); 183 | return new Loader(wasmLoader, this.#debug); 184 | } 185 | } 186 | 187 | export enum RequestedModuleType { 188 | Default = 0, 189 | Json = 1, 190 | Text = 2, 191 | Bytes = 3, 192 | } 193 | 194 | export interface EntrypointDiagnostic { 195 | message: string; 196 | } 197 | 198 | /** A loader for resolving and loading urls. */ 199 | export class Loader implements Disposable { 200 | #inner: WasmLoader; 201 | #debug: boolean; 202 | 203 | /** @internal */ 204 | constructor(loader: WasmLoader, debug: boolean) { 205 | if (!(loader instanceof WasmLoader)) { 206 | throw new Error("Get the loader from the workspace."); 207 | } 208 | this.#inner = loader; 209 | this.#debug = debug; 210 | } 211 | 212 | [Symbol.dispose]() { 213 | this.#inner.free(); 214 | } 215 | 216 | /** Adds entrypoints to the loader. 217 | * 218 | * It's useful to specify entrypoints so that the loader can resolve 219 | * npm: and jsr: specifiers the same way that Deno does when not using 220 | * a lockfile. 221 | */ 222 | async addEntrypoints( 223 | entrypoints: string[], 224 | ): Promise { 225 | const messages = await this.#inner.add_entrypoints(entrypoints); 226 | return messages.map((message) => ({ message })); 227 | } 228 | 229 | /** Synchronously resolves a specifier using the given referrer and resolution mode. 230 | * @throws {ResolveError} 231 | */ 232 | resolveSync( 233 | specifier: string, 234 | referrer: string | undefined, 235 | resolutionMode: ResolutionMode, 236 | ): string { 237 | if (this.#debug) { 238 | console.error( 239 | `DEBUG - Resolving '${specifier}' from '${ 240 | referrer ?? "" 241 | }' (${resolutionModeToString(resolutionMode)})`, 242 | ); 243 | } 244 | try { 245 | const value = this.#inner.resolve_sync( 246 | specifier, 247 | referrer, 248 | resolutionMode, 249 | ); 250 | if (this.#debug) { 251 | console.error(`DEBUG - Resolved to '${value}'`); 252 | } 253 | return value; 254 | } catch (err) { 255 | Object.setPrototypeOf(err, ResolveError.prototype); 256 | throw err; 257 | } 258 | } 259 | 260 | /** Asynchronously resolves a specifier using the given referrer and resolution mode. 261 | * 262 | * This is useful for resolving `jsr:` and `npm:` specifiers on the fly when they can't 263 | * be figured out from entrypoints, but it may cause multiple "npm install"s and different 264 | * npm or jsr resolution than Deno. For that reason it's better to provide the list of 265 | * entrypoints up front so the loader can create the npm and jsr graph, and then after use 266 | * synchronous resolution to resolve jsr and npm specifiers. 267 | * 268 | * @throws {ResolveError} 269 | */ 270 | async resolve( 271 | specifier: string, 272 | referrer: string | undefined, 273 | resolutionMode: ResolutionMode, 274 | ): Promise { 275 | if (this.#debug) { 276 | console.error( 277 | `DEBUG - Resolving '${specifier}' from '${ 278 | referrer ?? "" 279 | }' (${resolutionModeToString(resolutionMode)})`, 280 | ); 281 | } 282 | try { 283 | const value = await this.#inner.resolve( 284 | specifier, 285 | referrer, 286 | resolutionMode, 287 | ); 288 | if (this.#debug) { 289 | console.error(`DEBUG - Resolved to '${value}'`); 290 | } 291 | return value; 292 | } catch (err) { 293 | Object.setPrototypeOf(err, ResolveError.prototype); 294 | throw err; 295 | } 296 | } 297 | 298 | /** Loads a specifier. */ 299 | load( 300 | specifier: string, 301 | requestedModuleType: RequestedModuleType, 302 | ): Promise { 303 | if (this.#debug) { 304 | console.error( 305 | `DEBUG - Loading '${specifier}' with type '${ 306 | requestedModuleTypeToString(requestedModuleType) ?? "" 307 | }'`, 308 | ); 309 | } 310 | return this.#inner.load(specifier, requestedModuleType); 311 | } 312 | 313 | /** Gets the module graph. 314 | * 315 | * WARNING: This function is very unstable and the output may change between 316 | * patch releases. 317 | */ 318 | getGraphUnstable(): unknown { 319 | return this.#inner.get_graph(); 320 | } 321 | } 322 | 323 | function requestedModuleTypeToString(moduleType: RequestedModuleType) { 324 | switch (moduleType) { 325 | case RequestedModuleType.Bytes: 326 | return "bytes"; 327 | case RequestedModuleType.Text: 328 | return "text"; 329 | case RequestedModuleType.Json: 330 | return "json"; 331 | case RequestedModuleType.Default: 332 | return undefined; 333 | default: { 334 | const _never: never = moduleType; 335 | return undefined; 336 | } 337 | } 338 | } 339 | 340 | function resolutionModeToString(mode: ResolutionMode) { 341 | switch (mode) { 342 | case ResolutionMode.Import: 343 | return "import"; 344 | case ResolutionMode.Require: 345 | return "require"; 346 | default: { 347 | const _assertNever: never = mode; 348 | return "unknown"; 349 | } 350 | } 351 | } 352 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "5", 3 | "specifiers": { 4 | "jsr:@david/console-static-text@0.3": "0.3.0", 5 | "jsr:@david/dax@~0.43.2": "0.43.2", 6 | "jsr:@david/path@0.2": "0.2.0", 7 | "jsr:@david/which@~0.4.1": "0.4.1", 8 | "jsr:@std/assert@^1.0.13": "1.0.13", 9 | "jsr:@std/bytes@^1.0.5": "1.0.6", 10 | "jsr:@std/collections@^1.1.1": "1.1.1", 11 | "jsr:@std/fmt@1": "1.0.8", 12 | "jsr:@std/fs@1": "1.0.18", 13 | "jsr:@std/internal@^1.0.6": "1.0.8", 14 | "jsr:@std/io@0.225": "0.225.2", 15 | "jsr:@std/path@1": "1.1.0", 16 | "jsr:@std/path@^1.1.0": "1.1.0", 17 | "jsr:@std/toml@^1.0.7": "1.0.7", 18 | "npm:@types/jscodeshift@*": "17.3.0", 19 | "npm:@types/node@*": "22.15.15", 20 | "npm:jscodeshift@0.15.2": "0.15.2_@babel+core@7.27.4" 21 | }, 22 | "jsr": { 23 | "@david/console-static-text@0.3.0": { 24 | "integrity": "2dfb46ecee525755f7989f94ece30bba85bd8ffe3e8666abc1bf926e1ee0698d" 25 | }, 26 | "@david/dax@0.43.2": { 27 | "integrity": "8c7df175465d994c0e3568e3eb91102768c2f1c86d2a513d7fc4cab13f9cb328", 28 | "dependencies": [ 29 | "jsr:@david/console-static-text", 30 | "jsr:@david/path", 31 | "jsr:@david/which", 32 | "jsr:@std/fmt", 33 | "jsr:@std/fs", 34 | "jsr:@std/io", 35 | "jsr:@std/path@1" 36 | ] 37 | }, 38 | "@david/path@0.2.0": { 39 | "integrity": "f2d7aa7f02ce5a55e27c09f9f1381794acb09d328f8d3c8a2e3ab3ffc294dccd", 40 | "dependencies": [ 41 | "jsr:@std/fs", 42 | "jsr:@std/path@1" 43 | ] 44 | }, 45 | "@david/which@0.4.1": { 46 | "integrity": "896a682b111f92ab866cc70c5b4afab2f5899d2f9bde31ed00203b9c250f225e" 47 | }, 48 | "@std/assert@1.0.13": { 49 | "integrity": "ae0d31e41919b12c656c742b22522c32fb26ed0cba32975cb0de2a273cb68b29", 50 | "dependencies": [ 51 | "jsr:@std/internal" 52 | ] 53 | }, 54 | "@std/bytes@1.0.6": { 55 | "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" 56 | }, 57 | "@std/collections@1.1.1": { 58 | "integrity": "eff6443fbd9d5a6697018fb39c5d13d5f662f0045f21392d640693d0008ab2af" 59 | }, 60 | "@std/fmt@1.0.8": { 61 | "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" 62 | }, 63 | "@std/fs@1.0.18": { 64 | "integrity": "24bcad99eab1af4fde75e05da6e9ed0e0dce5edb71b7e34baacf86ffe3969f3a", 65 | "dependencies": [ 66 | "jsr:@std/path@^1.1.0" 67 | ] 68 | }, 69 | "@std/internal@1.0.8": { 70 | "integrity": "fc66e846d8d38a47cffd274d80d2ca3f0de71040f855783724bb6b87f60891f5" 71 | }, 72 | "@std/io@0.225.2": { 73 | "integrity": "3c740cd4ee4c082e6cfc86458f47e2ab7cb353dc6234d5e9b1f91a2de5f4d6c7", 74 | "dependencies": [ 75 | "jsr:@std/bytes" 76 | ] 77 | }, 78 | "@std/path@1.1.0": { 79 | "integrity": "ddc94f8e3c275627281cbc23341df6b8bcc874d70374f75fec2533521e3d6886" 80 | }, 81 | "@std/toml@1.0.7": { 82 | "integrity": "3c86f8bbde31578da33d2fbe410b80e3cb672b66e008e06cf41afc4d7409921c", 83 | "dependencies": [ 84 | "jsr:@std/collections" 85 | ] 86 | } 87 | }, 88 | "npm": { 89 | "@ampproject/remapping@2.3.0": { 90 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 91 | "dependencies": [ 92 | "@jridgewell/gen-mapping", 93 | "@jridgewell/trace-mapping" 94 | ] 95 | }, 96 | "@babel/code-frame@7.27.1": { 97 | "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", 98 | "dependencies": [ 99 | "@babel/helper-validator-identifier", 100 | "js-tokens", 101 | "picocolors" 102 | ] 103 | }, 104 | "@babel/compat-data@7.27.5": { 105 | "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==" 106 | }, 107 | "@babel/core@7.27.4": { 108 | "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", 109 | "dependencies": [ 110 | "@ampproject/remapping", 111 | "@babel/code-frame", 112 | "@babel/generator", 113 | "@babel/helper-compilation-targets", 114 | "@babel/helper-module-transforms", 115 | "@babel/helpers", 116 | "@babel/parser", 117 | "@babel/template", 118 | "@babel/traverse", 119 | "@babel/types", 120 | "convert-source-map", 121 | "debug", 122 | "gensync", 123 | "json5", 124 | "semver@6.3.1" 125 | ] 126 | }, 127 | "@babel/generator@7.27.5": { 128 | "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", 129 | "dependencies": [ 130 | "@babel/parser", 131 | "@babel/types", 132 | "@jridgewell/gen-mapping", 133 | "@jridgewell/trace-mapping", 134 | "jsesc" 135 | ] 136 | }, 137 | "@babel/helper-annotate-as-pure@7.27.3": { 138 | "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", 139 | "dependencies": [ 140 | "@babel/types" 141 | ] 142 | }, 143 | "@babel/helper-compilation-targets@7.27.2": { 144 | "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", 145 | "dependencies": [ 146 | "@babel/compat-data", 147 | "@babel/helper-validator-option", 148 | "browserslist", 149 | "lru-cache", 150 | "semver@6.3.1" 151 | ] 152 | }, 153 | "@babel/helper-create-class-features-plugin@7.27.1_@babel+core@7.27.4": { 154 | "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", 155 | "dependencies": [ 156 | "@babel/core", 157 | "@babel/helper-annotate-as-pure", 158 | "@babel/helper-member-expression-to-functions", 159 | "@babel/helper-optimise-call-expression", 160 | "@babel/helper-replace-supers", 161 | "@babel/helper-skip-transparent-expression-wrappers", 162 | "@babel/traverse", 163 | "semver@6.3.1" 164 | ] 165 | }, 166 | "@babel/helper-member-expression-to-functions@7.27.1": { 167 | "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", 168 | "dependencies": [ 169 | "@babel/traverse", 170 | "@babel/types" 171 | ] 172 | }, 173 | "@babel/helper-module-imports@7.27.1": { 174 | "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", 175 | "dependencies": [ 176 | "@babel/traverse", 177 | "@babel/types" 178 | ] 179 | }, 180 | "@babel/helper-module-transforms@7.27.3_@babel+core@7.27.4": { 181 | "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", 182 | "dependencies": [ 183 | "@babel/core", 184 | "@babel/helper-module-imports", 185 | "@babel/helper-validator-identifier", 186 | "@babel/traverse" 187 | ] 188 | }, 189 | "@babel/helper-optimise-call-expression@7.27.1": { 190 | "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", 191 | "dependencies": [ 192 | "@babel/types" 193 | ] 194 | }, 195 | "@babel/helper-plugin-utils@7.27.1": { 196 | "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==" 197 | }, 198 | "@babel/helper-replace-supers@7.27.1_@babel+core@7.27.4": { 199 | "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", 200 | "dependencies": [ 201 | "@babel/core", 202 | "@babel/helper-member-expression-to-functions", 203 | "@babel/helper-optimise-call-expression", 204 | "@babel/traverse" 205 | ] 206 | }, 207 | "@babel/helper-skip-transparent-expression-wrappers@7.27.1": { 208 | "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", 209 | "dependencies": [ 210 | "@babel/traverse", 211 | "@babel/types" 212 | ] 213 | }, 214 | "@babel/helper-string-parser@7.27.1": { 215 | "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" 216 | }, 217 | "@babel/helper-validator-identifier@7.27.1": { 218 | "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" 219 | }, 220 | "@babel/helper-validator-option@7.27.1": { 221 | "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==" 222 | }, 223 | "@babel/helpers@7.27.6": { 224 | "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", 225 | "dependencies": [ 226 | "@babel/template", 227 | "@babel/types" 228 | ] 229 | }, 230 | "@babel/parser@7.27.5": { 231 | "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", 232 | "dependencies": [ 233 | "@babel/types" 234 | ], 235 | "bin": true 236 | }, 237 | "@babel/plugin-syntax-flow@7.27.1_@babel+core@7.27.4": { 238 | "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", 239 | "dependencies": [ 240 | "@babel/core", 241 | "@babel/helper-plugin-utils" 242 | ] 243 | }, 244 | "@babel/plugin-syntax-jsx@7.27.1_@babel+core@7.27.4": { 245 | "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", 246 | "dependencies": [ 247 | "@babel/core", 248 | "@babel/helper-plugin-utils" 249 | ] 250 | }, 251 | "@babel/plugin-syntax-typescript@7.27.1_@babel+core@7.27.4": { 252 | "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", 253 | "dependencies": [ 254 | "@babel/core", 255 | "@babel/helper-plugin-utils" 256 | ] 257 | }, 258 | "@babel/plugin-transform-class-properties@7.27.1_@babel+core@7.27.4": { 259 | "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", 260 | "dependencies": [ 261 | "@babel/core", 262 | "@babel/helper-create-class-features-plugin", 263 | "@babel/helper-plugin-utils" 264 | ] 265 | }, 266 | "@babel/plugin-transform-flow-strip-types@7.27.1_@babel+core@7.27.4": { 267 | "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", 268 | "dependencies": [ 269 | "@babel/core", 270 | "@babel/helper-plugin-utils", 271 | "@babel/plugin-syntax-flow" 272 | ] 273 | }, 274 | "@babel/plugin-transform-modules-commonjs@7.27.1_@babel+core@7.27.4": { 275 | "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", 276 | "dependencies": [ 277 | "@babel/core", 278 | "@babel/helper-module-transforms", 279 | "@babel/helper-plugin-utils" 280 | ] 281 | }, 282 | "@babel/plugin-transform-nullish-coalescing-operator@7.27.1_@babel+core@7.27.4": { 283 | "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", 284 | "dependencies": [ 285 | "@babel/core", 286 | "@babel/helper-plugin-utils" 287 | ] 288 | }, 289 | "@babel/plugin-transform-optional-chaining@7.27.1_@babel+core@7.27.4": { 290 | "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", 291 | "dependencies": [ 292 | "@babel/core", 293 | "@babel/helper-plugin-utils", 294 | "@babel/helper-skip-transparent-expression-wrappers" 295 | ] 296 | }, 297 | "@babel/plugin-transform-private-methods@7.27.1_@babel+core@7.27.4": { 298 | "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", 299 | "dependencies": [ 300 | "@babel/core", 301 | "@babel/helper-create-class-features-plugin", 302 | "@babel/helper-plugin-utils" 303 | ] 304 | }, 305 | "@babel/plugin-transform-typescript@7.27.1_@babel+core@7.27.4": { 306 | "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", 307 | "dependencies": [ 308 | "@babel/core", 309 | "@babel/helper-annotate-as-pure", 310 | "@babel/helper-create-class-features-plugin", 311 | "@babel/helper-plugin-utils", 312 | "@babel/helper-skip-transparent-expression-wrappers", 313 | "@babel/plugin-syntax-typescript" 314 | ] 315 | }, 316 | "@babel/preset-flow@7.27.1_@babel+core@7.27.4": { 317 | "integrity": "sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==", 318 | "dependencies": [ 319 | "@babel/core", 320 | "@babel/helper-plugin-utils", 321 | "@babel/helper-validator-option", 322 | "@babel/plugin-transform-flow-strip-types" 323 | ] 324 | }, 325 | "@babel/preset-typescript@7.27.1_@babel+core@7.27.4": { 326 | "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", 327 | "dependencies": [ 328 | "@babel/core", 329 | "@babel/helper-plugin-utils", 330 | "@babel/helper-validator-option", 331 | "@babel/plugin-syntax-jsx", 332 | "@babel/plugin-transform-modules-commonjs", 333 | "@babel/plugin-transform-typescript" 334 | ] 335 | }, 336 | "@babel/register@7.27.1_@babel+core@7.27.4": { 337 | "integrity": "sha512-K13lQpoV54LATKkzBpBAEu1GGSIRzxR9f4IN4V8DCDgiUMo2UDGagEZr3lPeVNJPLkWUi5JE4hCHKneVTwQlYQ==", 338 | "dependencies": [ 339 | "@babel/core", 340 | "clone-deep", 341 | "find-cache-dir", 342 | "make-dir", 343 | "pirates", 344 | "source-map-support" 345 | ] 346 | }, 347 | "@babel/template@7.27.2": { 348 | "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", 349 | "dependencies": [ 350 | "@babel/code-frame", 351 | "@babel/parser", 352 | "@babel/types" 353 | ] 354 | }, 355 | "@babel/traverse@7.27.4": { 356 | "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", 357 | "dependencies": [ 358 | "@babel/code-frame", 359 | "@babel/generator", 360 | "@babel/parser", 361 | "@babel/template", 362 | "@babel/types", 363 | "debug", 364 | "globals" 365 | ] 366 | }, 367 | "@babel/types@7.27.6": { 368 | "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", 369 | "dependencies": [ 370 | "@babel/helper-string-parser", 371 | "@babel/helper-validator-identifier" 372 | ] 373 | }, 374 | "@jridgewell/gen-mapping@0.3.8": { 375 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 376 | "dependencies": [ 377 | "@jridgewell/set-array", 378 | "@jridgewell/sourcemap-codec", 379 | "@jridgewell/trace-mapping" 380 | ] 381 | }, 382 | "@jridgewell/resolve-uri@3.1.2": { 383 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" 384 | }, 385 | "@jridgewell/set-array@1.2.1": { 386 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" 387 | }, 388 | "@jridgewell/sourcemap-codec@1.5.0": { 389 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" 390 | }, 391 | "@jridgewell/trace-mapping@0.3.25": { 392 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 393 | "dependencies": [ 394 | "@jridgewell/resolve-uri", 395 | "@jridgewell/sourcemap-codec" 396 | ] 397 | }, 398 | "@types/jscodeshift@17.3.0": { 399 | "integrity": "sha512-ogvGG8VQQqAQQ096uRh+d6tBHrYuZjsumHirKtvBa5qEyTMN3IQJ7apo+sw9lxaB/iKWIhbbLlF3zmAWk9XQIg==", 400 | "dependencies": [ 401 | "ast-types", 402 | "recast" 403 | ] 404 | }, 405 | "@types/node@22.15.15": { 406 | "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", 407 | "dependencies": [ 408 | "undici-types" 409 | ] 410 | }, 411 | "ansi-styles@4.3.0": { 412 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 413 | "dependencies": [ 414 | "color-convert" 415 | ] 416 | }, 417 | "ast-types@0.16.1": { 418 | "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", 419 | "dependencies": [ 420 | "tslib" 421 | ] 422 | }, 423 | "babel-core@7.0.0-bridge.0_@babel+core@7.27.4": { 424 | "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", 425 | "dependencies": [ 426 | "@babel/core" 427 | ] 428 | }, 429 | "balanced-match@1.0.2": { 430 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 431 | }, 432 | "brace-expansion@1.1.12": { 433 | "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", 434 | "dependencies": [ 435 | "balanced-match", 436 | "concat-map" 437 | ] 438 | }, 439 | "braces@3.0.3": { 440 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 441 | "dependencies": [ 442 | "fill-range" 443 | ] 444 | }, 445 | "browserslist@4.25.0": { 446 | "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", 447 | "dependencies": [ 448 | "caniuse-lite", 449 | "electron-to-chromium", 450 | "node-releases", 451 | "update-browserslist-db" 452 | ], 453 | "bin": true 454 | }, 455 | "buffer-from@1.1.2": { 456 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" 457 | }, 458 | "caniuse-lite@1.0.30001722": { 459 | "integrity": "sha512-DCQHBBZtiK6JVkAGw7drvAMK0Q0POD/xZvEmDp6baiMMP6QXXk9HpD6mNYBZWhOPG6LvIDb82ITqtWjhDckHCA==" 460 | }, 461 | "chalk@4.1.2": { 462 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 463 | "dependencies": [ 464 | "ansi-styles", 465 | "supports-color" 466 | ] 467 | }, 468 | "clone-deep@4.0.1": { 469 | "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", 470 | "dependencies": [ 471 | "is-plain-object", 472 | "kind-of", 473 | "shallow-clone" 474 | ] 475 | }, 476 | "color-convert@2.0.1": { 477 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 478 | "dependencies": [ 479 | "color-name" 480 | ] 481 | }, 482 | "color-name@1.1.4": { 483 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 484 | }, 485 | "commondir@1.0.1": { 486 | "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" 487 | }, 488 | "concat-map@0.0.1": { 489 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 490 | }, 491 | "convert-source-map@2.0.0": { 492 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" 493 | }, 494 | "debug@4.4.1": { 495 | "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", 496 | "dependencies": [ 497 | "ms" 498 | ] 499 | }, 500 | "electron-to-chromium@1.5.166": { 501 | "integrity": "sha512-QPWqHL0BglzPYyJJ1zSSmwFFL6MFXhbACOCcsCdUMCkzPdS9/OIBVxg516X/Ado2qwAq8k0nJJ7phQPCqiaFAw==" 502 | }, 503 | "escalade@3.2.0": { 504 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==" 505 | }, 506 | "esprima@4.0.1": { 507 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 508 | "bin": true 509 | }, 510 | "fill-range@7.1.1": { 511 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 512 | "dependencies": [ 513 | "to-regex-range" 514 | ] 515 | }, 516 | "find-cache-dir@2.1.0": { 517 | "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", 518 | "dependencies": [ 519 | "commondir", 520 | "make-dir", 521 | "pkg-dir" 522 | ] 523 | }, 524 | "find-up@3.0.0": { 525 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 526 | "dependencies": [ 527 | "locate-path" 528 | ] 529 | }, 530 | "flow-parser@0.273.0": { 531 | "integrity": "sha512-KHe9AJfT0Zn0TpQ2daDFBpwaE0zqjWWiWLOANxzo/U6Xar5fRpU3Lucnk8iMVNitxo9inz2OmSnger70qHmsLw==" 532 | }, 533 | "fs.realpath@1.0.0": { 534 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" 535 | }, 536 | "gensync@1.0.0-beta.2": { 537 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" 538 | }, 539 | "glob@7.2.3": { 540 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 541 | "dependencies": [ 542 | "fs.realpath", 543 | "inflight", 544 | "inherits", 545 | "minimatch", 546 | "once", 547 | "path-is-absolute" 548 | ], 549 | "deprecated": true 550 | }, 551 | "globals@11.12.0": { 552 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" 553 | }, 554 | "graceful-fs@4.2.11": { 555 | "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 556 | }, 557 | "has-flag@4.0.0": { 558 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 559 | }, 560 | "imurmurhash@0.1.4": { 561 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" 562 | }, 563 | "inflight@1.0.6": { 564 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 565 | "dependencies": [ 566 | "once", 567 | "wrappy" 568 | ], 569 | "deprecated": true 570 | }, 571 | "inherits@2.0.4": { 572 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 573 | }, 574 | "is-number@7.0.0": { 575 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 576 | }, 577 | "is-plain-object@2.0.4": { 578 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 579 | "dependencies": [ 580 | "isobject" 581 | ] 582 | }, 583 | "isobject@3.0.1": { 584 | "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" 585 | }, 586 | "js-tokens@4.0.0": { 587 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 588 | }, 589 | "jscodeshift@0.15.2_@babel+core@7.27.4": { 590 | "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==", 591 | "dependencies": [ 592 | "@babel/core", 593 | "@babel/parser", 594 | "@babel/plugin-transform-class-properties", 595 | "@babel/plugin-transform-modules-commonjs", 596 | "@babel/plugin-transform-nullish-coalescing-operator", 597 | "@babel/plugin-transform-optional-chaining", 598 | "@babel/plugin-transform-private-methods", 599 | "@babel/preset-flow", 600 | "@babel/preset-typescript", 601 | "@babel/register", 602 | "babel-core", 603 | "chalk", 604 | "flow-parser", 605 | "graceful-fs", 606 | "micromatch", 607 | "neo-async", 608 | "node-dir", 609 | "recast", 610 | "temp", 611 | "write-file-atomic" 612 | ], 613 | "bin": true 614 | }, 615 | "jsesc@3.1.0": { 616 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 617 | "bin": true 618 | }, 619 | "json5@2.2.3": { 620 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 621 | "bin": true 622 | }, 623 | "kind-of@6.0.3": { 624 | "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" 625 | }, 626 | "locate-path@3.0.0": { 627 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 628 | "dependencies": [ 629 | "p-locate", 630 | "path-exists" 631 | ] 632 | }, 633 | "lru-cache@5.1.1": { 634 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 635 | "dependencies": [ 636 | "yallist" 637 | ] 638 | }, 639 | "make-dir@2.1.0": { 640 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", 641 | "dependencies": [ 642 | "pify", 643 | "semver@5.7.2" 644 | ] 645 | }, 646 | "micromatch@4.0.8": { 647 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 648 | "dependencies": [ 649 | "braces", 650 | "picomatch" 651 | ] 652 | }, 653 | "minimatch@3.1.2": { 654 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 655 | "dependencies": [ 656 | "brace-expansion" 657 | ] 658 | }, 659 | "ms@2.1.3": { 660 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 661 | }, 662 | "neo-async@2.6.2": { 663 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" 664 | }, 665 | "node-dir@0.1.17": { 666 | "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", 667 | "dependencies": [ 668 | "minimatch" 669 | ] 670 | }, 671 | "node-releases@2.0.19": { 672 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" 673 | }, 674 | "once@1.4.0": { 675 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 676 | "dependencies": [ 677 | "wrappy" 678 | ] 679 | }, 680 | "p-limit@2.3.0": { 681 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 682 | "dependencies": [ 683 | "p-try" 684 | ] 685 | }, 686 | "p-locate@3.0.0": { 687 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 688 | "dependencies": [ 689 | "p-limit" 690 | ] 691 | }, 692 | "p-try@2.2.0": { 693 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 694 | }, 695 | "path-exists@3.0.0": { 696 | "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" 697 | }, 698 | "path-is-absolute@1.0.1": { 699 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" 700 | }, 701 | "picocolors@1.1.1": { 702 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" 703 | }, 704 | "picomatch@2.3.1": { 705 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 706 | }, 707 | "pify@4.0.1": { 708 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" 709 | }, 710 | "pirates@4.0.7": { 711 | "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==" 712 | }, 713 | "pkg-dir@3.0.0": { 714 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", 715 | "dependencies": [ 716 | "find-up" 717 | ] 718 | }, 719 | "recast@0.23.11": { 720 | "integrity": "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==", 721 | "dependencies": [ 722 | "ast-types", 723 | "esprima", 724 | "source-map", 725 | "tiny-invariant", 726 | "tslib" 727 | ] 728 | }, 729 | "rimraf@2.6.3": { 730 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 731 | "dependencies": [ 732 | "glob" 733 | ], 734 | "deprecated": true, 735 | "bin": true 736 | }, 737 | "semver@5.7.2": { 738 | "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", 739 | "bin": true 740 | }, 741 | "semver@6.3.1": { 742 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 743 | "bin": true 744 | }, 745 | "shallow-clone@3.0.1": { 746 | "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", 747 | "dependencies": [ 748 | "kind-of" 749 | ] 750 | }, 751 | "signal-exit@3.0.7": { 752 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" 753 | }, 754 | "source-map-support@0.5.21": { 755 | "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", 756 | "dependencies": [ 757 | "buffer-from", 758 | "source-map" 759 | ] 760 | }, 761 | "source-map@0.6.1": { 762 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 763 | }, 764 | "supports-color@7.2.0": { 765 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 766 | "dependencies": [ 767 | "has-flag" 768 | ] 769 | }, 770 | "temp@0.8.4": { 771 | "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", 772 | "dependencies": [ 773 | "rimraf" 774 | ] 775 | }, 776 | "tiny-invariant@1.3.3": { 777 | "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" 778 | }, 779 | "to-regex-range@5.0.1": { 780 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 781 | "dependencies": [ 782 | "is-number" 783 | ] 784 | }, 785 | "tslib@2.8.1": { 786 | "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" 787 | }, 788 | "undici-types@6.21.0": { 789 | "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" 790 | }, 791 | "update-browserslist-db@1.1.3_browserslist@4.25.0": { 792 | "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", 793 | "dependencies": [ 794 | "browserslist", 795 | "escalade", 796 | "picocolors" 797 | ], 798 | "bin": true 799 | }, 800 | "wrappy@1.0.2": { 801 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 802 | }, 803 | "write-file-atomic@2.4.3": { 804 | "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", 805 | "dependencies": [ 806 | "graceful-fs", 807 | "imurmurhash", 808 | "signal-exit" 809 | ] 810 | }, 811 | "yallist@3.1.1": { 812 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 813 | } 814 | }, 815 | "workspace": { 816 | "dependencies": [ 817 | "jsr:@david/dax@~0.43.2", 818 | "jsr:@std/assert@^1.0.13", 819 | "jsr:@std/toml@^1.0.7" 820 | ] 821 | } 822 | } 823 | -------------------------------------------------------------------------------- /src/rs_lib/lib.rs: -------------------------------------------------------------------------------- 1 | mod http_client; 2 | 3 | use std::borrow::Cow; 4 | use std::cell::RefCell; 5 | use std::error::Error; 6 | use std::path::Path; 7 | use std::path::PathBuf; 8 | use std::rc::Rc; 9 | use std::sync::Arc; 10 | use std::sync::OnceLock; 11 | 12 | use anyhow::Context; 13 | use anyhow::bail; 14 | use deno_ast::ModuleKind; 15 | use deno_cache_dir::file_fetcher::CacheSetting; 16 | use deno_cache_dir::file_fetcher::NullBlobStore; 17 | use deno_config::deno_json::NewestDependencyDate; 18 | use deno_error::JsErrorBox; 19 | use deno_graph::CheckJsOption; 20 | use deno_graph::GraphKind; 21 | use deno_graph::JsrMetadataStore; 22 | use deno_graph::MediaType; 23 | use deno_graph::ModuleGraph; 24 | use deno_graph::Position; 25 | use deno_graph::WalkOptions; 26 | use deno_graph::analysis::ModuleAnalyzer; 27 | use deno_graph::ast::CapturingEsParser; 28 | use deno_graph::ast::DefaultEsParser; 29 | use deno_graph::ast::EsParser; 30 | use deno_graph::ast::ParsedSourceStore; 31 | use deno_npm_installer::NpmInstallerFactory; 32 | use deno_npm_installer::NpmInstallerFactoryOptions; 33 | use deno_npm_installer::Reporter; 34 | use deno_npm_installer::lifecycle_scripts::NullLifecycleScriptsExecutor; 35 | use deno_resolver::DenoResolveError; 36 | use deno_resolver::DenoResolveErrorKind; 37 | use deno_resolver::cache::ParsedSourceCache; 38 | use deno_resolver::cjs::CjsTrackerRc; 39 | use deno_resolver::deno_json::CompilerOptionsOverrides; 40 | use deno_resolver::deno_json::CompilerOptionsResolver; 41 | use deno_resolver::deno_json::JsxImportSourceConfigResolver; 42 | use deno_resolver::emit::Emitter; 43 | use deno_resolver::factory::ConfigDiscoveryOption; 44 | use deno_resolver::factory::NpmSystemInfo; 45 | use deno_resolver::factory::ResolverFactory; 46 | use deno_resolver::factory::ResolverFactoryOptions; 47 | use deno_resolver::factory::WorkspaceFactory; 48 | use deno_resolver::factory::WorkspaceFactoryOptions; 49 | use deno_resolver::file_fetcher::DenoGraphLoader; 50 | use deno_resolver::file_fetcher::DenoGraphLoaderOptions; 51 | use deno_resolver::file_fetcher::PermissionedFileFetcher; 52 | use deno_resolver::file_fetcher::PermissionedFileFetcherOptions; 53 | use deno_resolver::graph::DefaultDenoResolverRc; 54 | use deno_resolver::graph::ResolveWithGraphError; 55 | use deno_resolver::graph::ResolveWithGraphErrorKind; 56 | use deno_resolver::graph::ResolveWithGraphOptions; 57 | use deno_resolver::loader::AllowJsonImports; 58 | use deno_resolver::loader::LoadCodeSourceErrorKind; 59 | use deno_resolver::loader::LoadedModuleOrAsset; 60 | use deno_resolver::loader::MemoryFilesRc; 61 | use deno_resolver::loader::ModuleLoader; 62 | use deno_resolver::loader::RequestedModuleType; 63 | use deno_resolver::npm::DenoInNpmPackageChecker; 64 | use deno_resolver::workspace::MappedResolutionError; 65 | use deno_semver::SmallStackString; 66 | use deno_semver::jsr::JsrPackageReqReference; 67 | use deno_semver::npm::NpmPackageReqReference; 68 | use js_sys::Object; 69 | use js_sys::Uint8Array; 70 | use log::LevelFilter; 71 | use log::Metadata; 72 | use log::Record; 73 | use node_resolver::NodeConditionOptions; 74 | use node_resolver::NodeResolverOptions; 75 | use node_resolver::PackageJsonThreadLocalCache; 76 | use node_resolver::analyze::NodeCodeTranslatorMode; 77 | use node_resolver::cache::NodeResolutionThreadLocalCache; 78 | use node_resolver::errors::NodeJsErrorCode; 79 | use node_resolver::errors::NodeJsErrorCoded; 80 | use serde::Deserialize; 81 | use serde::Serialize; 82 | use sys_traits::EnvCurrentDir; 83 | use sys_traits::impls::RealSys; 84 | use url::Url; 85 | use wasm_bindgen::JsValue; 86 | use wasm_bindgen::prelude::wasm_bindgen; 87 | 88 | use self::http_client::WasmHttpClient; 89 | 90 | #[wasm_bindgen] 91 | extern "C" { 92 | #[wasm_bindgen(thread_local_v2, js_name = process)] 93 | static PROCESS_GLOBAL: JsValue; 94 | #[wasm_bindgen(js_namespace = console)] 95 | fn error(s: &JsValue); 96 | } 97 | 98 | static GLOBAL_LOGGER: OnceLock = OnceLock::new(); 99 | 100 | struct Logger { 101 | debug: bool, 102 | } 103 | 104 | impl log::Log for Logger { 105 | fn enabled(&self, metadata: &Metadata) -> bool { 106 | metadata.level() <= log::Level::Info 107 | || metadata.level() == log::Level::Debug && self.debug 108 | } 109 | 110 | fn log(&self, record: &Record) { 111 | if self.enabled(record.metadata()) { 112 | error(&JsValue::from(format!( 113 | "{} RS - {}", 114 | record.level(), 115 | record.args() 116 | ))); 117 | } 118 | } 119 | 120 | fn flush(&self) {} 121 | } 122 | 123 | #[derive(Debug, Clone)] 124 | pub struct ConsoleLogReporter; 125 | 126 | impl Reporter for ConsoleLogReporter { 127 | type Guard = (); 128 | type ClearGuard = (); 129 | 130 | fn on_blocking(&self, message: &str) -> Self::Guard { 131 | error(&JsValue::from(format!( 132 | "{} {}", 133 | "Blocking", // todo: cyan 134 | message 135 | ))); 136 | } 137 | 138 | fn on_initializing(&self, message: &str) -> Self::Guard { 139 | error(&JsValue::from(format!( 140 | "{} {}", 141 | "Initialize", // todo: green 142 | message 143 | ))); 144 | } 145 | 146 | fn clear_guard(&self) -> Self::ClearGuard {} 147 | } 148 | 149 | #[derive(Serialize)] 150 | #[serde(rename_all = "camelCase")] 151 | pub struct LoadResponse { 152 | pub specifier: String, 153 | pub media_type: u8, 154 | pub code: Arc<[u8]>, 155 | } 156 | 157 | #[derive(Deserialize)] 158 | #[serde(rename_all = "camelCase")] 159 | pub struct DenoWorkspaceOptions { 160 | // make all these optional to support someone providing `undefined` 161 | #[serde(default)] 162 | pub no_config: Option, 163 | #[serde(default)] 164 | pub no_lock: Option, 165 | #[serde(default)] 166 | pub platform: Option, 167 | #[serde(default)] 168 | pub config_path: Option, 169 | #[serde(default)] 170 | pub node_conditions: Option>, 171 | #[serde(default)] 172 | pub newest_dependency_date: Option>, 173 | #[serde(default)] 174 | pub cached_only: Option, 175 | #[serde(default)] 176 | pub preserve_jsx: Option, 177 | #[serde(default)] 178 | pub no_transpile: Option, 179 | #[serde(default)] 180 | pub debug: Option, 181 | } 182 | 183 | #[wasm_bindgen] 184 | pub struct DenoWorkspace { 185 | http_client: WasmHttpClient, 186 | npm_installer_factory: 187 | Rc>, 188 | resolver_factory: Arc>, 189 | workspace_factory: Arc>, 190 | } 191 | 192 | impl Drop for DenoWorkspace { 193 | fn drop(&mut self) { 194 | PackageJsonThreadLocalCache::clear(); 195 | } 196 | } 197 | 198 | #[wasm_bindgen] 199 | impl DenoWorkspace { 200 | #[wasm_bindgen(constructor)] 201 | pub fn new(options: JsValue) -> Result { 202 | console_error_panic_hook::set_once(); 203 | let options = serde_wasm_bindgen::from_value(options).map_err(|err| { 204 | create_js_error( 205 | &anyhow::anyhow!("{}", err) 206 | .context("Failed deserializing workspace options."), 207 | ) 208 | })?; 209 | Self::new_inner(options).map_err(|e| create_js_error(&e)) 210 | } 211 | 212 | fn new_inner(options: DenoWorkspaceOptions) -> Result { 213 | fn resolve_is_browser_platform( 214 | options: &DenoWorkspaceOptions, 215 | ) -> Result { 216 | Ok(match options.platform.as_deref() { 217 | Some("node" | "deno") => false, 218 | Some("browser") => true, 219 | Some(value) => bail!("Unknown platform '{}'", value), 220 | None => false, 221 | }) 222 | } 223 | 224 | let debug = options.debug.unwrap_or(false); 225 | let logger = GLOBAL_LOGGER.get_or_init(|| Logger { debug }); 226 | _ = log::set_logger(logger).map(|()| { 227 | log::set_max_level(if debug { 228 | LevelFilter::Debug 229 | } else { 230 | LevelFilter::Info 231 | }) 232 | }); 233 | 234 | let sys = RealSys; 235 | let cwd = sys.env_current_dir()?; 236 | let is_browser_platform = resolve_is_browser_platform(&options)?; 237 | let config_discovery = if options.no_config.unwrap_or_default() { 238 | ConfigDiscoveryOption::Disabled 239 | } else if let Some(config_path) = options.config_path { 240 | ConfigDiscoveryOption::Path( 241 | resolve_absolute_path(config_path, &cwd) 242 | .context("Failed resolving config path.")?, 243 | ) 244 | } else { 245 | ConfigDiscoveryOption::DiscoverCwd 246 | }; 247 | let workspace_factory = Arc::new(WorkspaceFactory::new( 248 | sys.clone(), 249 | cwd, 250 | WorkspaceFactoryOptions { 251 | additional_config_file_names: &[], 252 | config_discovery, 253 | is_package_manager_subcommand: false, 254 | frozen_lockfile: None, // provide this via config 255 | lock_arg: None, // supports the default only 256 | lockfile_skip_write: false, 257 | maybe_custom_deno_dir_root: None, 258 | node_modules_dir: None, // provide this via config 259 | no_lock: options.no_lock.unwrap_or_default(), 260 | no_npm: false, 261 | npm_process_state: None, 262 | root_node_modules_dir_override: None, 263 | vendor: None, // provide this via the config 264 | }, 265 | )); 266 | let resolver_factory = Arc::new(ResolverFactory::new( 267 | workspace_factory.clone(), 268 | ResolverFactoryOptions { 269 | allow_json_imports: AllowJsonImports::Always, 270 | compiler_options_overrides: CompilerOptionsOverrides { 271 | no_transpile: options.no_transpile.unwrap_or(false), 272 | source_map_base: Some( 273 | workspace_factory 274 | .workspace_directory()? 275 | .workspace 276 | .root_dir_url() 277 | .as_ref() 278 | .clone(), 279 | ), 280 | preserve_jsx: options.preserve_jsx.unwrap_or(false), 281 | }, 282 | // todo: make this configurable 283 | is_cjs_resolution_mode: 284 | deno_resolver::cjs::IsCjsResolutionMode::ExplicitTypeCommonJs, 285 | unstable_sloppy_imports: true, 286 | npm_system_info: npm_system_info()?, 287 | node_resolver_options: NodeResolverOptions { 288 | is_browser_platform, 289 | bundle_mode: true, 290 | conditions: NodeConditionOptions { 291 | conditions: options 292 | .node_conditions 293 | .unwrap_or_default() 294 | .into_iter() 295 | .map(|c| c.into()) 296 | .collect(), 297 | import_conditions_override: None, 298 | require_conditions_override: None, 299 | }, 300 | typescript_version: None, 301 | }, 302 | node_analysis_cache: None, 303 | node_code_translator_mode: NodeCodeTranslatorMode::Disabled, 304 | node_resolution_cache: Some(Arc::new(NodeResolutionThreadLocalCache)), 305 | package_json_cache: Some(Arc::new(PackageJsonThreadLocalCache)), 306 | package_json_dep_resolution: None, 307 | require_modules: Vec::new(), 308 | specified_import_map: None, 309 | bare_node_builtins: true, 310 | newest_dependency_date: options 311 | .newest_dependency_date 312 | .map(NewestDependencyDate::Enabled), 313 | // todo: report these 314 | on_mapped_resolution_diagnostic: None, 315 | }, 316 | )); 317 | let http_client = WasmHttpClient::default(); 318 | let npm_installer_factory = Rc::new(NpmInstallerFactory::new( 319 | resolver_factory.clone(), 320 | Arc::new(http_client.clone()), 321 | Arc::new(NullLifecycleScriptsExecutor), 322 | ConsoleLogReporter, 323 | None, 324 | NpmInstallerFactoryOptions { 325 | cache_setting: if options.cached_only.unwrap_or_default() { 326 | deno_npm_cache::NpmCacheSetting::Only 327 | } else { 328 | deno_npm_cache::NpmCacheSetting::Use 329 | }, 330 | caching_strategy: deno_npm_installer::graph::NpmCachingStrategy::Eager, 331 | lifecycle_scripts_config: deno_npm_installer::LifecycleScriptsConfig { 332 | allowed: deno_npm_installer::PackagesAllowedScripts::None, 333 | denied: Vec::new(), 334 | initial_cwd: workspace_factory.initial_cwd().clone(), 335 | root_dir: workspace_factory 336 | .workspace_directory()? 337 | .workspace 338 | .root_dir_path(), 339 | explicit_install: false, 340 | }, 341 | resolve_npm_resolution_snapshot: Box::new(|| Ok(None)), 342 | }, 343 | )); 344 | Ok(Self { 345 | http_client, 346 | npm_installer_factory, 347 | resolver_factory, 348 | workspace_factory, 349 | }) 350 | } 351 | 352 | pub async fn create_loader(&self) -> Result { 353 | self 354 | .create_loader_inner() 355 | .await 356 | .map_err(|e| create_js_error(&e)) 357 | } 358 | 359 | async fn create_loader_inner(&self) -> Result { 360 | self 361 | .npm_installer_factory 362 | .initialize_npm_resolution_if_managed() 363 | .await?; 364 | let file_fetcher = Arc::new(PermissionedFileFetcher::new( 365 | NullBlobStore, 366 | Arc::new(self.workspace_factory.http_cache()?.clone()), 367 | self.http_client.clone(), 368 | MemoryFilesRc::default(), 369 | self.workspace_factory.sys().clone(), 370 | PermissionedFileFetcherOptions { 371 | allow_remote: true, 372 | cache_setting: CacheSetting::Use, 373 | }, 374 | )); 375 | Ok(DenoLoader { 376 | cjs_tracker: self.resolver_factory.cjs_tracker()?.clone(), 377 | compiler_options_resolver: self 378 | .resolver_factory 379 | .compiler_options_resolver()? 380 | .clone(), 381 | file_fetcher, 382 | emitter: self.resolver_factory.emitter()?.clone(), 383 | resolver: self.resolver_factory.deno_resolver().await?.clone(), 384 | workspace_factory: self.workspace_factory.clone(), 385 | resolver_factory: self.resolver_factory.clone(), 386 | npm_installer_factory: self.npm_installer_factory.clone(), 387 | parsed_source_cache: self.resolver_factory.parsed_source_cache().clone(), 388 | module_loader: self.resolver_factory.module_loader()?.clone(), 389 | task_queue: Default::default(), 390 | graph: ModuleGraphCell::new(deno_graph::ModuleGraph::new( 391 | deno_graph::GraphKind::CodeOnly, 392 | )), 393 | jsr_metadata_store: Rc::new(JsrMetadataStore::default()), 394 | }) 395 | } 396 | } 397 | 398 | #[wasm_bindgen] 399 | pub struct DenoLoader { 400 | cjs_tracker: CjsTrackerRc, 401 | compiler_options_resolver: Arc, 402 | resolver: DefaultDenoResolverRc, 403 | file_fetcher: 404 | Arc>, 405 | emitter: Arc>, 406 | npm_installer_factory: 407 | Rc>, 408 | parsed_source_cache: Arc, 409 | module_loader: Arc>, 410 | resolver_factory: Arc>, 411 | workspace_factory: Arc>, 412 | graph: ModuleGraphCell, 413 | task_queue: Rc, 414 | jsr_metadata_store: Rc, 415 | } 416 | 417 | impl Drop for DenoLoader { 418 | fn drop(&mut self) { 419 | NodeResolutionThreadLocalCache::clear(); 420 | } 421 | } 422 | 423 | #[wasm_bindgen] 424 | impl DenoLoader { 425 | pub fn get_graph(&self) -> JsValue { 426 | let serializer = 427 | serde_wasm_bindgen::Serializer::new().serialize_maps_as_objects(true); 428 | self.graph.get().serialize(&serializer).unwrap() 429 | } 430 | 431 | pub async fn add_entrypoints( 432 | &self, 433 | entrypoints: Vec, 434 | ) -> Result, JsValue> { 435 | self 436 | .add_entrypoints_internal(entrypoints) 437 | .await 438 | .map_err(|e| create_js_error(&e)) 439 | } 440 | 441 | async fn add_entrypoints_internal( 442 | &self, 443 | entrypoints: Vec, 444 | ) -> Result, anyhow::Error> { 445 | let urls = entrypoints 446 | .into_iter() 447 | .map(|e| { 448 | self.resolve_entrypoint( 449 | Cow::Owned(e), 450 | node_resolver::ResolutionMode::Import, 451 | ) 452 | }) 453 | .collect::, _>>()?; 454 | self.add_entrypoint_urls(urls.clone()).await?; 455 | let errors = self 456 | .graph 457 | .get() 458 | .walk( 459 | urls.iter(), 460 | WalkOptions { 461 | check_js: CheckJsOption::True, 462 | kind: GraphKind::CodeOnly, 463 | follow_dynamic: false, 464 | prefer_fast_check_graph: false, 465 | }, 466 | ) 467 | .errors() 468 | .map(|e| e.to_string_with_range()) 469 | .collect(); 470 | Ok(errors) 471 | } 472 | 473 | async fn add_entrypoint_urls( 474 | &self, 475 | entrypoints: Vec, 476 | ) -> Result<(), anyhow::Error> { 477 | // only allow one async task to modify the graph at a time 478 | let task_queue = self.task_queue.clone(); 479 | task_queue 480 | .run(async { 481 | let npm_package_info_provider = self 482 | .npm_installer_factory 483 | .lockfile_npm_package_info_provider()?; 484 | let lockfile = self 485 | .workspace_factory 486 | .maybe_lockfile(npm_package_info_provider) 487 | .await?; 488 | let jsx_config = 489 | JsxImportSourceConfigResolver::from_compiler_options_resolver( 490 | &self.compiler_options_resolver, 491 | )?; 492 | 493 | let graph_resolver = self 494 | .resolver 495 | .as_graph_resolver(&self.cjs_tracker, &jsx_config); 496 | let loader = DenoGraphLoader::new( 497 | self.file_fetcher.clone(), 498 | self.workspace_factory.global_http_cache()?.clone(), 499 | self.resolver_factory.in_npm_package_checker()?.clone(), 500 | self.workspace_factory.sys().clone(), 501 | DenoGraphLoaderOptions { 502 | file_header_overrides: Default::default(), 503 | permissions: None, 504 | reporter: None, 505 | }, 506 | ); 507 | 508 | let mut locker = lockfile.as_ref().map(|l| l.as_deno_graph_locker()); 509 | let npm_resolver = 510 | self.npm_installer_factory.npm_deno_graph_resolver().await?; 511 | let module_analyzer = CapturingModuleAnalyzerRef { 512 | store: self.parsed_source_cache.as_ref(), 513 | parser: &DefaultEsParser, 514 | }; 515 | let mut graph = self.graph.deep_clone(); 516 | if graph.roots.is_empty() 517 | && let Some(lockfile) = lockfile 518 | { 519 | lockfile.fill_graph(&mut graph); 520 | } 521 | let jsr_version_resolver = 522 | self.resolver_factory.jsr_version_resolver()?; 523 | graph 524 | .build( 525 | entrypoints, 526 | Vec::new(), 527 | &loader, 528 | deno_graph::BuildOptions { 529 | is_dynamic: false, 530 | skip_dynamic_deps: false, 531 | module_info_cacher: Default::default(), 532 | executor: Default::default(), 533 | locker: locker.as_mut().map(|l| l as _), 534 | file_system: self.workspace_factory.sys(), 535 | jsr_url_provider: Default::default(), 536 | jsr_version_resolver: Cow::Borrowed( 537 | jsr_version_resolver.as_ref(), 538 | ), 539 | passthrough_jsr_specifiers: false, 540 | module_analyzer: &module_analyzer, 541 | npm_resolver: Some(npm_resolver.as_ref()), 542 | reporter: None, 543 | resolver: Some(&graph_resolver), 544 | unstable_bytes_imports: true, 545 | unstable_text_imports: true, 546 | jsr_metadata_store: Some(self.jsr_metadata_store.clone()), 547 | }, 548 | ) 549 | .await; 550 | self.graph.set(Rc::new(graph)); 551 | Ok(()) 552 | }) 553 | .await 554 | } 555 | 556 | pub fn resolve_sync( 557 | &self, 558 | specifier: String, 559 | importer: Option, 560 | resolution_mode: u8, 561 | ) -> Result { 562 | let importer = self 563 | .resolve_provided_referrer(importer) 564 | .map_err(|e| create_js_error(&e))?; 565 | self 566 | .resolve_sync_inner( 567 | &specifier, 568 | importer.as_ref(), 569 | parse_resolution_mode(resolution_mode), 570 | ) 571 | .map_err(|err| { 572 | self.create_resolve_js_error(&err, &specifier, importer.as_ref()) 573 | }) 574 | } 575 | 576 | fn resolve_sync_inner( 577 | &self, 578 | specifier: &str, 579 | importer: Option<&Url>, 580 | resolution_mode: node_resolver::ResolutionMode, 581 | ) -> Result { 582 | let (specifier, referrer) = self.resolve_specifier_and_referrer( 583 | specifier, 584 | importer, 585 | resolution_mode, 586 | )?; 587 | let resolved = self.resolver.resolve_with_graph( 588 | &self.graph.get(), 589 | &specifier, 590 | &referrer, 591 | deno_graph::Position::zeroed(), 592 | ResolveWithGraphOptions { 593 | mode: resolution_mode, 594 | kind: node_resolver::NodeResolutionKind::Execution, 595 | maintain_npm_specifiers: false, 596 | }, 597 | )?; 598 | Ok(resolved.into()) 599 | } 600 | 601 | pub async fn resolve( 602 | &self, 603 | specifier: String, 604 | importer: Option, 605 | resolution_mode: u8, 606 | ) -> Result { 607 | let importer = self 608 | .resolve_provided_referrer(importer) 609 | .map_err(|e| create_js_error(&e))?; 610 | self 611 | .resolve_inner( 612 | &specifier, 613 | importer.as_ref(), 614 | parse_resolution_mode(resolution_mode), 615 | ) 616 | .await 617 | .map_err(|err| { 618 | self.create_resolve_js_error(&err, &specifier, importer.as_ref()) 619 | }) 620 | } 621 | 622 | async fn resolve_inner( 623 | &self, 624 | specifier: &str, 625 | importer: Option<&Url>, 626 | resolution_mode: node_resolver::ResolutionMode, 627 | ) -> Result { 628 | let (specifier, referrer) = self.resolve_specifier_and_referrer( 629 | specifier, 630 | importer, 631 | resolution_mode, 632 | )?; 633 | let resolved = self.resolver.resolve_with_graph( 634 | &self.graph.get(), 635 | &specifier, 636 | &referrer, 637 | deno_graph::Position::zeroed(), 638 | ResolveWithGraphOptions { 639 | mode: resolution_mode, 640 | kind: node_resolver::NodeResolutionKind::Execution, 641 | maintain_npm_specifiers: true, 642 | }, 643 | )?; 644 | if NpmPackageReqReference::from_specifier(&resolved).is_ok() 645 | || JsrPackageReqReference::from_specifier(&resolved).is_ok() 646 | { 647 | self.add_entrypoint_urls(vec![resolved.clone()]).await?; 648 | self.resolve_sync_inner(&specifier, importer, resolution_mode) 649 | } else { 650 | Ok(resolved.into()) 651 | } 652 | } 653 | 654 | fn resolve_specifier_and_referrer<'a>( 655 | &self, 656 | specifier: &'a str, 657 | referrer: Option<&'a Url>, 658 | resolution_mode: node_resolver::ResolutionMode, 659 | ) -> Result<(Cow<'a, str>, Cow<'a, Url>), anyhow::Error> { 660 | Ok(match referrer { 661 | Some(referrer) => (Cow::Borrowed(specifier), Cow::Borrowed(referrer)), 662 | None => { 663 | let entrypoint = Cow::Owned( 664 | self 665 | .resolve_entrypoint(Cow::Borrowed(specifier), resolution_mode)? 666 | .into(), 667 | ); 668 | ( 669 | entrypoint, 670 | Cow::Owned(deno_path_util::url_from_directory_path( 671 | self.workspace_factory.initial_cwd(), 672 | )?), 673 | ) 674 | } 675 | }) 676 | } 677 | 678 | fn resolve_provided_referrer( 679 | &self, 680 | importer: Option, 681 | ) -> Result, anyhow::Error> { 682 | let importer = importer.filter(|v| !v.is_empty()); 683 | Ok(match importer { 684 | Some(referrer) 685 | if referrer.starts_with("http:") 686 | || referrer.starts_with("https:") 687 | || referrer.starts_with("file:") => 688 | { 689 | Some(Url::parse(&referrer)?) 690 | } 691 | Some(referrer) => Some(deno_path_util::url_from_file_path( 692 | &sys_traits::impls::wasm_string_to_path(referrer), 693 | )?), 694 | None => None, 695 | }) 696 | } 697 | 698 | pub async fn load( 699 | &self, 700 | url: String, 701 | requested_module_type: u8, 702 | ) -> Result { 703 | let requested_module_type = match requested_module_type { 704 | 0 => RequestedModuleType::None, 705 | 1 => RequestedModuleType::Json, 706 | 2 => RequestedModuleType::Text, 707 | 3 => RequestedModuleType::Bytes, 708 | _ => { 709 | return Err(create_js_error(&anyhow::anyhow!( 710 | "Invalid requested module type: {}", 711 | requested_module_type 712 | ))); 713 | } 714 | }; 715 | self 716 | .load_inner(url, &requested_module_type) 717 | .await 718 | .map_err(|err| create_js_error(&err)) 719 | } 720 | 721 | async fn load_inner( 722 | &self, 723 | url: String, 724 | requested_module_type: &RequestedModuleType<'_>, 725 | ) -> Result { 726 | let url = Url::parse(&url)?; 727 | 728 | if url.scheme() == "node" { 729 | return Ok(create_external_repsonse(&url)); 730 | } else if url.scheme() == "jsr" { 731 | bail!( 732 | "Failed loading '{}'. jsr: specifiers must be resolved to an https: specifier before being loaded.", 733 | url 734 | ); 735 | } 736 | 737 | match self 738 | .module_loader 739 | .load(&self.graph.get(), &url, None, requested_module_type) 740 | .await 741 | { 742 | Ok(LoadedModuleOrAsset::Module(m)) => { 743 | self.parsed_source_cache.free(&m.specifier); 744 | Ok(create_module_response( 745 | &m.specifier, 746 | m.media_type, 747 | m.source.as_bytes(), 748 | )) 749 | } 750 | Ok(LoadedModuleOrAsset::ExternalAsset { 751 | specifier, 752 | statically_analyzable: _, 753 | }) => { 754 | let file = self 755 | .file_fetcher 756 | .fetch_bypass_permissions(&specifier) 757 | .await?; 758 | let media_type = MediaType::from_specifier_and_headers( 759 | &file.url, 760 | file.maybe_headers.as_ref(), 761 | ); 762 | Ok(create_module_response(&file.url, media_type, &file.source)) 763 | } 764 | Err(err) => match err.as_kind() { 765 | LoadCodeSourceErrorKind::LoadUnpreparedModule(_) => { 766 | if url.scheme() == "npm" { 767 | bail!( 768 | "Failed resolving '{}'\n\nResolve the npm: specifier to a file: specifier before providing it to the loader.", 769 | url 770 | ) 771 | } 772 | let file = self.file_fetcher.fetch_bypass_permissions(&url).await?; 773 | let media_type = MediaType::from_specifier_and_headers( 774 | &url, 775 | file.maybe_headers.as_ref(), 776 | ); 777 | match requested_module_type { 778 | RequestedModuleType::Text | RequestedModuleType::Bytes => { 779 | Ok(create_module_response(&file.url, media_type, &file.source)) 780 | } 781 | RequestedModuleType::Json 782 | | RequestedModuleType::None 783 | | RequestedModuleType::Other(_) => { 784 | if media_type.is_emittable() { 785 | let str = String::from_utf8_lossy(&file.source); 786 | let value = str.into(); 787 | let source = self 788 | .maybe_transpile(&file.url, media_type, &value, None) 789 | .await?; 790 | Ok(create_module_response( 791 | &file.url, 792 | media_type, 793 | source.as_bytes(), 794 | )) 795 | } else { 796 | Ok(create_module_response(&file.url, media_type, &file.source)) 797 | } 798 | } 799 | } 800 | } 801 | _ => Err(err.into()), 802 | }, 803 | } 804 | } 805 | 806 | async fn maybe_transpile( 807 | &self, 808 | specifier: &Url, 809 | media_type: MediaType, 810 | source: &Arc, 811 | is_known_script: Option, 812 | ) -> Result, anyhow::Error> { 813 | let parsed_source = self.parsed_source_cache.get_matching_parsed_source( 814 | specifier, 815 | media_type, 816 | source.clone(), 817 | )?; 818 | let is_cjs = if let Some(is_known_script) = is_known_script { 819 | self.cjs_tracker.is_cjs_with_known_is_script( 820 | specifier, 821 | media_type, 822 | is_known_script, 823 | )? 824 | } else { 825 | self.cjs_tracker.is_maybe_cjs(specifier, media_type)? 826 | && parsed_source.compute_is_script() 827 | }; 828 | let module_kind = ModuleKind::from_is_cjs(is_cjs); 829 | let source = self 830 | .emitter 831 | .maybe_emit_parsed_source(parsed_source, module_kind) 832 | .await?; 833 | Ok(source) 834 | } 835 | 836 | fn resolve_entrypoint( 837 | &self, 838 | specifier: Cow, 839 | resolution_mode: node_resolver::ResolutionMode, 840 | ) -> Result { 841 | let cwd = self.workspace_factory.initial_cwd(); 842 | if specifier.contains('\\') { 843 | return Ok(deno_path_util::url_from_file_path(&resolve_absolute_path( 844 | specifier.into_owned(), 845 | cwd, 846 | )?)?); 847 | } 848 | let referrer = deno_path_util::url_from_directory_path(cwd)?; 849 | Ok(self.resolver.resolve( 850 | &specifier, 851 | &referrer, 852 | Position::zeroed(), 853 | resolution_mode, 854 | node_resolver::NodeResolutionKind::Execution, 855 | )?) 856 | } 857 | 858 | fn is_optional_npm_dep(&self, specifier: &str, referrer: &Url) -> bool { 859 | let Ok(referrer_path) = deno_path_util::url_to_file_path(referrer) else { 860 | return false; 861 | }; 862 | for result in self 863 | .resolver_factory 864 | .pkg_json_resolver() 865 | .get_closest_package_jsons(&referrer_path) 866 | { 867 | let Ok(pkg_json) = result else { 868 | continue; 869 | }; 870 | if let Some(optional_deps) = &pkg_json.optional_dependencies 871 | && optional_deps.contains_key(specifier) 872 | { 873 | return true; 874 | } 875 | if let Some(meta) = &pkg_json.peer_dependencies_meta 876 | && let Some(obj) = meta.get(specifier) 877 | && let Some(value) = obj.get("optional") 878 | && let Some(is_optional) = value.as_bool() 879 | && is_optional 880 | { 881 | return true; 882 | } 883 | if let Some(deps) = &pkg_json.dependencies 884 | && deps.contains_key(specifier) 885 | { 886 | return false; 887 | } 888 | if let Some(deps) = &pkg_json.peer_dependencies 889 | && deps.contains_key(specifier) 890 | { 891 | return false; 892 | } 893 | } 894 | false 895 | } 896 | 897 | fn create_resolve_js_error( 898 | &self, 899 | err: &anyhow::Error, 900 | specifier: &str, 901 | maybe_referrer: Option<&Url>, 902 | ) -> JsValue { 903 | let err_value = create_js_error(err); 904 | if let Some(err) = err.downcast_ref::() { 905 | if let Some(code) = resolve_with_graph_error_code(err) { 906 | _ = js_sys::Reflect::set( 907 | &err_value, 908 | &JsValue::from_str("code"), 909 | &JsValue::from_str(code.as_str()), 910 | ); 911 | if code == NodeJsErrorCode::ERR_MODULE_NOT_FOUND 912 | && let Some(referrer) = maybe_referrer 913 | && self.is_optional_npm_dep(specifier, referrer) 914 | { 915 | _ = js_sys::Reflect::set( 916 | &err_value, 917 | &JsValue::from_str("isOptionalDependency"), 918 | &JsValue::from_bool(true), 919 | ); 920 | } 921 | } 922 | if let Some(specifier) = err.maybe_specifier() 923 | && let Ok(url) = specifier.into_owned().into_url() 924 | { 925 | _ = js_sys::Reflect::set( 926 | &err_value, 927 | &JsValue::from_str("specifier"), 928 | &JsValue::from_str(url.as_str()), 929 | ); 930 | } 931 | } 932 | err_value 933 | } 934 | } 935 | 936 | fn resolve_with_graph_error_code( 937 | err: &ResolveWithGraphError, 938 | ) -> Option { 939 | match err.as_kind() { 940 | ResolveWithGraphErrorKind::CouldNotResolveNpmReqRef(err) => { 941 | Some(err.code()) 942 | } 943 | ResolveWithGraphErrorKind::ManagedResolvePkgFolderFromDenoReq(_) => None, 944 | ResolveWithGraphErrorKind::ResolvePkgFolderFromDenoModule(_) => None, 945 | ResolveWithGraphErrorKind::ResolveNpmReqRef(err) => err.err.maybe_code(), 946 | ResolveWithGraphErrorKind::Resolution(err) => err 947 | .source() 948 | .and_then(|s| s.downcast_ref::()) 949 | .and_then(deno_resolve_error_code), 950 | ResolveWithGraphErrorKind::Resolve(err) => deno_resolve_error_code(err), 951 | ResolveWithGraphErrorKind::PathToUrl(_) => None, 952 | } 953 | } 954 | 955 | fn deno_resolve_error_code(err: &DenoResolveError) -> Option { 956 | match err.as_kind() { 957 | DenoResolveErrorKind::InvalidVendorFolderImport 958 | | DenoResolveErrorKind::UnsupportedPackageJsonFileSpecifier 959 | | DenoResolveErrorKind::UnsupportedPackageJsonJsrReq => None, 960 | DenoResolveErrorKind::MappedResolution(err) => match err { 961 | MappedResolutionError::Specifier(_) 962 | | MappedResolutionError::ImportMap(_) 963 | | MappedResolutionError::Workspace(_) 964 | | MappedResolutionError::NotFoundInCompilerOptionsPaths(_) => None, 965 | }, 966 | DenoResolveErrorKind::Node(err) => err.maybe_code(), 967 | DenoResolveErrorKind::ResolveNpmReqRef(err) => err.err.maybe_code(), 968 | DenoResolveErrorKind::NodeModulesOutOfDate(_) 969 | | DenoResolveErrorKind::PackageJsonDepValueParse(_) 970 | | DenoResolveErrorKind::PackageJsonDepValueUrlParse(_) 971 | | DenoResolveErrorKind::PathToUrl(_) 972 | | DenoResolveErrorKind::ResolvePkgFolderFromDenoReq(_) 973 | | DenoResolveErrorKind::WorkspaceResolvePkgJsonFolder(_) => None, 974 | } 975 | } 976 | 977 | fn create_module_response( 978 | url: &Url, 979 | media_type: MediaType, 980 | source: &[u8], 981 | ) -> JsValue { 982 | let obj = Object::new(); 983 | js_sys::Reflect::set( 984 | &obj, 985 | &JsValue::from_str("kind"), 986 | &JsValue::from_str("module"), 987 | ) 988 | .unwrap(); 989 | let specifier = JsValue::from_str(url.as_str()); 990 | js_sys::Reflect::set(&obj, &JsValue::from_str("specifier"), &specifier) 991 | .unwrap(); 992 | js_sys::Reflect::set( 993 | &obj, 994 | &JsValue::from_str("mediaType"), 995 | &JsValue::from(media_type_to_u8(media_type)), 996 | ) 997 | .unwrap(); 998 | let code = Uint8Array::from(source); 999 | js_sys::Reflect::set(&obj, &JsValue::from_str("code"), &code).unwrap(); 1000 | obj.into() 1001 | } 1002 | 1003 | fn create_external_repsonse(url: &Url) -> JsValue { 1004 | let obj = Object::new(); 1005 | js_sys::Reflect::set( 1006 | &obj, 1007 | &JsValue::from_str("kind"), 1008 | &JsValue::from_str("external"), 1009 | ) 1010 | .unwrap(); 1011 | let specifier = JsValue::from_str(url.as_str()); 1012 | js_sys::Reflect::set(&obj, &JsValue::from_str("specifier"), &specifier) 1013 | .unwrap(); 1014 | obj.into() 1015 | } 1016 | 1017 | fn resolve_absolute_path( 1018 | path: String, 1019 | cwd: &Path, 1020 | ) -> Result { 1021 | if path.starts_with("file:///") { 1022 | let url = Url::parse(&path)?; 1023 | Ok(deno_path_util::url_to_file_path(&url)?) 1024 | } else { 1025 | let path = sys_traits::impls::wasm_string_to_path(path); 1026 | Ok(cwd.join(path)) 1027 | } 1028 | } 1029 | 1030 | fn create_js_error(err: &anyhow::Error) -> JsValue { 1031 | wasm_bindgen::JsError::new(&format!("{:#}", err)).into() 1032 | } 1033 | 1034 | fn parse_resolution_mode(resolution_mode: u8) -> node_resolver::ResolutionMode { 1035 | match resolution_mode { 1036 | 1 => node_resolver::ResolutionMode::Require, 1037 | _ => node_resolver::ResolutionMode::Import, 1038 | } 1039 | } 1040 | 1041 | fn media_type_to_u8(media_type: MediaType) -> u8 { 1042 | match media_type { 1043 | MediaType::JavaScript => 0, 1044 | MediaType::Jsx => 1, 1045 | MediaType::Mjs => 2, 1046 | MediaType::Cjs => 3, 1047 | MediaType::TypeScript => 4, 1048 | MediaType::Mts => 5, 1049 | MediaType::Cts => 6, 1050 | MediaType::Dts => 7, 1051 | MediaType::Dmts => 8, 1052 | MediaType::Dcts => 9, 1053 | MediaType::Tsx => 10, 1054 | MediaType::Css => 11, 1055 | MediaType::Json => 12, 1056 | MediaType::Jsonc => 13, 1057 | MediaType::Json5 => 14, 1058 | MediaType::Html => 15, 1059 | MediaType::Sql => 16, 1060 | MediaType::Wasm => 17, 1061 | MediaType::SourceMap => 18, 1062 | MediaType::Unknown => 19, 1063 | } 1064 | } 1065 | 1066 | fn npm_system_info() -> Result { 1067 | PROCESS_GLOBAL.with(|process| { 1068 | let os = js_sys::Reflect::get(process, &JsValue::from_str("platform")) 1069 | .ok() 1070 | .and_then(|s| s.as_string()) 1071 | .ok_or_else(|| { 1072 | anyhow::anyhow!("Could not resolve process.platform global.") 1073 | })?; 1074 | let arch = js_sys::Reflect::get(process, &JsValue::from_str("arch")) 1075 | .ok() 1076 | .and_then(|s| s.as_string()) 1077 | .ok_or_else(|| { 1078 | anyhow::anyhow!("Could not resolve process.arch global.") 1079 | })?; 1080 | Ok(NpmSystemInfo { 1081 | os: SmallStackString::from_string(os), 1082 | cpu: SmallStackString::from_string(arch), 1083 | }) 1084 | }) 1085 | } 1086 | 1087 | struct ModuleGraphCell { 1088 | graph: RefCell>, 1089 | } 1090 | 1091 | impl ModuleGraphCell { 1092 | pub fn new(graph: ModuleGraph) -> Self { 1093 | Self { 1094 | graph: RefCell::new(Rc::new(graph)), 1095 | } 1096 | } 1097 | 1098 | pub fn deep_clone(&self) -> ModuleGraph { 1099 | self.graph.borrow().as_ref().clone() 1100 | } 1101 | 1102 | pub fn get(&self) -> Rc { 1103 | self.graph.borrow().clone() 1104 | } 1105 | 1106 | pub fn set(&self, graph: Rc) { 1107 | *self.graph.borrow_mut() = graph; 1108 | } 1109 | } 1110 | 1111 | // todo(dsherret): shift this down into deno_graph 1112 | struct CapturingModuleAnalyzerRef<'a> { 1113 | parser: &'a dyn EsParser, 1114 | store: &'a dyn ParsedSourceStore, 1115 | } 1116 | 1117 | impl<'a> CapturingModuleAnalyzerRef<'a> { 1118 | pub fn as_capturing_parser(&self) -> CapturingEsParser<'_> { 1119 | CapturingEsParser::new(Some(self.parser), self.store) 1120 | } 1121 | } 1122 | 1123 | #[async_trait::async_trait(?Send)] 1124 | impl ModuleAnalyzer for CapturingModuleAnalyzerRef<'_> { 1125 | async fn analyze( 1126 | &self, 1127 | specifier: &deno_ast::ModuleSpecifier, 1128 | source: Arc, 1129 | media_type: MediaType, 1130 | ) -> Result { 1131 | let capturing_parser = self.as_capturing_parser(); 1132 | let module_analyzer = 1133 | deno_graph::ast::ParserModuleAnalyzer::new(&capturing_parser); 1134 | module_analyzer.analyze(specifier, source, media_type).await 1135 | } 1136 | } 1137 | -------------------------------------------------------------------------------- /src/rs_lib/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "ahash" 22 | version = "0.8.12" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" 25 | dependencies = [ 26 | "cfg-if", 27 | "once_cell", 28 | "version_check", 29 | "zerocopy", 30 | ] 31 | 32 | [[package]] 33 | name = "aho-corasick" 34 | version = "1.1.3" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 37 | dependencies = [ 38 | "memchr", 39 | ] 40 | 41 | [[package]] 42 | name = "allocator-api2" 43 | version = "0.2.21" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 46 | 47 | [[package]] 48 | name = "anyhow" 49 | version = "1.0.98" 50 | source = "registry+https://github.com/rust-lang/crates.io-index" 51 | checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" 52 | 53 | [[package]] 54 | name = "ascii" 55 | version = "1.1.0" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" 58 | 59 | [[package]] 60 | name = "ast_node" 61 | version = "5.0.0" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "2eb025ef00a6da925cf40870b9c8d008526b6004ece399cb0974209720f0b194" 64 | dependencies = [ 65 | "quote", 66 | "swc_macros_common", 67 | "syn", 68 | ] 69 | 70 | [[package]] 71 | name = "async-once-cell" 72 | version = "0.5.4" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "4288f83726785267c6f2ef073a3d83dc3f9b81464e9f99898240cced85fce35a" 75 | 76 | [[package]] 77 | name = "async-trait" 78 | version = "0.1.88" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" 81 | dependencies = [ 82 | "proc-macro2", 83 | "quote", 84 | "syn", 85 | ] 86 | 87 | [[package]] 88 | name = "autocfg" 89 | version = "1.5.0" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 92 | 93 | [[package]] 94 | name = "backtrace" 95 | version = "0.3.75" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" 98 | dependencies = [ 99 | "addr2line", 100 | "cfg-if", 101 | "libc", 102 | "miniz_oxide", 103 | "object", 104 | "rustc-demangle", 105 | "windows-targets 0.52.6", 106 | ] 107 | 108 | [[package]] 109 | name = "base32" 110 | version = "0.5.1" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "022dfe9eb35f19ebbcb51e0b40a5ab759f46ad60cadf7297e0bd085afb50e076" 113 | 114 | [[package]] 115 | name = "base64" 116 | version = "0.21.7" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 119 | 120 | [[package]] 121 | name = "base64" 122 | version = "0.22.1" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 125 | 126 | [[package]] 127 | name = "base64-simd" 128 | version = "0.8.0" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" 131 | dependencies = [ 132 | "outref", 133 | "vsimd", 134 | ] 135 | 136 | [[package]] 137 | name = "better_scoped_tls" 138 | version = "1.0.1" 139 | source = "registry+https://github.com/rust-lang/crates.io-index" 140 | checksum = "7cd228125315b132eed175bf47619ac79b945b26e56b848ba203ae4ea8603609" 141 | dependencies = [ 142 | "scoped-tls", 143 | ] 144 | 145 | [[package]] 146 | name = "bincode" 147 | version = "1.3.3" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 150 | dependencies = [ 151 | "serde", 152 | ] 153 | 154 | [[package]] 155 | name = "bitflags" 156 | version = "2.9.1" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" 159 | 160 | [[package]] 161 | name = "bitvec" 162 | version = "1.0.1" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 165 | dependencies = [ 166 | "funty", 167 | "radium", 168 | "tap", 169 | "wyz", 170 | ] 171 | 172 | [[package]] 173 | name = "block-buffer" 174 | version = "0.10.4" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 177 | dependencies = [ 178 | "generic-array", 179 | ] 180 | 181 | [[package]] 182 | name = "boxed_error" 183 | version = "0.2.3" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "17d4f95e880cfd28c4ca5a006cf7f6af52b4bcb7b5866f573b2faa126fb7affb" 186 | dependencies = [ 187 | "quote", 188 | "syn", 189 | ] 190 | 191 | [[package]] 192 | name = "bstr" 193 | version = "1.12.0" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" 196 | dependencies = [ 197 | "memchr", 198 | "serde", 199 | ] 200 | 201 | [[package]] 202 | name = "bumpalo" 203 | version = "3.19.0" 204 | source = "registry+https://github.com/rust-lang/crates.io-index" 205 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 206 | dependencies = [ 207 | "allocator-api2", 208 | ] 209 | 210 | [[package]] 211 | name = "byteorder" 212 | version = "1.5.0" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 215 | 216 | [[package]] 217 | name = "bytes" 218 | version = "1.10.1" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 221 | 222 | [[package]] 223 | name = "bytes-str" 224 | version = "0.2.7" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "7c60b5ce37e0b883c37eb89f79a1e26fbe9c1081945d024eee93e8d91a7e18b3" 227 | dependencies = [ 228 | "bytes", 229 | "serde", 230 | ] 231 | 232 | [[package]] 233 | name = "cache_control" 234 | version = "0.2.0" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee" 237 | 238 | [[package]] 239 | name = "capacity_builder" 240 | version = "0.5.0" 241 | source = "registry+https://github.com/rust-lang/crates.io-index" 242 | checksum = "8f2d24a6dcf0cd402a21b65d35340f3a49ff3475dc5fdac91d22d2733e6641c6" 243 | dependencies = [ 244 | "capacity_builder_macros", 245 | "ecow", 246 | "hipstr", 247 | "itoa", 248 | ] 249 | 250 | [[package]] 251 | name = "capacity_builder_macros" 252 | version = "0.3.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "3b4a6cae9efc04cc6cbb8faf338d2c497c165c83e74509cf4dbedea948bbf6e5" 255 | dependencies = [ 256 | "quote", 257 | "syn", 258 | ] 259 | 260 | [[package]] 261 | name = "castaway" 262 | version = "0.2.4" 263 | source = "registry+https://github.com/rust-lang/crates.io-index" 264 | checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" 265 | dependencies = [ 266 | "rustversion", 267 | ] 268 | 269 | [[package]] 270 | name = "cc" 271 | version = "1.2.29" 272 | source = "registry+https://github.com/rust-lang/crates.io-index" 273 | checksum = "5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362" 274 | dependencies = [ 275 | "shlex", 276 | ] 277 | 278 | [[package]] 279 | name = "cfg-if" 280 | version = "1.0.1" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" 283 | 284 | [[package]] 285 | name = "chrono" 286 | version = "0.4.42" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 289 | dependencies = [ 290 | "num-traits", 291 | "serde", 292 | ] 293 | 294 | [[package]] 295 | name = "compact_str" 296 | version = "0.7.1" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" 299 | dependencies = [ 300 | "castaway", 301 | "cfg-if", 302 | "itoa", 303 | "ryu", 304 | "static_assertions", 305 | ] 306 | 307 | [[package]] 308 | name = "console_error_panic_hook" 309 | version = "0.1.7" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 312 | dependencies = [ 313 | "cfg-if", 314 | "wasm-bindgen", 315 | ] 316 | 317 | [[package]] 318 | name = "const-oid" 319 | version = "0.9.6" 320 | source = "registry+https://github.com/rust-lang/crates.io-index" 321 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 322 | 323 | [[package]] 324 | name = "cpufeatures" 325 | version = "0.2.17" 326 | source = "registry+https://github.com/rust-lang/crates.io-index" 327 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 328 | dependencies = [ 329 | "libc", 330 | ] 331 | 332 | [[package]] 333 | name = "crc32fast" 334 | version = "1.5.0" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 337 | dependencies = [ 338 | "cfg-if", 339 | ] 340 | 341 | [[package]] 342 | name = "crossbeam-deque" 343 | version = "0.8.6" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 346 | dependencies = [ 347 | "crossbeam-epoch", 348 | "crossbeam-utils", 349 | ] 350 | 351 | [[package]] 352 | name = "crossbeam-epoch" 353 | version = "0.9.18" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 356 | dependencies = [ 357 | "crossbeam-utils", 358 | ] 359 | 360 | [[package]] 361 | name = "crossbeam-utils" 362 | version = "0.8.21" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 365 | 366 | [[package]] 367 | name = "crypto-common" 368 | version = "0.1.6" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 371 | dependencies = [ 372 | "generic-array", 373 | "typenum", 374 | ] 375 | 376 | [[package]] 377 | name = "dashmap" 378 | version = "5.5.3" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" 381 | dependencies = [ 382 | "cfg-if", 383 | "hashbrown 0.14.5", 384 | "lock_api", 385 | "once_cell", 386 | "parking_lot_core", 387 | ] 388 | 389 | [[package]] 390 | name = "data-encoding" 391 | version = "2.9.0" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 394 | 395 | [[package]] 396 | name = "data-url" 397 | version = "0.3.1" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" 400 | 401 | [[package]] 402 | name = "debugid" 403 | version = "0.8.0" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" 406 | dependencies = [ 407 | "serde", 408 | "uuid", 409 | ] 410 | 411 | [[package]] 412 | name = "deno_ast" 413 | version = "0.52.0" 414 | source = "registry+https://github.com/rust-lang/crates.io-index" 415 | checksum = "30c2f6f65154faed61e45d6578566f9fab9d2a330c35c87366706883701cce51" 416 | dependencies = [ 417 | "base64 0.22.1", 418 | "capacity_builder", 419 | "deno_error", 420 | "deno_media_type", 421 | "deno_terminal", 422 | "dprint-swc-ext", 423 | "percent-encoding", 424 | "serde", 425 | "swc_atoms", 426 | "swc_common", 427 | "swc_config", 428 | "swc_config_macro", 429 | "swc_ecma_ast", 430 | "swc_ecma_codegen", 431 | "swc_ecma_codegen_macros", 432 | "swc_ecma_lexer", 433 | "swc_ecma_loader", 434 | "swc_ecma_parser", 435 | "swc_ecma_transforms_base", 436 | "swc_ecma_transforms_classes", 437 | "swc_ecma_transforms_macros", 438 | "swc_ecma_transforms_proposal", 439 | "swc_ecma_transforms_react", 440 | "swc_ecma_transforms_typescript", 441 | "swc_ecma_utils", 442 | "swc_ecma_visit", 443 | "swc_eq_ignore_macros", 444 | "swc_macros_common", 445 | "swc_sourcemap", 446 | "swc_visit", 447 | "text_lines", 448 | "thiserror", 449 | "unicode-width", 450 | "url", 451 | ] 452 | 453 | [[package]] 454 | name = "deno_cache_dir" 455 | version = "0.26.3" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "7862aa4b7aad895ee979a3078bd25da192a1810b30cb5a7e764fed38d065eba9" 458 | dependencies = [ 459 | "async-trait", 460 | "base32", 461 | "base64 0.21.7", 462 | "boxed_error", 463 | "cache_control", 464 | "chrono", 465 | "data-url", 466 | "deno_error", 467 | "deno_media_type", 468 | "deno_path_util", 469 | "http", 470 | "indexmap", 471 | "log", 472 | "once_cell", 473 | "parking_lot", 474 | "serde", 475 | "serde_json", 476 | "sha2", 477 | "sys_traits", 478 | "thiserror", 479 | "url", 480 | ] 481 | 482 | [[package]] 483 | name = "deno_config" 484 | version = "0.73.0" 485 | dependencies = [ 486 | "boxed_error", 487 | "capacity_builder", 488 | "chrono", 489 | "deno_error", 490 | "deno_maybe_sync", 491 | "deno_package_json", 492 | "deno_path_util", 493 | "deno_semver", 494 | "glob", 495 | "ignore", 496 | "import_map", 497 | "indexmap", 498 | "jsonc-parser", 499 | "log", 500 | "serde", 501 | "serde_json", 502 | "sys_traits", 503 | "thiserror", 504 | "url", 505 | ] 506 | 507 | [[package]] 508 | name = "deno_error" 509 | version = "0.7.1" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "bfafd2219b29886a71aecbb3449e462deed1b2c474dc5b12f855f0e58c478931" 512 | dependencies = [ 513 | "deno_error_macro", 514 | "libc", 515 | "serde", 516 | "serde_json", 517 | "tokio", 518 | "url", 519 | ] 520 | 521 | [[package]] 522 | name = "deno_error_macro" 523 | version = "0.7.1" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "1c28ede88783f14cd8aae46ca89f230c226b40e4a81ab06fa52ed72af84beb2f" 526 | dependencies = [ 527 | "proc-macro2", 528 | "quote", 529 | "syn", 530 | ] 531 | 532 | [[package]] 533 | name = "deno_graph" 534 | version = "0.105.0" 535 | source = "registry+https://github.com/rust-lang/crates.io-index" 536 | checksum = "7fd6d3843cfbbd8803b6ef81025af98519651880e6ffd50ee01bb7251afbd6f5" 537 | dependencies = [ 538 | "async-trait", 539 | "boxed_error", 540 | "capacity_builder", 541 | "chrono", 542 | "data-url", 543 | "deno_ast", 544 | "deno_error", 545 | "deno_media_type", 546 | "deno_path_util", 547 | "deno_semver", 548 | "deno_unsync", 549 | "futures", 550 | "import_map", 551 | "indexmap", 552 | "log", 553 | "monch", 554 | "once_cell", 555 | "parking_lot", 556 | "regex", 557 | "serde", 558 | "serde_json", 559 | "sha2", 560 | "sys_traits", 561 | "thiserror", 562 | "url", 563 | "wasm_dep_analyzer", 564 | ] 565 | 566 | [[package]] 567 | name = "deno_lockfile" 568 | version = "0.32.2" 569 | source = "registry+https://github.com/rust-lang/crates.io-index" 570 | checksum = "3d71c0df1464034be21a9472e7ec8f9a21958418d203fa2c40507fb5cafe799d" 571 | dependencies = [ 572 | "async-trait", 573 | "deno_semver", 574 | "serde", 575 | "serde_json", 576 | "thiserror", 577 | ] 578 | 579 | [[package]] 580 | name = "deno_maybe_sync" 581 | version = "0.10.0" 582 | dependencies = [ 583 | "dashmap", 584 | ] 585 | 586 | [[package]] 587 | name = "deno_media_type" 588 | version = "0.3.0" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "ac0109d26ff08a089642a79b45c65f91a849404c1ef3ec78c837a412956d8808" 591 | dependencies = [ 592 | "data-url", 593 | "encoding_rs", 594 | "serde", 595 | "url", 596 | ] 597 | 598 | [[package]] 599 | name = "deno_npm" 600 | version = "0.42.2" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "7daa908c280b25d68ea59765144df488714716cc14a2dcafaa1ec3906d4abbbe" 603 | dependencies = [ 604 | "async-trait", 605 | "capacity_builder", 606 | "chrono", 607 | "deno_error", 608 | "deno_lockfile", 609 | "deno_semver", 610 | "futures", 611 | "indexmap", 612 | "log", 613 | "monch", 614 | "serde", 615 | "serde_json", 616 | "thiserror", 617 | "url", 618 | ] 619 | 620 | [[package]] 621 | name = "deno_npm_cache" 622 | version = "0.42.0" 623 | dependencies = [ 624 | "async-trait", 625 | "base64 0.22.1", 626 | "boxed_error", 627 | "deno_cache_dir", 628 | "deno_error", 629 | "deno_npm", 630 | "deno_path_util", 631 | "deno_semver", 632 | "deno_unsync", 633 | "faster-hex", 634 | "flate2", 635 | "futures", 636 | "log", 637 | "parking_lot", 638 | "percent-encoding", 639 | "serde", 640 | "serde_json", 641 | "sha1", 642 | "sha2", 643 | "sys_traits", 644 | "tar", 645 | "thiserror", 646 | "url", 647 | ] 648 | 649 | [[package]] 650 | name = "deno_npm_installer" 651 | version = "0.18.0" 652 | dependencies = [ 653 | "anyhow", 654 | "async-once-cell", 655 | "async-trait", 656 | "bincode", 657 | "boxed_error", 658 | "capacity_builder", 659 | "chrono", 660 | "deno_config", 661 | "deno_error", 662 | "deno_graph", 663 | "deno_lockfile", 664 | "deno_npm", 665 | "deno_npm_cache", 666 | "deno_package_json", 667 | "deno_path_util", 668 | "deno_resolver", 669 | "deno_semver", 670 | "deno_terminal", 671 | "deno_unsync", 672 | "dyn-clone", 673 | "futures", 674 | "lazy-regex", 675 | "log", 676 | "once_cell", 677 | "parking_lot", 678 | "pathdiff", 679 | "rustc-hash", 680 | "serde", 681 | "serde_json", 682 | "sys_traits", 683 | "thiserror", 684 | "tokio", 685 | "twox-hash", 686 | "url", 687 | "winapi", 688 | ] 689 | 690 | [[package]] 691 | name = "deno_package_json" 692 | version = "0.25.0" 693 | dependencies = [ 694 | "boxed_error", 695 | "deno_error", 696 | "deno_maybe_sync", 697 | "deno_path_util", 698 | "deno_semver", 699 | "indexmap", 700 | "serde", 701 | "serde_json", 702 | "sys_traits", 703 | "thiserror", 704 | "url", 705 | ] 706 | 707 | [[package]] 708 | name = "deno_path_util" 709 | version = "0.6.4" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "78c7e98943f0d068928906db0c7bde89de684fa32c6a8018caacc4cee2cdd72b" 712 | dependencies = [ 713 | "deno_error", 714 | "percent-encoding", 715 | "sys_traits", 716 | "thiserror", 717 | "url", 718 | ] 719 | 720 | [[package]] 721 | name = "deno_permissions" 722 | version = "0.82.0" 723 | dependencies = [ 724 | "capacity_builder", 725 | "chrono", 726 | "deno_error", 727 | "deno_path_util", 728 | "deno_terminal", 729 | "deno_unsync", 730 | "fqdn", 731 | "ipnetwork", 732 | "libc", 733 | "log", 734 | "nix", 735 | "once_cell", 736 | "parking_lot", 737 | "percent-encoding", 738 | "serde", 739 | "serde_json", 740 | "sys_traits", 741 | "thiserror", 742 | "url", 743 | "which", 744 | "winapi", 745 | "windows-sys 0.59.0", 746 | ] 747 | 748 | [[package]] 749 | name = "deno_resolver" 750 | version = "0.54.0" 751 | dependencies = [ 752 | "anyhow", 753 | "async-once-cell", 754 | "async-trait", 755 | "base32", 756 | "boxed_error", 757 | "capacity_builder", 758 | "chrono", 759 | "dashmap", 760 | "deno_ast", 761 | "deno_cache_dir", 762 | "deno_config", 763 | "deno_error", 764 | "deno_graph", 765 | "deno_lockfile", 766 | "deno_maybe_sync", 767 | "deno_media_type", 768 | "deno_npm", 769 | "deno_package_json", 770 | "deno_path_util", 771 | "deno_permissions", 772 | "deno_semver", 773 | "deno_terminal", 774 | "deno_unsync", 775 | "dissimilar", 776 | "futures", 777 | "http", 778 | "import_map", 779 | "indexmap", 780 | "jsonc-parser", 781 | "log", 782 | "node_resolver", 783 | "once_cell", 784 | "parking_lot", 785 | "phf", 786 | "serde", 787 | "serde_json", 788 | "sys_traits", 789 | "thiserror", 790 | "twox-hash", 791 | "url", 792 | ] 793 | 794 | [[package]] 795 | name = "deno_semver" 796 | version = "0.9.1" 797 | source = "registry+https://github.com/rust-lang/crates.io-index" 798 | checksum = "92d46d2fd6959170a6e9f6607a6f79683868fa82ceac56ca520ab014e4fa5b21" 799 | dependencies = [ 800 | "capacity_builder", 801 | "deno_error", 802 | "ecow", 803 | "hipstr", 804 | "monch", 805 | "once_cell", 806 | "serde", 807 | "thiserror", 808 | "url", 809 | ] 810 | 811 | [[package]] 812 | name = "deno_terminal" 813 | version = "0.2.3" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "f3ba8041ae7319b3ca6a64c399df4112badcbbe0868b4517637647614bede4be" 816 | dependencies = [ 817 | "once_cell", 818 | "termcolor", 819 | ] 820 | 821 | [[package]] 822 | name = "deno_unsync" 823 | version = "0.4.4" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "6742a724e8becb372a74c650a1aefb8924a5b8107f7d75b3848763ea24b27a87" 826 | dependencies = [ 827 | "futures-util", 828 | "parking_lot", 829 | "tokio", 830 | ] 831 | 832 | [[package]] 833 | name = "diff" 834 | version = "0.1.13" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 837 | 838 | [[package]] 839 | name = "digest" 840 | version = "0.10.7" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 843 | dependencies = [ 844 | "block-buffer", 845 | "const-oid", 846 | "crypto-common", 847 | ] 848 | 849 | [[package]] 850 | name = "displaydoc" 851 | version = "0.2.5" 852 | source = "registry+https://github.com/rust-lang/crates.io-index" 853 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 854 | dependencies = [ 855 | "proc-macro2", 856 | "quote", 857 | "syn", 858 | ] 859 | 860 | [[package]] 861 | name = "dissimilar" 862 | version = "1.0.9" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "59f8e79d1fbf76bdfbde321e902714bf6c49df88a7dda6fc682fc2979226962d" 865 | 866 | [[package]] 867 | name = "dprint-swc-ext" 868 | version = "0.26.0" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "33175ddb7a6d418589cab2966bd14a710b3b1139459d3d5ca9edf783c4833f4c" 871 | dependencies = [ 872 | "num-bigint", 873 | "rustc-hash", 874 | "swc_atoms", 875 | "swc_common", 876 | "swc_ecma_ast", 877 | "swc_ecma_lexer", 878 | "swc_ecma_parser", 879 | "text_lines", 880 | ] 881 | 882 | [[package]] 883 | name = "dyn-clone" 884 | version = "1.0.20" 885 | source = "registry+https://github.com/rust-lang/crates.io-index" 886 | checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" 887 | 888 | [[package]] 889 | name = "ecow" 890 | version = "0.2.5" 891 | source = "registry+https://github.com/rust-lang/crates.io-index" 892 | checksum = "b92b481eb5d59fd8e80e92ff11d057d1ca8d144b2cd8c66cc8d5bd177a3c0dc5" 893 | dependencies = [ 894 | "serde", 895 | ] 896 | 897 | [[package]] 898 | name = "either" 899 | version = "1.15.0" 900 | source = "registry+https://github.com/rust-lang/crates.io-index" 901 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 902 | 903 | [[package]] 904 | name = "encoding_rs" 905 | version = "0.8.35" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 908 | dependencies = [ 909 | "cfg-if", 910 | ] 911 | 912 | [[package]] 913 | name = "equivalent" 914 | version = "1.0.2" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 917 | 918 | [[package]] 919 | name = "errno" 920 | version = "0.3.13" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" 923 | dependencies = [ 924 | "libc", 925 | "windows-sys 0.60.2", 926 | ] 927 | 928 | [[package]] 929 | name = "faster-hex" 930 | version = "0.10.0" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "7223ae2d2f179b803433d9c830478527e92b8117eab39460edae7f1614d9fb73" 933 | dependencies = [ 934 | "heapless", 935 | "serde", 936 | ] 937 | 938 | [[package]] 939 | name = "filetime" 940 | version = "0.2.25" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" 943 | dependencies = [ 944 | "cfg-if", 945 | "libc", 946 | "libredox", 947 | "windows-sys 0.59.0", 948 | ] 949 | 950 | [[package]] 951 | name = "flate2" 952 | version = "1.1.2" 953 | source = "registry+https://github.com/rust-lang/crates.io-index" 954 | checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" 955 | dependencies = [ 956 | "crc32fast", 957 | "miniz_oxide", 958 | ] 959 | 960 | [[package]] 961 | name = "fnv" 962 | version = "1.0.7" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 965 | 966 | [[package]] 967 | name = "form_urlencoded" 968 | version = "1.2.1" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 971 | dependencies = [ 972 | "percent-encoding", 973 | ] 974 | 975 | [[package]] 976 | name = "fqdn" 977 | version = "0.4.6" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "c0f5d7f7b3eed2f771fc7f6fcb651f9560d7b0c483d75876082acb4649d266b3" 980 | 981 | [[package]] 982 | name = "from_variant" 983 | version = "3.0.0" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9" 986 | dependencies = [ 987 | "swc_macros_common", 988 | "syn", 989 | ] 990 | 991 | [[package]] 992 | name = "funty" 993 | version = "2.0.0" 994 | source = "registry+https://github.com/rust-lang/crates.io-index" 995 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 996 | 997 | [[package]] 998 | name = "futures" 999 | version = "0.3.31" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 1002 | dependencies = [ 1003 | "futures-channel", 1004 | "futures-core", 1005 | "futures-executor", 1006 | "futures-io", 1007 | "futures-sink", 1008 | "futures-task", 1009 | "futures-util", 1010 | ] 1011 | 1012 | [[package]] 1013 | name = "futures-channel" 1014 | version = "0.3.31" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1017 | dependencies = [ 1018 | "futures-core", 1019 | "futures-sink", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "futures-core" 1024 | version = "0.3.31" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1027 | 1028 | [[package]] 1029 | name = "futures-executor" 1030 | version = "0.3.31" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 1033 | dependencies = [ 1034 | "futures-core", 1035 | "futures-task", 1036 | "futures-util", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "futures-io" 1041 | version = "0.3.31" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1044 | 1045 | [[package]] 1046 | name = "futures-macro" 1047 | version = "0.3.31" 1048 | source = "registry+https://github.com/rust-lang/crates.io-index" 1049 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 1050 | dependencies = [ 1051 | "proc-macro2", 1052 | "quote", 1053 | "syn", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "futures-sink" 1058 | version = "0.3.31" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1061 | 1062 | [[package]] 1063 | name = "futures-task" 1064 | version = "0.3.31" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1067 | 1068 | [[package]] 1069 | name = "futures-util" 1070 | version = "0.3.31" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1073 | dependencies = [ 1074 | "futures-channel", 1075 | "futures-core", 1076 | "futures-io", 1077 | "futures-macro", 1078 | "futures-sink", 1079 | "futures-task", 1080 | "memchr", 1081 | "pin-project-lite", 1082 | "pin-utils", 1083 | "slab", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "generic-array" 1088 | version = "0.14.7" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1091 | dependencies = [ 1092 | "typenum", 1093 | "version_check", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "getrandom" 1098 | version = "0.2.16" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 1101 | dependencies = [ 1102 | "cfg-if", 1103 | "libc", 1104 | "wasi", 1105 | ] 1106 | 1107 | [[package]] 1108 | name = "gimli" 1109 | version = "0.31.1" 1110 | source = "registry+https://github.com/rust-lang/crates.io-index" 1111 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 1112 | 1113 | [[package]] 1114 | name = "glob" 1115 | version = "0.3.2" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" 1118 | 1119 | [[package]] 1120 | name = "globset" 1121 | version = "0.4.16" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" 1124 | dependencies = [ 1125 | "aho-corasick", 1126 | "bstr", 1127 | "log", 1128 | "regex-automata", 1129 | "regex-syntax", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "hash32" 1134 | version = "0.3.1" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" 1137 | dependencies = [ 1138 | "byteorder", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "hashbrown" 1143 | version = "0.14.5" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1146 | dependencies = [ 1147 | "ahash", 1148 | "allocator-api2", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "hashbrown" 1153 | version = "0.15.4" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" 1156 | 1157 | [[package]] 1158 | name = "heapless" 1159 | version = "0.8.0" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" 1162 | dependencies = [ 1163 | "hash32", 1164 | "stable_deref_trait", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "heck" 1169 | version = "0.5.0" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1172 | 1173 | [[package]] 1174 | name = "hermit-abi" 1175 | version = "0.5.2" 1176 | source = "registry+https://github.com/rust-lang/crates.io-index" 1177 | checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" 1178 | 1179 | [[package]] 1180 | name = "hipstr" 1181 | version = "0.6.0" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "97971ffc85d4c98de12e2608e992a43f5294ebb625fdb045b27c731b64c4c6d6" 1184 | dependencies = [ 1185 | "serde", 1186 | "serde_bytes", 1187 | "sptr", 1188 | ] 1189 | 1190 | [[package]] 1191 | name = "hstr" 1192 | version = "3.0.3" 1193 | source = "registry+https://github.com/rust-lang/crates.io-index" 1194 | checksum = "0c43c0a9e8fbdb3bb9dc8eee85e1e2ac81605418b4c83b6b7413cbf14d56ca5c" 1195 | dependencies = [ 1196 | "hashbrown 0.14.5", 1197 | "new_debug_unreachable", 1198 | "once_cell", 1199 | "rustc-hash", 1200 | "serde", 1201 | "triomphe", 1202 | ] 1203 | 1204 | [[package]] 1205 | name = "http" 1206 | version = "1.3.1" 1207 | source = "registry+https://github.com/rust-lang/crates.io-index" 1208 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1209 | dependencies = [ 1210 | "bytes", 1211 | "fnv", 1212 | "itoa", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "icu_collections" 1217 | version = "2.0.0" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1220 | dependencies = [ 1221 | "displaydoc", 1222 | "potential_utf", 1223 | "yoke", 1224 | "zerofrom", 1225 | "zerovec", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "icu_locale_core" 1230 | version = "2.0.0" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1233 | dependencies = [ 1234 | "displaydoc", 1235 | "litemap", 1236 | "tinystr", 1237 | "writeable", 1238 | "zerovec", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "icu_normalizer" 1243 | version = "2.0.0" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1246 | dependencies = [ 1247 | "displaydoc", 1248 | "icu_collections", 1249 | "icu_normalizer_data", 1250 | "icu_properties", 1251 | "icu_provider", 1252 | "smallvec", 1253 | "zerovec", 1254 | ] 1255 | 1256 | [[package]] 1257 | name = "icu_normalizer_data" 1258 | version = "2.0.0" 1259 | source = "registry+https://github.com/rust-lang/crates.io-index" 1260 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1261 | 1262 | [[package]] 1263 | name = "icu_properties" 1264 | version = "2.0.1" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1267 | dependencies = [ 1268 | "displaydoc", 1269 | "icu_collections", 1270 | "icu_locale_core", 1271 | "icu_properties_data", 1272 | "icu_provider", 1273 | "potential_utf", 1274 | "zerotrie", 1275 | "zerovec", 1276 | ] 1277 | 1278 | [[package]] 1279 | name = "icu_properties_data" 1280 | version = "2.0.1" 1281 | source = "registry+https://github.com/rust-lang/crates.io-index" 1282 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1283 | 1284 | [[package]] 1285 | name = "icu_provider" 1286 | version = "2.0.0" 1287 | source = "registry+https://github.com/rust-lang/crates.io-index" 1288 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1289 | dependencies = [ 1290 | "displaydoc", 1291 | "icu_locale_core", 1292 | "stable_deref_trait", 1293 | "tinystr", 1294 | "writeable", 1295 | "yoke", 1296 | "zerofrom", 1297 | "zerotrie", 1298 | "zerovec", 1299 | ] 1300 | 1301 | [[package]] 1302 | name = "idna" 1303 | version = "1.0.3" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 1306 | dependencies = [ 1307 | "idna_adapter", 1308 | "smallvec", 1309 | "utf8_iter", 1310 | ] 1311 | 1312 | [[package]] 1313 | name = "idna_adapter" 1314 | version = "1.2.1" 1315 | source = "registry+https://github.com/rust-lang/crates.io-index" 1316 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1317 | dependencies = [ 1318 | "icu_normalizer", 1319 | "icu_properties", 1320 | ] 1321 | 1322 | [[package]] 1323 | name = "if_chain" 1324 | version = "1.0.2" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" 1327 | 1328 | [[package]] 1329 | name = "ignore" 1330 | version = "0.4.23" 1331 | source = "registry+https://github.com/rust-lang/crates.io-index" 1332 | checksum = "6d89fd380afde86567dfba715db065673989d6253f42b88179abd3eae47bda4b" 1333 | dependencies = [ 1334 | "crossbeam-deque", 1335 | "globset", 1336 | "log", 1337 | "memchr", 1338 | "regex-automata", 1339 | "same-file", 1340 | "walkdir", 1341 | "winapi-util", 1342 | ] 1343 | 1344 | [[package]] 1345 | name = "import_map" 1346 | version = "0.24.0" 1347 | source = "registry+https://github.com/rust-lang/crates.io-index" 1348 | checksum = "f83a4958a41489355816028239fee373797435384d162f4908e7980c83c3bb1b" 1349 | dependencies = [ 1350 | "boxed_error", 1351 | "deno_error", 1352 | "indexmap", 1353 | "log", 1354 | "percent-encoding", 1355 | "serde", 1356 | "serde_json", 1357 | "thiserror", 1358 | "url", 1359 | ] 1360 | 1361 | [[package]] 1362 | name = "indexmap" 1363 | version = "2.10.0" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" 1366 | dependencies = [ 1367 | "equivalent", 1368 | "hashbrown 0.15.4", 1369 | "serde", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "io-uring" 1374 | version = "0.7.8" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" 1377 | dependencies = [ 1378 | "bitflags", 1379 | "cfg-if", 1380 | "libc", 1381 | ] 1382 | 1383 | [[package]] 1384 | name = "ipnetwork" 1385 | version = "0.20.0" 1386 | source = "registry+https://github.com/rust-lang/crates.io-index" 1387 | checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e" 1388 | dependencies = [ 1389 | "serde", 1390 | ] 1391 | 1392 | [[package]] 1393 | name = "is-macro" 1394 | version = "0.3.7" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4" 1397 | dependencies = [ 1398 | "heck", 1399 | "proc-macro2", 1400 | "quote", 1401 | "syn", 1402 | ] 1403 | 1404 | [[package]] 1405 | name = "itoa" 1406 | version = "1.0.15" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1409 | 1410 | [[package]] 1411 | name = "js-sys" 1412 | version = "0.3.82" 1413 | source = "registry+https://github.com/rust-lang/crates.io-index" 1414 | checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" 1415 | dependencies = [ 1416 | "once_cell", 1417 | "wasm-bindgen", 1418 | ] 1419 | 1420 | [[package]] 1421 | name = "jsonc-parser" 1422 | version = "0.27.1" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "01958dcb05b69d9612853b47df8f7881810e4f61b5cedd8894be04291f28ccb9" 1425 | dependencies = [ 1426 | "serde_json", 1427 | ] 1428 | 1429 | [[package]] 1430 | name = "junction" 1431 | version = "1.2.0" 1432 | source = "registry+https://github.com/rust-lang/crates.io-index" 1433 | checksum = "72bbdfd737a243da3dfc1f99ee8d6e166480f17ab4ac84d7c34aacd73fc7bd16" 1434 | dependencies = [ 1435 | "scopeguard", 1436 | "windows-sys 0.52.0", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "lazy-regex" 1441 | version = "3.4.1" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "60c7310b93682b36b98fa7ea4de998d3463ccbebd94d935d6b48ba5b6ffa7126" 1444 | dependencies = [ 1445 | "lazy-regex-proc_macros", 1446 | "once_cell", 1447 | "regex", 1448 | ] 1449 | 1450 | [[package]] 1451 | name = "lazy-regex-proc_macros" 1452 | version = "3.4.1" 1453 | source = "registry+https://github.com/rust-lang/crates.io-index" 1454 | checksum = "4ba01db5ef81e17eb10a5e0f2109d1b3a3e29bac3070fdbd7d156bf7dbd206a1" 1455 | dependencies = [ 1456 | "proc-macro2", 1457 | "quote", 1458 | "regex", 1459 | "syn", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "libc" 1464 | version = "0.2.174" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" 1467 | 1468 | [[package]] 1469 | name = "libredox" 1470 | version = "0.1.4" 1471 | source = "registry+https://github.com/rust-lang/crates.io-index" 1472 | checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" 1473 | dependencies = [ 1474 | "bitflags", 1475 | "libc", 1476 | "redox_syscall", 1477 | ] 1478 | 1479 | [[package]] 1480 | name = "linux-raw-sys" 1481 | version = "0.9.4" 1482 | source = "registry+https://github.com/rust-lang/crates.io-index" 1483 | checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 1484 | 1485 | [[package]] 1486 | name = "litemap" 1487 | version = "0.8.0" 1488 | source = "registry+https://github.com/rust-lang/crates.io-index" 1489 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 1490 | 1491 | [[package]] 1492 | name = "lock_api" 1493 | version = "0.4.13" 1494 | source = "registry+https://github.com/rust-lang/crates.io-index" 1495 | checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" 1496 | dependencies = [ 1497 | "autocfg", 1498 | "scopeguard", 1499 | ] 1500 | 1501 | [[package]] 1502 | name = "log" 1503 | version = "0.4.28" 1504 | source = "registry+https://github.com/rust-lang/crates.io-index" 1505 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 1506 | 1507 | [[package]] 1508 | name = "memchr" 1509 | version = "2.7.5" 1510 | source = "registry+https://github.com/rust-lang/crates.io-index" 1511 | checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" 1512 | 1513 | [[package]] 1514 | name = "miniz_oxide" 1515 | version = "0.8.9" 1516 | source = "registry+https://github.com/rust-lang/crates.io-index" 1517 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 1518 | dependencies = [ 1519 | "adler2", 1520 | ] 1521 | 1522 | [[package]] 1523 | name = "mio" 1524 | version = "1.0.4" 1525 | source = "registry+https://github.com/rust-lang/crates.io-index" 1526 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 1527 | dependencies = [ 1528 | "libc", 1529 | "wasi", 1530 | "windows-sys 0.59.0", 1531 | ] 1532 | 1533 | [[package]] 1534 | name = "monch" 1535 | version = "0.5.0" 1536 | source = "registry+https://github.com/rust-lang/crates.io-index" 1537 | checksum = "b52c1b33ff98142aecea13138bd399b68aa7ab5d9546c300988c345004001eea" 1538 | 1539 | [[package]] 1540 | name = "new_debug_unreachable" 1541 | version = "1.0.6" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 1544 | 1545 | [[package]] 1546 | name = "nix" 1547 | version = "0.27.1" 1548 | source = "registry+https://github.com/rust-lang/crates.io-index" 1549 | checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" 1550 | dependencies = [ 1551 | "bitflags", 1552 | "cfg-if", 1553 | "libc", 1554 | ] 1555 | 1556 | [[package]] 1557 | name = "node_resolver" 1558 | version = "0.61.0" 1559 | dependencies = [ 1560 | "anyhow", 1561 | "async-trait", 1562 | "boxed_error", 1563 | "capacity_builder", 1564 | "dashmap", 1565 | "deno_error", 1566 | "deno_graph", 1567 | "deno_maybe_sync", 1568 | "deno_media_type", 1569 | "deno_package_json", 1570 | "deno_path_util", 1571 | "deno_semver", 1572 | "futures", 1573 | "lazy-regex", 1574 | "log", 1575 | "once_cell", 1576 | "path-clean", 1577 | "pretty_assertions", 1578 | "regex", 1579 | "serde", 1580 | "serde_json", 1581 | "sys_traits", 1582 | "thiserror", 1583 | "url", 1584 | ] 1585 | 1586 | [[package]] 1587 | name = "num-bigint" 1588 | version = "0.4.6" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1591 | dependencies = [ 1592 | "num-integer", 1593 | "num-traits", 1594 | "serde", 1595 | ] 1596 | 1597 | [[package]] 1598 | name = "num-integer" 1599 | version = "0.1.46" 1600 | source = "registry+https://github.com/rust-lang/crates.io-index" 1601 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1602 | dependencies = [ 1603 | "num-traits", 1604 | ] 1605 | 1606 | [[package]] 1607 | name = "num-traits" 1608 | version = "0.2.19" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1611 | dependencies = [ 1612 | "autocfg", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "num_cpus" 1617 | version = "1.17.0" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" 1620 | dependencies = [ 1621 | "hermit-abi", 1622 | "libc", 1623 | ] 1624 | 1625 | [[package]] 1626 | name = "object" 1627 | version = "0.36.7" 1628 | source = "registry+https://github.com/rust-lang/crates.io-index" 1629 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 1630 | dependencies = [ 1631 | "memchr", 1632 | ] 1633 | 1634 | [[package]] 1635 | name = "once_cell" 1636 | version = "1.21.3" 1637 | source = "registry+https://github.com/rust-lang/crates.io-index" 1638 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 1639 | 1640 | [[package]] 1641 | name = "outref" 1642 | version = "0.5.2" 1643 | source = "registry+https://github.com/rust-lang/crates.io-index" 1644 | checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" 1645 | 1646 | [[package]] 1647 | name = "par-core" 1648 | version = "2.0.0" 1649 | source = "registry+https://github.com/rust-lang/crates.io-index" 1650 | checksum = "e96cbd21255b7fb29a5d51ef38a779b517a91abd59e2756c039583f43ef4c90f" 1651 | dependencies = [ 1652 | "once_cell", 1653 | ] 1654 | 1655 | [[package]] 1656 | name = "parking_lot" 1657 | version = "0.12.4" 1658 | source = "registry+https://github.com/rust-lang/crates.io-index" 1659 | checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" 1660 | dependencies = [ 1661 | "lock_api", 1662 | "parking_lot_core", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "parking_lot_core" 1667 | version = "0.9.11" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" 1670 | dependencies = [ 1671 | "cfg-if", 1672 | "libc", 1673 | "redox_syscall", 1674 | "smallvec", 1675 | "windows-targets 0.52.6", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "path-clean" 1680 | version = "0.1.0" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" 1683 | 1684 | [[package]] 1685 | name = "pathdiff" 1686 | version = "0.2.3" 1687 | source = "registry+https://github.com/rust-lang/crates.io-index" 1688 | checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 1689 | 1690 | [[package]] 1691 | name = "percent-encoding" 1692 | version = "2.3.1" 1693 | source = "registry+https://github.com/rust-lang/crates.io-index" 1694 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 1695 | 1696 | [[package]] 1697 | name = "phf" 1698 | version = "0.11.3" 1699 | source = "registry+https://github.com/rust-lang/crates.io-index" 1700 | checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" 1701 | dependencies = [ 1702 | "phf_macros", 1703 | "phf_shared", 1704 | ] 1705 | 1706 | [[package]] 1707 | name = "phf_generator" 1708 | version = "0.11.3" 1709 | source = "registry+https://github.com/rust-lang/crates.io-index" 1710 | checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" 1711 | dependencies = [ 1712 | "phf_shared", 1713 | "rand", 1714 | ] 1715 | 1716 | [[package]] 1717 | name = "phf_macros" 1718 | version = "0.11.3" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" 1721 | dependencies = [ 1722 | "phf_generator", 1723 | "phf_shared", 1724 | "proc-macro2", 1725 | "quote", 1726 | "syn", 1727 | ] 1728 | 1729 | [[package]] 1730 | name = "phf_shared" 1731 | version = "0.11.3" 1732 | source = "registry+https://github.com/rust-lang/crates.io-index" 1733 | checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" 1734 | dependencies = [ 1735 | "siphasher 1.0.1", 1736 | ] 1737 | 1738 | [[package]] 1739 | name = "pin-project-lite" 1740 | version = "0.2.16" 1741 | source = "registry+https://github.com/rust-lang/crates.io-index" 1742 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 1743 | 1744 | [[package]] 1745 | name = "pin-utils" 1746 | version = "0.1.0" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1749 | 1750 | [[package]] 1751 | name = "potential_utf" 1752 | version = "0.1.2" 1753 | source = "registry+https://github.com/rust-lang/crates.io-index" 1754 | checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" 1755 | dependencies = [ 1756 | "zerovec", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "pretty_assertions" 1761 | version = "1.4.1" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" 1764 | dependencies = [ 1765 | "diff", 1766 | "yansi", 1767 | ] 1768 | 1769 | [[package]] 1770 | name = "proc-macro2" 1771 | version = "1.0.95" 1772 | source = "registry+https://github.com/rust-lang/crates.io-index" 1773 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1774 | dependencies = [ 1775 | "unicode-ident", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "psm" 1780 | version = "0.1.26" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "6e944464ec8536cd1beb0bbfd96987eb5e3b72f2ecdafdc5c769a37f1fa2ae1f" 1783 | dependencies = [ 1784 | "cc", 1785 | ] 1786 | 1787 | [[package]] 1788 | name = "quote" 1789 | version = "1.0.40" 1790 | source = "registry+https://github.com/rust-lang/crates.io-index" 1791 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1792 | dependencies = [ 1793 | "proc-macro2", 1794 | ] 1795 | 1796 | [[package]] 1797 | name = "radium" 1798 | version = "0.7.0" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 1801 | 1802 | [[package]] 1803 | name = "rand" 1804 | version = "0.8.5" 1805 | source = "registry+https://github.com/rust-lang/crates.io-index" 1806 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1807 | dependencies = [ 1808 | "rand_core", 1809 | ] 1810 | 1811 | [[package]] 1812 | name = "rand_core" 1813 | version = "0.6.4" 1814 | source = "registry+https://github.com/rust-lang/crates.io-index" 1815 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1816 | 1817 | [[package]] 1818 | name = "redox_syscall" 1819 | version = "0.5.13" 1820 | source = "registry+https://github.com/rust-lang/crates.io-index" 1821 | checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" 1822 | dependencies = [ 1823 | "bitflags", 1824 | ] 1825 | 1826 | [[package]] 1827 | name = "regex" 1828 | version = "1.11.1" 1829 | source = "registry+https://github.com/rust-lang/crates.io-index" 1830 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 1831 | dependencies = [ 1832 | "aho-corasick", 1833 | "memchr", 1834 | "regex-automata", 1835 | "regex-syntax", 1836 | ] 1837 | 1838 | [[package]] 1839 | name = "regex-automata" 1840 | version = "0.4.9" 1841 | source = "registry+https://github.com/rust-lang/crates.io-index" 1842 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 1843 | dependencies = [ 1844 | "aho-corasick", 1845 | "memchr", 1846 | "regex-syntax", 1847 | ] 1848 | 1849 | [[package]] 1850 | name = "regex-syntax" 1851 | version = "0.8.5" 1852 | source = "registry+https://github.com/rust-lang/crates.io-index" 1853 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1854 | 1855 | [[package]] 1856 | name = "rs_lib" 1857 | version = "0.0.0" 1858 | dependencies = [ 1859 | "anyhow", 1860 | "async-trait", 1861 | "chrono", 1862 | "console_error_panic_hook", 1863 | "deno_ast", 1864 | "deno_cache_dir", 1865 | "deno_config", 1866 | "deno_error", 1867 | "deno_graph", 1868 | "deno_npm_cache", 1869 | "deno_npm_installer", 1870 | "deno_path_util", 1871 | "deno_resolver", 1872 | "deno_semver", 1873 | "deno_unsync", 1874 | "flate2", 1875 | "js-sys", 1876 | "log", 1877 | "node_resolver", 1878 | "serde", 1879 | "serde-wasm-bindgen", 1880 | "sys_traits", 1881 | "url", 1882 | "wasm-bindgen", 1883 | "wasm-bindgen-futures", 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "rustc-demangle" 1888 | version = "0.1.25" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" 1891 | 1892 | [[package]] 1893 | name = "rustc-hash" 1894 | version = "2.1.1" 1895 | source = "registry+https://github.com/rust-lang/crates.io-index" 1896 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1897 | 1898 | [[package]] 1899 | name = "rustix" 1900 | version = "1.0.8" 1901 | source = "registry+https://github.com/rust-lang/crates.io-index" 1902 | checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" 1903 | dependencies = [ 1904 | "bitflags", 1905 | "errno", 1906 | "libc", 1907 | "linux-raw-sys", 1908 | "windows-sys 0.60.2", 1909 | ] 1910 | 1911 | [[package]] 1912 | name = "rustversion" 1913 | version = "1.0.21" 1914 | source = "registry+https://github.com/rust-lang/crates.io-index" 1915 | checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" 1916 | 1917 | [[package]] 1918 | name = "ryu" 1919 | version = "1.0.20" 1920 | source = "registry+https://github.com/rust-lang/crates.io-index" 1921 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1922 | 1923 | [[package]] 1924 | name = "ryu-js" 1925 | version = "1.0.2" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" 1928 | 1929 | [[package]] 1930 | name = "same-file" 1931 | version = "1.0.6" 1932 | source = "registry+https://github.com/rust-lang/crates.io-index" 1933 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 1934 | dependencies = [ 1935 | "winapi-util", 1936 | ] 1937 | 1938 | [[package]] 1939 | name = "scoped-tls" 1940 | version = "1.0.1" 1941 | source = "registry+https://github.com/rust-lang/crates.io-index" 1942 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 1943 | 1944 | [[package]] 1945 | name = "scopeguard" 1946 | version = "1.2.0" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1949 | 1950 | [[package]] 1951 | name = "seq-macro" 1952 | version = "0.3.6" 1953 | source = "registry+https://github.com/rust-lang/crates.io-index" 1954 | checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" 1955 | 1956 | [[package]] 1957 | name = "serde" 1958 | version = "1.0.228" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 1961 | dependencies = [ 1962 | "serde_core", 1963 | "serde_derive", 1964 | ] 1965 | 1966 | [[package]] 1967 | name = "serde-wasm-bindgen" 1968 | version = "0.6.5" 1969 | source = "registry+https://github.com/rust-lang/crates.io-index" 1970 | checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" 1971 | dependencies = [ 1972 | "js-sys", 1973 | "serde", 1974 | "wasm-bindgen", 1975 | ] 1976 | 1977 | [[package]] 1978 | name = "serde_bytes" 1979 | version = "0.11.17" 1980 | source = "registry+https://github.com/rust-lang/crates.io-index" 1981 | checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" 1982 | dependencies = [ 1983 | "serde", 1984 | ] 1985 | 1986 | [[package]] 1987 | name = "serde_core" 1988 | version = "1.0.228" 1989 | source = "registry+https://github.com/rust-lang/crates.io-index" 1990 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 1991 | dependencies = [ 1992 | "serde_derive", 1993 | ] 1994 | 1995 | [[package]] 1996 | name = "serde_derive" 1997 | version = "1.0.228" 1998 | source = "registry+https://github.com/rust-lang/crates.io-index" 1999 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 2000 | dependencies = [ 2001 | "proc-macro2", 2002 | "quote", 2003 | "syn", 2004 | ] 2005 | 2006 | [[package]] 2007 | name = "serde_json" 2008 | version = "1.0.140" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 2011 | dependencies = [ 2012 | "indexmap", 2013 | "itoa", 2014 | "memchr", 2015 | "ryu", 2016 | "serde", 2017 | ] 2018 | 2019 | [[package]] 2020 | name = "sha1" 2021 | version = "0.10.6" 2022 | source = "registry+https://github.com/rust-lang/crates.io-index" 2023 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 2024 | dependencies = [ 2025 | "cfg-if", 2026 | "cpufeatures", 2027 | "digest", 2028 | ] 2029 | 2030 | [[package]] 2031 | name = "sha2" 2032 | version = "0.10.9" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 2035 | dependencies = [ 2036 | "cfg-if", 2037 | "cpufeatures", 2038 | "digest", 2039 | ] 2040 | 2041 | [[package]] 2042 | name = "shlex" 2043 | version = "1.3.0" 2044 | source = "registry+https://github.com/rust-lang/crates.io-index" 2045 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 2046 | 2047 | [[package]] 2048 | name = "signal-hook-registry" 2049 | version = "1.4.5" 2050 | source = "registry+https://github.com/rust-lang/crates.io-index" 2051 | checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 2052 | dependencies = [ 2053 | "libc", 2054 | ] 2055 | 2056 | [[package]] 2057 | name = "siphasher" 2058 | version = "0.3.11" 2059 | source = "registry+https://github.com/rust-lang/crates.io-index" 2060 | checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" 2061 | 2062 | [[package]] 2063 | name = "siphasher" 2064 | version = "1.0.1" 2065 | source = "registry+https://github.com/rust-lang/crates.io-index" 2066 | checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" 2067 | 2068 | [[package]] 2069 | name = "slab" 2070 | version = "0.4.10" 2071 | source = "registry+https://github.com/rust-lang/crates.io-index" 2072 | checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" 2073 | 2074 | [[package]] 2075 | name = "smallvec" 2076 | version = "1.15.1" 2077 | source = "registry+https://github.com/rust-lang/crates.io-index" 2078 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 2079 | 2080 | [[package]] 2081 | name = "smartstring" 2082 | version = "1.0.1" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" 2085 | dependencies = [ 2086 | "autocfg", 2087 | "static_assertions", 2088 | "version_check", 2089 | ] 2090 | 2091 | [[package]] 2092 | name = "socket2" 2093 | version = "0.6.0" 2094 | source = "registry+https://github.com/rust-lang/crates.io-index" 2095 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 2096 | dependencies = [ 2097 | "libc", 2098 | "windows-sys 0.59.0", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "sptr" 2103 | version = "0.3.2" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" 2106 | 2107 | [[package]] 2108 | name = "stable_deref_trait" 2109 | version = "1.2.0" 2110 | source = "registry+https://github.com/rust-lang/crates.io-index" 2111 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 2112 | 2113 | [[package]] 2114 | name = "stacker" 2115 | version = "0.1.21" 2116 | source = "registry+https://github.com/rust-lang/crates.io-index" 2117 | checksum = "cddb07e32ddb770749da91081d8d0ac3a16f1a569a18b20348cd371f5dead06b" 2118 | dependencies = [ 2119 | "cc", 2120 | "cfg-if", 2121 | "libc", 2122 | "psm", 2123 | "windows-sys 0.59.0", 2124 | ] 2125 | 2126 | [[package]] 2127 | name = "static_assertions" 2128 | version = "1.1.0" 2129 | source = "registry+https://github.com/rust-lang/crates.io-index" 2130 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 2131 | 2132 | [[package]] 2133 | name = "string_enum" 2134 | version = "1.0.2" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e" 2137 | dependencies = [ 2138 | "quote", 2139 | "swc_macros_common", 2140 | "syn", 2141 | ] 2142 | 2143 | [[package]] 2144 | name = "swc_allocator" 2145 | version = "4.0.1" 2146 | source = "registry+https://github.com/rust-lang/crates.io-index" 2147 | checksum = "9d7eefd2c8b228a8c73056482b2ae4b3a1071fbe07638e3b55ceca8570cc48bb" 2148 | dependencies = [ 2149 | "allocator-api2", 2150 | "bumpalo", 2151 | "hashbrown 0.14.5", 2152 | "rustc-hash", 2153 | ] 2154 | 2155 | [[package]] 2156 | name = "swc_atoms" 2157 | version = "9.0.0" 2158 | source = "registry+https://github.com/rust-lang/crates.io-index" 2159 | checksum = "d4ccbe2ecad10ad7432100f878a107b1d972a8aee83ca53184d00c23a078bb8a" 2160 | dependencies = [ 2161 | "hstr", 2162 | "once_cell", 2163 | "serde", 2164 | ] 2165 | 2166 | [[package]] 2167 | name = "swc_common" 2168 | version = "17.0.1" 2169 | source = "registry+https://github.com/rust-lang/crates.io-index" 2170 | checksum = "259b675d633a26d24efe3802a9d88858c918e6e8f062d3222d3aa02d56a2cf4c" 2171 | dependencies = [ 2172 | "anyhow", 2173 | "ast_node", 2174 | "better_scoped_tls", 2175 | "bytes-str", 2176 | "either", 2177 | "from_variant", 2178 | "new_debug_unreachable", 2179 | "num-bigint", 2180 | "once_cell", 2181 | "rustc-hash", 2182 | "serde", 2183 | "siphasher 0.3.11", 2184 | "swc_atoms", 2185 | "swc_eq_ignore_macros", 2186 | "swc_sourcemap", 2187 | "swc_visit", 2188 | "tracing", 2189 | "unicode-width", 2190 | "url", 2191 | ] 2192 | 2193 | [[package]] 2194 | name = "swc_config" 2195 | version = "3.1.2" 2196 | source = "registry+https://github.com/rust-lang/crates.io-index" 2197 | checksum = "72e90b52ee734ded867104612218101722ad87ff4cf74fe30383bd244a533f97" 2198 | dependencies = [ 2199 | "anyhow", 2200 | "bytes-str", 2201 | "indexmap", 2202 | "serde", 2203 | "serde_json", 2204 | "swc_config_macro", 2205 | ] 2206 | 2207 | [[package]] 2208 | name = "swc_config_macro" 2209 | version = "1.0.1" 2210 | source = "registry+https://github.com/rust-lang/crates.io-index" 2211 | checksum = "7b416e8ce6de17dc5ea496e10c7012b35bbc0e3fef38d2e065eed936490db0b3" 2212 | dependencies = [ 2213 | "proc-macro2", 2214 | "quote", 2215 | "swc_macros_common", 2216 | "syn", 2217 | ] 2218 | 2219 | [[package]] 2220 | name = "swc_ecma_ast" 2221 | version = "18.0.0" 2222 | source = "registry+https://github.com/rust-lang/crates.io-index" 2223 | checksum = "a573a0c72850dec8d4d8085f152d5778af35a2520c3093b242d2d1d50776da7c" 2224 | dependencies = [ 2225 | "bitflags", 2226 | "is-macro", 2227 | "num-bigint", 2228 | "once_cell", 2229 | "phf", 2230 | "rustc-hash", 2231 | "serde", 2232 | "string_enum", 2233 | "swc_atoms", 2234 | "swc_common", 2235 | "swc_visit", 2236 | "unicode-id-start", 2237 | ] 2238 | 2239 | [[package]] 2240 | name = "swc_ecma_codegen" 2241 | version = "20.0.2" 2242 | source = "registry+https://github.com/rust-lang/crates.io-index" 2243 | checksum = "ff2a6ee1ec49dda8dedeac54e4147b4e8b3f278d9bb34ab28983257a393d34ed" 2244 | dependencies = [ 2245 | "ascii", 2246 | "compact_str", 2247 | "memchr", 2248 | "num-bigint", 2249 | "once_cell", 2250 | "regex", 2251 | "rustc-hash", 2252 | "ryu-js", 2253 | "serde", 2254 | "swc_allocator", 2255 | "swc_atoms", 2256 | "swc_common", 2257 | "swc_ecma_ast", 2258 | "swc_ecma_codegen_macros", 2259 | "swc_sourcemap", 2260 | "tracing", 2261 | ] 2262 | 2263 | [[package]] 2264 | name = "swc_ecma_codegen_macros" 2265 | version = "2.0.2" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "e276dc62c0a2625a560397827989c82a93fd545fcf6f7faec0935a82cc4ddbb8" 2268 | dependencies = [ 2269 | "proc-macro2", 2270 | "swc_macros_common", 2271 | "syn", 2272 | ] 2273 | 2274 | [[package]] 2275 | name = "swc_ecma_lexer" 2276 | version = "26.0.0" 2277 | source = "registry+https://github.com/rust-lang/crates.io-index" 2278 | checksum = "5e82f7747e052c6ff6e111fa4adeb14e33b46ee6e94fe5ef717601f651db48fc" 2279 | dependencies = [ 2280 | "bitflags", 2281 | "either", 2282 | "num-bigint", 2283 | "rustc-hash", 2284 | "seq-macro", 2285 | "serde", 2286 | "smallvec", 2287 | "smartstring", 2288 | "stacker", 2289 | "swc_atoms", 2290 | "swc_common", 2291 | "swc_ecma_ast", 2292 | "swc_ecma_parser", 2293 | "tracing", 2294 | ] 2295 | 2296 | [[package]] 2297 | name = "swc_ecma_loader" 2298 | version = "17.0.0" 2299 | source = "registry+https://github.com/rust-lang/crates.io-index" 2300 | checksum = "fbcababb48f0d46587a0a854b2c577eb3a56fa99687de558338021e93cd2c8f5" 2301 | dependencies = [ 2302 | "anyhow", 2303 | "pathdiff", 2304 | "rustc-hash", 2305 | "serde", 2306 | "swc_atoms", 2307 | "swc_common", 2308 | "tracing", 2309 | ] 2310 | 2311 | [[package]] 2312 | name = "swc_ecma_parser" 2313 | version = "27.0.7" 2314 | source = "registry+https://github.com/rust-lang/crates.io-index" 2315 | checksum = "7f1a51af1a92cd4904c073b293e491bbc0918400a45d58227b34c961dd6f52d7" 2316 | dependencies = [ 2317 | "bitflags", 2318 | "either", 2319 | "num-bigint", 2320 | "phf", 2321 | "rustc-hash", 2322 | "seq-macro", 2323 | "serde", 2324 | "smartstring", 2325 | "stacker", 2326 | "swc_atoms", 2327 | "swc_common", 2328 | "swc_ecma_ast", 2329 | "tracing", 2330 | ] 2331 | 2332 | [[package]] 2333 | name = "swc_ecma_transforms_base" 2334 | version = "30.0.1" 2335 | source = "registry+https://github.com/rust-lang/crates.io-index" 2336 | checksum = "250f6f165578ca4fee47bd57585c1b9597c94bf4ea6591df47f2b5fa5b1883fe" 2337 | dependencies = [ 2338 | "better_scoped_tls", 2339 | "indexmap", 2340 | "once_cell", 2341 | "par-core", 2342 | "phf", 2343 | "rustc-hash", 2344 | "serde", 2345 | "swc_atoms", 2346 | "swc_common", 2347 | "swc_ecma_ast", 2348 | "swc_ecma_parser", 2349 | "swc_ecma_utils", 2350 | "swc_ecma_visit", 2351 | "tracing", 2352 | ] 2353 | 2354 | [[package]] 2355 | name = "swc_ecma_transforms_classes" 2356 | version = "30.0.0" 2357 | source = "registry+https://github.com/rust-lang/crates.io-index" 2358 | checksum = "3d3ab35eff4a980e02d708798ae4c35bc017612292adbffe7b7b554df772fdf5" 2359 | dependencies = [ 2360 | "swc_common", 2361 | "swc_ecma_ast", 2362 | "swc_ecma_transforms_base", 2363 | "swc_ecma_utils", 2364 | "swc_ecma_visit", 2365 | ] 2366 | 2367 | [[package]] 2368 | name = "swc_ecma_transforms_macros" 2369 | version = "1.0.1" 2370 | source = "registry+https://github.com/rust-lang/crates.io-index" 2371 | checksum = "bc777288799bf6786e5200325a56e4fbabba590264a4a48a0c70b16ad0cf5cd8" 2372 | dependencies = [ 2373 | "proc-macro2", 2374 | "quote", 2375 | "swc_macros_common", 2376 | "syn", 2377 | ] 2378 | 2379 | [[package]] 2380 | name = "swc_ecma_transforms_proposal" 2381 | version = "30.0.0" 2382 | source = "registry+https://github.com/rust-lang/crates.io-index" 2383 | checksum = "c2d7748d4112c87ce1885260035e4a43cebfe7661a40174b7d77a0a04760a257" 2384 | dependencies = [ 2385 | "either", 2386 | "rustc-hash", 2387 | "serde", 2388 | "swc_atoms", 2389 | "swc_common", 2390 | "swc_ecma_ast", 2391 | "swc_ecma_transforms_base", 2392 | "swc_ecma_transforms_classes", 2393 | "swc_ecma_utils", 2394 | "swc_ecma_visit", 2395 | ] 2396 | 2397 | [[package]] 2398 | name = "swc_ecma_transforms_react" 2399 | version = "33.0.0" 2400 | source = "registry+https://github.com/rust-lang/crates.io-index" 2401 | checksum = "03de12e38e47ac1c96ac576f793ad37a9d7b16fbf4f2203881f89152f2498682" 2402 | dependencies = [ 2403 | "base64 0.22.1", 2404 | "bytes-str", 2405 | "indexmap", 2406 | "once_cell", 2407 | "rustc-hash", 2408 | "serde", 2409 | "sha1", 2410 | "string_enum", 2411 | "swc_atoms", 2412 | "swc_common", 2413 | "swc_config", 2414 | "swc_ecma_ast", 2415 | "swc_ecma_parser", 2416 | "swc_ecma_transforms_base", 2417 | "swc_ecma_utils", 2418 | "swc_ecma_visit", 2419 | ] 2420 | 2421 | [[package]] 2422 | name = "swc_ecma_transforms_typescript" 2423 | version = "33.0.0" 2424 | source = "registry+https://github.com/rust-lang/crates.io-index" 2425 | checksum = "4408800fdeb541fabf3659db622189a0aeb386f57b6103f9294ff19dfde4f7b0" 2426 | dependencies = [ 2427 | "bytes-str", 2428 | "rustc-hash", 2429 | "serde", 2430 | "swc_atoms", 2431 | "swc_common", 2432 | "swc_ecma_ast", 2433 | "swc_ecma_transforms_base", 2434 | "swc_ecma_transforms_react", 2435 | "swc_ecma_utils", 2436 | "swc_ecma_visit", 2437 | ] 2438 | 2439 | [[package]] 2440 | name = "swc_ecma_utils" 2441 | version = "24.0.0" 2442 | source = "registry+https://github.com/rust-lang/crates.io-index" 2443 | checksum = "0fb99e179988cabd473779a4452ab942bcb777176983ca3cbaf22a8f056a65b0" 2444 | dependencies = [ 2445 | "indexmap", 2446 | "num_cpus", 2447 | "once_cell", 2448 | "par-core", 2449 | "rustc-hash", 2450 | "ryu-js", 2451 | "swc_atoms", 2452 | "swc_common", 2453 | "swc_ecma_ast", 2454 | "swc_ecma_visit", 2455 | "tracing", 2456 | ] 2457 | 2458 | [[package]] 2459 | name = "swc_ecma_visit" 2460 | version = "18.0.1" 2461 | source = "registry+https://github.com/rust-lang/crates.io-index" 2462 | checksum = "a9611a72a4008d62608547a394e5d72a5245413104db096d95a52368a8cc1d63" 2463 | dependencies = [ 2464 | "new_debug_unreachable", 2465 | "num-bigint", 2466 | "swc_atoms", 2467 | "swc_common", 2468 | "swc_ecma_ast", 2469 | "swc_visit", 2470 | "tracing", 2471 | ] 2472 | 2473 | [[package]] 2474 | name = "swc_eq_ignore_macros" 2475 | version = "1.0.1" 2476 | source = "registry+https://github.com/rust-lang/crates.io-index" 2477 | checksum = "c16ce73424a6316e95e09065ba6a207eba7765496fed113702278b7711d4b632" 2478 | dependencies = [ 2479 | "proc-macro2", 2480 | "quote", 2481 | "syn", 2482 | ] 2483 | 2484 | [[package]] 2485 | name = "swc_macros_common" 2486 | version = "1.0.1" 2487 | source = "registry+https://github.com/rust-lang/crates.io-index" 2488 | checksum = "aae1efbaa74943dc5ad2a2fb16cbd78b77d7e4d63188f3c5b4df2b4dcd2faaae" 2489 | dependencies = [ 2490 | "proc-macro2", 2491 | "quote", 2492 | "syn", 2493 | ] 2494 | 2495 | [[package]] 2496 | name = "swc_sourcemap" 2497 | version = "9.3.4" 2498 | source = "registry+https://github.com/rust-lang/crates.io-index" 2499 | checksum = "de08ef00f816acdd1a58ee8a81c0e1a59eefef2093aefe5611f256fa6b64c4d7" 2500 | dependencies = [ 2501 | "base64-simd", 2502 | "bitvec", 2503 | "bytes-str", 2504 | "data-encoding", 2505 | "debugid", 2506 | "if_chain", 2507 | "rustc-hash", 2508 | "serde", 2509 | "serde_json", 2510 | "unicode-id-start", 2511 | "url", 2512 | ] 2513 | 2514 | [[package]] 2515 | name = "swc_visit" 2516 | version = "2.0.1" 2517 | source = "registry+https://github.com/rust-lang/crates.io-index" 2518 | checksum = "62fb71484b486c185e34d2172f0eabe7f4722742aad700f426a494bb2de232a2" 2519 | dependencies = [ 2520 | "either", 2521 | "new_debug_unreachable", 2522 | ] 2523 | 2524 | [[package]] 2525 | name = "syn" 2526 | version = "2.0.104" 2527 | source = "registry+https://github.com/rust-lang/crates.io-index" 2528 | checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" 2529 | dependencies = [ 2530 | "proc-macro2", 2531 | "quote", 2532 | "unicode-ident", 2533 | ] 2534 | 2535 | [[package]] 2536 | name = "synstructure" 2537 | version = "0.13.2" 2538 | source = "registry+https://github.com/rust-lang/crates.io-index" 2539 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 2540 | dependencies = [ 2541 | "proc-macro2", 2542 | "quote", 2543 | "syn", 2544 | ] 2545 | 2546 | [[package]] 2547 | name = "sys_traits" 2548 | version = "0.1.17" 2549 | source = "registry+https://github.com/rust-lang/crates.io-index" 2550 | checksum = "4f74a2c95f72e36fa6bd04a40d15623a9904bab1cc2fa6c6135b09d774a65088" 2551 | dependencies = [ 2552 | "getrandom", 2553 | "js-sys", 2554 | "junction", 2555 | "libc", 2556 | "sys_traits_macros", 2557 | "wasm-bindgen", 2558 | "windows-sys 0.59.0", 2559 | ] 2560 | 2561 | [[package]] 2562 | name = "sys_traits_macros" 2563 | version = "0.1.0" 2564 | source = "registry+https://github.com/rust-lang/crates.io-index" 2565 | checksum = "181f22127402abcf8ee5c83ccd5b408933fec36a6095cf82cda545634692657e" 2566 | dependencies = [ 2567 | "proc-macro2", 2568 | "quote", 2569 | "syn", 2570 | ] 2571 | 2572 | [[package]] 2573 | name = "tap" 2574 | version = "1.0.1" 2575 | source = "registry+https://github.com/rust-lang/crates.io-index" 2576 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 2577 | 2578 | [[package]] 2579 | name = "tar" 2580 | version = "0.4.43" 2581 | source = "registry+https://github.com/rust-lang/crates.io-index" 2582 | checksum = "c65998313f8e17d0d553d28f91a0df93e4dbbbf770279c7bc21ca0f09ea1a1f6" 2583 | dependencies = [ 2584 | "filetime", 2585 | "libc", 2586 | "xattr", 2587 | ] 2588 | 2589 | [[package]] 2590 | name = "termcolor" 2591 | version = "1.4.1" 2592 | source = "registry+https://github.com/rust-lang/crates.io-index" 2593 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 2594 | dependencies = [ 2595 | "winapi-util", 2596 | ] 2597 | 2598 | [[package]] 2599 | name = "text_lines" 2600 | version = "0.6.0" 2601 | source = "registry+https://github.com/rust-lang/crates.io-index" 2602 | checksum = "7fd5828de7deaa782e1dd713006ae96b3bee32d3279b79eb67ecf8072c059bcf" 2603 | dependencies = [ 2604 | "serde", 2605 | ] 2606 | 2607 | [[package]] 2608 | name = "thiserror" 2609 | version = "2.0.12" 2610 | source = "registry+https://github.com/rust-lang/crates.io-index" 2611 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 2612 | dependencies = [ 2613 | "thiserror-impl", 2614 | ] 2615 | 2616 | [[package]] 2617 | name = "thiserror-impl" 2618 | version = "2.0.12" 2619 | source = "registry+https://github.com/rust-lang/crates.io-index" 2620 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 2621 | dependencies = [ 2622 | "proc-macro2", 2623 | "quote", 2624 | "syn", 2625 | ] 2626 | 2627 | [[package]] 2628 | name = "tinystr" 2629 | version = "0.8.1" 2630 | source = "registry+https://github.com/rust-lang/crates.io-index" 2631 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 2632 | dependencies = [ 2633 | "displaydoc", 2634 | "zerovec", 2635 | ] 2636 | 2637 | [[package]] 2638 | name = "tokio" 2639 | version = "1.47.1" 2640 | source = "registry+https://github.com/rust-lang/crates.io-index" 2641 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 2642 | dependencies = [ 2643 | "backtrace", 2644 | "bytes", 2645 | "io-uring", 2646 | "libc", 2647 | "mio", 2648 | "parking_lot", 2649 | "pin-project-lite", 2650 | "signal-hook-registry", 2651 | "slab", 2652 | "socket2", 2653 | "tokio-macros", 2654 | "windows-sys 0.59.0", 2655 | ] 2656 | 2657 | [[package]] 2658 | name = "tokio-macros" 2659 | version = "2.5.0" 2660 | source = "registry+https://github.com/rust-lang/crates.io-index" 2661 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 2662 | dependencies = [ 2663 | "proc-macro2", 2664 | "quote", 2665 | "syn", 2666 | ] 2667 | 2668 | [[package]] 2669 | name = "tracing" 2670 | version = "0.1.41" 2671 | source = "registry+https://github.com/rust-lang/crates.io-index" 2672 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 2673 | dependencies = [ 2674 | "pin-project-lite", 2675 | "tracing-attributes", 2676 | "tracing-core", 2677 | ] 2678 | 2679 | [[package]] 2680 | name = "tracing-attributes" 2681 | version = "0.1.30" 2682 | source = "registry+https://github.com/rust-lang/crates.io-index" 2683 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 2684 | dependencies = [ 2685 | "proc-macro2", 2686 | "quote", 2687 | "syn", 2688 | ] 2689 | 2690 | [[package]] 2691 | name = "tracing-core" 2692 | version = "0.1.34" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 2695 | dependencies = [ 2696 | "once_cell", 2697 | ] 2698 | 2699 | [[package]] 2700 | name = "triomphe" 2701 | version = "0.1.14" 2702 | source = "registry+https://github.com/rust-lang/crates.io-index" 2703 | checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" 2704 | dependencies = [ 2705 | "serde", 2706 | "stable_deref_trait", 2707 | ] 2708 | 2709 | [[package]] 2710 | name = "twox-hash" 2711 | version = "2.1.0" 2712 | source = "registry+https://github.com/rust-lang/crates.io-index" 2713 | checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" 2714 | 2715 | [[package]] 2716 | name = "typenum" 2717 | version = "1.18.0" 2718 | source = "registry+https://github.com/rust-lang/crates.io-index" 2719 | checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" 2720 | 2721 | [[package]] 2722 | name = "unicode-id-start" 2723 | version = "1.3.1" 2724 | source = "registry+https://github.com/rust-lang/crates.io-index" 2725 | checksum = "2f322b60f6b9736017344fa0635d64be2f458fbc04eef65f6be22976dd1ffd5b" 2726 | 2727 | [[package]] 2728 | name = "unicode-ident" 2729 | version = "1.0.18" 2730 | source = "registry+https://github.com/rust-lang/crates.io-index" 2731 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 2732 | 2733 | [[package]] 2734 | name = "unicode-width" 2735 | version = "0.2.1" 2736 | source = "registry+https://github.com/rust-lang/crates.io-index" 2737 | checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" 2738 | 2739 | [[package]] 2740 | name = "url" 2741 | version = "2.5.4" 2742 | source = "registry+https://github.com/rust-lang/crates.io-index" 2743 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 2744 | dependencies = [ 2745 | "form_urlencoded", 2746 | "idna", 2747 | "percent-encoding", 2748 | "serde", 2749 | ] 2750 | 2751 | [[package]] 2752 | name = "utf8_iter" 2753 | version = "1.0.4" 2754 | source = "registry+https://github.com/rust-lang/crates.io-index" 2755 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 2756 | 2757 | [[package]] 2758 | name = "uuid" 2759 | version = "1.17.0" 2760 | source = "registry+https://github.com/rust-lang/crates.io-index" 2761 | checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" 2762 | dependencies = [ 2763 | "js-sys", 2764 | "wasm-bindgen", 2765 | ] 2766 | 2767 | [[package]] 2768 | name = "version_check" 2769 | version = "0.9.5" 2770 | source = "registry+https://github.com/rust-lang/crates.io-index" 2771 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 2772 | 2773 | [[package]] 2774 | name = "vsimd" 2775 | version = "0.8.0" 2776 | source = "registry+https://github.com/rust-lang/crates.io-index" 2777 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 2778 | 2779 | [[package]] 2780 | name = "walkdir" 2781 | version = "2.5.0" 2782 | source = "registry+https://github.com/rust-lang/crates.io-index" 2783 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 2784 | dependencies = [ 2785 | "same-file", 2786 | "winapi-util", 2787 | ] 2788 | 2789 | [[package]] 2790 | name = "wasi" 2791 | version = "0.11.1+wasi-snapshot-preview1" 2792 | source = "registry+https://github.com/rust-lang/crates.io-index" 2793 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 2794 | 2795 | [[package]] 2796 | name = "wasm-bindgen" 2797 | version = "0.2.105" 2798 | source = "registry+https://github.com/rust-lang/crates.io-index" 2799 | checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" 2800 | dependencies = [ 2801 | "cfg-if", 2802 | "once_cell", 2803 | "rustversion", 2804 | "wasm-bindgen-macro", 2805 | "wasm-bindgen-shared", 2806 | ] 2807 | 2808 | [[package]] 2809 | name = "wasm-bindgen-futures" 2810 | version = "0.4.55" 2811 | source = "registry+https://github.com/rust-lang/crates.io-index" 2812 | checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" 2813 | dependencies = [ 2814 | "cfg-if", 2815 | "js-sys", 2816 | "once_cell", 2817 | "wasm-bindgen", 2818 | "web-sys", 2819 | ] 2820 | 2821 | [[package]] 2822 | name = "wasm-bindgen-macro" 2823 | version = "0.2.105" 2824 | source = "registry+https://github.com/rust-lang/crates.io-index" 2825 | checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" 2826 | dependencies = [ 2827 | "quote", 2828 | "wasm-bindgen-macro-support", 2829 | ] 2830 | 2831 | [[package]] 2832 | name = "wasm-bindgen-macro-support" 2833 | version = "0.2.105" 2834 | source = "registry+https://github.com/rust-lang/crates.io-index" 2835 | checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" 2836 | dependencies = [ 2837 | "bumpalo", 2838 | "proc-macro2", 2839 | "quote", 2840 | "syn", 2841 | "wasm-bindgen-shared", 2842 | ] 2843 | 2844 | [[package]] 2845 | name = "wasm-bindgen-shared" 2846 | version = "0.2.105" 2847 | source = "registry+https://github.com/rust-lang/crates.io-index" 2848 | checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" 2849 | dependencies = [ 2850 | "unicode-ident", 2851 | ] 2852 | 2853 | [[package]] 2854 | name = "wasm_dep_analyzer" 2855 | version = "0.4.0" 2856 | source = "registry+https://github.com/rust-lang/crates.io-index" 2857 | checksum = "a10e6b67c951a84de7029487e0e0a496860dae49f6699edd279d5ff35b8fbf54" 2858 | dependencies = [ 2859 | "deno_error", 2860 | "thiserror", 2861 | ] 2862 | 2863 | [[package]] 2864 | name = "web-sys" 2865 | version = "0.3.82" 2866 | source = "registry+https://github.com/rust-lang/crates.io-index" 2867 | checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" 2868 | dependencies = [ 2869 | "js-sys", 2870 | "wasm-bindgen", 2871 | ] 2872 | 2873 | [[package]] 2874 | name = "which" 2875 | version = "8.0.0" 2876 | source = "registry+https://github.com/rust-lang/crates.io-index" 2877 | checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" 2878 | 2879 | [[package]] 2880 | name = "winapi" 2881 | version = "0.3.9" 2882 | source = "registry+https://github.com/rust-lang/crates.io-index" 2883 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2884 | dependencies = [ 2885 | "winapi-i686-pc-windows-gnu", 2886 | "winapi-x86_64-pc-windows-gnu", 2887 | ] 2888 | 2889 | [[package]] 2890 | name = "winapi-i686-pc-windows-gnu" 2891 | version = "0.4.0" 2892 | source = "registry+https://github.com/rust-lang/crates.io-index" 2893 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2894 | 2895 | [[package]] 2896 | name = "winapi-util" 2897 | version = "0.1.9" 2898 | source = "registry+https://github.com/rust-lang/crates.io-index" 2899 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 2900 | dependencies = [ 2901 | "windows-sys 0.59.0", 2902 | ] 2903 | 2904 | [[package]] 2905 | name = "winapi-x86_64-pc-windows-gnu" 2906 | version = "0.4.0" 2907 | source = "registry+https://github.com/rust-lang/crates.io-index" 2908 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2909 | 2910 | [[package]] 2911 | name = "windows-sys" 2912 | version = "0.52.0" 2913 | source = "registry+https://github.com/rust-lang/crates.io-index" 2914 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 2915 | dependencies = [ 2916 | "windows-targets 0.52.6", 2917 | ] 2918 | 2919 | [[package]] 2920 | name = "windows-sys" 2921 | version = "0.59.0" 2922 | source = "registry+https://github.com/rust-lang/crates.io-index" 2923 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 2924 | dependencies = [ 2925 | "windows-targets 0.52.6", 2926 | ] 2927 | 2928 | [[package]] 2929 | name = "windows-sys" 2930 | version = "0.60.2" 2931 | source = "registry+https://github.com/rust-lang/crates.io-index" 2932 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 2933 | dependencies = [ 2934 | "windows-targets 0.53.2", 2935 | ] 2936 | 2937 | [[package]] 2938 | name = "windows-targets" 2939 | version = "0.52.6" 2940 | source = "registry+https://github.com/rust-lang/crates.io-index" 2941 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 2942 | dependencies = [ 2943 | "windows_aarch64_gnullvm 0.52.6", 2944 | "windows_aarch64_msvc 0.52.6", 2945 | "windows_i686_gnu 0.52.6", 2946 | "windows_i686_gnullvm 0.52.6", 2947 | "windows_i686_msvc 0.52.6", 2948 | "windows_x86_64_gnu 0.52.6", 2949 | "windows_x86_64_gnullvm 0.52.6", 2950 | "windows_x86_64_msvc 0.52.6", 2951 | ] 2952 | 2953 | [[package]] 2954 | name = "windows-targets" 2955 | version = "0.53.2" 2956 | source = "registry+https://github.com/rust-lang/crates.io-index" 2957 | checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" 2958 | dependencies = [ 2959 | "windows_aarch64_gnullvm 0.53.0", 2960 | "windows_aarch64_msvc 0.53.0", 2961 | "windows_i686_gnu 0.53.0", 2962 | "windows_i686_gnullvm 0.53.0", 2963 | "windows_i686_msvc 0.53.0", 2964 | "windows_x86_64_gnu 0.53.0", 2965 | "windows_x86_64_gnullvm 0.53.0", 2966 | "windows_x86_64_msvc 0.53.0", 2967 | ] 2968 | 2969 | [[package]] 2970 | name = "windows_aarch64_gnullvm" 2971 | version = "0.52.6" 2972 | source = "registry+https://github.com/rust-lang/crates.io-index" 2973 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2974 | 2975 | [[package]] 2976 | name = "windows_aarch64_gnullvm" 2977 | version = "0.53.0" 2978 | source = "registry+https://github.com/rust-lang/crates.io-index" 2979 | checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2980 | 2981 | [[package]] 2982 | name = "windows_aarch64_msvc" 2983 | version = "0.52.6" 2984 | source = "registry+https://github.com/rust-lang/crates.io-index" 2985 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2986 | 2987 | [[package]] 2988 | name = "windows_aarch64_msvc" 2989 | version = "0.53.0" 2990 | source = "registry+https://github.com/rust-lang/crates.io-index" 2991 | checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2992 | 2993 | [[package]] 2994 | name = "windows_i686_gnu" 2995 | version = "0.52.6" 2996 | source = "registry+https://github.com/rust-lang/crates.io-index" 2997 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2998 | 2999 | [[package]] 3000 | name = "windows_i686_gnu" 3001 | version = "0.53.0" 3002 | source = "registry+https://github.com/rust-lang/crates.io-index" 3003 | checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 3004 | 3005 | [[package]] 3006 | name = "windows_i686_gnullvm" 3007 | version = "0.52.6" 3008 | source = "registry+https://github.com/rust-lang/crates.io-index" 3009 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 3010 | 3011 | [[package]] 3012 | name = "windows_i686_gnullvm" 3013 | version = "0.53.0" 3014 | source = "registry+https://github.com/rust-lang/crates.io-index" 3015 | checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 3016 | 3017 | [[package]] 3018 | name = "windows_i686_msvc" 3019 | version = "0.52.6" 3020 | source = "registry+https://github.com/rust-lang/crates.io-index" 3021 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 3022 | 3023 | [[package]] 3024 | name = "windows_i686_msvc" 3025 | version = "0.53.0" 3026 | source = "registry+https://github.com/rust-lang/crates.io-index" 3027 | checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 3028 | 3029 | [[package]] 3030 | name = "windows_x86_64_gnu" 3031 | version = "0.52.6" 3032 | source = "registry+https://github.com/rust-lang/crates.io-index" 3033 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 3034 | 3035 | [[package]] 3036 | name = "windows_x86_64_gnu" 3037 | version = "0.53.0" 3038 | source = "registry+https://github.com/rust-lang/crates.io-index" 3039 | checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 3040 | 3041 | [[package]] 3042 | name = "windows_x86_64_gnullvm" 3043 | version = "0.52.6" 3044 | source = "registry+https://github.com/rust-lang/crates.io-index" 3045 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 3046 | 3047 | [[package]] 3048 | name = "windows_x86_64_gnullvm" 3049 | version = "0.53.0" 3050 | source = "registry+https://github.com/rust-lang/crates.io-index" 3051 | checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 3052 | 3053 | [[package]] 3054 | name = "windows_x86_64_msvc" 3055 | version = "0.52.6" 3056 | source = "registry+https://github.com/rust-lang/crates.io-index" 3057 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 3058 | 3059 | [[package]] 3060 | name = "windows_x86_64_msvc" 3061 | version = "0.53.0" 3062 | source = "registry+https://github.com/rust-lang/crates.io-index" 3063 | checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 3064 | 3065 | [[package]] 3066 | name = "writeable" 3067 | version = "0.6.1" 3068 | source = "registry+https://github.com/rust-lang/crates.io-index" 3069 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 3070 | 3071 | [[package]] 3072 | name = "wyz" 3073 | version = "0.5.1" 3074 | source = "registry+https://github.com/rust-lang/crates.io-index" 3075 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 3076 | dependencies = [ 3077 | "tap", 3078 | ] 3079 | 3080 | [[package]] 3081 | name = "xattr" 3082 | version = "1.5.1" 3083 | source = "registry+https://github.com/rust-lang/crates.io-index" 3084 | checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" 3085 | dependencies = [ 3086 | "libc", 3087 | "rustix", 3088 | ] 3089 | 3090 | [[package]] 3091 | name = "yansi" 3092 | version = "1.0.1" 3093 | source = "registry+https://github.com/rust-lang/crates.io-index" 3094 | checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" 3095 | 3096 | [[package]] 3097 | name = "yoke" 3098 | version = "0.8.0" 3099 | source = "registry+https://github.com/rust-lang/crates.io-index" 3100 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 3101 | dependencies = [ 3102 | "serde", 3103 | "stable_deref_trait", 3104 | "yoke-derive", 3105 | "zerofrom", 3106 | ] 3107 | 3108 | [[package]] 3109 | name = "yoke-derive" 3110 | version = "0.8.0" 3111 | source = "registry+https://github.com/rust-lang/crates.io-index" 3112 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 3113 | dependencies = [ 3114 | "proc-macro2", 3115 | "quote", 3116 | "syn", 3117 | "synstructure", 3118 | ] 3119 | 3120 | [[package]] 3121 | name = "zerocopy" 3122 | version = "0.8.26" 3123 | source = "registry+https://github.com/rust-lang/crates.io-index" 3124 | checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" 3125 | dependencies = [ 3126 | "zerocopy-derive", 3127 | ] 3128 | 3129 | [[package]] 3130 | name = "zerocopy-derive" 3131 | version = "0.8.26" 3132 | source = "registry+https://github.com/rust-lang/crates.io-index" 3133 | checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" 3134 | dependencies = [ 3135 | "proc-macro2", 3136 | "quote", 3137 | "syn", 3138 | ] 3139 | 3140 | [[package]] 3141 | name = "zerofrom" 3142 | version = "0.1.6" 3143 | source = "registry+https://github.com/rust-lang/crates.io-index" 3144 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 3145 | dependencies = [ 3146 | "zerofrom-derive", 3147 | ] 3148 | 3149 | [[package]] 3150 | name = "zerofrom-derive" 3151 | version = "0.1.6" 3152 | source = "registry+https://github.com/rust-lang/crates.io-index" 3153 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 3154 | dependencies = [ 3155 | "proc-macro2", 3156 | "quote", 3157 | "syn", 3158 | "synstructure", 3159 | ] 3160 | 3161 | [[package]] 3162 | name = "zerotrie" 3163 | version = "0.2.2" 3164 | source = "registry+https://github.com/rust-lang/crates.io-index" 3165 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 3166 | dependencies = [ 3167 | "displaydoc", 3168 | "yoke", 3169 | "zerofrom", 3170 | ] 3171 | 3172 | [[package]] 3173 | name = "zerovec" 3174 | version = "0.11.2" 3175 | source = "registry+https://github.com/rust-lang/crates.io-index" 3176 | checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" 3177 | dependencies = [ 3178 | "yoke", 3179 | "zerofrom", 3180 | "zerovec-derive", 3181 | ] 3182 | 3183 | [[package]] 3184 | name = "zerovec-derive" 3185 | version = "0.11.1" 3186 | source = "registry+https://github.com/rust-lang/crates.io-index" 3187 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 3188 | dependencies = [ 3189 | "proc-macro2", 3190 | "quote", 3191 | "syn", 3192 | ] 3193 | --------------------------------------------------------------------------------