@vxrn/compiler 1.25.16 → 1.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cache.cjs +4 -2
- package/dist/cjs/configure.cjs +9 -1
- package/dist/cjs/index.cjs +87 -5
- package/dist/cjs/reactNativeCodegen.cjs +140 -0
- package/dist/cjs/reactNativeViewConfig.cjs +489 -0
- package/dist/cjs/transformBabel.cjs +15 -20
- package/dist/cjs/transformBabel.test.cjs +260 -0
- package/dist/cjs/transformHermesAsync.cjs +61 -0
- package/dist/cjs/transformHermesLoops.cjs +319 -0
- package/dist/cjs/transformHermesLoops.test.cjs +257 -0
- package/dist/cjs/transformSWC.cjs +110 -138
- package/dist/cjs/transformSWC.test.cjs +117 -0
- package/dist/cjs/transformWorklets.cjs +123 -0
- package/dist/cjs/transformWorklets.test.cjs +604 -0
- package/dist/cjs/worklets/autoworklet.cjs +265 -0
- package/dist/cjs/worklets/globals.cjs +73 -0
- package/dist/cjs/worklets/hash.cjs +38 -0
- package/dist/cjs/worklets/scope.cjs +370 -0
- package/dist/cjs/worklets/serialize.cjs +101 -0
- package/dist/cjs/worklets/transform.cjs +266 -0
- package/dist/cjs/worklets/types.cjs +18 -0
- package/dist/esm/cache.mjs +5 -3
- package/dist/esm/cache.mjs.map +1 -1
- package/dist/esm/configure.mjs +8 -1
- package/dist/esm/configure.mjs.map +1 -1
- package/dist/esm/index.js +75 -6
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +75 -6
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/reactNativeCodegen.mjs +104 -0
- package/dist/esm/reactNativeCodegen.mjs.map +1 -0
- package/dist/esm/reactNativeViewConfig.mjs +460 -0
- package/dist/esm/reactNativeViewConfig.mjs.map +1 -0
- package/dist/esm/transformBabel.mjs +14 -19
- package/dist/esm/transformBabel.mjs.map +1 -1
- package/dist/esm/transformBabel.test.mjs +261 -1
- package/dist/esm/transformBabel.test.mjs.map +1 -1
- package/dist/esm/transformHermesAsync.mjs +25 -0
- package/dist/esm/transformHermesAsync.mjs.map +1 -0
- package/dist/esm/transformHermesLoops.mjs +283 -0
- package/dist/esm/transformHermesLoops.mjs.map +1 -0
- package/dist/esm/transformHermesLoops.test.mjs +234 -0
- package/dist/esm/transformHermesLoops.test.mjs.map +1 -0
- package/dist/esm/transformSWC.mjs +96 -139
- package/dist/esm/transformSWC.mjs.map +1 -1
- package/dist/esm/transformSWC.test.mjs +118 -0
- package/dist/esm/transformSWC.test.mjs.map +1 -0
- package/dist/esm/transformWorklets.mjs +82 -0
- package/dist/esm/transformWorklets.mjs.map +1 -0
- package/dist/esm/transformWorklets.test.mjs +581 -0
- package/dist/esm/transformWorklets.test.mjs.map +1 -0
- package/dist/esm/worklets/autoworklet.mjs +234 -0
- package/dist/esm/worklets/autoworklet.mjs.map +1 -0
- package/dist/esm/worklets/globals.mjs +46 -0
- package/dist/esm/worklets/globals.mjs.map +1 -0
- package/dist/esm/worklets/hash.mjs +13 -0
- package/dist/esm/worklets/hash.mjs.map +1 -0
- package/dist/esm/worklets/scope.mjs +345 -0
- package/dist/esm/worklets/scope.mjs.map +1 -0
- package/dist/esm/worklets/serialize.mjs +75 -0
- package/dist/esm/worklets/serialize.mjs.map +1 -0
- package/dist/esm/worklets/transform.mjs +229 -0
- package/dist/esm/worklets/transform.mjs.map +1 -0
- package/dist/esm/worklets/types.mjs +2 -0
- package/dist/esm/worklets/types.mjs.map +1 -0
- package/package.json +11 -6
- package/src/cache.ts +10 -3
- package/src/configure.ts +12 -0
- package/src/index.ts +96 -13
- package/src/reactNativeCodegen.ts +181 -0
- package/src/reactNativeViewConfig.ts +593 -0
- package/src/transformBabel.test.ts +268 -1
- package/src/transformBabel.ts +21 -31
- package/src/transformHermesAsync.ts +30 -0
- package/src/transformHermesLoops.test.ts +341 -0
- package/src/transformHermesLoops.ts +435 -0
- package/src/transformSWC.test.ts +132 -0
- package/src/transformSWC.ts +121 -161
- package/src/transformWorklets.test.ts +708 -0
- package/src/transformWorklets.ts +160 -0
- package/src/types.ts +4 -4
- package/src/worklets/autoworklet.ts +391 -0
- package/src/worklets/globals.ts +129 -0
- package/src/worklets/hash.ts +14 -0
- package/src/worklets/scope.ts +401 -0
- package/src/worklets/serialize.ts +114 -0
- package/src/worklets/transform.ts +319 -0
- package/src/worklets/types.ts +26 -0
- package/types/cache.d.ts +1 -0
- package/types/cache.d.ts.map +1 -1
- package/types/configure.d.ts +2 -0
- package/types/configure.d.ts.map +1 -1
- package/types/index.d.ts +6 -0
- package/types/index.d.ts.map +1 -1
- package/types/reactNativeCodegen.d.ts +5 -0
- package/types/reactNativeCodegen.d.ts.map +1 -0
- package/types/reactNativeViewConfig.d.ts +35 -0
- package/types/reactNativeViewConfig.d.ts.map +1 -0
- package/types/transformBabel.d.ts +3 -3
- package/types/transformBabel.d.ts.map +1 -1
- package/types/transformHermesAsync.d.ts +5 -0
- package/types/transformHermesAsync.d.ts.map +1 -0
- package/types/transformHermesLoops.d.ts +5 -0
- package/types/transformHermesLoops.d.ts.map +1 -0
- package/types/transformHermesLoops.test.d.ts +2 -0
- package/types/transformHermesLoops.test.d.ts.map +1 -0
- package/types/transformSWC.d.ts +13 -3
- package/types/transformSWC.d.ts.map +1 -1
- package/types/transformSWC.test.d.ts +2 -0
- package/types/transformSWC.test.d.ts.map +1 -0
- package/types/transformWorklets.d.ts +23 -0
- package/types/transformWorklets.d.ts.map +1 -0
- package/types/transformWorklets.test.d.ts +2 -0
- package/types/transformWorklets.test.d.ts.map +1 -0
- package/types/types.d.ts +4 -4
- package/types/types.d.ts.map +1 -1
- package/types/worklets/autoworklet.d.ts +14 -0
- package/types/worklets/autoworklet.d.ts.map +1 -0
- package/types/worklets/globals.d.ts +4 -0
- package/types/worklets/globals.d.ts.map +1 -0
- package/types/worklets/hash.d.ts +5 -0
- package/types/worklets/hash.d.ts.map +1 -0
- package/types/worklets/scope.d.ts +7 -0
- package/types/worklets/scope.d.ts.map +1 -0
- package/types/worklets/serialize.d.ts +12 -0
- package/types/worklets/serialize.d.ts.map +1 -0
- package/types/worklets/transform.d.ts +10 -0
- package/types/worklets/transform.d.ts.map +1 -0
- package/types/worklets/types.d.ts +21 -0
- package/types/worklets/types.d.ts.map +1 -0
package/src/transformSWC.ts
CHANGED
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
import { extname } from 'node:path'
|
|
2
|
-
import {
|
|
3
|
-
type Output,
|
|
4
|
-
type ParserConfig,
|
|
5
|
-
type Options as SWCOptions,
|
|
6
|
-
type TransformConfig,
|
|
7
|
-
transform,
|
|
8
|
-
} from '@swc/core'
|
|
9
|
-
import { merge } from 'ts-deepmerge'
|
|
10
2
|
import { normalizePath } from 'vite'
|
|
11
3
|
import { configuration } from './configure'
|
|
12
|
-
import { asyncGeneratorRegex, debug,
|
|
4
|
+
import { asyncGeneratorRegex, debug, runtimePublicPath } from './constants'
|
|
13
5
|
import type { Options } from './types'
|
|
14
6
|
|
|
7
|
+
export interface Output {
|
|
8
|
+
code: string
|
|
9
|
+
map?: any
|
|
10
|
+
}
|
|
11
|
+
|
|
15
12
|
// posix-only — id is normalized below
|
|
16
13
|
const ignoreId = /node_modules\/(\.vite|vite)\//
|
|
17
14
|
|
|
15
|
+
export function shouldStripFlow(id: string, code: string): boolean {
|
|
16
|
+
const filename = id.split('?')[0]
|
|
17
|
+
if (!/\.jsx?$/.test(filename)) return false
|
|
18
|
+
if (/node_modules[\\/](?:react-native|@react-native)[\\/].*\.js$/.test(filename)) {
|
|
19
|
+
return true
|
|
20
|
+
}
|
|
21
|
+
// scan the complete comment preamble, including license blocks before @flow.
|
|
22
|
+
const header =
|
|
23
|
+
code.match(/^(?:#![^\r\n]*(?:\r?\n|$))?(?:\s|\/\*[\s\S]*?\*\/|\/\/[^\r\n]*)*/)?.[0] || ''
|
|
24
|
+
return /@flow\b/.test(header) || /\b(?:import|export)\s+type\b/.test(code)
|
|
25
|
+
}
|
|
26
|
+
|
|
18
27
|
export async function transformSWC(
|
|
19
28
|
id: string,
|
|
20
29
|
code: string,
|
|
21
30
|
options: Options & { es5?: boolean },
|
|
22
|
-
swcOptions?:
|
|
23
|
-
) {
|
|
31
|
+
swcOptions?: any
|
|
32
|
+
): Promise<Output | undefined> {
|
|
24
33
|
// unify caller contracts (Vite plugin: POSIX id; patches.ts: native id)
|
|
25
34
|
id = normalizePath(id.split('?')[0]).replace(normalizePath(process.cwd()), '')
|
|
26
35
|
|
|
@@ -32,9 +41,8 @@ export async function transformSWC(
|
|
|
32
41
|
return
|
|
33
42
|
}
|
|
34
43
|
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
if (!parser) {
|
|
44
|
+
const lang = getLang(id, options.forceJSX)
|
|
45
|
+
if (!lang) {
|
|
38
46
|
return
|
|
39
47
|
}
|
|
40
48
|
|
|
@@ -45,108 +53,62 @@ export async function transformSWC(
|
|
|
45
53
|
!options.forceJSX &&
|
|
46
54
|
!id.includes('node_modules')
|
|
47
55
|
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const shouldEs5Transform =
|
|
80
|
-
options.es5 ||
|
|
81
|
-
(!process.env.VXRN_USE_BABEL_FOR_GENERATORS && asyncGeneratorRegex.test(code))
|
|
82
|
-
|
|
83
|
-
const opts: SWCOptions = shouldEs5Transform
|
|
84
|
-
? {
|
|
85
|
-
jsc: {
|
|
86
|
-
parser,
|
|
87
|
-
target: 'es5',
|
|
88
|
-
transform: {
|
|
89
|
-
useDefineForClassFields: true,
|
|
90
|
-
react: reactConfig,
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
}
|
|
94
|
-
: {
|
|
95
|
-
...(!options.forceJSX && { env: SWC_ENV }),
|
|
96
|
-
jsc: {
|
|
97
|
-
...(options.forceJSX && { target: 'esnext' }),
|
|
98
|
-
parser,
|
|
99
|
-
transform: {
|
|
100
|
-
useDefineForClassFields: true,
|
|
101
|
-
react: reactConfig,
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
sourceMaps: shouldSourceMap(),
|
|
108
|
-
module: {
|
|
109
|
-
importInterop: 'none',
|
|
110
|
-
type: 'nodenext',
|
|
111
|
-
},
|
|
112
|
-
...(options.mode === 'serve-cjs' && {
|
|
113
|
-
module: {
|
|
114
|
-
importInterop: 'none',
|
|
115
|
-
type: 'commonjs',
|
|
116
|
-
strict: true,
|
|
117
|
-
},
|
|
118
|
-
}),
|
|
119
|
-
...opts,
|
|
120
|
-
}
|
|
121
|
-
})()
|
|
122
|
-
|
|
123
|
-
const finalOptions = merge(
|
|
124
|
-
{
|
|
125
|
-
filename: id,
|
|
126
|
-
swcrc: false,
|
|
127
|
-
configFile: false,
|
|
128
|
-
...transformOptions,
|
|
56
|
+
const importSource =
|
|
57
|
+
configuration.enableNativewind && !id.includes('node_modules')
|
|
58
|
+
? 'nativewind'
|
|
59
|
+
: 'react'
|
|
60
|
+
|
|
61
|
+
const shouldEs5Transform =
|
|
62
|
+
options.es5 ||
|
|
63
|
+
(!process.env.VXRN_USE_BABEL_FOR_GENERATORS && asyncGeneratorRegex.test(code))
|
|
64
|
+
|
|
65
|
+
const target = shouldEs5Transform ? 'es2015' : 'es2020'
|
|
66
|
+
const sourceMaps =
|
|
67
|
+
swcOptions?.sourceMaps !== undefined
|
|
68
|
+
? Boolean(swcOptions.sourceMaps)
|
|
69
|
+
: shouldSourceMap()
|
|
70
|
+
|
|
71
|
+
const oxcOptions: import('oxc-transform').TransformOptions = {
|
|
72
|
+
lang,
|
|
73
|
+
target,
|
|
74
|
+
assumptions: {
|
|
75
|
+
setPublicClassFields: true,
|
|
76
|
+
...(swcOptions?.assumptions || {}),
|
|
77
|
+
},
|
|
78
|
+
sourcemap: sourceMaps,
|
|
79
|
+
jsx: {
|
|
80
|
+
runtime: 'automatic',
|
|
81
|
+
development: !options.forceJSX && !options.production,
|
|
82
|
+
refresh: Boolean(refresh),
|
|
83
|
+
importSource,
|
|
129
84
|
},
|
|
130
|
-
|
|
131
|
-
) satisfies SWCOptions
|
|
85
|
+
}
|
|
132
86
|
|
|
133
|
-
const
|
|
87
|
+
const { transformSync } = await import('oxc-transform')
|
|
88
|
+
|
|
89
|
+
const result: Output = (() => {
|
|
134
90
|
try {
|
|
135
91
|
debug?.(
|
|
136
|
-
`transformSWC ${id} using options:\n${JSON.stringify(
|
|
92
|
+
`transformSWC (oxc) ${id} using options:\n${JSON.stringify(oxcOptions, null, 2)}`
|
|
137
93
|
)
|
|
138
94
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
if (
|
|
146
|
-
|
|
147
|
-
|
|
95
|
+
const res = transformSync(id, code, oxcOptions)
|
|
96
|
+
if (res.errors?.length) {
|
|
97
|
+
const err = res.errors[0]
|
|
98
|
+
const error: any = new Error(
|
|
99
|
+
err.message + (err.codeframe ? `\n${err.codeframe}` : '')
|
|
100
|
+
)
|
|
101
|
+
if (err.labels?.[0]) {
|
|
102
|
+
error.start = err.labels[0].start
|
|
103
|
+
error.end = err.labels[0].end
|
|
148
104
|
}
|
|
105
|
+
throw error
|
|
149
106
|
}
|
|
107
|
+
return {
|
|
108
|
+
code: res.code,
|
|
109
|
+
map: res.map,
|
|
110
|
+
}
|
|
111
|
+
} catch (e: any) {
|
|
150
112
|
throw e
|
|
151
113
|
}
|
|
152
114
|
})()
|
|
@@ -163,7 +125,7 @@ export async function transformSWC(
|
|
|
163
125
|
// fix for node_modules that ship tsx but don't use type-specific imports
|
|
164
126
|
if (
|
|
165
127
|
options.fixNonTypeSpecificImports ||
|
|
166
|
-
(id.includes('node_modules') &&
|
|
128
|
+
(id.includes('node_modules') && (lang === 'ts' || lang === 'tsx'))
|
|
167
129
|
) {
|
|
168
130
|
// we need to keep fake objects for type exports
|
|
169
131
|
const typeExportsMatch = code.match(/^\s*export\s+type\s+([^\s]+)/gi)
|
|
@@ -199,6 +161,8 @@ export async function transformSWC(
|
|
|
199
161
|
return result
|
|
200
162
|
}
|
|
201
163
|
|
|
164
|
+
export const transformOxc = transformSWC
|
|
165
|
+
|
|
202
166
|
function wrapSourceInRefreshRuntime(
|
|
203
167
|
id: string,
|
|
204
168
|
result: Output,
|
|
@@ -219,7 +183,11 @@ function wrapSourceInRefreshRuntimeWeb(
|
|
|
219
183
|
result: Output,
|
|
220
184
|
hasRefreshRuntime: boolean
|
|
221
185
|
) {
|
|
222
|
-
const sourceMap = result.map
|
|
186
|
+
const sourceMap = result.map
|
|
187
|
+
? typeof result.map === 'string'
|
|
188
|
+
? JSON.parse(result.map)
|
|
189
|
+
: { ...result.map }
|
|
190
|
+
: undefined
|
|
223
191
|
if (sourceMap) {
|
|
224
192
|
sourceMap.mappings = ';;' + sourceMap.mappings
|
|
225
193
|
}
|
|
@@ -286,7 +254,11 @@ globalThis.$RefreshSig$ = RefreshRuntime.createSignatureFunctionForTransform;
|
|
|
286
254
|
module.url = '${id}'
|
|
287
255
|
module.hot = createHotContext(module.url)`
|
|
288
256
|
|
|
289
|
-
const sourceMap = result.map
|
|
257
|
+
const sourceMap = result.map
|
|
258
|
+
? typeof result.map === 'string'
|
|
259
|
+
? JSON.parse(result.map)
|
|
260
|
+
: { ...result.map }
|
|
261
|
+
: undefined
|
|
290
262
|
|
|
291
263
|
if (sourceMap) {
|
|
292
264
|
// we need ";" equal to number of lines added to the top
|
|
@@ -314,72 +286,60 @@ ${postfixCode}
|
|
|
314
286
|
return result
|
|
315
287
|
}
|
|
316
288
|
|
|
317
|
-
const SWC_ENV = {
|
|
318
|
-
targets: {
|
|
319
|
-
node: '4',
|
|
320
|
-
},
|
|
321
|
-
// debug: true,
|
|
322
|
-
include: [],
|
|
323
|
-
// this breaks the uniswap app for any file with a ...spread
|
|
324
|
-
exclude: [
|
|
325
|
-
'transform-spread',
|
|
326
|
-
'transform-destructuring',
|
|
327
|
-
'transform-object-rest-spread',
|
|
328
|
-
// `transform-async-to-generator` is relying on `transform-destructuring`.
|
|
329
|
-
// If we exclude `transform-destructuring` but not `transform-async-to-generator`, the SWC binary will panic
|
|
330
|
-
// with error: `called `Option::unwrap()` on a `None` value`.
|
|
331
|
-
// See: https://github.com/swc-project/swc/blob/v1.7.14/crates/swc_ecma_compat_es2015/src/generator.rs#L703-L705
|
|
332
|
-
'transform-async-to-generator',
|
|
333
|
-
'transform-regenerator', // Similar to above
|
|
334
|
-
],
|
|
335
|
-
} satisfies SWCOptions['env']
|
|
336
|
-
|
|
337
289
|
const refreshContentRE = /\$Refresh(?:Reg|Sig)\$\(/
|
|
338
290
|
|
|
339
|
-
function shouldSourceMap() {
|
|
291
|
+
export function shouldSourceMap() {
|
|
340
292
|
return process.env.VXRN_ENABLE_SOURCE_MAP === '1'
|
|
341
293
|
}
|
|
342
294
|
|
|
343
|
-
function
|
|
295
|
+
function getLang(id: string, forceJSX = false): 'js' | 'jsx' | 'ts' | 'tsx' | undefined {
|
|
344
296
|
if (id.endsWith('one-entry-native')) {
|
|
345
|
-
return
|
|
297
|
+
return 'tsx'
|
|
346
298
|
}
|
|
347
299
|
|
|
348
300
|
const extension = extname(id)
|
|
349
|
-
let parser: ParserConfig = !extension ? parsers['.js'] : parsers[extension]
|
|
350
301
|
|
|
351
|
-
if (extension === '.
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
302
|
+
if (extension === '.tsx') return 'tsx'
|
|
303
|
+
if (extension === '.ts') return 'ts'
|
|
304
|
+
if (extension === '.jsx' || extension === '.mdx') return 'jsx'
|
|
305
|
+
if (extension === '.js' || extension === '.mjs' || extension === '.cjs') {
|
|
306
|
+
// native packages ship jsx inside plain js files; jsx mode also accepts
|
|
307
|
+
// ordinary javascript, matching the native bundler's parser.
|
|
308
|
+
return 'jsx'
|
|
309
|
+
}
|
|
355
310
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
}
|
|
311
|
+
if (!extension) {
|
|
312
|
+
return forceJSX ? 'jsx' : 'js'
|
|
359
313
|
}
|
|
360
314
|
|
|
361
|
-
return
|
|
315
|
+
return undefined
|
|
362
316
|
}
|
|
363
317
|
|
|
364
318
|
export const transformSWCStripJSX = async (id: string, code: string) => {
|
|
365
|
-
const
|
|
366
|
-
if (!
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
refresh: false,
|
|
381
|
-
},
|
|
382
|
-
},
|
|
319
|
+
const lang = getLang(id)
|
|
320
|
+
if (!lang) return
|
|
321
|
+
|
|
322
|
+
const { transformSync } = await import('oxc-transform')
|
|
323
|
+
const res = transformSync(id, code, {
|
|
324
|
+
lang,
|
|
325
|
+
target: 'es2020',
|
|
326
|
+
assumptions: {
|
|
327
|
+
setPublicClassFields: true,
|
|
328
|
+
},
|
|
329
|
+
sourcemap: shouldSourceMap(),
|
|
330
|
+
jsx: {
|
|
331
|
+
runtime: 'automatic',
|
|
332
|
+
development: true,
|
|
333
|
+
refresh: false,
|
|
383
334
|
},
|
|
384
335
|
})
|
|
336
|
+
|
|
337
|
+
if (res.errors?.length) {
|
|
338
|
+
const err = res.errors[0]
|
|
339
|
+
throw new Error(err.message + (err.codeframe ? `\n${err.codeframe}` : ''))
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return { code: res.code, map: res.map as any }
|
|
385
343
|
}
|
|
344
|
+
|
|
345
|
+
export const transformOxcStripJSX = transformSWCStripJSX
|