Skip to content

Commit e9115d4

Browse files
committed
Use swc for JSX & TypeScript
1 parent c97fc66 commit e9115d4

File tree

7 files changed

+68
-52
lines changed

7 files changed

+68
-52
lines changed

lib/bundle/babel.js

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
let { loadExtension } = require("faucet-pipeline-core/lib/util");
44

5-
module.exports = function generateTranspiler({ esnext, jsx, exclude }, { browsers }) {
5+
module.exports = function generateTranspiler({ esnext, exclude }, { browsers }) {
66
let settings = {
77
babelHelpers: "bundled"
88
};
@@ -30,12 +30,6 @@ module.exports = function generateTranspiler({ esnext, jsx, exclude }, { browser
3030
];
3131
}
3232

33-
if(jsx) {
34-
let { pragma, pragmaFrag } = jsx;
35-
plugins.push(["@babel/plugin-transform-react-jsx",
36-
{ pragma, pragmaFrag }]);
37-
}
38-
3933
if(plugins.length) {
4034
settings.plugins = plugins;
4135
}

lib/bundle/config.js

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"use strict";
33

44
let generateTranspiler = require("./babel");
5+
let { generateSWCConfig } = require("./swc");
56
let { loadExtension, abort, repr } = require("faucet-pipeline-core/lib/util");
67
let commonjs = require("@rollup/plugin-commonjs");
78
let { nodeResolve } = require("@rollup/plugin-node-resolve");
@@ -52,22 +53,24 @@ function generateConfig({ externals, format, exports, // eslint-disable-next-lin
5253
let plugins = [];
5354
let extensions = [".js"];
5455

55-
if(esnext || jsx) {
56-
let transpiler = Object.assign({}, esnext, jsx);
57-
if(esnext) {
58-
transpiler.esnext = true;
59-
}
56+
if(typescript || jsx) {
57+
// TODO: Improve error message (correct extension name)
58+
let { default: swc } = loadExtension("rollup-plugin-swc",
59+
"failed to activate SWC");
60+
6061
if(jsx) {
6162
extensions.push(".jsx");
62-
// just to be safe, discard JSX-specifics on parent object
63-
delete transpiler.pragma;
64-
delete transpiler.fragment;
65-
66-
transpiler.jsx = selectiveAssign({}, {
67-
pragma: jsx.pragma,
68-
pragmaFrag: jsx.fragment
69-
});
7063
}
64+
if(typescript) {
65+
extensions.push(".ts");
66+
}
67+
let swcConfig = generateSWCConfig({ typescript, jsx, sourcemaps });
68+
plugins.push(swc(swcConfig));
69+
}
70+
71+
if(esnext) {
72+
let transpiler = Object.assign({}, esnext);
73+
transpiler.esnext = true;
7174

7275
let { browserslist } = transpiler;
7376
browsers = browserslist === false ? null : browsers[browserslist || "defaults"];
@@ -78,13 +81,6 @@ function generateConfig({ externals, format, exports, // eslint-disable-next-lin
7881
let { plugin } = generateTranspiler(transpiler, { browsers });
7982
plugins.push(plugin);
8083
}
81-
if(typescript) {
82-
let ts = loadExtension("@rollup/plugin-typescript",
83-
"failed to activate TypeScript", "faucet-pipeline-typescript");
84-
extensions.push(".ts");
85-
// TODO: provide defaults and abstractions for low-level options?
86-
plugins.push(typescript === true ? ts() : ts(typescript));
87-
}
8884

8985
plugins = plugins.concat([
9086
nodeResolve({ extensions }),
@@ -157,13 +153,3 @@ function determineCompacting(type = true) {
157153
"failed to activate minification", "faucet-pipeline-jsmin");
158154
return terser(options);
159155
}
160-
161-
// merges `source` properties into `target`, skipping `undefined` values
162-
function selectiveAssign(target, source) {
163-
Object.entries(source).forEach(([key, value]) => {
164-
if(value !== undefined) {
165-
target[key] = value;
166-
}
167-
});
168-
return target;
169-
}

lib/bundle/swc.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
exports.generateSWCConfig = function({ typescript, jsx, sourcemaps }) {
2+
let jsc = {
3+
parser: {
4+
syntax: typescript ? "typescript" : "ecmascript"
5+
},
6+
// Disable es3 / es5 / es2015 transforms
7+
target: "es2016"
8+
};
9+
10+
if(jsx) {
11+
if(typescript) {
12+
jsc.parser.tsx = true;
13+
} else {
14+
jsc.parser.jsx = true;
15+
}
16+
17+
jsc.transform = {
18+
react: {
19+
pragma: jsx?.pragma,
20+
pragmaFrag: jsx?.fragment
21+
22+
// TODO: Improve JSX Handling
23+
// https://github.com/faucet-pipeline/faucet-pipeline-js/issues/144
24+
// https://swc.rs/docs/configuration/compilation#jsctransformreact
25+
}
26+
};
27+
}
28+
29+
if(sourcemaps) {
30+
jsc.sourcemaps = "inline";
31+
}
32+
33+
return {
34+
jsc
35+
};
36+
};

pkg/faucet-pipeline-jsx/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"url": "https://github.com/faucet-pipeline/faucet-pipeline-js/issues"
1414
},
1515
"dependencies": {
16-
"@babel/plugin-transform-react-jsx": "~7.17.3",
17-
"faucet-pipeline-esnext": "2.1.8"
16+
"@swc/core": "^1.2.145",
17+
"rollup-plugin-swc": "^0.2.1"
1818
}
1919
}

pkg/faucet-pipeline-typescript/package.json

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
"url": "https://github.com/faucet-pipeline/faucet-pipeline-js/issues"
1717
},
1818
"dependencies": {
19-
"@rollup/plugin-typescript": "~8.3.1",
20-
"faucet-pipeline-js": "2.1.8",
21-
"tslib": "~2.3.1",
22-
"typescript": "~4.6.2"
19+
"@swc/core": "^1.2.145",
20+
"rollup-plugin-swc": "^0.2.1"
2321
}
2422
}

test/cli/test_jsx/expected.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var MyComponent = /*#__PURE__*/_createClass(function MyComponent() {
2727
_classCallCheck(this, MyComponent);
2828
});
2929

30-
var el = createElement(MyComponent, {
30+
var el = /*#__PURE__*/createElement(MyComponent, {
3131
type: "dummy"
32-
}, createElement("my-element", null, "lorem ipsum", createElement(Fragment, null, createElement("mark", null, "666"), "dolor sit amet")));
32+
}, /*#__PURE__*/createElement("my-element", null, "lorem ipsum", /*#__PURE__*/createElement(Fragment, null, /*#__PURE__*/createElement("mark", null, "666"), "dolor sit amet")));
3333
console.log(el);
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,22 @@
11
var LogLevel;
2-
(function (LogLevel) {
2+
(function(LogLevel) {
33
LogLevel[LogLevel["Debug"] = 0] = "Debug";
44
LogLevel[LogLevel["Info"] = 1] = "Info";
55
LogLevel[LogLevel["Critical"] = 2] = "Critical";
66
})(LogLevel || (LogLevel = {}));
77
function log(level, msg) {
88
if (level === LogLevel.Critical) {
99
console.error(msg);
10-
}
11-
else {
10+
} else {
1211
console.log(msg);
1312
}
1413
}
1514

16-
var generateArticle = function (params) {
17-
var title = params.title, authors = params.authors;
15+
let generateArticle = (params)=>{
16+
let { title , authors } = params;
1817
if (typeof title !== "string") {
1918
log(LogLevel.Debug, "auto-generating title");
20-
title = "".concat(title.main, ": ").concat(title.sub);
19+
title = `${title.main}: ${title.sub}`;
2120
}
2221
return title + "\n" + authors.join(", ");
2322
};
@@ -26,5 +25,8 @@ generateArticle({
2625
main: "Hello World",
2726
sub: "sup"
2827
},
29-
authors: ["foo", "bar"]
28+
authors: [
29+
"foo",
30+
"bar"
31+
]
3032
});

0 commit comments

Comments
 (0)