Skip to content

Commit 1210fb9

Browse files
authored
fix: revert #684 and #674 to fix @swc/helpers bundle error (#687)
1 parent aa36362 commit 1210fb9

File tree

8 files changed

+93
-45
lines changed

8 files changed

+93
-45
lines changed

.changeset/angry-llamas-punch.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

.changeset/calm-bikes-punch.md

Lines changed: 0 additions & 5 deletions
This file was deleted.

.changeset/pre.json

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,5 @@
2121
"@ice/remark-react-docgen-docusaurus": "1.0.1",
2222
"icepkg-site": "0.0.0"
2323
},
24-
"changesets": [
25-
"angry-llamas-punch",
26-
"cold-camels-rest",
27-
"dry-pots-buy",
28-
"long-experts-design",
29-
"quick-wasps-shake",
30-
"violet-pots-brush"
31-
]
24+
"changesets": ["cold-camels-rest", "dry-pots-buy", "long-experts-design", "quick-wasps-shake", "violet-pots-brush"]
3225
}

packages/pkg/src/engine/rollup/options.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,16 @@ export function getRollupOptions(context: Context, taskRunnerContext: TaskRunner
4848
);
4949
}
5050

51-
const swcPluginInstance = swcPlugin(
52-
taskConfig.jsxRuntime,
53-
rootDir,
54-
taskConfig.swcCompileOptions,
55-
taskConfig.type === 'bundle' && taskConfig.compileDependencies,
51+
plugins.push(
52+
swcPlugin(
53+
taskConfig.jsxRuntime,
54+
rootDir,
55+
taskConfig.swcCompileOptions,
56+
taskConfig.type === 'bundle' && taskConfig.compileDependencies,
57+
),
5658
);
5759

5860
if (taskConfig.type === 'transform') {
59-
plugins.push(swcPluginInstance);
6061
plugins.push(transformAliasPlugin(rootDir, taskConfig.alias));
6162
} else if (taskConfig.type === 'bundle') {
6263
const [external, globals] = getExternalsAndGlobals(taskConfig, pkg as PkgJson);
@@ -130,7 +131,6 @@ export function getRollupOptions(context: Context, taskRunnerContext: TaskRunner
130131
),
131132
image(),
132133
json(),
133-
swcPluginInstance,
134134
bundleAliasPlugin({
135135
entries: alias,
136136
}),

packages/pkg/src/rollupPlugins/swc.ts

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
formatCnpmDepFilepath,
88
getIncludeNodeModuleScripts,
99
} from '../utils.js';
10+
import { init, parse } from 'es-module-lexer';
11+
import MagicString from 'magic-string';
1012
import type { Options as SwcCompileOptions, Config, TsParserConfig, EsParserConfig } from '@swc/core';
1113
import type { TaskConfig, OutputFile, BundleTaskConfig } from '../types.js';
1214
import type { Plugin } from 'rollup';
@@ -69,6 +71,59 @@ const normalizeSwcConfig = (
6971
});
7072
};
7173

74+
// Transform @swc/helpers to cjs path if in commonjs module.
75+
async function transformImport(source: string, sourceFilename: string) {
76+
await init;
77+
const [imports, exports] = await parse(source);
78+
let s: MagicString | undefined;
79+
const str = () => {
80+
if (!s) {
81+
s = new MagicString(source);
82+
}
83+
return s;
84+
};
85+
const isESM =
86+
exports.length > 0 ||
87+
imports.some((targetImport) => {
88+
const importString = targetImport.n;
89+
// `targetImport.n` get undefined when code has `import.meta.*`.
90+
return importString && !importString.includes('core-js') && !importString.includes('@swc/helpers');
91+
});
92+
93+
imports.forEach((targetImport) => {
94+
if (!targetImport.n) {
95+
// If visiting `import.meta.*`, `targetImport.n` will be undefined, that should be ignored.
96+
return;
97+
}
98+
if (targetImport.n.startsWith('@swc/helpers')) {
99+
if (!isESM) {
100+
// Replace @swc/helpers with cjs path.
101+
const importStr = source.substring(targetImport.ss, targetImport.se);
102+
// Import rule: import { _ as _type_of } from "@swc/helpers/_/_type_of";
103+
const matchImport = importStr.match(/import\s+{\s+([\w*\s{},]*)\s+}\s+from\s+['"](.*)['"]/);
104+
if (matchImport) {
105+
const [, identifier] = matchImport;
106+
const replaceModule = `var ${identifier.split(' as ')[1].trim()} = require('${targetImport.n}')._`;
107+
str().overwrite(targetImport.ss, targetImport.se, replaceModule);
108+
}
109+
}
110+
}
111+
});
112+
113+
return s
114+
? {
115+
code: s.toString(),
116+
map: s.generateMap({
117+
source: sourceFilename,
118+
file: `${sourceFilename}.map`,
119+
includeContent: true,
120+
}),
121+
}
122+
: {
123+
code: source,
124+
};
125+
}
126+
72127
/**
73128
* plugin-swc works as substitute of plugin-typescript, babel, babel-preset-env and plugin-minify.
74129
*/
@@ -108,9 +163,11 @@ const swcPlugin = (
108163
}),
109164
);
110165

