Skip to content

Commit b7a9131

Browse files
committed
Add swc testing
1 parent ad1e63c commit b7a9131

File tree

3 files changed

+138
-23
lines changed

3 files changed

+138
-23
lines changed

packages/babel-plugin-fbtee/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"@babel/traverse": "^7.28.5",
3636
"@babel/types": "^7.28.5",
3737
"@nkzw/babel-plugin-fbtee-auto-import": "workspace:*",
38+
"@swc/core": "1.14.0",
3839
"invariant": "^2.2.4",
3940
"jest-docblock": "30.2.0",
4041
"nullthrows": "^1.1.1",

packages/babel-plugin-fbtee/src/__tests__/FbtTestUtil.tsx

Lines changed: 96 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,71 @@
1+
import { createRequire } from 'node:module';
12
import { PluginOptions, transformSync } from '@babel/core';
23
import syntaxJSX from '@babel/plugin-syntax-jsx';
34
import presetReact from '@babel/preset-react';
45
import presetTypeScript from '@babel/preset-typescript';
6+
import * as swc from '@swc/core';
57
import prettier from 'prettier-2';
68
import fbt from '../index.tsx';
79

10+
const require = createRequire(import.meta.url);
11+
12+
function resolveSwcPluginPath() {
13+
const tryPaths = [
14+
'../../../swc-plugin-fbtee/target/wasm32-wasip1/debug/swc_plugin_fbtee.wasm',
15+
'../../../swc-plugin-fbtee/target/wasm32-wasip1/release/swc_plugin_fbtee.wasm',
16+
];
17+
18+
for (const p of tryPaths) {
19+
try {
20+
return require.resolve(p);
21+
} catch {
22+
// continue
23+
}
24+
}
25+
26+
throw new Error(
27+
'Could not resolve swc-plugin-fbtee .wasm. Please build it (e.g. cargo build --target wasm32-wasi).',
28+
);
29+
}
30+
31+
export const fbtSwcPlugin = resolveSwcPluginPath();
32+
833
export function transform(source: string, pluginOptions?: PluginOptions) {
34+
const useSwc = process.env.USE_SWC === '1';
35+
36+
if (!useSwc) {
37+
return (
38+
transformSync(source, {
39+
ast: false,
40+
filename: 'source.js',
41+
plugins: [[fbt, pluginOptions]],
42+
presets: [presetTypeScript, presetReact],
43+
sourceType: 'module',
44+
})?.code || ''
45+
);
46+
}
47+
948
return (
10-
transformSync(source, {
11-
ast: false,
49+
swc.transformSync(source, {
50+
isModule: true,
1251
filename: 'source.js',
13-
plugins: [[fbt, pluginOptions]],
14-
presets: [presetTypeScript, presetReact],
15-
sourceType: 'module',
16-
})?.code || ''
52+
jsc: {
53+
target: 'es2020',
54+
parser: {
55+
syntax: 'ecmascript',
56+
jsx: true,
57+
},
58+
transform: {
59+
react: {
60+
runtime: 'preserve',
61+
throwIfNamespace: false,
62+
},
63+
},
64+
experimental: {
65+
plugins: [[fbtSwcPlugin, {}]],
66+
},
67+
},
68+
}).code || ''
1769
);
1870
}
1971

@@ -24,17 +76,46 @@ export function snapshotTransform(
2476
return transform(source, pluginOptions);
2577
}
2678

27-
const transformKeepJsx = (source: string, pluginOptions?: PluginOptions) =>
28-
prettier.format(
29-
transformSync(source, {
30-
ast: false,
79+
const transformKeepJsx = (source: string, pluginOptions?: PluginOptions) => {
80+
const useSwc = process.env.USE_SWC === '1';
81+
82+
if (!useSwc) {
83+
return prettier.format(
84+
transformSync(source, {
85+
ast: false,
86+
filename: 'source.js',
87+
plugins: [syntaxJSX, [fbt, pluginOptions]],
88+
presets: [presetTypeScript],
89+
sourceType: 'module',
90+
})?.code || '',
91+
{ parser: 'babel' },
92+
);
93+
}
94+
95+
return prettier.format(
96+
swc.transformSync(source, {
97+
isModule: true,
3198
filename: 'source.js',
32-
plugins: [syntaxJSX, [fbt, pluginOptions]],
33-
presets: [presetTypeScript],
34-
sourceType: 'module',
35-
})?.code || '',
36-
{ parser: 'babel' },
99+
jsc: {
100+
target: 'es2020',
101+
parser: {
102+
syntax: 'ecmascript',
103+
jsx: true,
104+
},
105+
transform: {
106+
react: {
107+
runtime: 'preserve',
108+
throwIfNamespace: false,
109+
},
110+
},
111+
experimental: {
112+
plugins: [[fbtSwcPlugin, {}]],
113+
},
114+
},
115+
}).code || '',
116+
{ parser: 'swc' },
37117
);
118+
};
38119

39120
export const snapshotTransformKeepJsx = (
40121
source: string,

packages/babel-plugin-fbtee/src/__tests__/runtime-test.tsx

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,49 @@ import { transformSync } from '@babel/core';
22
import presetReact from '@babel/preset-react';
33
import { describe, it } from '@jest/globals';
44
import fbtAutoImport from '@nkzw/babel-plugin-fbtee-auto-import';
5+
import * as swc from '@swc/core';
56
import fbtee from '../index.tsx';
6-
import { withFbtImportStatement } from './FbtTestUtil.tsx';
7+
import { fbtSwcPlugin, withFbtImportStatement } from './FbtTestUtil.tsx';
78

8-
const transform = (source: string) =>
9-
transformSync(source, {
10-
ast: false,
11-
plugins: [fbtAutoImport, fbtee],
12-
presets: [presetReact],
13-
sourceType: 'module',
14-
})?.code || '';
9+
const transform = (source: string) => {
10+
const useSwc = process.env.USE_SWC === '1';
11+
12+
if (!useSwc) {
13+
// Default to Babel until SWC plugin host compatibility is resolved.
14+
return (
15+
transformSync(source, {
16+
ast: false,
17+
filename: 'source.js',
18+
plugins: [fbtAutoImport, fbtee],
19+
presets: [presetReact],
20+
sourceType: 'module',
21+
})?.code || ''
22+
);
23+
}
24+
25+
return (
26+
swc.transformSync(source, {
27+
isModule: true,
28+
filename: 'source.js',
29+
jsc: {
30+
target: 'es2020',
31+
parser: {
32+
syntax: 'ecmascript',
33+
jsx: true,
34+
},
35+
transform: {
36+
react: {
37+
runtime: 'preserve',
38+
throwIfNamespace: false,
39+
},
40+
},
41+
experimental: {
42+
plugins: [[fbtSwcPlugin, {}]],
43+
},
44+
},
45+
}).code || ''
46+
);
47+
};
1548

1649
describe('Test hash key generation', () => {
1750
it('should generate hash key for simple string', () => {

0 commit comments

Comments
 (0)