Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(es/transforms): Add module.outFileExtension #9784

Merged
47 changes: 33 additions & 14 deletions crates/swc/src/config/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1400,22 +1400,39 @@ impl ModuleConfig {

let base_url = base_url.to_path_buf();
let resolver = match config {
None => build_resolver(base_url, paths, false),
None => build_resolver(base_url, paths, false, &"js".to_string()),
Some(ModuleConfig::Es6(config)) | Some(ModuleConfig::NodeNext(config)) => {
build_resolver(base_url, paths, config.resolve_fully)
}
Some(ModuleConfig::CommonJs(config)) => {
build_resolver(base_url, paths, config.resolve_fully)
}
Some(ModuleConfig::Umd(config)) => {
build_resolver(base_url, paths, config.config.resolve_fully)
}
Some(ModuleConfig::Amd(config)) => {
build_resolver(base_url, paths, config.config.resolve_fully)
}
Some(ModuleConfig::SystemJs(config)) => {
build_resolver(base_url, paths, config.resolve_fully)
build_resolver(
base_url,
paths,
config.resolve_fully,
&config.config.out_file_extension,
)
}
Some(ModuleConfig::CommonJs(config)) => build_resolver(
base_url,
paths,
config.resolve_fully,
&config.out_file_extension,
),
Some(ModuleConfig::Umd(config)) => build_resolver(
base_url,
paths,
config.config.resolve_fully,
&config.config.out_file_extension,
),
Some(ModuleConfig::Amd(config)) => build_resolver(
base_url,
paths,
config.config.resolve_fully,
&config.config.out_file_extension,
),
Some(ModuleConfig::SystemJs(config)) => build_resolver(
base_url,
paths,
config.resolve_fully,
&config.config.out_file_extension,
),
};

Some((base, resolver))
Expand Down Expand Up @@ -1733,6 +1750,7 @@ fn build_resolver(
mut base_url: PathBuf,
paths: CompiledPaths,
resolve_fully: bool,
file_extension: &String,
Copy link
Member

@kdy1 kdy1 Dec 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think clippy will be angry at this

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
file_extension: &String,
file_extension: &str,

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah thanks. I have updated it!

) -> SwcImportResolver {
static CACHE: Lazy<DashMap<(PathBuf, CompiledPaths, bool), SwcImportResolver, ARandomState>> =
Lazy::new(Default::default);
Expand Down Expand Up @@ -1772,6 +1790,7 @@ fn build_resolver(
swc_ecma_transforms::modules::path::Config {
base_dir: Some(base_url.clone()),
resolve_fully,
file_extension: file_extension.to_owned(),
},
);
Arc::new(r)
Expand Down
21 changes: 21 additions & 0 deletions crates/swc/tests/fixture/issues-3xxx/3067/amd/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"dynamicImport": true,
},
"target": "es2020",
"baseUrl": ".",
"paths": {
"@print/c": ["./packages/c/src/index.js"],
},
"externalHelpers": true,
},
"module": {
"type": "amd",
"resolveFully": true,
// This should say "resolve this fully to .mjs".
// Normally should be paired with --out-file-extension in the cli
"outFileExtension": "mjs",
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Simulate accessing a .js file in a third party package that shouldn't be edited
import something from 'lodash/dist/something.js'
export function displayC(): string {
something()
return 'Display C'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

import { displayB } from './inner/b'
import { displayC } from '@print/c'
import { merge } from 'lodash'

async function display() {
const displayA = await import('./inner/a').then(c => c.displayA)
console.log(displayA())
console.log(displayB())
console.log(displayC())
const foo = merge({}, { a: 22 })
}

display()
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function displayA() {
return 'Display A'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function displayB() {
return 'Display B'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Simulate accessing a .js file in a third party package that shouldn't be edited
define([
"require",
"exports",
"@swc/helpers/_/_interop_require_default",
"lodash/dist/something.js"
], function(require, exports, _interop_require_default, _something) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "displayC", {
enumerable: true,
get: function() {
return displayC;
}
});
_something = /*#__PURE__*/ _interop_require_default._(_something);
function displayC() {
(0, _something.default)();
return 'Display C';
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
define([
"require",
"exports",
"@swc/helpers/_/_interop_require_wildcard",
"./inner/b/index.mjs",
"../packages/c/src/index.mjs",
"lodash"
], function(require, exports, _interop_require_wildcard, _b, _c, _lodash) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
async function display() {
const displayA = await new Promise((resolve, reject)=>require([
"./inner/a/index.mjs"
], (m)=>resolve(/*#__PURE__*/ _interop_require_wildcard._(m)), reject)).then((c)=>c.displayA);
console.log(displayA());
console.log((0, _b.displayB)());
console.log((0, _c.displayC)());
const foo = (0, _lodash.merge)({}, {
a: 22
});
}
display();
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
define([
"require",
"exports"
], function(require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "displayA", {
enumerable: true,
get: function() {
return displayA;
}
});
function displayA() {
return 'Display A';
}
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
define([
"require",
"exports"
], function(require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "displayB", {
enumerable: true,
get: function() {
return displayB;
}
});
function displayB() {
return 'Display B';
}
});
21 changes: 21 additions & 0 deletions crates/swc/tests/fixture/issues-3xxx/3067/commonjs/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"dynamicImport": true,
},
"target": "es2020",
"baseUrl": ".",
"paths": {
"@print/c": ["./packages/c/src/index.js"],
},
"externalHelpers": true,
},
"module": {
"type": "commonjs",
"resolveFully": true,
// This should say "resolve this fully to .mjs".
// Normally should be paired with --out-file-extension in the cli
"outFileExtension": "mjs",
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Simulate accessing a .js file in a third party package that shouldn't be edited
import something from 'lodash/dist/something.js'
export function displayC(): string {
something()
return 'Display C'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

import { displayB } from './inner/b'
import { displayC } from '@print/c'
import { merge } from 'lodash'

async function display() {
const displayA = await import('./inner/a').then(c => c.displayA)
console.log(displayA())
console.log(displayB())
console.log(displayC())
const foo = merge({}, { a: 22 })
}

display()
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function displayA() {
return 'Display A'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function displayB() {
return 'Display B'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Simulate accessing a .js file in a third party package that shouldn't be edited
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "displayC", {
enumerable: true,
get: function() {
return displayC;
}
});
const _interop_require_default = require("@swc/helpers/_/_interop_require_default");
const _something = /*#__PURE__*/ _interop_require_default._(require("lodash/dist/something.js"));
function displayC() {
(0, _something.default)();
return 'Display C';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _b = require("./inner/b/index.mjs");
const _c = require("../packages/c/src/index.mjs");
const _lodash = require("lodash");
async function display() {
const displayA = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard._(require("./inner/a/index.mjs"))).then((c)=>c.displayA);
console.log(displayA());
console.log((0, _b.displayB)());
console.log((0, _c.displayC)());
const foo = (0, _lodash.merge)({}, {
a: 22
});
}
display();
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "displayA", {
enumerable: true,
get: function() {
return displayA;
}
});
function displayA() {
return 'Display A';
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "displayB", {
enumerable: true,
get: function() {
return displayB;
}
});
function displayB() {
return 'Display B';
}
21 changes: 21 additions & 0 deletions crates/swc/tests/fixture/issues-3xxx/3067/es6/input/.swcrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"jsc": {
"parser": {
"syntax": "typescript",
"dynamicImport": true,
},
"target": "es2020",
"baseUrl": ".",
"paths": {
"@print/c": ["./packages/c/src/index.js"],
},
"externalHelpers": true,
},
"module": {
"type": "es6",
"resolveFully": true,
// This should say "resolve this fully to .mjs".
// Normally should be paired with --out-file-extension in the cli
"outFileExtension": "mjs",
},
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Simulate accessing a .js file in a third party package that shouldn't be edited
import something from 'lodash/dist/something.js'
export function displayC(): string {
something()
return 'Display C'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

import { displayB } from './inner/b'
import { displayC } from '@print/c'
import { merge } from 'lodash'

async function display() {
const displayA = await import('./inner/a').then(c => c.displayA)
console.log(displayA())
console.log(displayB())
console.log(displayC())
const foo = merge({}, { a: 22 })
}

display()
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function displayA() {
return 'Display A'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function displayB() {
return 'Display B'
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Simulate accessing a .js file in a third party package that shouldn't be edited
import something from "lodash/dist/something.js";
export function displayC() {
something();
return 'Display C';
}
Loading
Loading