166+
const transformedCode = await transformImport(code, sourceFileName);
167+
111168
return {
112-
code,
113-
map,
169+
code: transformedCode.code,
170+
map: transformedCode.map ?? map,
114171
meta: {
115172
filename: destFilename,
116173
},

tests/integration/mix-cjs-mjs/__snapshots__/index.test.ts.snap

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ exports[`Run config swc-helpers > dist structure 1`] = `
2626
{
2727
"name": "entry-mts.esm.es5.production.js",
2828
},
29+
{
30+
"name": "entry-mts.umd.es5.production.js",
31+
},
2932
],
3033
"name": "dist",
3134
}
@@ -66,9 +69,9 @@ module.exports.extend = function(a, b) {
6669
`;
6770

6871
exports[`Run config swc-helpers > file content cjs/entry-mts.d.ts 1`] = `
69-
"import { join, extend } from './cjs';
70-
export { join, extend };
71-
export declare const foo: any;
72+
"import { add, extend } from './cjs';
73+
export { add, extend };
74+
export declare const foo: Record<string, any>;
7275
"
7376
`;
7477

@@ -84,14 +87,14 @@ function _export(target, all) {
8487
});
8588
}
8689
_export(exports, {
90+
add: function() {
91+
return _cjs.add;
92+
},
8793
extend: function() {
8894
return _cjs.extend;
8995
},
9096
foo: function() {
9197
return foo;
92-
},
93-
join: function() {
94-
return _cjs.join;
9598
}
9699
});
97100
var _object_spread = require(\\"@swc/helpers/_/_object_spread\\");
@@ -105,17 +108,22 @@ var foo = _object_spread._({}, (0, _cjs.extend)({
105108
`;
106109

107110
exports[`Run config swc-helpers > file content dist/entry-mts.cjs.es5.production.js 1`] = `
108-
"\\"use strict\\";var e,t=require(\\"@swc/helpers/_/_object_spread\\"),r={},n=(e||(e=1,r.add=function(e,t){return e+t},r.extend=function(e,r){return t._({},e,r)}),r),o=t._({},n.extend({a:1},{b:2}));exports.extend=n.extend,exports.foo=o,exports.join=n.join;
111+
"\\"use strict\\";var e,r=require(\\"@swc/helpers/_/_object_spread\\"),t={},n=function(){if(e)return t;e=1;var n=r._;return t.add=function(e,r){return e+r},t.extend=function(e,r){return n({},e,r)},t}(),d=r._({},n.extend({a:1},{b:2}));exports.add=n.add,exports.extend=n.extend,exports.foo=d;
109112
"
110113
`;
111114

112115
exports[`Run config swc-helpers > file content dist/entry-mts.esm.es5.production.js 1`] = `
113-
"import{_ as e}from\\"@swc/helpers/_/_object_spread\\";var n,t={},o=(n||(n=1,t.add=function(e,n){return e+n},t.extend=function(n,t){return e({},n,t)}),t),r=e({},o.extend({a:1},{b:2})),d=o.extend,i=o.join;export{d as extend,r as foo,i as join};
116+
"import e,{_ as r}from\\"@swc/helpers/_/_object_spread\\";var n,t={},d=function(){if(n)return t;n=1;var r=e._;return t.add=function(e,r){return e+r},t.extend=function(e,n){return r({},e,n)},t}(),o=r({},d.extend({a:1},{b:2})),a=d.add,u=d.extend;export{a as add,u as extend,o as foo};
117+
"
118+
`;
119+
120+
exports[`Run config swc-helpers > file content dist/entry-mts.umd.es5.production.js 1`] = `
121+
"var e,t;e=this,t=function(e,t){\\"use strict\\";var n,r={},d=function(){if(n)return r;n=1;var e=t._;return r.add=function(e,t){return e+t},r.extend=function(t,n){return e({},t,n)},r}(),o=t._({},d.extend({a:1},{b:2}));e.add=d.add,e.extend=d.extend,e.foo=o},\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?t(exports,require(\\"@swc/helpers/_/_object_spread\\")):\\"function\\"==typeof define&&define.amd?define([\\"exports\\",\\"@swc/helpers/_/_object_spread\\"],t):t((e=\\"undefined\\"!=typeof globalThis?globalThis:e||self)[\\"@ice/pkg-tests-mix-cjs-mjs\\"]={},e.require$$0);
114122
"
115123
`;
116124

117125
exports[`Run config swc-helpers > file content esm/cjs.js 1`] = `
118-
"import { _ as _object_spread } from \\"@swc/helpers/_/_object_spread\\";
126+
"var _object_spread = require('@swc/helpers/_/_object_spread')._;
119127
module.exports.add = function(a, b) {
120128
return a + b;
121129
};
@@ -126,16 +134,16 @@ module.exports.extend = function(a, b) {
126134
`;
127135

128136
exports[`Run config swc-helpers > file content esm/entry-mts.d.ts 1`] = `
129-
"import { join, extend } from './cjs';
130-
export { join, extend };
131-
export declare const foo: any;
137+
"import { add, extend } from './cjs';
138+
export { add, extend };
139+
export declare const foo: Record<string, any>;
132140
"
133141
`;
134142

135143
exports[`Run config swc-helpers > file content esm/entry-mts.js 1`] = `
136144
"import { _ as _object_spread } from \\"@swc/helpers/_/_object_spread\\";
137-
import { join, extend } from './cjs';
138-
export { join, extend };
145+
import { add, extend } from './cjs';
146+
export { add, extend };
139147
export var foo = _object_spread({}, extend({
140148
a: 1
141149
}, {

tests/integration/mix-cjs-mjs/build.config.swc-helpers.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export default defineConfig({
66
formats: ['cjs', 'esm']
77
},
88
bundle: {
9-
formats: ['cjs', 'esm'],
9+
formats: ['cjs', 'esm', 'umd'],
1010
externals: [/@swc\/helpers/]
1111
},
1212
})
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { join, extend } from './cjs';
1+
import { add, extend } from './cjs';
22

3-
export { join, extend };
3+
export { add, extend };
44

5-
export const foo = {
5+
export const foo: Record<string, any> = {
66
...extend({ a: 1 }, { b: 2 }),
77
};

0 commit comments

Comments
 (0)