├── .node-version ├── .npmrc ├── tests ├── fixture │ ├── case_6 │ │ ├── input.js │ │ └── output.js │ ├── issue_55 │ │ ├── 1 │ │ │ ├── input.js │ │ │ └── output.js │ │ └── 2 │ │ │ ├── input.js │ │ │ └── output.js │ ├── issue_87 │ │ ├── input.js │ │ └── output.js │ ├── case_7 │ │ ├── input.js │ │ └── output.js │ ├── case_1 │ │ ├── input.js │ │ └── output.js │ ├── issue_133 │ │ ├── input.jsx │ │ └── output.jsx │ ├── case_2 │ │ ├── input.js │ │ └── output.js │ ├── case_4 │ │ ├── input.js │ │ └── output.js │ ├── case_3 │ │ ├── input.js │ │ └── output.js │ ├── case_11 │ │ ├── input.js │ │ └── output.js │ └── case_5 │ │ ├── input.js │ │ └── output.js └── test.rs ├── __test__ ├── case_8 │ ├── nino.ts │ ├── child.ts │ ├── index.ts │ ├── parent.ts │ └── index.spec.ts ├── case_9 │ ├── nino.ts │ ├── child.ts │ ├── parent.ts │ ├── index.ts │ └── index.spec.ts ├── case_swc_9651 │ ├── index.ts │ └── index.spec.ts ├── case_10 │ ├── children │ │ ├── nino.ts │ │ ├── index.ts │ │ └── child.ts │ ├── index.ts │ ├── parent.ts │ └── index.spec.ts └── case_1 │ ├── index.js │ └── index.spec.js ├── renovate.json ├── .taplo.toml ├── rust-toolchain.toml ├── .rustfmt.toml ├── jest.config.cjs ├── Cargo.toml ├── LICENSE ├── .github └── workflows │ ├── cron-latest.yml │ ├── cron-nightly.yml │ ├── test.yml │ ├── swc-compat-test.yml │ └── publish.yml ├── package.json ├── .gitignore ├── src ├── utils.rs ├── lib.rs └── local_export_strip.rs ├── README.md └── Cargo.lock /.node-version: -------------------------------------------------------------------------------- 1 | 20.11.1 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | registry=https://registry.npmjs.org/ -------------------------------------------------------------------------------- /tests/fixture/case_6/input.js: -------------------------------------------------------------------------------- 1 | export default 42; 2 | -------------------------------------------------------------------------------- /tests/fixture/issue_55/1/input.js: -------------------------------------------------------------------------------- 1 | export * from "./someModule"; 2 | -------------------------------------------------------------------------------- /tests/fixture/issue_87/input.js: -------------------------------------------------------------------------------- 1 | export { null } from "io-ts"; 2 | -------------------------------------------------------------------------------- /tests/fixture/case_7/input.js: -------------------------------------------------------------------------------- 1 | const foo = 42; 2 | export default foo; 3 | -------------------------------------------------------------------------------- /__test__/case_8/nino.ts: -------------------------------------------------------------------------------- 1 | export const niño = () => console.log("¡Hola Mundo!"); 2 | -------------------------------------------------------------------------------- /__test__/case_9/nino.ts: -------------------------------------------------------------------------------- 1 | export const hola = () => console.log("¡Hola Mundo!"); 2 | -------------------------------------------------------------------------------- /__test__/case_swc_9651/index.ts: -------------------------------------------------------------------------------- 1 | export const enum TagType { 2 | tag = "tag", 3 | } 4 | -------------------------------------------------------------------------------- /__test__/case_10/children/nino.ts: -------------------------------------------------------------------------------- 1 | export const niño = () => console.log("¡Hola Mundo!"); 2 | -------------------------------------------------------------------------------- /__test__/case_8/child.ts: -------------------------------------------------------------------------------- 1 | export const child = () => { 2 | console.log("Hello World!"); 3 | }; 4 | -------------------------------------------------------------------------------- /__test__/case_9/child.ts: -------------------------------------------------------------------------------- 1 | export const hello = () => { 2 | console.log("Hello World!"); 3 | }; 4 | -------------------------------------------------------------------------------- /__test__/case_10/children/index.ts: -------------------------------------------------------------------------------- 1 | export { child } from './child'; 2 | export { niño } from './nino'; 3 | -------------------------------------------------------------------------------- /__test__/case_10/index.ts: -------------------------------------------------------------------------------- 1 | export * as children from './children'; 2 | export { parent } from './parent'; 3 | -------------------------------------------------------------------------------- /__test__/case_10/children/child.ts: -------------------------------------------------------------------------------- 1 | export const child = () => { 2 | console.log("Hello World!"); 3 | }; 4 | -------------------------------------------------------------------------------- /__test__/case_8/index.ts: -------------------------------------------------------------------------------- 1 | export { child } from './child'; 2 | export { niño } from './nino'; 3 | export { parent } from './parent'; 4 | -------------------------------------------------------------------------------- /__test__/case_8/parent.ts: -------------------------------------------------------------------------------- 1 | import { child, niño } from "."; 2 | 3 | export const parent = () => { 4 | child(); 5 | niño(); 6 | }; 7 | -------------------------------------------------------------------------------- /__test__/case_9/parent.ts: -------------------------------------------------------------------------------- 1 | import { child, niño } from "."; 2 | 3 | export const parent = () => { 4 | child(); 5 | niño(); 6 | }; 7 | -------------------------------------------------------------------------------- /__test__/case_10/parent.ts: -------------------------------------------------------------------------------- 1 | import { child, niño } from "./children"; 2 | 3 | export const parent = () => { 4 | child(); 5 | niño(); 6 | }; 7 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /__test__/case_9/index.ts: -------------------------------------------------------------------------------- 1 | export { hello as child } from './child'; 2 | export { hola as niño } from './nino'; 3 | export { parent } from './parent'; 4 | -------------------------------------------------------------------------------- /tests/fixture/issue_55/2/input.js: -------------------------------------------------------------------------------- 1 | export * as mod from "./someModule"; 2 | export * from "./someModule"; 3 | export { foo, bar, baz } from "./someModule"; 4 | -------------------------------------------------------------------------------- /__test__/case_1/index.js: -------------------------------------------------------------------------------- 1 | export const child = () => { 2 | console.log("Hello World!"); 3 | }; 4 | 5 | export const callChild = () => { 6 | child(); 7 | }; 8 | -------------------------------------------------------------------------------- /.taplo.toml: -------------------------------------------------------------------------------- 1 | # https://taplo.tamasfe.dev/configuration/formatter-options.html 2 | [formatting] 3 | align_entries = true 4 | indent_tables = true 5 | reorder_keys = true 6 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "1.81.0" 3 | components = ["rustfmt", "clippy"] 4 | profile = "minimal" 5 | targets = ["wasm32-unknown-unknown"] 6 | -------------------------------------------------------------------------------- /tests/fixture/case_1/input.js: -------------------------------------------------------------------------------- 1 | export const child = () => { 2 | console.log("Hello World!"); 3 | }; 4 | 5 | export const callChild = () => { 6 | child(); 7 | }; 8 | -------------------------------------------------------------------------------- /__test__/case_swc_9651/index.spec.ts: -------------------------------------------------------------------------------- 1 | import * as index from "."; 2 | 3 | describe("index", () => { 4 | it("enums should be transformed correctly", () => { 5 | expect(index.TagType.tag).toBe("tag"); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /tests/fixture/issue_133/input.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export const A = () => { 4 | return
real a
; 5 | }; 6 | 7 | const B = () => { 8 | return ; 9 | }; 10 | 11 | export default B; 12 | -------------------------------------------------------------------------------- /tests/fixture/case_2/input.js: -------------------------------------------------------------------------------- 1 | import memoize from "p-memoize"; 2 | import { getConfig } from "./config"; 3 | export const getRedis = memoize(async () => { 4 | const config = await getConfig(); 5 | return new Redis(config.redisUrl); 6 | }); 7 | -------------------------------------------------------------------------------- /tests/fixture/case_4/input.js: -------------------------------------------------------------------------------- 1 | export function foo() { 2 | foo = () => 1; 3 | foo.bar = () => 2; 4 | return 3; 5 | } 6 | 7 | export let bar = function () { 8 | bar = () => 1; 9 | bar.bar = () => bar(); 10 | return 3; 11 | }; 12 | -------------------------------------------------------------------------------- /tests/fixture/case_3/input.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export const App = () => { 4 | return React.createElement( 5 | "main", 6 | { className: "akari" }, 7 | "Hello", 8 | "swc", 9 | "plugin" 10 | ); 11 | }; 12 | -------------------------------------------------------------------------------- /tests/fixture/case_11/input.js: -------------------------------------------------------------------------------- 1 | import { foo } from "foo"; 2 | export { foo, foofoo } from "foo"; 3 | 4 | import { bar } from "bar"; 5 | export { "b-a-r" as bar } from "bar"; 6 | 7 | export { "x-1" as "y-1" } from "baz"; 8 | 9 | export * as ns from "ns"; 10 | -------------------------------------------------------------------------------- /__test__/case_1/index.spec.js: -------------------------------------------------------------------------------- 1 | import * as index from "."; 2 | 3 | describe("index", () => { 4 | it("called", () => { 5 | const spiedChild = jest.spyOn(index, "child"); 6 | index.callChild(); 7 | 8 | expect(spiedChild).toHaveBeenCalled(); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /tests/fixture/case_6/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "default", { 3 | enumerable: true, 4 | get () { 5 | return _default; 6 | }, 7 | set (v) { 8 | _default = v; 9 | }, 10 | configurable: true 11 | }); 12 | const _default = 42; 13 | -------------------------------------------------------------------------------- /tests/fixture/case_5/input.js: -------------------------------------------------------------------------------- 1 | export let a = function () {}; 2 | 3 | export function b() {} 4 | 5 | export class c {} 6 | 7 | a(); 8 | b(); 9 | new c(); 10 | 11 | let _ = { 12 | a, 13 | b, 14 | c, 15 | }; 16 | 17 | a = function () {}; 18 | b = function () {}; 19 | 20 | a``; 21 | b``; 22 | -------------------------------------------------------------------------------- /tests/fixture/issue_87/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "null", { 3 | enumerable: true, 4 | get () { 5 | return _null; 6 | }, 7 | set (v) { 8 | _null = v; 9 | }, 10 | configurable: true 11 | }); 12 | import { null as _null } from "io-ts"; 13 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | edition = "2021" 2 | format_strings = true 3 | group_imports = "StdExternalCrate" 4 | hex_literal_case = "Lower" 5 | imports_granularity = "Crate" 6 | reorder_impl_items = true 7 | use_field_init_shorthand = true 8 | wrap_comments = true 9 | -------------------------------------------------------------------------------- /tests/fixture/case_7/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "default", { 3 | enumerable: true, 4 | get () { 5 | return _default; 6 | }, 7 | set (v) { 8 | _default = v; 9 | }, 10 | configurable: true 11 | }); 12 | const foo = 42; 13 | const _default = foo; 14 | -------------------------------------------------------------------------------- /__test__/case_8/index.spec.ts: -------------------------------------------------------------------------------- 1 | import * as index from "."; 2 | import { parent } from "./parent"; 3 | 4 | describe("index", () => { 5 | beforeEach(() => { 6 | jest.spyOn(index, "child"); 7 | jest.spyOn(index, "niño"); 8 | }) 9 | 10 | it("called", () => { 11 | parent(); 12 | 13 | expect(index.child).toHaveBeenCalled(); 14 | expect(index.niño).toHaveBeenCalled(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /__test__/case_9/index.spec.ts: -------------------------------------------------------------------------------- 1 | import * as index from "."; 2 | import { parent } from "./parent"; 3 | 4 | describe("index", () => { 5 | beforeEach(() => { 6 | jest.spyOn(index, "child"); 7 | jest.spyOn(index, "niño"); 8 | }) 9 | 10 | it("called", () => { 11 | parent(); 12 | 13 | expect(index.child).toHaveBeenCalled(); 14 | expect(index.niño).toHaveBeenCalled(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/fixture/case_3/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "App", { 3 | enumerable: true, 4 | get () { 5 | return App; 6 | }, 7 | set (v) { 8 | App = v; 9 | }, 10 | configurable: true 11 | }); 12 | import React from "react"; 13 | const App = ()=>{ 14 | return React.createElement("main", { 15 | className: "akari" 16 | }, "Hello", "swc", "plugin"); 17 | }; 18 | -------------------------------------------------------------------------------- /__test__/case_10/index.spec.ts: -------------------------------------------------------------------------------- 1 | import * as index from "."; 2 | import { parent } from "./parent"; 3 | 4 | describe("index", () => { 5 | beforeEach(() => { 6 | jest.spyOn(index.children, "child"); 7 | jest.spyOn(index.children, "niño"); 8 | }) 9 | 10 | it("called", () => { 11 | parent(); 12 | 13 | expect(index.children.child).toHaveBeenCalled(); 14 | expect(index.children.niño).toHaveBeenCalled(); 15 | }); 16 | }); 17 | -------------------------------------------------------------------------------- /tests/fixture/issue_55/1/output.js: -------------------------------------------------------------------------------- 1 | Object.keys(mod).forEach(function(key) { 2 | if (key === "default" || key === "__esModule") return; 3 | if (Object.prototype.hasOwnProperty.call(exports, key)) return; 4 | Object.defineProperty(exports, key, { 5 | enumerable: true, 6 | get: function() { 7 | return mod[key]; 8 | }, 9 | configurable: true 10 | }); 11 | }); 12 | import * as mod from "./someModule"; 13 | -------------------------------------------------------------------------------- /tests/fixture/case_2/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "getRedis", { 3 | enumerable: true, 4 | get () { 5 | return getRedis; 6 | }, 7 | set (v) { 8 | getRedis = v; 9 | }, 10 | configurable: true 11 | }); 12 | import memoize from "p-memoize"; 13 | import { getConfig } from "./config"; 14 | const getRedis = memoize(async ()=>{ 15 | const config = await getConfig(); 16 | return new Redis(config.redisUrl); 17 | }); 18 | -------------------------------------------------------------------------------- /tests/fixture/case_1/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "callChild", { 3 | enumerable: true, 4 | get () { 5 | return callChild; 6 | }, 7 | set (v) { 8 | callChild = v; 9 | }, 10 | configurable: true 11 | }); 12 | Object.defineProperty(exports, "child", { 13 | enumerable: true, 14 | get () { 15 | return child; 16 | }, 17 | set (v) { 18 | child = v; 19 | }, 20 | configurable: true 21 | }); 22 | const child = ()=>{ 23 | console.log("Hello World!"); 24 | }; 25 | const callChild = ()=>{ 26 | (0, exports.child)(); 27 | }; 28 | -------------------------------------------------------------------------------- /tests/fixture/issue_133/output.jsx: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "A", { 3 | enumerable: true, 4 | get () { 5 | return A; 6 | }, 7 | set (v) { 8 | A = v; 9 | }, 10 | configurable: true 11 | }); 12 | Object.defineProperty(exports, "default", { 13 | enumerable: true, 14 | get () { 15 | return _default; 16 | }, 17 | set (v) { 18 | _default = v; 19 | }, 20 | configurable: true 21 | }); 22 | import React from "react"; 23 | const A = ()=>{ 24 | return
real a
; 25 | }; 26 | const B = ()=>{ 27 | return ; 28 | }; 29 | const _default = B; 30 | -------------------------------------------------------------------------------- /tests/fixture/case_4/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "bar", { 3 | enumerable: true, 4 | get () { 5 | return bar; 6 | }, 7 | set (v) { 8 | bar = v; 9 | }, 10 | configurable: true 11 | }); 12 | Object.defineProperty(exports, "foo", { 13 | enumerable: true, 14 | get () { 15 | return foo; 16 | }, 17 | set (v) { 18 | foo = v; 19 | }, 20 | configurable: true 21 | }); 22 | function foo() { 23 | foo = ()=>1; 24 | foo.bar = ()=>2; 25 | return 3; 26 | } 27 | let bar = function() { 28 | bar = ()=>1; 29 | exports.bar.bar = ()=>(0, exports.bar)(); 30 | return 3; 31 | }; 32 | -------------------------------------------------------------------------------- /jest.config.cjs: -------------------------------------------------------------------------------- 1 | const path = require("node:path"); 2 | 3 | const isDev = process.env.WASM_ENV !== "release"; 4 | 5 | const plugin = isDev 6 | ? path.resolve( 7 | "./target/wasm32-unknown-unknown/debug/swc_mut_cjs_exports.wasm", 8 | ) 9 | : path.resolve( 10 | "./target/wasm32-unknown-unknown/release/swc_mut_cjs_exports.wasm", 11 | ); 12 | 13 | module.exports = { 14 | transform: { 15 | "^.+\\.(t|j)sx?$": [ 16 | "@swc/jest", 17 | { 18 | jsc: { 19 | experimental: { 20 | plugins: [[plugin, {}]], 21 | }, 22 | }, 23 | module: { 24 | type: "commonjs", 25 | }, 26 | }, 27 | ], 28 | }, 29 | }; 30 | -------------------------------------------------------------------------------- /tests/fixture/case_5/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "a", { 3 | enumerable: true, 4 | get () { 5 | return a; 6 | }, 7 | set (v) { 8 | a = v; 9 | }, 10 | configurable: true 11 | }); 12 | Object.defineProperty(exports, "b", { 13 | enumerable: true, 14 | get () { 15 | return b; 16 | }, 17 | set (v) { 18 | b = v; 19 | }, 20 | configurable: true 21 | }); 22 | Object.defineProperty(exports, "c", { 23 | enumerable: true, 24 | get () { 25 | return c; 26 | }, 27 | set (v) { 28 | c = v; 29 | }, 30 | configurable: true 31 | }); 32 | let a = function() {}; 33 | function b() {} 34 | class c { 35 | } 36 | (0, exports.a)(); 37 | b(); 38 | new c(); 39 | let _ = { 40 | a: exports.a, 41 | b, 42 | c 43 | }; 44 | a = function() {}; 45 | b = function() {}; 46 | (0, exports.a)``; 47 | b``; 48 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | authors = ["magic-akari "] 3 | description = "[SWC plugin] mutable CJS exports" 4 | edition = "2021" 5 | homepage = "https://github.com/magic-akari/swc_mut_cjs_exports" 6 | keywords = ["swc-plugin", "swc", "jest", "cjs", "commonjs"] 7 | license = "MIT" 8 | name = "swc_mut_cjs_exports" 9 | readme = "README.md" 10 | repository = "https://github.com/magic-akari/swc_mut_cjs_exports" 11 | version = "10.7.0" 12 | 13 | [lib] 14 | crate-type = ["cdylib", "lib"] 15 | 16 | [dependencies] 17 | rustc-hash = "2.1.1" 18 | swc_core = { version = "10.7.0", features = [ 19 | "ecma_ast", 20 | "ecma_visit", 21 | "swc_plugin", 22 | "ecma_utils", 23 | "swc_atoms", 24 | "ecma_plugin_transform", 25 | ] } 26 | 27 | 28 | [dev-dependencies] 29 | swc_core = { version = "10.7.0", features = [ 30 | "testing_transform", 31 | "ecma_parser", 32 | ] } 33 | testing = "4.0.0" 34 | 35 | [profile.release] 36 | codegen-units = 1 37 | opt-level = "s" 38 | strip = "debuginfo" 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) magic-akari 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. -------------------------------------------------------------------------------- /.github/workflows/cron-latest.yml: -------------------------------------------------------------------------------- 1 | name: with @swc/core@latest 2 | 3 | on: 4 | schedule: 5 | - cron: "0 18 * * 1,3,5" 6 | 7 | env: 8 | CARGO_INCREMENTAL: 0 9 | RUST_LOG: "debug" 10 | DIFF: 0 11 | RUST_MIN_STACK: 4194304 12 | NODE_ENV: "development" 13 | CARGO_TERM_COLOR: always 14 | 15 | jobs: 16 | node-test-latest: 17 | name: "@swc/core@latest test" 18 | runs-on: macos-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | 22 | - uses: actions/setup-node@v4 23 | with: 24 | node-version-file: ".node-version" 25 | - uses: pnpm/action-setup@v2 26 | 27 | - name: Get pnpm store directory 28 | shell: bash 29 | run: | 30 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 31 | 32 | - uses: actions/cache@v4 33 | name: Setup pnpm cache 34 | with: 35 | path: ${{ env.STORE_PATH }} 36 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 37 | restore-keys: | 38 | ${{ runner.os }}-pnpm-store- 39 | 40 | - run: pnpm add -D --ignore-scripts @swc/core@latest @swc/jest@latest 41 | - run: pnpm build 42 | - run: pnpm test 43 | -------------------------------------------------------------------------------- /.github/workflows/cron-nightly.yml: -------------------------------------------------------------------------------- 1 | name: with @swc/core@nightly 2 | 3 | on: 4 | schedule: 5 | - cron: "0 18 * * *" 6 | 7 | env: 8 | CARGO_INCREMENTAL: 0 9 | RUST_LOG: "debug" 10 | DIFF: 0 11 | RUST_MIN_STACK: 4194304 12 | NODE_ENV: "development" 13 | CARGO_TERM_COLOR: always 14 | 15 | jobs: 16 | node-test-nightly: 17 | name: "@swc/core@nightly test" 18 | runs-on: macos-latest 19 | steps: 20 | - uses: actions/checkout@v4 21 | 22 | - uses: actions/setup-node@v4 23 | with: 24 | node-version-file: ".node-version" 25 | - uses: pnpm/action-setup@v2 26 | 27 | - name: Get pnpm store directory 28 | shell: bash 29 | run: | 30 | echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV 31 | 32 | - uses: actions/cache@v4 33 | name: Setup pnpm cache 34 | with: 35 | path: ${{ env.STORE_PATH }} 36 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 37 | restore-keys: | 38 | ${{ runner.os }}-pnpm-store- 39 | 40 | - run: pnpm add -D --ignore-scripts @swc/core@nightly @swc/jest@latest 41 | - run: pnpm build 42 | - run: pnpm test 43 | -------------------------------------------------------------------------------- /tests/test.rs: -------------------------------------------------------------------------------- 1 | use std::path::PathBuf; 2 | use swc_core::{ 3 | common::Mark, 4 | ecma::{ 5 | ast::Pass, 6 | parser::{EsSyntax, Syntax}, 7 | transforms::{ 8 | base::resolver, 9 | testing::{test, test_fixture}, 10 | }, 11 | visit::visit_mut_pass, 12 | }, 13 | }; 14 | use swc_mut_cjs_exports::TransformVisitor; 15 | 16 | fn tr() -> impl Pass { 17 | let unresolved_mark = Mark::new(); 18 | let top_level_mark = Mark::new(); 19 | 20 | ( 21 | resolver(unresolved_mark, top_level_mark, false), 22 | visit_mut_pass(TransformVisitor::new(unresolved_mark)), 23 | ) 24 | } 25 | 26 | #[testing::fixture("tests/fixture/**/input.js")] 27 | #[testing::fixture("tests/fixture/**/input.jsx")] 28 | fn test(input: PathBuf) { 29 | let dir = input.parent().unwrap().to_path_buf(); 30 | let jsx = input.extension().unwrap() == "jsx"; 31 | let output = if jsx { 32 | dir.join("output.jsx") 33 | } else { 34 | dir.join("output.js") 35 | }; 36 | 37 | test_fixture( 38 | Syntax::Es(EsSyntax { 39 | jsx, 40 | ..Default::default() 41 | }), 42 | &|_| tr(), 43 | &input, 44 | &output, 45 | Default::default(), 46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | push: 5 | branches: 6 | - "*" 7 | pull_request: 8 | types: ["opened", "reopened", "synchronize"] 9 | 10 | env: 11 | CARGO_INCREMENTAL: 0 12 | RUST_LOG: "debug" 13 | DIFF: 0 14 | RUST_MIN_STACK: 4194304 15 | CARGO_TERM_COLOR: always 16 | 17 | jobs: 18 | cargo-fmt: 19 | name: Cargo fmt 20 | runs-on: macos-latest 21 | steps: 22 | - uses: actions/checkout@v4 23 | - run: cargo fmt -- --check 24 | 25 | cargo-clippy: 26 | name: Cargo clippy 27 | runs-on: macos-latest 28 | steps: 29 | - uses: actions/checkout@v4 30 | - run: cargo clippy 31 | 32 | cargo-test: 33 | name: Cargo test 34 | runs-on: macos-latest 35 | steps: 36 | - uses: actions/checkout@v4 37 | 38 | - run: cargo check --all-targets 39 | - run: cargo test 40 | 41 | swc-test: 42 | name: SWC test 43 | runs-on: macos-latest 44 | steps: 45 | - uses: actions/checkout@v4 46 | 47 | - uses: actions/setup-node@v4 48 | with: 49 | node-version-file: ".node-version" 50 | 51 | - uses: pnpm/action-setup@v2 52 | with: 53 | run_install: | 54 | - args: [--frozen-lockfile, --strict-peer-dependencies] 55 | 56 | - run: pnpm build 57 | - run: pnpm test 58 | -------------------------------------------------------------------------------- /tests/fixture/case_11/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "bar", { 3 | enumerable: true, 4 | get () { 5 | return bar1; 6 | }, 7 | set (v) { 8 | bar1 = v; 9 | }, 10 | configurable: true 11 | }); 12 | Object.defineProperty(exports, "foo", { 13 | enumerable: true, 14 | get () { 15 | return foo1; 16 | }, 17 | set (v) { 18 | foo1 = v; 19 | }, 20 | configurable: true 21 | }); 22 | Object.defineProperty(exports, "foofoo", { 23 | enumerable: true, 24 | get () { 25 | return foofoo; 26 | }, 27 | set (v) { 28 | foofoo = v; 29 | }, 30 | configurable: true 31 | }); 32 | Object.defineProperty(exports, "ns", { 33 | enumerable: true, 34 | get () { 35 | return ns; 36 | }, 37 | set (v) { 38 | ns = v; 39 | }, 40 | configurable: true 41 | }); 42 | Object.defineProperty(exports, "y-1", { 43 | enumerable: true, 44 | get () { 45 | return x1; 46 | }, 47 | set (v) { 48 | x1 = v; 49 | }, 50 | configurable: true 51 | }); 52 | import { foo } from "foo"; 53 | import { foo as foo1, foofoo as foofoo } from "foo"; 54 | import { bar } from "bar"; 55 | import { "b-a-r" as bar1 } from "bar"; 56 | import { "x-1" as x1 } from "baz"; 57 | import * as ns from "ns"; 58 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swc_mut_cjs_exports", 3 | "version": "10.7.0", 4 | "description": "[SWC plugin] mutable CJS exports", 5 | "author": "magic-akari ", 6 | "license": "MIT", 7 | "keywords": [ 8 | "swc-plugin", 9 | "swc", 10 | "jest", 11 | "cjs", 12 | "commonjs" 13 | ], 14 | "scripts": { 15 | "build": "cargo build --target wasm32-unknown-unknown", 16 | "test": "jest", 17 | "prepack": "cp -rf target/wasm32-unknown-unknown/release/swc_mut_cjs_exports.wasm ." 18 | }, 19 | "packageManager": "pnpm@8.15.5", 20 | "main": "swc_mut_cjs_exports.wasm", 21 | "files": [ 22 | "src", 23 | "swc_mut_cjs_exports.wasm" 24 | ], 25 | "homepage": "https://github.com/magic-akari/swc_mut_cjs_exports#readme", 26 | "repository": { 27 | "type": "git", 28 | "url": "git+https://github.com/magic-akari/swc_mut_cjs_exports.git" 29 | }, 30 | "bugs": { 31 | "url": "https://github.com/magic-akari/swc_mut_cjs_exports/issues" 32 | }, 33 | "devDependencies": { 34 | "@swc/core": "^1.10.0", 35 | "@swc/jest": "^0.2.37", 36 | "@types/jest": "^29.5.11", 37 | "jest": "^29.7.0" 38 | }, 39 | "peerDependencies": { 40 | "@swc/core": "^1.10.0", 41 | "@swc/jest": "^0.2.37" 42 | } 43 | } -------------------------------------------------------------------------------- /tests/fixture/issue_55/2/output.js: -------------------------------------------------------------------------------- 1 | export { }; 2 | Object.defineProperty(exports, "bar", { 3 | enumerable: true, 4 | get () { 5 | return bar; 6 | }, 7 | set (v) { 8 | bar = v; 9 | }, 10 | configurable: true 11 | }); 12 | Object.defineProperty(exports, "baz", { 13 | enumerable: true, 14 | get () { 15 | return baz; 16 | }, 17 | set (v) { 18 | baz = v; 19 | }, 20 | configurable: true 21 | }); 22 | Object.defineProperty(exports, "foo", { 23 | enumerable: true, 24 | get () { 25 | return foo; 26 | }, 27 | set (v) { 28 | foo = v; 29 | }, 30 | configurable: true 31 | }); 32 | Object.defineProperty(exports, "mod", { 33 | enumerable: true, 34 | get () { 35 | return mod; 36 | }, 37 | set (v) { 38 | mod = v; 39 | }, 40 | configurable: true 41 | }); 42 | Object.keys(mod1).forEach(function(key) { 43 | if (key === "default" || key === "__esModule") return; 44 | if (Object.prototype.hasOwnProperty.call(exports, key)) return; 45 | Object.defineProperty(exports, key, { 46 | enumerable: true, 47 | get: function() { 48 | return mod1[key]; 49 | }, 50 | configurable: true 51 | }); 52 | }); 53 | import * as mod from "./someModule"; 54 | import * as mod1 from "./someModule"; 55 | import { foo as foo, bar as bar, baz as baz } from "./someModule"; 56 | -------------------------------------------------------------------------------- /.github/workflows/swc-compat-test.yml: -------------------------------------------------------------------------------- 1 | name: SWC Compat Test 2 | 3 | on: 4 | push: 5 | branches: 6 | - "*" 7 | pull_request: 8 | types: ["opened", "reopened", "synchronize"] 9 | 10 | env: 11 | CARGO_INCREMENTAL: 0 12 | RUST_LOG: "debug" 13 | DIFF: 0 14 | RUST_MIN_STACK: 4194304 15 | CARGO_TERM_COLOR: always 16 | 17 | jobs: 18 | wasm-build: 19 | runs-on: macos-latest 20 | steps: 21 | - uses: actions/checkout@v4 22 | - uses: pnpm/action-setup@v2 23 | - run: pnpm build 24 | 25 | - name: Upload Binary 26 | uses: actions/upload-artifact@v4 27 | with: 28 | if-no-files-found: error 29 | name: wasm 30 | path: | 31 | target/*/debug/*.wasm 32 | 33 | test: 34 | name: Test with ${{ matrix.swc_package }} 35 | runs-on: macos-latest 36 | needs: wasm-build 37 | strategy: 38 | fail-fast: false 39 | matrix: 40 | swc_package: 41 | - "@swc/core@1.10.0" 42 | - "@swc/core@1.11.5" 43 | - "@swc/core@1.11.9" 44 | - "@swc/core@1.11.13" 45 | - "@swc/core@latest" 46 | steps: 47 | - uses: actions/checkout@v4 48 | 49 | - uses: actions/setup-node@v4 50 | with: 51 | node-version-file: ".node-version" 52 | 53 | - uses: pnpm/action-setup@v2 54 | with: 55 | run_install: | 56 | - args: [--frozen-lockfile, --strict-peer-dependencies] 57 | 58 | - run: pnpm add -D --ignore-scripts ${{ matrix.swc_package }} 59 | 60 | - uses: actions/download-artifact@v4 61 | with: 62 | name: wasm 63 | path: target/ 64 | 65 | - run: pnpm test 66 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*" 7 | 8 | env: 9 | CARGO_INCREMENTAL: 0 10 | CARGO_PROFILE_RELEASE_LTO: "fat" 11 | CARGO_TERM_COLOR: always 12 | 13 | jobs: 14 | cargo-publish: 15 | if: startsWith(github.ref, 'refs/tags/v') 16 | runs-on: macos-latest 17 | steps: 18 | - uses: actions/checkout@v4 19 | 20 | - name: Pre-Release 21 | run: cargo publish --dry-run 22 | 23 | - name: Github Release 24 | uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 25 | with: 26 | files: | 27 | target/package/swc_mut_cjs_exports-*.crate 28 | 29 | - name: publish crates 30 | run: cargo publish --token ${CRATES_TOKEN} 31 | env: 32 | CRATES_TOKEN: ${{ secrets.CRATES_TOKEN }} 33 | 34 | npm-publish: 35 | if: startsWith(github.ref, 'refs/tags/v') 36 | runs-on: macos-latest 37 | steps: 38 | - uses: actions/checkout@v4 39 | 40 | - uses: actions/setup-node@v4 41 | with: 42 | node-version-file: ".node-version" 43 | registry-url: "https://registry.npmjs.org" 44 | 45 | - uses: pnpm/action-setup@v2 46 | with: 47 | run_install: | 48 | - recursive: false 49 | args: [--ignore-scripts, --frozen-lockfile] 50 | 51 | - run: pnpm build --release 52 | - run: pnpm test 53 | env: 54 | WASM_ENV: release 55 | - run: pnpm pack 56 | 57 | - name: Github Release 58 | uses: softprops/action-gh-release@9d7c94cfd0a1f3ed45544c887983e9fa900f0564 59 | with: 60 | files: | 61 | target/wasm32-unknown-unknown/release/swc_mut_cjs_exports.wasm 62 | swc_mut_cjs_exports-*.tgz 63 | 64 | - name: NPM Release 65 | run: npm publish 66 | env: 67 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 68 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | 106 | .DS_Store 107 | 108 | /target 109 | ^target/ 110 | target 111 | .swc 112 | *.wasm -------------------------------------------------------------------------------- /src/utils.rs: -------------------------------------------------------------------------------- 1 | use swc_core::{ 2 | atoms::Atom, 3 | common::{Span, DUMMY_SP}, 4 | ecma::{ 5 | ast::*, 6 | utils::{member_expr, private_ident, quote_ident, quote_str, ExprFactory}, 7 | }, 8 | }; 9 | 10 | use crate::local_export_strip::Export; 11 | 12 | /// ```javascript 13 | /// { 14 | /// get() { return ident; } 15 | /// } 16 | /// ``` 17 | pub(crate) fn prop_method_getter(ident: Ident) -> Prop { 18 | let key = quote_ident!("get").into(); 19 | 20 | MethodProp { 21 | key, 22 | function: ident.into_lazy_fn(Default::default()).into(), 23 | } 24 | .into() 25 | } 26 | 27 | /// ```javascript 28 | /// { 29 | /// set(v) { ident = v; } 30 | /// } 31 | /// ``` 32 | pub(crate) fn prop_method_setter(ident: Ident) -> Prop { 33 | let key = quote_ident!("set").into(); 34 | 35 | let setter_param = private_ident!("v"); 36 | let params = vec![setter_param.clone().into()]; 37 | 38 | let body = BlockStmt { 39 | stmts: vec![setter_param 40 | .make_assign_to(op!("="), ident.clone().into()) 41 | .into_stmt()], 42 | ..Default::default() 43 | }; 44 | 45 | MethodProp { 46 | key, 47 | function: Function { 48 | params, 49 | body: Some(body), 50 | ..Default::default() 51 | } 52 | .into(), 53 | } 54 | .into() 55 | } 56 | 57 | /// Creates 58 | /// 59 | ///```js 60 | /// 61 | /// Object.defineProperty(target, prop_name, { 62 | /// ...props 63 | /// }); 64 | /// ``` 65 | pub(super) fn object_define_property( 66 | target: ExprOrSpread, 67 | prop_name: ExprOrSpread, 68 | descriptor: ExprOrSpread, 69 | ) -> Expr { 70 | member_expr!(Default::default(), DUMMY_SP, Object.defineProperty) 71 | .as_call(DUMMY_SP, vec![target, prop_name, descriptor]) 72 | } 73 | 74 | pub(crate) fn object_define_enumerable_configurable( 75 | target: ExprOrSpread, 76 | prop_name: ExprOrSpread, 77 | getter: PropOrSpread, 78 | setter: PropOrSpread, 79 | ) -> Expr { 80 | object_define_property( 81 | target, 82 | prop_name, 83 | ObjectLit { 84 | span: DUMMY_SP, 85 | props: vec![ 86 | PropOrSpread::Prop(Box::new( 87 | KeyValueProp { 88 | key: quote_ident!("enumerable").into(), 89 | value: Box::new(true.into()), 90 | } 91 | .into(), 92 | )), 93 | getter, 94 | setter, 95 | PropOrSpread::Prop(Box::new( 96 | KeyValueProp { 97 | key: quote_ident!("configurable").into(), 98 | value: Box::new(true.into()), 99 | } 100 | .into(), 101 | )), 102 | ], 103 | } 104 | .as_arg(), 105 | ) 106 | } 107 | 108 | pub(crate) fn emit_export_stmts(exports: Ident, export: Export) -> Vec { 109 | export 110 | .into_iter() 111 | .map(|(export_name, export_item)| { 112 | let prop_name = quote_str!(export_item.export_name_span(), export_name); 113 | let local_ident = export_item.into_local_ident(); 114 | 115 | object_define_enumerable_configurable( 116 | exports.clone().as_arg(), 117 | prop_name.as_arg(), 118 | prop_method_getter(local_ident.clone()).into(), 119 | prop_method_setter(local_ident).into(), 120 | ) 121 | .into_stmt() 122 | }) 123 | .collect() 124 | } 125 | 126 | pub(crate) fn key_from_export_name(n: &ModuleExportName) -> (Atom, Span) { 127 | match n { 128 | ModuleExportName::Ident(ident) => (ident.sym.clone(), ident.span), 129 | ModuleExportName::Str(str) => (str.value.clone(), str.span), 130 | } 131 | } 132 | 133 | pub(crate) fn local_ident_from_export_name(n: ModuleExportName) -> Ident { 134 | let name = match n { 135 | ModuleExportName::Ident(ident) => ident.sym, 136 | ModuleExportName::Str(str) => str.value, 137 | }; 138 | 139 | match Ident::verify_symbol(&name) { 140 | Ok(_) => private_ident!(name), 141 | Err(s) => private_ident!(s), 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [SWC plugin] mutable CJS exports 2 | 3 | > [!IMPORTANT] 4 | > This plugin has been migrated to the [swc official plugin repository](https://github.com/swc-project/plugins) and is available as [`@swc-contrib/mut-cjs-exports` on npm](https://www.npmjs.com/package/@swc-contrib/mut-cjs-exports). 5 | 6 | [![Crates.io](https://img.shields.io/crates/v/swc_mut_cjs_exports)](https://crates.io/crates/swc_mut_cjs_exports) 7 | [![npm](https://img.shields.io/npm/v/swc_mut_cjs_exports)](https://www.npmjs.com/package/swc_mut_cjs_exports) 8 | 9 | [![Test](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/test.yml/badge.svg)](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/test.yml) 10 | [![SWC Compat Test](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/swc-compat-test.yml/badge.svg)](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/swc-compat-test.yml) 11 | [![with @swc/core@latest](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/cron-latest.yml/badge.svg)](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/cron-latest.yml) 12 | [![with @swc/core@nightly](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/cron-nightly.yml/badge.svg)](https://github.com/magic-akari/swc_mut_cjs_exports/actions/workflows/cron-nightly.yml) 13 | 14 | This is a SWC plugin to emit mutable CJS exports. 15 | 16 | This SWC plugin has only been tested for compatibility with jest. It should be used with `@swc/jest`. 17 | 18 | This project was previously called jest_workaround 19 | 20 | ## plugin version 21 | 22 | | swc_mut_cjs_exports | @swc/core version | 23 | | ------------------- | ----------------- | 24 | | 0.79.69 | >=1.3.78 <1.3.81 | 25 | | 0.85.0 | >=1.3.81 <1.3.106 | 26 | | 0.86.17 | >=1.3.81 <1.3.106 | 27 | | 0.89.2 | >=1.3.106 <1.4.0 | 28 | | 0.90.3 | 1.4.0 | 29 | | 0.90.6 | >=1.4.0 <1.7.0 | 30 | | 0.90.24 | >=1.4.0 <1.7.0 | 31 | | 0.99.0 | >=1.7.0 <1.7.28 | 32 | | 0.109.1 | >=1.7.28 <1.10.0 | 33 | | 8.0.1 | >=1.10.0 <1.13.0 | 34 | | 8.0.2 | >=1.10.0 <1.13.0 | 35 | | 10.7.0 | >=1.10.0 <1.13.0 | 36 | 37 | > [!NOTE] 38 | > The version of this plugin after 10.7.0 is migrated to the [swc official plugin repository](https://github.com/swc-project/plugins) and is available as [`@swc-contrib/mut-cjs-exports` on npm](https://www.npmjs.com/package/@swc-contrib/mut-cjs-exports). 39 | > 40 | > Please refer to https://swc.rs/docs/plugin/selecting-swc-core for version compatibility. 41 | 42 | ## usage 43 | 44 | install 45 | 46 | ```bash 47 | npm i -D jest @swc/core @swc/jest swc_mut_cjs_exports 48 | ``` 49 | 50 | ```js 51 | // jest.config.js 52 | const fs = require("node:fs"); 53 | 54 | const swcrc = JSON.parse(fs.readFileSync(".swcrc", "utf8")); 55 | 56 | // If you have other plugins, change this line. 57 | ((swcrc.jsc ??= {}).experimental ??= {}).plugins = [ 58 | ["swc_mut_cjs_exports", {}], 59 | ]; 60 | 61 | module.exports = { 62 | transform: { 63 | "^.+\\.(t|j)sx?$": ["@swc/jest", swcrc], 64 | }, 65 | }; 66 | ``` 67 | 68 | Alternative implementation without .swcrc file 69 | 70 | ```JavaScript 71 | // jest.config.js 72 | 73 | module.exports = { 74 | transform: { 75 | "^.+\\.(t|j)sx?$": [ 76 | "@swc/jest", 77 | { 78 | jsc: { 79 | experimental: { 80 | plugins: [["swc_mut_cjs_exports", {}]], 81 | }, 82 | }, 83 | }, 84 | ], 85 | }, 86 | }; 87 | ``` 88 | 89 | Make sure that `module.type` is `commonjs` in your `.swcrc` since this plugin 90 | does not touch non-workaround parts, such as import statements. 91 | 92 | ## FAQ 93 | 94 | #### 1. When do I need this? 95 | 96 | If you're using the swc compiler to transform your code to comply with the ESM 97 | specification, but you're also using Jest to test it in a CJS environment, you 98 | may encounter issues due to the immutable issue of `exports`. 99 | 100 | This plugin can help by transforming the `export` statements into mutable 101 | `exports`. 102 | 103 | #### 2. Do I have a better choice? 104 | 105 | You may have other options depending on your specific needs: 106 | 107 | - If you're able to run Jest in an ESM environment, you can use swc to transpile 108 | TypeScript/JSX syntax or downgrade JavaScript syntax without module 109 | conversion. Simply set the value of `module.type` to `es6` to achieve this. 110 | 111 | - It's possible that some issues related to running Jest in an ESM environment 112 | will be resolved over time. Keep an eye on 113 | [facebook/jest#9430](https://github.com/facebook/jest/issues/9430) for 114 | updates. 115 | 116 | - If you don't need the behavior of ESM specifically, you can stick with the CJS 117 | syntax to get the CJS behavior of `exports`. 118 | 119 | These options may be worth considering before using this plugin. 120 | 121 | CJS syntax 122 | 123 | ```JavaScript 124 | exports.foo = function foo() { 125 | return 42; 126 | }; 127 | ``` 128 | 129 | CTS(CJS in TypeScript) syntax 130 | 131 | ```TypeScript 132 | export = { 133 | foo: function foo() { 134 | return 42; 135 | }, 136 | }; 137 | ``` 138 | 139 | Notes: 140 | 141 | - ESM style export means immutable exports when transformed into CJS 142 | - ESM style import means hoisted require when transformed into CJS 143 | 144 | #### 3. After upgrading the plugin version, the changes have not taken effect. 145 | 146 | This is a known issue. You could remove the Jest cache by running 147 | [`jest --clearCache`](https://jestjs.io/docs/cli#--clearcache) as a workaround. 148 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | mod local_export_strip; 2 | mod utils; 3 | 4 | use local_export_strip::LocalExportStrip; 5 | use rustc_hash::FxHashSet; 6 | use swc_core::{ 7 | common::{util::take::Take, Mark, SyntaxContext, DUMMY_SP}, 8 | ecma::{ 9 | ast::*, 10 | utils::{ 11 | for_each_binding_ident, member_expr, private_ident, quote_ident, quote_str, 12 | ExprFactory, IntoIndirectCall, 13 | }, 14 | visit::{noop_visit_mut_type, VisitMut, VisitMutWith}, 15 | }, 16 | plugin::{plugin_transform, proxies::TransformPluginProgramMetadata}, 17 | }; 18 | use utils::{emit_export_stmts, object_define_property}; 19 | 20 | #[derive(Debug)] 21 | pub struct TransformVisitor { 22 | unresolved_mark: Mark, 23 | 24 | export_decl_id: FxHashSet, 25 | } 26 | 27 | impl VisitMut for TransformVisitor { 28 | noop_visit_mut_type!(); 29 | 30 | fn visit_mut_script(&mut self, _: &mut Script) { 31 | // skip 32 | } 33 | 34 | fn visit_mut_module(&mut self, n: &mut Module) { 35 | let mut strip = LocalExportStrip::default(); 36 | n.visit_mut_with(&mut strip); 37 | 38 | let LocalExportStrip { 39 | has_export_assign, 40 | export, 41 | export_all, 42 | export_decl_id, 43 | .. 44 | } = strip; 45 | 46 | self.export_decl_id = export_decl_id; 47 | 48 | let mut stmts: Vec = Vec::with_capacity(n.body.len() + 1); 49 | 50 | if !has_export_assign && !export.is_empty() { 51 | // keep module env 52 | stmts.push(ModuleItem::ModuleDecl(ModuleDecl::ExportNamed( 53 | NamedExport::dummy(), 54 | ))); 55 | 56 | let exports = self.exports(); 57 | 58 | stmts.extend( 59 | emit_export_stmts(exports, export) 60 | .into_iter() 61 | .map(Into::into), 62 | ); 63 | 64 | if !self.export_decl_id.is_empty() { 65 | n.visit_mut_children_with(self); 66 | } 67 | } 68 | 69 | stmts.extend(export_all.into_iter().map(|id| self.export_all(id))); 70 | 71 | stmts.extend(n.body.take()); 72 | 73 | n.body = stmts; 74 | } 75 | 76 | fn visit_mut_function(&mut self, node: &mut Function) { 77 | let export_decl_id = self.export_decl_id.clone(); 78 | 79 | for_each_binding_ident(&node.params, |ident| { 80 | self.export_decl_id.remove(&ident.id.to_id()); 81 | }); 82 | 83 | node.visit_mut_children_with(self); 84 | self.export_decl_id = export_decl_id; 85 | } 86 | 87 | fn visit_mut_prop(&mut self, n: &mut Prop) { 88 | match n { 89 | Prop::Shorthand(ref_ident) => { 90 | if self.export_decl_id.contains(&ref_ident.to_id()) { 91 | *n = KeyValueProp { 92 | key: ref_ident.clone().into(), 93 | value: Box::new(self.exports().make_member(ref_ident.take().into()).into()), 94 | } 95 | .into() 96 | } 97 | } 98 | _ => n.visit_mut_children_with(self), 99 | } 100 | } 101 | 102 | fn visit_mut_expr(&mut self, n: &mut Expr) { 103 | match n { 104 | Expr::Ident(ref_ident) => { 105 | if self.export_decl_id.contains(&ref_ident.to_id()) { 106 | *n = self.exports().make_member(ref_ident.take().into()).into(); 107 | } 108 | } 109 | 110 | _ => n.visit_mut_children_with(self), 111 | }; 112 | } 113 | 114 | fn visit_mut_tagged_tpl(&mut self, n: &mut TaggedTpl) { 115 | let is_indirect = n 116 | .tag 117 | .as_ident() 118 | .map(|ident| self.export_decl_id.contains(&ident.to_id())) 119 | .unwrap_or_default(); 120 | 121 | n.visit_mut_children_with(self); 122 | 123 | if is_indirect { 124 | *n = n.take().into_indirect() 125 | } 126 | } 127 | 128 | fn visit_mut_callee(&mut self, n: &mut Callee) { 129 | match n { 130 | Callee::Expr(e) if e.is_ident() => { 131 | let is_indirect_callee = e 132 | .as_ident() 133 | .map(|ident| self.export_decl_id.contains(&ident.to_id())) 134 | .unwrap_or_default(); 135 | 136 | e.visit_mut_with(self); 137 | 138 | if is_indirect_callee { 139 | *n = n.take().into_indirect() 140 | } 141 | } 142 | 143 | _ => n.visit_mut_children_with(self), 144 | } 145 | } 146 | 147 | fn visit_mut_jsx_element_name(&mut self, n: &mut JSXElementName) { 148 | match n { 149 | JSXElementName::Ident(ref_ident) => { 150 | if self.export_decl_id.contains(&ref_ident.to_id()) { 151 | *n = JSXElementName::JSXMemberExpr( 152 | JSXMemberExpr { 153 | span: DUMMY_SP, 154 | obj: self.exports().into(), 155 | prop: ref_ident.clone().into(), 156 | } 157 | .into(), 158 | ); 159 | } 160 | } 161 | _ => n.visit_mut_children_with(self), 162 | }; 163 | } 164 | } 165 | 166 | impl TransformVisitor { 167 | pub fn new(unresolved_mark: Mark) -> Self { 168 | Self { 169 | unresolved_mark, 170 | export_decl_id: Default::default(), 171 | } 172 | } 173 | 174 | fn exports(&self) -> Ident { 175 | quote_ident!( 176 | SyntaxContext::empty().apply_mark(self.unresolved_mark), 177 | "exports" 178 | ) 179 | } 180 | 181 | /// ```JavaScript 182 | /// Object.keys(_mod).forEach(function (key) { 183 | /// if (key === "default" || key === "__esModule") return; 184 | /// if (Object.prototype.hasOwnProperty.call(exports, key)) return; 185 | /// Object.defineProperty(exports, key, { 186 | /// enumerable: true, 187 | /// get: function () { 188 | /// return mod[key]; 189 | /// }, 190 | /// configurable: true 191 | /// }); 192 | /// ``` 193 | fn export_all(&self, id: Id) -> ModuleItem { 194 | let mod_name = Ident::from(id); 195 | let key = private_ident!("key"); 196 | 197 | member_expr!(Default::default(), DUMMY_SP, Object.keys) 198 | .as_call(DUMMY_SP, vec![mod_name.clone().as_arg()]) 199 | .make_member(quote_ident!("forEach")) 200 | .as_call( 201 | DUMMY_SP, 202 | vec![Function { 203 | params: vec![key.clone().into()], 204 | span: DUMMY_SP, 205 | body: Some(BlockStmt { 206 | stmts: vec![ 207 | // if (key === "default" || key === "__esModule") return; 208 | IfStmt { 209 | span: DUMMY_SP, 210 | test: BinExpr { 211 | span: DUMMY_SP, 212 | op: op!("||"), 213 | left: BinExpr { 214 | span: DUMMY_SP, 215 | op: op!("==="), 216 | left: key.clone().into(), 217 | right: quote_str!("default").into(), 218 | } 219 | .into(), 220 | right: BinExpr { 221 | span: DUMMY_SP, 222 | op: op!("==="), 223 | left: key.clone().into(), 224 | right: quote_str!("__esModule").into(), 225 | } 226 | .into(), 227 | } 228 | .into(), 229 | cons: Box::new( 230 | ReturnStmt { 231 | span: DUMMY_SP, 232 | arg: None, 233 | } 234 | .into(), 235 | ), 236 | alt: None, 237 | } 238 | .into(), 239 | // if (Object.prototype.hasOwnProperty.call(exports, key)) return; 240 | IfStmt { 241 | span: DUMMY_SP, 242 | test: Box::new( 243 | member_expr!( 244 | Default::default(), 245 | DUMMY_SP, 246 | Object.prototype.hasOwnProperty.call 247 | ) 248 | .as_call( 249 | DUMMY_SP, 250 | vec![self.exports().as_arg(), key.clone().as_arg()], 251 | ), 252 | ), 253 | cons: Box::new( 254 | ReturnStmt { 255 | span: DUMMY_SP, 256 | arg: None, 257 | } 258 | .into(), 259 | ), 260 | alt: None, 261 | } 262 | .into(), 263 | // Object.defineProperty(exports, key, { 264 | // enumerable: true, 265 | // get: function () { 266 | // return mod[key]; 267 | // }, 268 | // configurable: true 269 | // }); 270 | object_define_property( 271 | self.exports().as_arg(), 272 | key.clone().as_arg(), 273 | ObjectLit { 274 | span: DUMMY_SP, 275 | props: vec![ 276 | PropOrSpread::Prop(Box::new( 277 | KeyValueProp { 278 | key: quote_ident!("enumerable").into(), 279 | value: true.into(), 280 | } 281 | .into(), 282 | )), 283 | PropOrSpread::Prop(Box::new( 284 | KeyValueProp { 285 | key: quote_ident!("get").into(), 286 | value: mod_name 287 | .clone() 288 | .computed_member(key.clone()) 289 | .into_lazy_fn(vec![]) 290 | .into(), 291 | } 292 | .into(), 293 | )), 294 | PropOrSpread::Prop(Box::new( 295 | KeyValueProp { 296 | key: quote_ident!("configurable").into(), 297 | value: true.into(), 298 | } 299 | .into(), 300 | )), 301 | ], 302 | } 303 | .as_arg(), 304 | ) 305 | .into_stmt(), 306 | ], 307 | ..Default::default() 308 | }), 309 | ..Default::default() 310 | } 311 | .as_arg()], 312 | ) 313 | .into_stmt() 314 | .into() 315 | } 316 | } 317 | 318 | #[plugin_transform] 319 | pub fn process_transform( 320 | mut program: Program, 321 | metadata: TransformPluginProgramMetadata, 322 | ) -> Program { 323 | program.visit_mut_with(&mut TransformVisitor::new(metadata.unresolved_mark)); 324 | program 325 | } 326 | -------------------------------------------------------------------------------- /src/local_export_strip.rs: -------------------------------------------------------------------------------- 1 | use std::collections::BTreeMap; 2 | 3 | use rustc_hash::FxHashSet; 4 | use swc_core::{ 5 | atoms::Atom, 6 | common::{util::take::Take, Span, DUMMY_SP}, 7 | ecma::{ 8 | ast::*, 9 | utils::{find_pat_ids, private_ident, ExprFactory}, 10 | visit::{noop_visit_mut_type, VisitMut, VisitMutWith}, 11 | }, 12 | }; 13 | 14 | use crate::utils::{key_from_export_name, local_ident_from_export_name}; 15 | 16 | pub type Export = BTreeMap; 17 | 18 | #[derive(Debug)] 19 | pub struct ExportItem(Span, Ident); 20 | 21 | impl ExportItem { 22 | pub fn new(export_name_span: Span, local_ident: Ident) -> Self { 23 | Self(export_name_span, local_ident) 24 | } 25 | 26 | pub fn export_name_span(&self) -> Span { 27 | self.0 28 | } 29 | 30 | pub fn into_local_ident(self) -> Ident { 31 | self.1 32 | } 33 | } 34 | 35 | #[derive(Debug, Default)] 36 | pub(crate) struct LocalExportStrip { 37 | pub(crate) has_export_assign: bool, 38 | pub(crate) export: Export, 39 | pub(crate) export_all: FxHashSet, 40 | pub(crate) export_decl_id: FxHashSet, 41 | export_default: Option, 42 | } 43 | 44 | impl VisitMut for LocalExportStrip { 45 | noop_visit_mut_type!(); 46 | 47 | fn visit_mut_script(&mut self, _: &mut Script) { 48 | // skip 49 | } 50 | 51 | fn visit_mut_module(&mut self, n: &mut Module) { 52 | let mut list = Vec::with_capacity(n.body.len()); 53 | 54 | for item in n.body.drain(..) { 55 | match item { 56 | ModuleItem::Stmt(stmt) => list.push(stmt.into()), 57 | 58 | ModuleItem::ModuleDecl(mut module_decl) => { 59 | // collect link meta 60 | module_decl.visit_mut_with(self); 61 | 62 | // emit stmt 63 | match module_decl { 64 | ModuleDecl::ExportDecl(ExportDecl { decl, .. }) => { 65 | list.push(Stmt::Decl(decl).into()); 66 | } 67 | ModuleDecl::ExportNamed(NamedExport { src: None, .. }) => continue, 68 | ModuleDecl::ExportNamed( 69 | item @ NamedExport { 70 | src: Some(..), 71 | type_only: false, 72 | .. 73 | }, 74 | ) => { 75 | let decl: ModuleDecl = self.convert_export_decl(item).into(); 76 | list.push(decl.into()); 77 | } 78 | ModuleDecl::ExportAll( 79 | e @ ExportAll { 80 | type_only: false, .. 81 | }, 82 | ) => { 83 | let decl: ModuleDecl = self.convert_export_all(e).into(); 84 | list.push(decl.into()); 85 | } 86 | ModuleDecl::ExportDefaultDecl(ExportDefaultDecl { 87 | decl: 88 | decl @ (DefaultDecl::Class(ClassExpr { 89 | ident: Some(..), .. 90 | }) 91 | | DefaultDecl::Fn(FnExpr { 92 | ident: Some(..), .. 93 | })), 94 | .. 95 | }) => match decl { 96 | DefaultDecl::Class(class_expr) => list.extend( 97 | class_expr 98 | .as_class_decl() 99 | .map(|decl| Stmt::Decl(Decl::Class(decl))) 100 | .map(Into::into), 101 | ), 102 | DefaultDecl::Fn(fn_expr) => list.extend( 103 | fn_expr 104 | .as_fn_decl() 105 | .map(|decl| Stmt::Decl(Decl::Fn(decl))) 106 | .map(Into::into), 107 | ), 108 | _ => unreachable!(), 109 | }, 110 | ModuleDecl::ExportDefaultExpr(..) => { 111 | list.extend(self.export_default.take().map(From::from)) 112 | } 113 | ModuleDecl::TsExportAssignment(..) => { 114 | self.has_export_assign = true; 115 | list.push(module_decl.into()); 116 | } 117 | _ => list.push(module_decl.into()), 118 | }; 119 | } 120 | }; 121 | } 122 | 123 | n.body = list; 124 | } 125 | 126 | /// ```javascript 127 | /// export const foo = 1, bar = 2, { baz } = { baz: 3 }; 128 | /// export let a = 1, [b] = [2]; 129 | /// export function x() {} 130 | /// export class y {} 131 | /// ``` 132 | /// -> 133 | /// ```javascript 134 | /// const foo = 1, bar = 2, { baz } = { baz: 3 }; 135 | /// let a = 1, [b] = [2]; 136 | /// function x() {} 137 | /// class y {} 138 | /// ``` 139 | fn visit_mut_export_decl(&mut self, n: &mut ExportDecl) { 140 | match &n.decl { 141 | Decl::Class(ClassDecl { ident, .. }) | Decl::Fn(FnDecl { ident, .. }) => { 142 | self.export.insert( 143 | ident.sym.clone(), 144 | ExportItem::new(ident.span, ident.clone()), 145 | ); 146 | } 147 | 148 | Decl::Var(v) => { 149 | let ids = find_pat_ids::<_, Ident>(&v.decls); 150 | 151 | self.export_decl_id.extend(ids.iter().map(Ident::to_id)); 152 | 153 | self.export.extend( 154 | find_pat_ids::<_, Ident>(&v.decls) 155 | .into_iter() 156 | .map(|id| (id.sym.clone(), ExportItem::new(id.span, id))), 157 | ); 158 | } 159 | _ => {} 160 | }; 161 | } 162 | 163 | /// ```javascript 164 | /// export { foo, foo as bar, foo as "baz" }; 165 | /// export { "foo", foo as bar, "foo" as "baz" } from "mod"; 166 | /// export * as foo from "mod"; 167 | /// export * as "bar" from "mod"; 168 | /// ``` 169 | fn visit_mut_named_export(&mut self, n: &mut NamedExport) { 170 | if n.type_only || n.src.is_some() { 171 | return; 172 | } 173 | 174 | let NamedExport { specifiers, .. } = n.take(); 175 | 176 | self.export.extend(specifiers.into_iter().map(|e| match e { 177 | ExportSpecifier::Namespace(..) => { 178 | unreachable!("`export *` without src is invalid") 179 | } 180 | ExportSpecifier::Default(..) => { 181 | unreachable!("`export foo` without src is invalid") 182 | } 183 | ExportSpecifier::Named(ExportNamedSpecifier { orig, exported, .. }) => { 184 | let orig = match orig { 185 | ModuleExportName::Ident(id) => id, 186 | ModuleExportName::Str(_) => { 187 | unreachable!(r#"`export {{ "foo" }}` without src is invalid"#) 188 | } 189 | }; 190 | 191 | if let Some(exported) = exported { 192 | let (export_name, export_name_span) = match exported { 193 | ModuleExportName::Ident(Ident { span, sym, .. }) => (sym, span), 194 | ModuleExportName::Str(Str { span, value, .. }) => (value, span), 195 | }; 196 | 197 | (export_name, ExportItem::new(export_name_span, orig)) 198 | } else { 199 | (orig.sym.clone(), ExportItem::new(orig.span, orig)) 200 | } 201 | } 202 | })) 203 | } 204 | 205 | /// ```javascript 206 | /// export default class foo {}; 207 | /// export default class {}; 208 | /// export default function bar () {}; 209 | /// export default function () {}; 210 | /// ``` 211 | /// -> 212 | /// ```javascript 213 | /// class foo {}; 214 | /// class _default {}; 215 | /// function bar () {}; 216 | /// function _default () {}; 217 | /// ``` 218 | fn visit_mut_export_default_decl(&mut self, n: &mut ExportDefaultDecl) { 219 | match &mut n.decl { 220 | DefaultDecl::Class(class_expr) => { 221 | if let Some(ident) = class_expr.ident.clone() { 222 | self.export 223 | .insert("default".into(), ExportItem::new(n.span, ident)); 224 | } 225 | } 226 | DefaultDecl::Fn(fn_expr) => { 227 | if let Some(ident) = fn_expr.ident.clone() { 228 | self.export 229 | .insert("default".into(), ExportItem::new(n.span, ident)); 230 | } 231 | } 232 | DefaultDecl::TsInterfaceDecl(_) => {} 233 | } 234 | } 235 | 236 | /// ```javascript 237 | /// export default foo; 238 | /// export default 1 239 | /// ``` 240 | /// -> 241 | /// ```javascript 242 | /// var _default = foo; 243 | /// var _default = 1; 244 | /// ``` 245 | fn visit_mut_export_default_expr(&mut self, n: &mut ExportDefaultExpr) { 246 | let ident = private_ident!(n.span, "_default"); 247 | 248 | self.export 249 | .insert("default".into(), ExportItem::new(n.span, ident.clone())); 250 | 251 | self.export_default = Some(Stmt::Decl( 252 | n.expr 253 | .take() 254 | .into_var_decl(VarDeclKind::Const, ident.into()) 255 | .into(), 256 | )); 257 | } 258 | } 259 | 260 | impl LocalExportStrip { 261 | fn convert_export_decl(&mut self, n: NamedExport) -> ImportDecl { 262 | let NamedExport { 263 | span, 264 | specifiers, 265 | src, 266 | type_only, 267 | with, 268 | } = n; 269 | 270 | let src = src.unwrap(); 271 | 272 | let specifiers = specifiers 273 | .into_iter() 274 | .flat_map(|s| self.convert_export_specifier(s)) 275 | .collect(); 276 | 277 | ImportDecl { 278 | span, 279 | specifiers, 280 | src, 281 | type_only, 282 | with, 283 | phase: Default::default(), 284 | } 285 | } 286 | 287 | fn convert_export_specifier(&mut self, s: ExportSpecifier) -> Option { 288 | match s { 289 | ExportSpecifier::Namespace(ExportNamespaceSpecifier { span, name }) => { 290 | let (export_name, export_span) = key_from_export_name(&name); 291 | let local = local_ident_from_export_name(name); 292 | self.export 293 | .insert(export_name, ExportItem::new(export_span, local.clone())); 294 | 295 | Some(ImportSpecifier::Namespace(ImportStarAsSpecifier { 296 | span, 297 | local, 298 | })) 299 | } 300 | ExportSpecifier::Default(ExportDefaultSpecifier { exported }) => { 301 | let (export_name, export_span) = (exported.sym.clone(), exported.span); 302 | let local = exported.into_private(); 303 | self.export 304 | .insert(export_name, ExportItem::new(export_span, local.clone())); 305 | 306 | Some(ImportSpecifier::Default(ImportDefaultSpecifier { 307 | local, 308 | span: DUMMY_SP, 309 | })) 310 | } 311 | ExportSpecifier::Named(ExportNamedSpecifier { 312 | span, 313 | orig, 314 | exported, 315 | is_type_only: false, 316 | }) => { 317 | // export { "x-1" as "y-1" } from "foo" 318 | // -> 319 | // import { "x-1" as x1 } from "foo" 320 | // export { x1 as "y-1" } 321 | let name = exported.as_ref().unwrap_or(&orig); 322 | 323 | let (export_name, export_span) = key_from_export_name(name); 324 | let local = local_ident_from_export_name(orig.clone()); 325 | self.export 326 | .insert(export_name, ExportItem::new(export_span, local.clone())); 327 | 328 | Some(ImportSpecifier::Named(ImportNamedSpecifier { 329 | span, 330 | local, 331 | imported: Some(orig), 332 | is_type_only: false, 333 | })) 334 | } 335 | _ => None, 336 | } 337 | } 338 | 339 | fn convert_export_all(&mut self, e: ExportAll) -> ImportDecl { 340 | let ExportAll { 341 | span, src, with, .. 342 | } = e; 343 | 344 | let mod_name = private_ident!("mod"); 345 | 346 | self.export_all.insert(mod_name.to_id()); 347 | 348 | let star = ImportStarAsSpecifier { 349 | span, 350 | local: mod_name.clone(), 351 | }; 352 | 353 | ImportDecl { 354 | span, 355 | specifiers: vec![star.into()], 356 | src, 357 | type_only: false, 358 | with, 359 | phase: Default::default(), 360 | } 361 | } 362 | } 363 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "Inflector" 7 | version = "0.11.4" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" 10 | 11 | [[package]] 12 | name = "ahash" 13 | version = "0.7.6" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" 16 | dependencies = [ 17 | "getrandom", 18 | "once_cell", 19 | "version_check", 20 | ] 21 | 22 | [[package]] 23 | name = "ahash" 24 | version = "0.8.11" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 27 | dependencies = [ 28 | "cfg-if", 29 | "once_cell", 30 | "version_check", 31 | "zerocopy", 32 | ] 33 | 34 | [[package]] 35 | name = "aho-corasick" 36 | version = "1.0.2" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" 39 | dependencies = [ 40 | "memchr", 41 | ] 42 | 43 | [[package]] 44 | name = "allocator-api2" 45 | version = "0.2.18" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" 48 | 49 | [[package]] 50 | name = "ansi_term" 51 | version = "0.12.1" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 54 | dependencies = [ 55 | "winapi", 56 | ] 57 | 58 | [[package]] 59 | name = "anyhow" 60 | version = "1.0.89" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" 63 | 64 | [[package]] 65 | name = "ast_node" 66 | version = "2.0.0" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "94741d66bdda032fcbf33e621b4e3a888d7d11bd3ac4446d82c5593a136936ff" 69 | dependencies = [ 70 | "proc-macro2", 71 | "quote", 72 | "swc_macros_common", 73 | "syn 2.0.87", 74 | ] 75 | 76 | [[package]] 77 | name = "ast_node" 78 | version = "3.0.0" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "91fb5864e2f5bf9fd9797b94b2dfd1554d4c3092b535008b27d7e15c86675a2f" 81 | dependencies = [ 82 | "proc-macro2", 83 | "quote", 84 | "swc_macros_common", 85 | "syn 2.0.87", 86 | ] 87 | 88 | [[package]] 89 | name = "autocfg" 90 | version = "1.1.0" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 93 | 94 | [[package]] 95 | name = "base64" 96 | version = "0.21.7" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 99 | 100 | [[package]] 101 | name = "base64-simd" 102 | version = "0.7.0" 103 | source = "registry+https://github.com/rust-lang/crates.io-index" 104 | checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" 105 | dependencies = [ 106 | "simd-abstraction", 107 | ] 108 | 109 | [[package]] 110 | name = "better_scoped_tls" 111 | version = "1.0.0" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "50fd297a11c709be8348aec039c8b91de16075d2b2bdaee1bd562c0875993664" 114 | dependencies = [ 115 | "scoped-tls", 116 | ] 117 | 118 | [[package]] 119 | name = "bitflags" 120 | version = "1.3.2" 121 | source = "registry+https://github.com/rust-lang/crates.io-index" 122 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 123 | 124 | [[package]] 125 | name = "bitflags" 126 | version = "2.6.0" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 129 | 130 | [[package]] 131 | name = "bitvec" 132 | version = "1.0.1" 133 | source = "registry+https://github.com/rust-lang/crates.io-index" 134 | checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" 135 | dependencies = [ 136 | "funty", 137 | "radium", 138 | "tap", 139 | "wyz", 140 | ] 141 | 142 | [[package]] 143 | name = "block-buffer" 144 | version = "0.10.4" 145 | source = "registry+https://github.com/rust-lang/crates.io-index" 146 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 147 | dependencies = [ 148 | "generic-array", 149 | ] 150 | 151 | [[package]] 152 | name = "bumpalo" 153 | version = "3.16.0" 154 | source = "registry+https://github.com/rust-lang/crates.io-index" 155 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 156 | dependencies = [ 157 | "allocator-api2", 158 | ] 159 | 160 | [[package]] 161 | name = "bytecheck" 162 | version = "0.8.0" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "50c8f430744b23b54ad15161fcbc22d82a29b73eacbe425fea23ec822600bc6f" 165 | dependencies = [ 166 | "bytecheck_derive", 167 | "ptr_meta 0.3.0", 168 | "rancor", 169 | "simdutf8", 170 | ] 171 | 172 | [[package]] 173 | name = "bytecheck_derive" 174 | version = "0.8.0" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "523363cbe1df49b68215efdf500b103ac3b0fb4836aed6d15689a076eadb8fff" 177 | dependencies = [ 178 | "proc-macro2", 179 | "quote", 180 | "syn 2.0.87", 181 | ] 182 | 183 | [[package]] 184 | name = "bytes" 185 | version = "1.6.1" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" 188 | 189 | [[package]] 190 | name = "camino" 191 | version = "1.1.6" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" 194 | dependencies = [ 195 | "serde", 196 | ] 197 | 198 | [[package]] 199 | name = "cargo-platform" 200 | version = "0.1.2" 201 | source = "registry+https://github.com/rust-lang/crates.io-index" 202 | checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" 203 | dependencies = [ 204 | "serde", 205 | ] 206 | 207 | [[package]] 208 | name = "cargo_metadata" 209 | version = "0.18.1" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" 212 | dependencies = [ 213 | "camino", 214 | "cargo-platform", 215 | "semver 1.0.18", 216 | "serde", 217 | "serde_json", 218 | "thiserror", 219 | ] 220 | 221 | [[package]] 222 | name = "cc" 223 | version = "1.0.82" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" 226 | dependencies = [ 227 | "libc", 228 | ] 229 | 230 | [[package]] 231 | name = "cfg-if" 232 | version = "1.0.0" 233 | source = "registry+https://github.com/rust-lang/crates.io-index" 234 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 235 | 236 | [[package]] 237 | name = "cpufeatures" 238 | version = "0.2.9" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" 241 | dependencies = [ 242 | "libc", 243 | ] 244 | 245 | [[package]] 246 | name = "crypto-common" 247 | version = "0.1.6" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 250 | dependencies = [ 251 | "generic-array", 252 | "typenum", 253 | ] 254 | 255 | [[package]] 256 | name = "darling" 257 | version = "0.20.10" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" 260 | dependencies = [ 261 | "darling_core", 262 | "darling_macro", 263 | ] 264 | 265 | [[package]] 266 | name = "darling_core" 267 | version = "0.20.10" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" 270 | dependencies = [ 271 | "fnv", 272 | "ident_case", 273 | "proc-macro2", 274 | "quote", 275 | "strsim", 276 | "syn 2.0.87", 277 | ] 278 | 279 | [[package]] 280 | name = "darling_macro" 281 | version = "0.20.10" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" 284 | dependencies = [ 285 | "darling_core", 286 | "quote", 287 | "syn 2.0.87", 288 | ] 289 | 290 | [[package]] 291 | name = "data-encoding" 292 | version = "2.3.3" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" 295 | 296 | [[package]] 297 | name = "debugid" 298 | version = "0.8.0" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d" 301 | dependencies = [ 302 | "serde", 303 | "uuid", 304 | ] 305 | 306 | [[package]] 307 | name = "derive_builder" 308 | version = "0.20.2" 309 | source = "registry+https://github.com/rust-lang/crates.io-index" 310 | checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 311 | dependencies = [ 312 | "derive_builder_macro", 313 | ] 314 | 315 | [[package]] 316 | name = "derive_builder_core" 317 | version = "0.20.2" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 320 | dependencies = [ 321 | "darling", 322 | "proc-macro2", 323 | "quote", 324 | "syn 2.0.87", 325 | ] 326 | 327 | [[package]] 328 | name = "derive_builder_macro" 329 | version = "0.20.2" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 332 | dependencies = [ 333 | "derive_builder_core", 334 | "syn 2.0.87", 335 | ] 336 | 337 | [[package]] 338 | name = "diff" 339 | version = "0.1.13" 340 | source = "registry+https://github.com/rust-lang/crates.io-index" 341 | checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" 342 | 343 | [[package]] 344 | name = "difference" 345 | version = "2.0.0" 346 | source = "registry+https://github.com/rust-lang/crates.io-index" 347 | checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198" 348 | 349 | [[package]] 350 | name = "digest" 351 | version = "0.10.7" 352 | source = "registry+https://github.com/rust-lang/crates.io-index" 353 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 354 | dependencies = [ 355 | "block-buffer", 356 | "crypto-common", 357 | ] 358 | 359 | [[package]] 360 | name = "either" 361 | version = "1.13.0" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 364 | 365 | [[package]] 366 | name = "equivalent" 367 | version = "1.0.1" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 370 | 371 | [[package]] 372 | name = "errno" 373 | version = "0.3.2" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" 376 | dependencies = [ 377 | "errno-dragonfly", 378 | "libc", 379 | "windows-sys", 380 | ] 381 | 382 | [[package]] 383 | name = "errno-dragonfly" 384 | version = "0.1.2" 385 | source = "registry+https://github.com/rust-lang/crates.io-index" 386 | checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" 387 | dependencies = [ 388 | "cc", 389 | "libc", 390 | ] 391 | 392 | [[package]] 393 | name = "fastrand" 394 | version = "2.0.0" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" 397 | 398 | [[package]] 399 | name = "fnv" 400 | version = "1.0.7" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 403 | 404 | [[package]] 405 | name = "form_urlencoded" 406 | version = "1.2.0" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" 409 | dependencies = [ 410 | "percent-encoding", 411 | ] 412 | 413 | [[package]] 414 | name = "from_variant" 415 | version = "2.0.0" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "8d7ccf961415e7aa17ef93dcb6c2441faaa8e768abe09e659b908089546f74c5" 418 | dependencies = [ 419 | "proc-macro2", 420 | "swc_macros_common", 421 | "syn 2.0.87", 422 | ] 423 | 424 | [[package]] 425 | name = "funty" 426 | version = "2.0.0" 427 | source = "registry+https://github.com/rust-lang/crates.io-index" 428 | checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" 429 | 430 | [[package]] 431 | name = "generic-array" 432 | version = "0.14.7" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 435 | dependencies = [ 436 | "typenum", 437 | "version_check", 438 | ] 439 | 440 | [[package]] 441 | name = "getrandom" 442 | version = "0.2.10" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" 445 | dependencies = [ 446 | "cfg-if", 447 | "libc", 448 | "wasi", 449 | ] 450 | 451 | [[package]] 452 | name = "glob" 453 | version = "0.3.1" 454 | source = "registry+https://github.com/rust-lang/crates.io-index" 455 | checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" 456 | 457 | [[package]] 458 | name = "hashbrown" 459 | version = "0.12.3" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 462 | dependencies = [ 463 | "ahash 0.7.6", 464 | ] 465 | 466 | [[package]] 467 | name = "hashbrown" 468 | version = "0.14.5" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 471 | dependencies = [ 472 | "ahash 0.8.11", 473 | "allocator-api2", 474 | ] 475 | 476 | [[package]] 477 | name = "hashbrown" 478 | version = "0.15.2" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 481 | 482 | [[package]] 483 | name = "hermit-abi" 484 | version = "0.3.2" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" 487 | 488 | [[package]] 489 | name = "hex" 490 | version = "0.4.3" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 493 | 494 | [[package]] 495 | name = "hstr" 496 | version = "0.2.17" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "a1a26def229ea95a8709dad32868d975d0dd40235bd2ce82920e4a8fe692b5e0" 499 | dependencies = [ 500 | "hashbrown 0.14.5", 501 | "new_debug_unreachable", 502 | "once_cell", 503 | "phf", 504 | "rustc-hash 1.1.0", 505 | "triomphe", 506 | ] 507 | 508 | [[package]] 509 | name = "ident_case" 510 | version = "1.0.1" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 513 | 514 | [[package]] 515 | name = "idna" 516 | version = "0.4.0" 517 | source = "registry+https://github.com/rust-lang/crates.io-index" 518 | checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" 519 | dependencies = [ 520 | "unicode-bidi", 521 | "unicode-normalization", 522 | ] 523 | 524 | [[package]] 525 | name = "if_chain" 526 | version = "1.0.2" 527 | source = "registry+https://github.com/rust-lang/crates.io-index" 528 | checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" 529 | 530 | [[package]] 531 | name = "indexmap" 532 | version = "2.1.0" 533 | source = "registry+https://github.com/rust-lang/crates.io-index" 534 | checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" 535 | dependencies = [ 536 | "equivalent", 537 | "hashbrown 0.14.5", 538 | ] 539 | 540 | [[package]] 541 | name = "is-macro" 542 | version = "0.3.5" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "59a85abdc13717906baccb5a1e435556ce0df215f242892f721dff62bf25288f" 545 | dependencies = [ 546 | "Inflector", 547 | "proc-macro2", 548 | "quote", 549 | "syn 2.0.87", 550 | ] 551 | 552 | [[package]] 553 | name = "itoa" 554 | version = "1.0.9" 555 | source = "registry+https://github.com/rust-lang/crates.io-index" 556 | checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" 557 | 558 | [[package]] 559 | name = "lazy_static" 560 | version = "1.4.0" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 563 | 564 | [[package]] 565 | name = "libc" 566 | version = "0.2.147" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" 569 | 570 | [[package]] 571 | name = "linux-raw-sys" 572 | version = "0.4.5" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" 575 | 576 | [[package]] 577 | name = "lock_api" 578 | version = "0.4.10" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" 581 | dependencies = [ 582 | "autocfg", 583 | "scopeguard", 584 | ] 585 | 586 | [[package]] 587 | name = "log" 588 | version = "0.4.19" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" 591 | 592 | [[package]] 593 | name = "matchers" 594 | version = "0.1.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" 597 | dependencies = [ 598 | "regex-automata 0.1.10", 599 | ] 600 | 601 | [[package]] 602 | name = "memchr" 603 | version = "2.6.4" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 606 | 607 | [[package]] 608 | name = "miette" 609 | version = "7.2.0" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "4edc8853320c2a0dab800fbda86253c8938f6ea88510dc92c5f1ed20e794afc1" 612 | dependencies = [ 613 | "cfg-if", 614 | "miette-derive", 615 | "owo-colors", 616 | "textwrap", 617 | "thiserror", 618 | "unicode-width", 619 | ] 620 | 621 | [[package]] 622 | name = "miette-derive" 623 | version = "7.2.0" 624 | source = "registry+https://github.com/rust-lang/crates.io-index" 625 | checksum = "dcf09caffaac8068c346b6df2a7fc27a177fd20b39421a39ce0a211bde679a6c" 626 | dependencies = [ 627 | "proc-macro2", 628 | "quote", 629 | "syn 2.0.87", 630 | ] 631 | 632 | [[package]] 633 | name = "munge" 634 | version = "0.4.1" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "64142d38c84badf60abf06ff9bd80ad2174306a5b11bd4706535090a30a419df" 637 | dependencies = [ 638 | "munge_macro", 639 | ] 640 | 641 | [[package]] 642 | name = "munge_macro" 643 | version = "0.4.1" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "1bb5c1d8184f13f7d0ccbeeca0def2f9a181bce2624302793005f5ca8aa62e5e" 646 | dependencies = [ 647 | "proc-macro2", 648 | "quote", 649 | "syn 2.0.87", 650 | ] 651 | 652 | [[package]] 653 | name = "new_debug_unreachable" 654 | version = "1.0.6" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" 657 | 658 | [[package]] 659 | name = "nu-ansi-term" 660 | version = "0.46.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 663 | dependencies = [ 664 | "overload", 665 | "winapi", 666 | ] 667 | 668 | [[package]] 669 | name = "num-bigint" 670 | version = "0.4.3" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" 673 | dependencies = [ 674 | "autocfg", 675 | "num-integer", 676 | "num-traits", 677 | "serde", 678 | ] 679 | 680 | [[package]] 681 | name = "num-integer" 682 | version = "0.1.45" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" 685 | dependencies = [ 686 | "autocfg", 687 | "num-traits", 688 | ] 689 | 690 | [[package]] 691 | name = "num-traits" 692 | version = "0.2.16" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" 695 | dependencies = [ 696 | "autocfg", 697 | ] 698 | 699 | [[package]] 700 | name = "num_cpus" 701 | version = "1.16.0" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" 704 | dependencies = [ 705 | "hermit-abi", 706 | "libc", 707 | ] 708 | 709 | [[package]] 710 | name = "once_cell" 711 | version = "1.19.0" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" 714 | 715 | [[package]] 716 | name = "outref" 717 | version = "0.1.0" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" 720 | 721 | [[package]] 722 | name = "overload" 723 | version = "0.1.1" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 726 | 727 | [[package]] 728 | name = "owo-colors" 729 | version = "4.0.0" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "caff54706df99d2a78a5a4e3455ff45448d81ef1bb63c22cd14052ca0e993a3f" 732 | 733 | [[package]] 734 | name = "parking_lot" 735 | version = "0.12.1" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 738 | dependencies = [ 739 | "lock_api", 740 | "parking_lot_core", 741 | ] 742 | 743 | [[package]] 744 | name = "parking_lot_core" 745 | version = "0.9.8" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" 748 | dependencies = [ 749 | "cfg-if", 750 | "libc", 751 | "redox_syscall", 752 | "smallvec", 753 | "windows-targets", 754 | ] 755 | 756 | [[package]] 757 | name = "percent-encoding" 758 | version = "2.3.0" 759 | source = "registry+https://github.com/rust-lang/crates.io-index" 760 | checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" 761 | 762 | [[package]] 763 | name = "phf" 764 | version = "0.11.2" 765 | source = "registry+https://github.com/rust-lang/crates.io-index" 766 | checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" 767 | dependencies = [ 768 | "phf_macros", 769 | "phf_shared", 770 | ] 771 | 772 | [[package]] 773 | name = "phf_generator" 774 | version = "0.11.2" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" 777 | dependencies = [ 778 | "phf_shared", 779 | "rand", 780 | ] 781 | 782 | [[package]] 783 | name = "phf_macros" 784 | version = "0.11.2" 785 | source = "registry+https://github.com/rust-lang/crates.io-index" 786 | checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" 787 | dependencies = [ 788 | "phf_generator", 789 | "phf_shared", 790 | "proc-macro2", 791 | "quote", 792 | "syn 2.0.87", 793 | ] 794 | 795 | [[package]] 796 | name = "phf_shared" 797 | version = "0.11.2" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" 800 | dependencies = [ 801 | "siphasher", 802 | ] 803 | 804 | [[package]] 805 | name = "pin-project-lite" 806 | version = "0.2.11" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "2c516611246607d0c04186886dbb3a754368ef82c79e9827a802c6d836dd111c" 809 | 810 | [[package]] 811 | name = "pretty_assertions" 812 | version = "1.4.0" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66" 815 | dependencies = [ 816 | "diff", 817 | "yansi", 818 | ] 819 | 820 | [[package]] 821 | name = "proc-macro2" 822 | version = "1.0.86" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" 825 | dependencies = [ 826 | "unicode-ident", 827 | ] 828 | 829 | [[package]] 830 | name = "psm" 831 | version = "0.1.21" 832 | source = "registry+https://github.com/rust-lang/crates.io-index" 833 | checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" 834 | dependencies = [ 835 | "cc", 836 | ] 837 | 838 | [[package]] 839 | name = "ptr_meta" 840 | version = "0.1.4" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" 843 | dependencies = [ 844 | "ptr_meta_derive 0.1.4", 845 | ] 846 | 847 | [[package]] 848 | name = "ptr_meta" 849 | version = "0.3.0" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "fe9e76f66d3f9606f44e45598d155cb13ecf09f4a28199e48daf8c8fc937ea90" 852 | dependencies = [ 853 | "ptr_meta_derive 0.3.0", 854 | ] 855 | 856 | [[package]] 857 | name = "ptr_meta_derive" 858 | version = "0.1.4" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" 861 | dependencies = [ 862 | "proc-macro2", 863 | "quote", 864 | "syn 1.0.109", 865 | ] 866 | 867 | [[package]] 868 | name = "ptr_meta_derive" 869 | version = "0.3.0" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "ca414edb151b4c8d125c12566ab0d74dc9cdba36fb80eb7b848c15f495fd32d1" 872 | dependencies = [ 873 | "proc-macro2", 874 | "quote", 875 | "syn 2.0.87", 876 | ] 877 | 878 | [[package]] 879 | name = "quote" 880 | version = "1.0.36" 881 | source = "registry+https://github.com/rust-lang/crates.io-index" 882 | checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" 883 | dependencies = [ 884 | "proc-macro2", 885 | ] 886 | 887 | [[package]] 888 | name = "radium" 889 | version = "0.7.0" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" 892 | 893 | [[package]] 894 | name = "rancor" 895 | version = "0.1.0" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "caf5f7161924b9d1cea0e4cabc97c372cea92b5f927fc13c6bca67157a0ad947" 898 | dependencies = [ 899 | "ptr_meta 0.3.0", 900 | ] 901 | 902 | [[package]] 903 | name = "rand" 904 | version = "0.8.5" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 907 | dependencies = [ 908 | "rand_core", 909 | ] 910 | 911 | [[package]] 912 | name = "rand_core" 913 | version = "0.6.4" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 916 | 917 | [[package]] 918 | name = "redox_syscall" 919 | version = "0.3.5" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" 922 | dependencies = [ 923 | "bitflags 1.3.2", 924 | ] 925 | 926 | [[package]] 927 | name = "regex" 928 | version = "1.11.0" 929 | source = "registry+https://github.com/rust-lang/crates.io-index" 930 | checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" 931 | dependencies = [ 932 | "aho-corasick", 933 | "memchr", 934 | "regex-automata 0.4.8", 935 | "regex-syntax 0.8.5", 936 | ] 937 | 938 | [[package]] 939 | name = "regex-automata" 940 | version = "0.1.10" 941 | source = "registry+https://github.com/rust-lang/crates.io-index" 942 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 943 | dependencies = [ 944 | "regex-syntax 0.6.29", 945 | ] 946 | 947 | [[package]] 948 | name = "regex-automata" 949 | version = "0.4.8" 950 | source = "registry+https://github.com/rust-lang/crates.io-index" 951 | checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" 952 | dependencies = [ 953 | "aho-corasick", 954 | "memchr", 955 | "regex-syntax 0.8.5", 956 | ] 957 | 958 | [[package]] 959 | name = "regex-syntax" 960 | version = "0.6.29" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" 963 | 964 | [[package]] 965 | name = "regex-syntax" 966 | version = "0.8.5" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 969 | 970 | [[package]] 971 | name = "relative-path" 972 | version = "1.8.0" 973 | source = "registry+https://github.com/rust-lang/crates.io-index" 974 | checksum = "4bf2521270932c3c7bed1a59151222bd7643c79310f2916f01925e1e16255698" 975 | 976 | [[package]] 977 | name = "rend" 978 | version = "0.5.2" 979 | source = "registry+https://github.com/rust-lang/crates.io-index" 980 | checksum = "a35e8a6bf28cd121053a66aa2e6a2e3eaffad4a60012179f0e864aa5ffeff215" 981 | dependencies = [ 982 | "bytecheck", 983 | ] 984 | 985 | [[package]] 986 | name = "rkyv" 987 | version = "0.8.9" 988 | source = "registry+https://github.com/rust-lang/crates.io-index" 989 | checksum = "b11a153aec4a6ab60795f8ebe2923c597b16b05bb1504377451e705ef1a45323" 990 | dependencies = [ 991 | "bytecheck", 992 | "bytes", 993 | "hashbrown 0.15.2", 994 | "indexmap", 995 | "munge", 996 | "ptr_meta 0.3.0", 997 | "rancor", 998 | "rend", 999 | "rkyv_derive", 1000 | "tinyvec", 1001 | "uuid", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "rkyv_derive" 1006 | version = "0.8.9" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "beb382a4d9f53bd5c0be86b10d8179c3f8a14c30bf774ff77096ed6581e35981" 1009 | dependencies = [ 1010 | "proc-macro2", 1011 | "quote", 1012 | "syn 2.0.87", 1013 | ] 1014 | 1015 | [[package]] 1016 | name = "rustc-hash" 1017 | version = "1.1.0" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1020 | 1021 | [[package]] 1022 | name = "rustc-hash" 1023 | version = "2.1.1" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 1026 | 1027 | [[package]] 1028 | name = "rustc_version" 1029 | version = "0.2.3" 1030 | source = "registry+https://github.com/rust-lang/crates.io-index" 1031 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1032 | dependencies = [ 1033 | "semver 0.9.0", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "rustix" 1038 | version = "0.38.7" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "172891ebdceb05aa0005f533a6cbfca599ddd7d966f6f5d4d9b2e70478e70399" 1041 | dependencies = [ 1042 | "bitflags 2.6.0", 1043 | "errno", 1044 | "libc", 1045 | "linux-raw-sys", 1046 | "windows-sys", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "rustversion" 1051 | version = "1.0.18" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" 1054 | 1055 | [[package]] 1056 | name = "ryu" 1057 | version = "1.0.15" 1058 | source = "registry+https://github.com/rust-lang/crates.io-index" 1059 | checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" 1060 | 1061 | [[package]] 1062 | name = "ryu-js" 1063 | version = "1.0.1" 1064 | source = "registry+https://github.com/rust-lang/crates.io-index" 1065 | checksum = "ad97d4ce1560a5e27cec89519dc8300d1aa6035b099821261c651486a19e44d5" 1066 | 1067 | [[package]] 1068 | name = "scoped-tls" 1069 | version = "1.0.1" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" 1072 | 1073 | [[package]] 1074 | name = "scopeguard" 1075 | version = "1.2.0" 1076 | source = "registry+https://github.com/rust-lang/crates.io-index" 1077 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1078 | 1079 | [[package]] 1080 | name = "semver" 1081 | version = "0.9.0" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1084 | dependencies = [ 1085 | "semver-parser", 1086 | ] 1087 | 1088 | [[package]] 1089 | name = "semver" 1090 | version = "1.0.18" 1091 | source = "registry+https://github.com/rust-lang/crates.io-index" 1092 | checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" 1093 | dependencies = [ 1094 | "serde", 1095 | ] 1096 | 1097 | [[package]] 1098 | name = "semver-parser" 1099 | version = "0.7.0" 1100 | source = "registry+https://github.com/rust-lang/crates.io-index" 1101 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1102 | 1103 | [[package]] 1104 | name = "serde" 1105 | version = "1.0.204" 1106 | source = "registry+https://github.com/rust-lang/crates.io-index" 1107 | checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" 1108 | dependencies = [ 1109 | "serde_derive", 1110 | ] 1111 | 1112 | [[package]] 1113 | name = "serde_derive" 1114 | version = "1.0.204" 1115 | source = "registry+https://github.com/rust-lang/crates.io-index" 1116 | checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" 1117 | dependencies = [ 1118 | "proc-macro2", 1119 | "quote", 1120 | "syn 2.0.87", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "serde_json" 1125 | version = "1.0.120" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" 1128 | dependencies = [ 1129 | "itoa", 1130 | "ryu", 1131 | "serde", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "sha2" 1136 | version = "0.10.8" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1139 | dependencies = [ 1140 | "cfg-if", 1141 | "cpufeatures", 1142 | "digest", 1143 | ] 1144 | 1145 | [[package]] 1146 | name = "sharded-slab" 1147 | version = "0.1.4" 1148 | source = "registry+https://github.com/rust-lang/crates.io-index" 1149 | checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" 1150 | dependencies = [ 1151 | "lazy_static", 1152 | ] 1153 | 1154 | [[package]] 1155 | name = "simd-abstraction" 1156 | version = "0.7.1" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" 1159 | dependencies = [ 1160 | "outref", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "simdutf8" 1165 | version = "0.1.4" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" 1168 | 1169 | [[package]] 1170 | name = "siphasher" 1171 | version = "0.3.10" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" 1174 | 1175 | [[package]] 1176 | name = "smallvec" 1177 | version = "1.13.1" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" 1180 | 1181 | [[package]] 1182 | name = "smartstring" 1183 | version = "1.0.1" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" 1186 | dependencies = [ 1187 | "autocfg", 1188 | "static_assertions", 1189 | "version_check", 1190 | ] 1191 | 1192 | [[package]] 1193 | name = "smawk" 1194 | version = "0.3.1" 1195 | source = "registry+https://github.com/rust-lang/crates.io-index" 1196 | checksum = "f67ad224767faa3c7d8b6d91985b78e70a1324408abcb1cfcc2be4c06bc06043" 1197 | 1198 | [[package]] 1199 | name = "sourcemap" 1200 | version = "9.0.0" 1201 | source = "registry+https://github.com/rust-lang/crates.io-index" 1202 | checksum = "dab08a862c70980b8e23698b507e272317ae52a608a164a844111f5372374f1f" 1203 | dependencies = [ 1204 | "base64-simd", 1205 | "bitvec", 1206 | "data-encoding", 1207 | "debugid", 1208 | "if_chain", 1209 | "rustc-hash 1.1.0", 1210 | "rustc_version", 1211 | "serde", 1212 | "serde_json", 1213 | "unicode-id-start", 1214 | "url", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "stable_deref_trait" 1219 | version = "1.2.0" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1222 | 1223 | [[package]] 1224 | name = "stacker" 1225 | version = "0.1.15" 1226 | source = "registry+https://github.com/rust-lang/crates.io-index" 1227 | checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" 1228 | dependencies = [ 1229 | "cc", 1230 | "cfg-if", 1231 | "libc", 1232 | "psm", 1233 | "winapi", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "static_assertions" 1238 | version = "1.1.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1241 | 1242 | [[package]] 1243 | name = "string_enum" 1244 | version = "1.0.0" 1245 | source = "registry+https://github.com/rust-lang/crates.io-index" 1246 | checksum = "c9fe66b8ee349846ce2f9557a26b8f1e74843c4a13fb381f9a3d73617a5f956a" 1247 | dependencies = [ 1248 | "proc-macro2", 1249 | "quote", 1250 | "swc_macros_common", 1251 | "syn 2.0.87", 1252 | ] 1253 | 1254 | [[package]] 1255 | name = "strsim" 1256 | version = "0.11.1" 1257 | source = "registry+https://github.com/rust-lang/crates.io-index" 1258 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1259 | 1260 | [[package]] 1261 | name = "swc_allocator" 1262 | version = "1.0.0" 1263 | source = "registry+https://github.com/rust-lang/crates.io-index" 1264 | checksum = "52cacc28f0ada8e4e31a720dd849ff06864b10e6ab0a1aaa99c06456cfe046af" 1265 | dependencies = [ 1266 | "bumpalo", 1267 | "hashbrown 0.14.5", 1268 | "ptr_meta 0.1.4", 1269 | "rustc-hash 1.1.0", 1270 | "triomphe", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "swc_allocator" 1275 | version = "2.0.0" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "117d5d3289663f53022ebf157df8a42b3872d7ac759e63abf96b5987b85d4af3" 1278 | dependencies = [ 1279 | "bumpalo", 1280 | "hashbrown 0.14.5", 1281 | "ptr_meta 0.3.0", 1282 | "rustc-hash 1.1.0", 1283 | "triomphe", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "swc_atoms" 1288 | version = "2.0.0" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "5d7211e5c57ea972f32b8a104d7006c4a68d094ec30c6a73bcd20d4d6c473c7c" 1291 | dependencies = [ 1292 | "hstr", 1293 | "once_cell", 1294 | "rustc-hash 1.1.0", 1295 | "serde", 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "swc_atoms" 1300 | version = "3.1.0" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "c24077f986f0bc1c07823f850f688dd9be91b186efdb03fe1d52f7c2f2a4a346" 1303 | dependencies = [ 1304 | "bytecheck", 1305 | "hstr", 1306 | "once_cell", 1307 | "rancor", 1308 | "rkyv", 1309 | "rustc-hash 2.1.1", 1310 | "serde", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "swc_common" 1315 | version = "4.0.1" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "4f87a21612a324493fd065e9c6fea960b4031088a213db782e2ca71d2fabb3ec" 1318 | dependencies = [ 1319 | "ast_node 2.0.0", 1320 | "better_scoped_tls", 1321 | "cfg-if", 1322 | "either", 1323 | "from_variant", 1324 | "new_debug_unreachable", 1325 | "num-bigint", 1326 | "once_cell", 1327 | "parking_lot", 1328 | "rustc-hash 1.1.0", 1329 | "serde", 1330 | "siphasher", 1331 | "swc_allocator 1.0.0", 1332 | "swc_atoms 2.0.0", 1333 | "swc_eq_ignore_macros", 1334 | "swc_visit", 1335 | "termcolor", 1336 | "tracing", 1337 | "unicode-width", 1338 | "url", 1339 | ] 1340 | 1341 | [[package]] 1342 | name = "swc_common" 1343 | version = "5.0.0" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "a521e8120dc0401580864a643b5bffa035c29fc3fc41697c972743d4f008ed22" 1346 | dependencies = [ 1347 | "anyhow", 1348 | "ast_node 3.0.0", 1349 | "better_scoped_tls", 1350 | "bytecheck", 1351 | "cfg-if", 1352 | "either", 1353 | "from_variant", 1354 | "new_debug_unreachable", 1355 | "num-bigint", 1356 | "once_cell", 1357 | "parking_lot", 1358 | "rancor", 1359 | "rkyv", 1360 | "rustc-hash 1.1.0", 1361 | "serde", 1362 | "siphasher", 1363 | "sourcemap", 1364 | "swc_allocator 2.0.0", 1365 | "swc_atoms 3.1.0", 1366 | "swc_eq_ignore_macros", 1367 | "swc_visit", 1368 | "termcolor", 1369 | "tracing", 1370 | "unicode-width", 1371 | "url", 1372 | ] 1373 | 1374 | [[package]] 1375 | name = "swc_core" 1376 | version = "10.7.0" 1377 | source = "registry+https://github.com/rust-lang/crates.io-index" 1378 | checksum = "9a2e50df9008ca01c05c914d3970b74e6b32ae7cbafb4fb0776f6e46b6db891b" 1379 | dependencies = [ 1380 | "once_cell", 1381 | "swc_allocator 2.0.0", 1382 | "swc_atoms 3.1.0", 1383 | "swc_common 5.0.0", 1384 | "swc_ecma_ast", 1385 | "swc_ecma_parser", 1386 | "swc_ecma_transforms_base", 1387 | "swc_ecma_transforms_testing", 1388 | "swc_ecma_utils", 1389 | "swc_ecma_visit", 1390 | "swc_plugin", 1391 | "swc_plugin_macro", 1392 | "swc_plugin_proxy", 1393 | "vergen", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "swc_ecma_ast" 1398 | version = "5.0.3" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "a05e7518b3052102506969009cabb027a88259ccde64ed675aa4ea8703b651f5" 1401 | dependencies = [ 1402 | "bitflags 2.6.0", 1403 | "bytecheck", 1404 | "is-macro", 1405 | "num-bigint", 1406 | "phf", 1407 | "rancor", 1408 | "rkyv", 1409 | "scoped-tls", 1410 | "string_enum", 1411 | "swc_atoms 3.1.0", 1412 | "swc_common 5.0.0", 1413 | "swc_visit", 1414 | "unicode-id-start", 1415 | ] 1416 | 1417 | [[package]] 1418 | name = "swc_ecma_codegen" 1419 | version = "5.1.0" 1420 | source = "registry+https://github.com/rust-lang/crates.io-index" 1421 | checksum = "389a3f4f9f28425fe0e3994ade4f099ad4f3a788cfe781cba36a9f4288eae222" 1422 | dependencies = [ 1423 | "memchr", 1424 | "num-bigint", 1425 | "once_cell", 1426 | "regex", 1427 | "serde", 1428 | "sourcemap", 1429 | "swc_allocator 2.0.0", 1430 | "swc_atoms 3.1.0", 1431 | "swc_common 5.0.0", 1432 | "swc_ecma_ast", 1433 | "swc_ecma_codegen_macros", 1434 | "tracing", 1435 | ] 1436 | 1437 | [[package]] 1438 | name = "swc_ecma_codegen_macros" 1439 | version = "1.0.0" 1440 | source = "registry+https://github.com/rust-lang/crates.io-index" 1441 | checksum = "5f9a42f479a6475647e248fa9750982c87cd985e19d1016a1fc18a70682305d1" 1442 | dependencies = [ 1443 | "proc-macro2", 1444 | "quote", 1445 | "swc_macros_common", 1446 | "syn 2.0.87", 1447 | ] 1448 | 1449 | [[package]] 1450 | name = "swc_ecma_parser" 1451 | version = "6.0.2" 1452 | source = "registry+https://github.com/rust-lang/crates.io-index" 1453 | checksum = "b92d3a25349d7f612c38d940f09f9c19c7b7aa3bf4d22fbe31ea44fd5354de02" 1454 | dependencies = [ 1455 | "either", 1456 | "new_debug_unreachable", 1457 | "num-bigint", 1458 | "num-traits", 1459 | "phf", 1460 | "serde", 1461 | "smallvec", 1462 | "smartstring", 1463 | "stacker", 1464 | "swc_atoms 3.1.0", 1465 | "swc_common 5.0.0", 1466 | "swc_ecma_ast", 1467 | "tracing", 1468 | "typed-arena", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "swc_ecma_testing" 1473 | version = "5.0.0" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "e8ac0df7dbb231e54ebbdf9b5f4f83cc3e3830e7329fa4365e5da510f373f158" 1476 | dependencies = [ 1477 | "anyhow", 1478 | "hex", 1479 | "sha2", 1480 | "testing 5.0.0", 1481 | "tracing", 1482 | ] 1483 | 1484 | [[package]] 1485 | name = "swc_ecma_transforms_base" 1486 | version = "7.1.1" 1487 | source = "registry+https://github.com/rust-lang/crates.io-index" 1488 | checksum = "4596fe5bcb4ed0836c71e69fb4cbf0071bb832669ae57ba28aaa4b6a67b6ddfd" 1489 | dependencies = [ 1490 | "better_scoped_tls", 1491 | "bitflags 2.6.0", 1492 | "indexmap", 1493 | "once_cell", 1494 | "phf", 1495 | "rustc-hash 1.1.0", 1496 | "serde", 1497 | "smallvec", 1498 | "swc_atoms 3.1.0", 1499 | "swc_common 5.0.0", 1500 | "swc_ecma_ast", 1501 | "swc_ecma_parser", 1502 | "swc_ecma_utils", 1503 | "swc_ecma_visit", 1504 | "swc_parallel", 1505 | "tracing", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "swc_ecma_transforms_testing" 1510 | version = "7.0.1" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "6595f97e02012d9d284c34c6f328be674a8631502629c921f606da88b59b3743" 1513 | dependencies = [ 1514 | "ansi_term", 1515 | "anyhow", 1516 | "base64", 1517 | "hex", 1518 | "serde", 1519 | "serde_json", 1520 | "sha2", 1521 | "sourcemap", 1522 | "swc_allocator 2.0.0", 1523 | "swc_common 5.0.0", 1524 | "swc_ecma_ast", 1525 | "swc_ecma_codegen", 1526 | "swc_ecma_parser", 1527 | "swc_ecma_testing", 1528 | "swc_ecma_transforms_base", 1529 | "swc_ecma_utils", 1530 | "swc_ecma_visit", 1531 | "tempfile", 1532 | "testing 5.0.0", 1533 | ] 1534 | 1535 | [[package]] 1536 | name = "swc_ecma_utils" 1537 | version = "7.0.4" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "971099632f1a9117debf5ca8451615c3014eea519e9ad31e386396b6e0ac8fb5" 1540 | dependencies = [ 1541 | "indexmap", 1542 | "num_cpus", 1543 | "once_cell", 1544 | "rustc-hash 1.1.0", 1545 | "ryu-js", 1546 | "swc_atoms 3.1.0", 1547 | "swc_common 5.0.0", 1548 | "swc_ecma_ast", 1549 | "swc_ecma_visit", 1550 | "swc_parallel", 1551 | "tracing", 1552 | "unicode-id", 1553 | ] 1554 | 1555 | [[package]] 1556 | name = "swc_ecma_visit" 1557 | version = "5.0.0" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "b04c06c1805bda18c27165560f1617a57453feb9fb0638d90839053641af42d4" 1560 | dependencies = [ 1561 | "new_debug_unreachable", 1562 | "num-bigint", 1563 | "swc_atoms 3.1.0", 1564 | "swc_common 5.0.0", 1565 | "swc_ecma_ast", 1566 | "swc_visit", 1567 | "tracing", 1568 | ] 1569 | 1570 | [[package]] 1571 | name = "swc_eq_ignore_macros" 1572 | version = "1.0.0" 1573 | source = "registry+https://github.com/rust-lang/crates.io-index" 1574 | checksum = "e96e15288bf385ab85eb83cff7f9e2d834348da58d0a31b33bdb572e66ee413e" 1575 | dependencies = [ 1576 | "proc-macro2", 1577 | "quote", 1578 | "syn 2.0.87", 1579 | ] 1580 | 1581 | [[package]] 1582 | name = "swc_error_reporters" 1583 | version = "5.0.0" 1584 | source = "registry+https://github.com/rust-lang/crates.io-index" 1585 | checksum = "fb4a3c124af5d297d98e6c18776ba04024087cde14602621017e8e9c6cd1c2d1" 1586 | dependencies = [ 1587 | "anyhow", 1588 | "miette", 1589 | "once_cell", 1590 | "parking_lot", 1591 | "swc_common 4.0.1", 1592 | ] 1593 | 1594 | [[package]] 1595 | name = "swc_error_reporters" 1596 | version = "6.0.0" 1597 | source = "registry+https://github.com/rust-lang/crates.io-index" 1598 | checksum = "4f741b530b2df577a287e193c4a111182de01b43361617af228ec9e6e6222fa4" 1599 | dependencies = [ 1600 | "anyhow", 1601 | "miette", 1602 | "once_cell", 1603 | "parking_lot", 1604 | "swc_common 5.0.0", 1605 | ] 1606 | 1607 | [[package]] 1608 | name = "swc_macros_common" 1609 | version = "1.0.0" 1610 | source = "registry+https://github.com/rust-lang/crates.io-index" 1611 | checksum = "a509f56fca05b39ba6c15f3e58636c3924c78347d63853632ed2ffcb6f5a0ac7" 1612 | dependencies = [ 1613 | "proc-macro2", 1614 | "quote", 1615 | "syn 2.0.87", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "swc_mut_cjs_exports" 1620 | version = "10.7.0" 1621 | dependencies = [ 1622 | "rustc-hash 2.1.1", 1623 | "swc_core", 1624 | "testing 4.0.0", 1625 | ] 1626 | 1627 | [[package]] 1628 | name = "swc_parallel" 1629 | version = "1.3.0" 1630 | source = "registry+https://github.com/rust-lang/crates.io-index" 1631 | checksum = "8f16052d5123ec45c1c49100781363f3f4e4a6be2da6d82f473b79db1e3abeb8" 1632 | dependencies = [ 1633 | "once_cell", 1634 | ] 1635 | 1636 | [[package]] 1637 | name = "swc_plugin" 1638 | version = "1.0.0" 1639 | source = "registry+https://github.com/rust-lang/crates.io-index" 1640 | checksum = "6b45099a38ed45528bef939d0eac1a0c1347749d0c67d3dd744d545316c5fd05" 1641 | dependencies = [ 1642 | "once_cell", 1643 | ] 1644 | 1645 | [[package]] 1646 | name = "swc_plugin_macro" 1647 | version = "1.0.0" 1648 | source = "registry+https://github.com/rust-lang/crates.io-index" 1649 | checksum = "0917ccfdcd3fa6cf41bdacef2388702a3b274f9ea708d930e1e8db37c7c3e1c6" 1650 | dependencies = [ 1651 | "proc-macro2", 1652 | "quote", 1653 | "syn 2.0.87", 1654 | ] 1655 | 1656 | [[package]] 1657 | name = "swc_plugin_proxy" 1658 | version = "5.0.0" 1659 | source = "registry+https://github.com/rust-lang/crates.io-index" 1660 | checksum = "5aad63126fed3ee4885416b2f206153a10b51ca13808cdc8ff68f244d1bd32ec" 1661 | dependencies = [ 1662 | "better_scoped_tls", 1663 | "bytecheck", 1664 | "rancor", 1665 | "rkyv", 1666 | "swc_common 5.0.0", 1667 | "swc_ecma_ast", 1668 | "swc_trace_macro", 1669 | "tracing", 1670 | ] 1671 | 1672 | [[package]] 1673 | name = "swc_trace_macro" 1674 | version = "2.0.0" 1675 | source = "registry+https://github.com/rust-lang/crates.io-index" 1676 | checksum = "4c78717a841565df57f811376a3d19c9156091c55175e12d378f3a522de70cef" 1677 | dependencies = [ 1678 | "proc-macro2", 1679 | "quote", 1680 | "syn 2.0.87", 1681 | ] 1682 | 1683 | [[package]] 1684 | name = "swc_visit" 1685 | version = "2.0.0" 1686 | source = "registry+https://github.com/rust-lang/crates.io-index" 1687 | checksum = "9138b6a36bbe76dd6753c4c0794f7e26480ea757bee499738bedbbb3ae3ec5f3" 1688 | dependencies = [ 1689 | "either", 1690 | "new_debug_unreachable", 1691 | ] 1692 | 1693 | [[package]] 1694 | name = "syn" 1695 | version = "1.0.109" 1696 | source = "registry+https://github.com/rust-lang/crates.io-index" 1697 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1698 | dependencies = [ 1699 | "proc-macro2", 1700 | "quote", 1701 | "unicode-ident", 1702 | ] 1703 | 1704 | [[package]] 1705 | name = "syn" 1706 | version = "2.0.87" 1707 | source = "registry+https://github.com/rust-lang/crates.io-index" 1708 | checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" 1709 | dependencies = [ 1710 | "proc-macro2", 1711 | "quote", 1712 | "unicode-ident", 1713 | ] 1714 | 1715 | [[package]] 1716 | name = "tap" 1717 | version = "1.0.1" 1718 | source = "registry+https://github.com/rust-lang/crates.io-index" 1719 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 1720 | 1721 | [[package]] 1722 | name = "tempfile" 1723 | version = "3.7.1" 1724 | source = "registry+https://github.com/rust-lang/crates.io-index" 1725 | checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" 1726 | dependencies = [ 1727 | "cfg-if", 1728 | "fastrand", 1729 | "redox_syscall", 1730 | "rustix", 1731 | "windows-sys", 1732 | ] 1733 | 1734 | [[package]] 1735 | name = "termcolor" 1736 | version = "1.2.0" 1737 | source = "registry+https://github.com/rust-lang/crates.io-index" 1738 | checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" 1739 | dependencies = [ 1740 | "winapi-util", 1741 | ] 1742 | 1743 | [[package]] 1744 | name = "testing" 1745 | version = "4.0.0" 1746 | source = "registry+https://github.com/rust-lang/crates.io-index" 1747 | checksum = "1c6b200c27382caadd583563c79cdf870d854e14c4c078731d447ecbfe27c35f" 1748 | dependencies = [ 1749 | "ansi_term", 1750 | "cargo_metadata", 1751 | "difference", 1752 | "once_cell", 1753 | "pretty_assertions", 1754 | "regex", 1755 | "serde", 1756 | "serde_json", 1757 | "swc_common 4.0.1", 1758 | "swc_error_reporters 5.0.0", 1759 | "testing_macros", 1760 | "tracing", 1761 | "tracing-subscriber", 1762 | ] 1763 | 1764 | [[package]] 1765 | name = "testing" 1766 | version = "5.0.0" 1767 | source = "registry+https://github.com/rust-lang/crates.io-index" 1768 | checksum = "fd6bafc289474aa56e277aa3f54f91cfdaac75656b6bea37af999bc91ba2b49f" 1769 | dependencies = [ 1770 | "ansi_term", 1771 | "cargo_metadata", 1772 | "difference", 1773 | "once_cell", 1774 | "pretty_assertions", 1775 | "regex", 1776 | "serde", 1777 | "serde_json", 1778 | "swc_common 5.0.0", 1779 | "swc_error_reporters 6.0.0", 1780 | "testing_macros", 1781 | "tracing", 1782 | "tracing-subscriber", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "testing_macros" 1787 | version = "1.0.0" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "a2d27bf245b90a80d5aa231133418ae7db98f032855ce5292e12071ab29c4b26" 1790 | dependencies = [ 1791 | "anyhow", 1792 | "glob", 1793 | "once_cell", 1794 | "proc-macro2", 1795 | "quote", 1796 | "regex", 1797 | "relative-path", 1798 | "syn 2.0.87", 1799 | ] 1800 | 1801 | [[package]] 1802 | name = "textwrap" 1803 | version = "0.16.1" 1804 | source = "registry+https://github.com/rust-lang/crates.io-index" 1805 | checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" 1806 | dependencies = [ 1807 | "smawk", 1808 | "unicode-linebreak", 1809 | "unicode-width", 1810 | ] 1811 | 1812 | [[package]] 1813 | name = "thiserror" 1814 | version = "1.0.63" 1815 | source = "registry+https://github.com/rust-lang/crates.io-index" 1816 | checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" 1817 | dependencies = [ 1818 | "thiserror-impl", 1819 | ] 1820 | 1821 | [[package]] 1822 | name = "thiserror-impl" 1823 | version = "1.0.63" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" 1826 | dependencies = [ 1827 | "proc-macro2", 1828 | "quote", 1829 | "syn 2.0.87", 1830 | ] 1831 | 1832 | [[package]] 1833 | name = "thread_local" 1834 | version = "1.1.7" 1835 | source = "registry+https://github.com/rust-lang/crates.io-index" 1836 | checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" 1837 | dependencies = [ 1838 | "cfg-if", 1839 | "once_cell", 1840 | ] 1841 | 1842 | [[package]] 1843 | name = "tinyvec" 1844 | version = "1.6.0" 1845 | source = "registry+https://github.com/rust-lang/crates.io-index" 1846 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 1847 | dependencies = [ 1848 | "tinyvec_macros", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "tinyvec_macros" 1853 | version = "0.1.1" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1856 | 1857 | [[package]] 1858 | name = "tracing" 1859 | version = "0.1.40" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" 1862 | dependencies = [ 1863 | "pin-project-lite", 1864 | "tracing-attributes", 1865 | "tracing-core", 1866 | ] 1867 | 1868 | [[package]] 1869 | name = "tracing-attributes" 1870 | version = "0.1.27" 1871 | source = "registry+https://github.com/rust-lang/crates.io-index" 1872 | checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" 1873 | dependencies = [ 1874 | "proc-macro2", 1875 | "quote", 1876 | "syn 2.0.87", 1877 | ] 1878 | 1879 | [[package]] 1880 | name = "tracing-core" 1881 | version = "0.1.32" 1882 | source = "registry+https://github.com/rust-lang/crates.io-index" 1883 | checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" 1884 | dependencies = [ 1885 | "once_cell", 1886 | "valuable", 1887 | ] 1888 | 1889 | [[package]] 1890 | name = "tracing-log" 1891 | version = "0.2.0" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1894 | dependencies = [ 1895 | "log", 1896 | "once_cell", 1897 | "tracing-core", 1898 | ] 1899 | 1900 | [[package]] 1901 | name = "tracing-subscriber" 1902 | version = "0.3.18" 1903 | source = "registry+https://github.com/rust-lang/crates.io-index" 1904 | checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" 1905 | dependencies = [ 1906 | "matchers", 1907 | "nu-ansi-term", 1908 | "once_cell", 1909 | "regex", 1910 | "sharded-slab", 1911 | "smallvec", 1912 | "thread_local", 1913 | "tracing", 1914 | "tracing-core", 1915 | "tracing-log", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "triomphe" 1920 | version = "0.1.13" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" 1923 | dependencies = [ 1924 | "serde", 1925 | "stable_deref_trait", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "typed-arena" 1930 | version = "2.0.2" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" 1933 | 1934 | [[package]] 1935 | name = "typenum" 1936 | version = "1.16.0" 1937 | source = "registry+https://github.com/rust-lang/crates.io-index" 1938 | checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" 1939 | 1940 | [[package]] 1941 | name = "unicode-bidi" 1942 | version = "0.3.13" 1943 | source = "registry+https://github.com/rust-lang/crates.io-index" 1944 | checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" 1945 | 1946 | [[package]] 1947 | name = "unicode-id" 1948 | version = "0.3.3" 1949 | source = "registry+https://github.com/rust-lang/crates.io-index" 1950 | checksum = "d70b6494226b36008c8366c288d77190b3fad2eb4c10533139c1c1f461127f1a" 1951 | 1952 | [[package]] 1953 | name = "unicode-id-start" 1954 | version = "1.2.0" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "bc3882f69607a2ac8cc4de3ee7993d8f68bb06f2974271195065b3bd07f2edea" 1957 | 1958 | [[package]] 1959 | name = "unicode-ident" 1960 | version = "1.0.11" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" 1963 | 1964 | [[package]] 1965 | name = "unicode-linebreak" 1966 | version = "0.1.4" 1967 | source = "registry+https://github.com/rust-lang/crates.io-index" 1968 | checksum = "c5faade31a542b8b35855fff6e8def199853b2da8da256da52f52f1316ee3137" 1969 | dependencies = [ 1970 | "hashbrown 0.12.3", 1971 | "regex", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "unicode-normalization" 1976 | version = "0.1.22" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" 1979 | dependencies = [ 1980 | "tinyvec", 1981 | ] 1982 | 1983 | [[package]] 1984 | name = "unicode-width" 1985 | version = "0.1.13" 1986 | source = "registry+https://github.com/rust-lang/crates.io-index" 1987 | checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" 1988 | 1989 | [[package]] 1990 | name = "url" 1991 | version = "2.4.0" 1992 | source = "registry+https://github.com/rust-lang/crates.io-index" 1993 | checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" 1994 | dependencies = [ 1995 | "form_urlencoded", 1996 | "idna", 1997 | "percent-encoding", 1998 | ] 1999 | 2000 | [[package]] 2001 | name = "uuid" 2002 | version = "1.4.1" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" 2005 | 2006 | [[package]] 2007 | name = "valuable" 2008 | version = "0.1.0" 2009 | source = "registry+https://github.com/rust-lang/crates.io-index" 2010 | checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" 2011 | 2012 | [[package]] 2013 | name = "vergen" 2014 | version = "9.0.1" 2015 | source = "registry+https://github.com/rust-lang/crates.io-index" 2016 | checksum = "349ed9e45296a581f455bc18039878f409992999bc1d5da12a6800eb18c8752f" 2017 | dependencies = [ 2018 | "anyhow", 2019 | "cargo_metadata", 2020 | "derive_builder", 2021 | "regex", 2022 | "rustversion", 2023 | "vergen-lib", 2024 | ] 2025 | 2026 | [[package]] 2027 | name = "vergen-lib" 2028 | version = "0.1.4" 2029 | source = "registry+https://github.com/rust-lang/crates.io-index" 2030 | checksum = "229eaddb0050920816cf051e619affaf18caa3dd512de8de5839ccbc8e53abb0" 2031 | dependencies = [ 2032 | "anyhow", 2033 | "derive_builder", 2034 | "rustversion", 2035 | ] 2036 | 2037 | [[package]] 2038 | name = "version_check" 2039 | version = "0.9.4" 2040 | source = "registry+https://github.com/rust-lang/crates.io-index" 2041 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 2042 | 2043 | [[package]] 2044 | name = "wasi" 2045 | version = "0.11.0+wasi-snapshot-preview1" 2046 | source = "registry+https://github.com/rust-lang/crates.io-index" 2047 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 2048 | 2049 | [[package]] 2050 | name = "winapi" 2051 | version = "0.3.9" 2052 | source = "registry+https://github.com/rust-lang/crates.io-index" 2053 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2054 | dependencies = [ 2055 | "winapi-i686-pc-windows-gnu", 2056 | "winapi-x86_64-pc-windows-gnu", 2057 | ] 2058 | 2059 | [[package]] 2060 | name = "winapi-i686-pc-windows-gnu" 2061 | version = "0.4.0" 2062 | source = "registry+https://github.com/rust-lang/crates.io-index" 2063 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2064 | 2065 | [[package]] 2066 | name = "winapi-util" 2067 | version = "0.1.5" 2068 | source = "registry+https://github.com/rust-lang/crates.io-index" 2069 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2070 | dependencies = [ 2071 | "winapi", 2072 | ] 2073 | 2074 | [[package]] 2075 | name = "winapi-x86_64-pc-windows-gnu" 2076 | version = "0.4.0" 2077 | source = "registry+https://github.com/rust-lang/crates.io-index" 2078 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2079 | 2080 | [[package]] 2081 | name = "windows-sys" 2082 | version = "0.48.0" 2083 | source = "registry+https://github.com/rust-lang/crates.io-index" 2084 | checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" 2085 | dependencies = [ 2086 | "windows-targets", 2087 | ] 2088 | 2089 | [[package]] 2090 | name = "windows-targets" 2091 | version = "0.48.1" 2092 | source = "registry+https://github.com/rust-lang/crates.io-index" 2093 | checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" 2094 | dependencies = [ 2095 | "windows_aarch64_gnullvm", 2096 | "windows_aarch64_msvc", 2097 | "windows_i686_gnu", 2098 | "windows_i686_msvc", 2099 | "windows_x86_64_gnu", 2100 | "windows_x86_64_gnullvm", 2101 | "windows_x86_64_msvc", 2102 | ] 2103 | 2104 | [[package]] 2105 | name = "windows_aarch64_gnullvm" 2106 | version = "0.48.0" 2107 | source = "registry+https://github.com/rust-lang/crates.io-index" 2108 | checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" 2109 | 2110 | [[package]] 2111 | name = "windows_aarch64_msvc" 2112 | version = "0.48.0" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" 2115 | 2116 | [[package]] 2117 | name = "windows_i686_gnu" 2118 | version = "0.48.0" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" 2121 | 2122 | [[package]] 2123 | name = "windows_i686_msvc" 2124 | version = "0.48.0" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" 2127 | 2128 | [[package]] 2129 | name = "windows_x86_64_gnu" 2130 | version = "0.48.0" 2131 | source = "registry+https://github.com/rust-lang/crates.io-index" 2132 | checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" 2133 | 2134 | [[package]] 2135 | name = "windows_x86_64_gnullvm" 2136 | version = "0.48.0" 2137 | source = "registry+https://github.com/rust-lang/crates.io-index" 2138 | checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" 2139 | 2140 | [[package]] 2141 | name = "windows_x86_64_msvc" 2142 | version = "0.48.0" 2143 | source = "registry+https://github.com/rust-lang/crates.io-index" 2144 | checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" 2145 | 2146 | [[package]] 2147 | name = "wyz" 2148 | version = "0.5.1" 2149 | source = "registry+https://github.com/rust-lang/crates.io-index" 2150 | checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" 2151 | dependencies = [ 2152 | "tap", 2153 | ] 2154 | 2155 | [[package]] 2156 | name = "yansi" 2157 | version = "0.5.1" 2158 | source = "registry+https://github.com/rust-lang/crates.io-index" 2159 | checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" 2160 | 2161 | [[package]] 2162 | name = "zerocopy" 2163 | version = "0.7.35" 2164 | source = "registry+https://github.com/rust-lang/crates.io-index" 2165 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 2166 | dependencies = [ 2167 | "zerocopy-derive", 2168 | ] 2169 | 2170 | [[package]] 2171 | name = "zerocopy-derive" 2172 | version = "0.7.35" 2173 | source = "registry+https://github.com/rust-lang/crates.io-index" 2174 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 2175 | dependencies = [ 2176 | "proc-macro2", 2177 | "quote", 2178 | "syn 2.0.87", 2179 | ] 2180 | --------------------------------------------------------------------------------