From 0e8e508281a630e75ae90b0cba9842416581663d Mon Sep 17 00:00:00 2001 From: DongYun Kang Date: Tue, 30 Jun 2026 18:16:39 +0900 Subject: [PATCH] Add import-meta-env contrib plugin --- Cargo.lock | 7 ++ contrib/import-meta-env/.gitignore | 2 + contrib/import-meta-env/.npmignore | 6 ++ contrib/import-meta-env/CHANGELOG.md | 7 ++ contrib/import-meta-env/Cargo.toml | 24 +++++ contrib/import-meta-env/README.md | 35 +++++++ contrib/import-meta-env/package.json | 38 ++++++++ contrib/import-meta-env/src/lib.rs | 95 +++++++++++++++++++ .../src/lib.rs/no_transform_import_meta.js | 1 + .../lib.rs/no_transform_import_meta_glob.js | 1 + .../src/lib.rs/transform_import_meta_env.js | 1 + .../lib.rs/transform_import_meta_env_key.js | 1 + .../lib.rs/transform_import_meta_env_prop.js | 1 + pnpm-lock.yaml | 6 ++ 14 files changed, 225 insertions(+) create mode 100644 contrib/import-meta-env/.gitignore create mode 100644 contrib/import-meta-env/.npmignore create mode 100644 contrib/import-meta-env/CHANGELOG.md create mode 100644 contrib/import-meta-env/Cargo.toml create mode 100644 contrib/import-meta-env/README.md create mode 100644 contrib/import-meta-env/package.json create mode 100644 contrib/import-meta-env/src/lib.rs create mode 100644 contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta.js create mode 100644 contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta_glob.js create mode 100644 contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env.js create mode 100644 contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_key.js create mode 100644 contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_prop.js diff --git a/Cargo.lock b/Cargo.lock index ad3b8c532..58cd2a25c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3505,6 +3505,13 @@ dependencies = [ "swc_core", ] +[[package]] +name = "swc_plugin_import_meta_env" +version = "1.15.41" +dependencies = [ + "swc_core", +] + [[package]] name = "swc_plugin_jest" version = "0.31.4" diff --git a/contrib/import-meta-env/.gitignore b/contrib/import-meta-env/.gitignore new file mode 100644 index 000000000..89ff0565d --- /dev/null +++ b/contrib/import-meta-env/.gitignore @@ -0,0 +1,2 @@ +*.wasm +target/ diff --git a/contrib/import-meta-env/.npmignore b/contrib/import-meta-env/.npmignore new file mode 100644 index 000000000..2634d4f94 --- /dev/null +++ b/contrib/import-meta-env/.npmignore @@ -0,0 +1,6 @@ +__tests__/ +tests/ +src/ +Cargo.toml +Cargo.lock +*.rs diff --git a/contrib/import-meta-env/CHANGELOG.md b/contrib/import-meta-env/CHANGELOG.md new file mode 100644 index 000000000..34299ea0d --- /dev/null +++ b/contrib/import-meta-env/CHANGELOG.md @@ -0,0 +1,7 @@ +# @swc-contrib/plugin-import-meta-env + +## 1.15.41 + +### Minor Changes + +- Add `@swc-contrib/plugin-import-meta-env`, based on `swc-plugin-import-meta-env`. diff --git a/contrib/import-meta-env/Cargo.toml b/contrib/import-meta-env/Cargo.toml new file mode 100644 index 000000000..12229d265 --- /dev/null +++ b/contrib/import-meta-env/Cargo.toml @@ -0,0 +1,24 @@ +[package] +authors = ["Alex Miller "] +description = "SWC plugin for handling the transformation of import.meta.env" +edition = "2021" +license = "Apache-2.0" +name = "swc_plugin_import_meta_env" +publish = false +readme = "README.md" +rust-version = "1.70" +version = "1.15.41" + +[lib] +crate-type = ["cdylib"] + +[dependencies] +swc_core = { workspace = true, features = [ + "common", + "ecma_ast", + "ecma_parser", + "ecma_plugin_transform", + "ecma_visit", + "testing", + "testing_transform", +] } diff --git a/contrib/import-meta-env/README.md b/contrib/import-meta-env/README.md new file mode 100644 index 000000000..64f67ef87 --- /dev/null +++ b/contrib/import-meta-env/README.md @@ -0,0 +1,35 @@ +# `@swc-contrib/plugin-import-meta-env` + +Simple SWC plugin to transform `import.meta.env` to `process.env`. + +This package is based on [`swc-plugin-import-meta-env`](https://github.com/Codex-/swc-plugin-import-meta-env) and is maintained under the SWC contrib plugin workspace. + +## Installation + +```bash +npm i -D @swc-contrib/plugin-import-meta-env +``` + +## Usage + +Add the plugin to the `jsc.experimental.plugins` field of your `.swcrc`. + +```json +{ + "jsc": { + "experimental": { + "plugins": [["@swc-contrib/plugin-import-meta-env", {}]] + } + } +} +``` + +The plugin only rewrites the `import.meta.env` expression shape. It does not load or expand environment files, so populate `process.env` through your test setup, runtime, or another tool such as `dotenv`. + +# @swc-contrib/plugin-import-meta-env + +## 1.15.41 + +### Minor Changes + +- Add `@swc-contrib/plugin-import-meta-env`, based on `swc-plugin-import-meta-env`. diff --git a/contrib/import-meta-env/package.json b/contrib/import-meta-env/package.json new file mode 100644 index 000000000..44f62277b --- /dev/null +++ b/contrib/import-meta-env/package.json @@ -0,0 +1,38 @@ +{ + "name": "@swc-contrib/plugin-import-meta-env", + "version": "1.15.41", + "publishConfig": { + "access": "public", + "provenance": true + }, + "description": "SWC plugin for handling the transformation of import.meta.env", + "author": "Alex Miller ", + "license": "Apache-2.0", + "keywords": [ + "swc-plugin", + "import.meta.env" + ], + "main": "swc_plugin_import_meta_env.wasm", + "scripts": { + "prepack": "pnpm run build", + "build": "RUSTFLAGS='--cfg swc_ast_unknown' cargo build --release -p swc_plugin_import_meta_env --target wasm32-wasip1 && cp ../../target/wasm32-wasip1/release/swc_plugin_import_meta_env.wasm .", + "build:debug": "RUSTFLAGS='--cfg swc_ast_unknown' cargo build -p swc_plugin_import_meta_env --target wasm32-wasip1 && cp ../../target/wasm32-wasip1/debug/swc_plugin_import_meta_env.wasm .", + "test": "cargo test -p swc_plugin_import_meta_env --color always" + }, + "homepage": "https://github.com/swc-project/plugins/tree/main/contrib/import-meta-env", + "repository": { + "type": "git", + "url": "git+https://github.com/swc-project/plugins.git", + "directory": "contrib/import-meta-env" + }, + "bugs": { + "url": "https://github.com/swc-project/plugins/issues" + }, + "files": [ + "swc_plugin_import_meta_env.wasm" + ], + "preferUnplugged": true, + "peerDependencies": { + "@swc/core": ">=1.15.4" + } +} diff --git a/contrib/import-meta-env/src/lib.rs b/contrib/import-meta-env/src/lib.rs new file mode 100644 index 000000000..ef4737301 --- /dev/null +++ b/contrib/import-meta-env/src/lib.rs @@ -0,0 +1,95 @@ +#![allow(clippy::not_unsafe_ptr_arg_deref)] + +use swc_core::{ + common::DUMMY_SP, + ecma::{ + ast::{Expr, Ident, MemberExpr, MetaPropKind, Program}, + visit::{noop_visit_mut_type, visit_mut_pass, VisitMut, VisitMutWith}, + }, + plugin::{plugin_transform, proxies::TransformPluginProgramMetadata}, +}; + +pub struct TransformVisitor; + +impl VisitMut for TransformVisitor { + noop_visit_mut_type!(); + + fn visit_mut_expr(&mut self, n: &mut Expr) { + n.visit_mut_children_with(self); + + if let Expr::Member(member) = n { + if is_import_meta_env(member) { + member.obj = Box::new(Ident::new_no_ctxt("process".into(), DUMMY_SP).into()); + } + } + } +} + +fn is_import_meta_env(n: &MemberExpr) -> bool { + let Some(obj) = n.obj.as_meta_prop() else { + return false; + }; + let Some(prop) = n.prop.as_ident() else { + return false; + }; + + obj.kind == MetaPropKind::ImportMeta && prop.sym == "env" +} + +#[plugin_transform] +pub fn process_transform(program: Program, _metadata: TransformPluginProgramMetadata) -> Program { + program.apply(&mut visit_mut_pass(TransformVisitor)) +} + +#[cfg(test)] +mod tests { + use swc_core::ecma::{ + parser::{EsSyntax, Syntax}, + transforms::testing::test, + visit::visit_mut_pass, + }; + + use super::*; + + fn syntax() -> Syntax { + Syntax::Es(EsSyntax { + import_attributes: true, + ..Default::default() + }) + } + + test!( + syntax(), + |_| visit_mut_pass(TransformVisitor), + transform_import_meta_env, + r#"import.meta.env"# + ); + + test!( + syntax(), + |_| visit_mut_pass(TransformVisitor), + transform_import_meta_env_prop, + r#"import.meta.env.MODE"# + ); + + test!( + syntax(), + |_| visit_mut_pass(TransformVisitor), + transform_import_meta_env_key, + r#"import.meta.env["PROP"]"# + ); + + test!( + syntax(), + |_| visit_mut_pass(TransformVisitor), + no_transform_import_meta, + r#"import.meta"# + ); + + test!( + syntax(), + |_| visit_mut_pass(TransformVisitor), + no_transform_import_meta_glob, + r#"import.meta.glob"# + ); +} diff --git a/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta.js b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta.js new file mode 100644 index 000000000..e06e1e4da --- /dev/null +++ b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta.js @@ -0,0 +1 @@ +import.meta; diff --git a/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta_glob.js b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta_glob.js new file mode 100644 index 000000000..c5378f44c --- /dev/null +++ b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/no_transform_import_meta_glob.js @@ -0,0 +1 @@ +import.meta.glob; diff --git a/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env.js b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env.js new file mode 100644 index 000000000..21a367b5a --- /dev/null +++ b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env.js @@ -0,0 +1 @@ +process.env; diff --git a/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_key.js b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_key.js new file mode 100644 index 000000000..6ecda643c --- /dev/null +++ b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_key.js @@ -0,0 +1 @@ +process.env["PROP"]; diff --git a/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_prop.js b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_prop.js new file mode 100644 index 000000000..f859888b1 --- /dev/null +++ b/contrib/import-meta-env/tests/__swc_snapshots__/src/lib.rs/transform_import_meta_env_prop.js @@ -0,0 +1 @@ +process.env.MODE; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d7741d68..58c3a5ecb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,12 @@ importers: contrib/graphql-codegen-client-preset: {} + contrib/import-meta-env: + dependencies: + '@swc/core': + specifier: '>=1.15.4' + version: 1.15.43 + contrib/mut-cjs-exports: dependencies: '@swc/core':