Skip to content

Commit 758d8ec

Browse files
fix(es/module): Support optional chaining in import.meta (#10985)
**Description:** `import.meta?.url` is not currently supported so it will not get transpiled. my thought is that it should get transpiled, so we are treating it the same as if the optional chain did not exist. Example of this in `@cesium/engine` here: https://github.com/CesiumGS/cesium/blob/52f55d0e7063115b47b12fee20bfc1c291edcddb/packages/engine/Source/Core/buildModuleUrl.js#L44 **Related issue:** Closes #10988 --------- Co-authored-by: magic-akari <akari.ccino@gmail.com>
1 parent 4911ec7 commit 758d8ec

File tree

7 files changed

+43
-0
lines changed

7 files changed

+43
-0
lines changed

.changeset/ninety-cobras-stare.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
swc_ecma_transforms_module: patch
3+
---
4+
5+
fix(es/module): Support optional chaining in `import.meta`

crates/swc_ecma_transforms_module/src/amd.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,21 @@ where
364364
_ => {}
365365
}
366366
}
367+
Expr::OptChain(OptChainExpr { base, .. }) if !self.config.preserve_import_meta => {
368+
if let OptChainBase::Member(member) = &mut **base {
369+
if member
370+
.obj
371+
.as_meta_prop()
372+
.is_some_and(|meta_prop| meta_prop.kind == MetaPropKind::ImportMeta)
373+
{
374+
*n = member.take().into();
375+
n.visit_mut_with(self);
376+
return;
377+
}
378+
};
379+
380+
n.visit_mut_children_with(self);
381+
}
367382
_ => n.visit_mut_children_with(self),
368383
}
369384
}

crates/swc_ecma_transforms_module/src/common_js.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,21 @@ impl VisitMut for Cjs {
271271
_ => {}
272272
}
273273
}
274+
Expr::OptChain(OptChainExpr { base, .. }) if !self.config.preserve_import_meta => {
275+
if let OptChainBase::Member(member) = &mut **base {
276+
if member
277+
.obj
278+
.as_meta_prop()
279+
.is_some_and(|meta_prop| meta_prop.kind == MetaPropKind::ImportMeta)
280+
{
281+
*n = member.take().into();
282+
n.visit_mut_with(self);
283+
return;
284+
}
285+
};
286+
287+
n.visit_mut_children_with(self);
288+
}
274289
_ => n.visit_mut_children_with(self),
275290
}
276291
}

crates/swc_ecma_transforms_module/tests/fixture/common/import-meta/input.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
const react = import.meta.resolve("react");
22
const url = import.meta.url;
3+
const urlMaybe = import.meta?.url;
34
const filename = import.meta.filename;
45
const dirname = import.meta.dirname;
56
const main = import.meta.main;
67

8+
foo?.bar(import.meta.url);
79
console.log(react);
810
console.log(url);
911
console.log(filename);

crates/swc_ecma_transforms_module/tests/fixture/common/import-meta/output.amd.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ define([
55
"use strict";
66
const react = require.toUrl("react");
77
const url = new URL(module.uri, document.baseURI).href;
8+
const urlMaybe = new URL(module.uri, document.baseURI).href;
89
const filename = module.uri.split("/").pop();
910
const dirname = require.toUrl(".");
1011
const main = module.id == "main";
12+
foo?.bar(new URL(module.uri, document.baseURI).href);
1113
console.log(react);
1214
console.log(url);
1315
console.log(filename);

crates/swc_ecma_transforms_module/tests/fixture/common/import-meta/output.cjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
"use strict";
22
const react = require.resolve("react");
33
const url = require("url").pathToFileURL(__filename).toString();
4+
const urlMaybe = require("url").pathToFileURL(__filename).toString();
45
const filename = __filename;
56
const dirname = __dirname;
67
const main = require.main == module;
8+
foo?.bar(require("url").pathToFileURL(__filename).toString());
79
console.log(react);
810
console.log(url);
911
console.log(filename);

crates/swc_ecma_transforms_module/tests/fixture/common/import-meta/output.umd.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
"use strict";
77
const react = import.meta.resolve("react");
88
const url = import.meta.url;
9+
const urlMaybe = import.meta?.url;
910
const filename = import.meta.filename;
1011
const dirname = import.meta.dirname;
1112
const main = import.meta.main;
13+
foo?.bar(import.meta.url);
1214
console.log(react);
1315
console.log(url);
1416
console.log(filename);

0 commit comments

Comments
 (0)