@vxrn/compiler 1.26.0 → 1.26.1-1789332805082
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 +7 -0
- package/dist/cjs/index.cjs +14 -8
- package/dist/cjs/transformBabel.cjs +56 -10
- package/dist/cjs/transformBabel.test.cjs +88 -0
- package/dist/esm/cache.mjs +8 -2
- package/dist/esm/cache.mjs.map +1 -1
- package/dist/esm/index.js +14 -9
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +14 -9
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/reactNativeViewConfig.mjs.map +1 -1
- package/dist/esm/transformBabel.mjs +57 -12
- package/dist/esm/transformBabel.mjs.map +1 -1
- package/dist/esm/transformBabel.test.mjs +89 -1
- package/dist/esm/transformBabel.test.mjs.map +1 -1
- package/dist/esm/transformHermesLoops.mjs.map +1 -1
- package/dist/esm/transformSWC.mjs.map +1 -1
- package/dist/esm/transformSWC.test.mjs.map +1 -1
- package/dist/esm/transformWorklets.mjs.map +1 -1
- package/dist/esm/transformWorklets.test.mjs.map +1 -1
- package/dist/esm/worklets/autoworklet.mjs.map +1 -1
- package/dist/esm/worklets/scope.mjs.map +1 -1
- package/dist/esm/worklets/serialize.mjs.map +1 -1
- package/dist/esm/worklets/transform.mjs.map +1 -1
- package/package.json +4 -4
- package/src/cache.ts +13 -1
- package/src/index.ts +45 -17
- package/src/reactNativeViewConfig.ts +19 -5
- package/src/transformBabel.test.ts +110 -0
- package/src/transformBabel.ts +79 -11
- package/src/transformHermesLoops.ts +22 -4
- package/src/transformSWC.test.ts +14 -11
- package/src/transformSWC.ts +2 -1
- package/src/transformWorklets.test.ts +11 -8
- package/src/transformWorklets.ts +4 -1
- package/src/worklets/autoworklet.ts +12 -4
- package/src/worklets/scope.ts +2 -1
- package/src/worklets/serialize.ts +4 -3
- package/src/worklets/transform.ts +35 -8
- package/types/cache.d.ts +2 -0
- package/types/cache.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/reactNativeViewConfig.d.ts.map +1 -1
- package/types/transformBabel.d.ts +4 -1
- package/types/transformBabel.d.ts.map +1 -1
- package/types/transformHermesLoops.d.ts.map +1 -1
- package/types/transformSWC.d.ts.map +1 -1
- package/types/transformWorklets.d.ts.map +1 -1
- package/types/worklets/autoworklet.d.ts.map +1 -1
- package/types/worklets/scope.d.ts.map +1 -1
- package/types/worklets/serialize.d.ts.map +1 -1
- package/types/worklets/transform.d.ts.map +1 -1
package/src/transformBabel.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs'
|
|
2
|
+
import { extname, join, relative } from 'node:path'
|
|
2
3
|
// type-only, so that importing this module does not drag babel in. every metro
|
|
3
4
|
// worker loads it through the package index, and on the native transform path
|
|
4
5
|
// babel is never called at all: loading it there is pure startup cost.
|
|
@@ -13,6 +14,37 @@ type Props = GetTransformProps & {
|
|
|
13
14
|
userSetting?: GetTransformResponse
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
const USER_BABEL_CONFIG_FILES = [
|
|
18
|
+
'babel.config.js',
|
|
19
|
+
'babel.config.cjs',
|
|
20
|
+
'babel.config.mjs',
|
|
21
|
+
'babel.config.json',
|
|
22
|
+
'.babelrc',
|
|
23
|
+
'.babelrc.js',
|
|
24
|
+
'.babelrc.json',
|
|
25
|
+
] as const
|
|
26
|
+
|
|
27
|
+
const ONE_GENERATED_MARKER = '@one-generated'
|
|
28
|
+
|
|
29
|
+
export function findUserBabelConfig(projectRoot?: string): string | null {
|
|
30
|
+
if (!projectRoot) return null
|
|
31
|
+
for (const name of USER_BABEL_CONFIG_FILES) {
|
|
32
|
+
const fullPath = join(projectRoot, name)
|
|
33
|
+
if (existsSync(fullPath)) {
|
|
34
|
+
try {
|
|
35
|
+
const content = readFileSync(fullPath, 'utf8')
|
|
36
|
+
if (content.includes(ONE_GENERATED_MARKER)) {
|
|
37
|
+
continue
|
|
38
|
+
}
|
|
39
|
+
} catch {
|
|
40
|
+
continue
|
|
41
|
+
}
|
|
42
|
+
return fullPath
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null
|
|
46
|
+
}
|
|
47
|
+
|
|
16
48
|
export function getBabelOptions(props: Props): babel.TransformOptions | null {
|
|
17
49
|
// unify caller contracts (the Vite plugin hands POSIX ids; the native/patches
|
|
18
50
|
// path hands OS-native ids) so every path matcher below can assume forward
|
|
@@ -20,22 +52,40 @@ export function getBabelOptions(props: Props): babel.TransformOptions | null {
|
|
|
20
52
|
// reason. without it, RN's own files aren't matched on Windows.
|
|
21
53
|
props = { ...props, id: normalizePath(props.id.split('?')[0]) }
|
|
22
54
|
|
|
55
|
+
const isProjectFile = !props.id.includes('node_modules')
|
|
56
|
+
const userBabelConfig =
|
|
57
|
+
isProjectFile && props.projectRoot
|
|
58
|
+
? findUserBabelConfig(props.projectRoot)
|
|
59
|
+
: null
|
|
60
|
+
|
|
23
61
|
if (props.userSetting === 'babel') {
|
|
24
|
-
return getOptions(props, true)
|
|
62
|
+
return getOptions(props, true, userBabelConfig)
|
|
25
63
|
}
|
|
26
64
|
if (
|
|
27
65
|
typeof props.userSetting === 'undefined' ||
|
|
28
66
|
(typeof props.userSetting === 'object' && props.userSetting.transform === 'babel')
|
|
29
67
|
) {
|
|
30
68
|
if (props.userSetting?.excludeDefaultPlugins) {
|
|
31
|
-
return
|
|
69
|
+
return {
|
|
70
|
+
...props.userSetting,
|
|
71
|
+
...(userBabelConfig
|
|
72
|
+
? { configFile: userBabelConfig, babelrc: true }
|
|
73
|
+
: {}),
|
|
74
|
+
}
|
|
32
75
|
}
|
|
33
|
-
return getOptions(props)
|
|
76
|
+
return getOptions(props, false, userBabelConfig)
|
|
77
|
+
}
|
|
78
|
+
if (userBabelConfig) {
|
|
79
|
+
return getOptions(props, false, userBabelConfig)
|
|
34
80
|
}
|
|
35
81
|
return null
|
|
36
82
|
}
|
|
37
83
|
|
|
38
|
-
const getOptions = (
|
|
84
|
+
const getOptions = (
|
|
85
|
+
props: Props,
|
|
86
|
+
force = false,
|
|
87
|
+
userBabelConfig: string | null = null
|
|
88
|
+
): babel.TransformOptions | null => {
|
|
39
89
|
let plugins: babel.PluginItem[] = []
|
|
40
90
|
|
|
41
91
|
if (force || shouldBabelGenerators(props)) {
|
|
@@ -72,8 +122,13 @@ const getOptions = (props: Props, force = false): babel.TransformOptions | null
|
|
|
72
122
|
plugins.push(getBabelReactCompilerPlugin(props))
|
|
73
123
|
}
|
|
74
124
|
|
|
75
|
-
if (plugins.length) {
|
|
76
|
-
return {
|
|
125
|
+
if (plugins.length || userBabelConfig) {
|
|
126
|
+
return {
|
|
127
|
+
plugins,
|
|
128
|
+
...(userBabelConfig
|
|
129
|
+
? { configFile: userBabelConfig, babelrc: true }
|
|
130
|
+
: {}),
|
|
131
|
+
}
|
|
77
132
|
}
|
|
78
133
|
|
|
79
134
|
return null
|
|
@@ -91,14 +146,27 @@ const getOptions = (props: Props, force = false): babel.TransformOptions | null
|
|
|
91
146
|
export async function transformOxcReactCompiler(
|
|
92
147
|
id: string,
|
|
93
148
|
code: string,
|
|
94
|
-
|
|
149
|
+
optionsOrTarget: '18' | '19' | (Record<string, any> & { target?: '18' | '19' }) = '19',
|
|
95
150
|
sourceMap = false
|
|
96
151
|
) {
|
|
97
152
|
const { transform } = await import('oxc-transform-react')
|
|
153
|
+
const compilerOptions =
|
|
154
|
+
typeof optionsOrTarget === 'string'
|
|
155
|
+
? { target: optionsOrTarget }
|
|
156
|
+
: optionsOrTarget || {}
|
|
157
|
+
|
|
158
|
+
const target = compilerOptions.target ?? '19'
|
|
98
159
|
const result = await transform(id, code, {
|
|
99
160
|
jsx: 'preserve',
|
|
100
161
|
sourcemap: sourceMap,
|
|
101
|
-
reactCompiler: {
|
|
162
|
+
reactCompiler: {
|
|
163
|
+
target,
|
|
164
|
+
...compilerOptions,
|
|
165
|
+
environment: {
|
|
166
|
+
enableCustomTypeDefinitionForReanimated: true,
|
|
167
|
+
...compilerOptions.environment,
|
|
168
|
+
},
|
|
169
|
+
},
|
|
102
170
|
})
|
|
103
171
|
|
|
104
172
|
// `errors` with fatal:false are react compiler BAILOUTS ("Cannot access refs
|
|
@@ -140,8 +208,8 @@ export async function transformBabel(
|
|
|
140
208
|
const babelOptions = {
|
|
141
209
|
filename: id,
|
|
142
210
|
compact: false,
|
|
143
|
-
babelrc: false,
|
|
144
|
-
configFile: false,
|
|
211
|
+
babelrc: options.babelrc ?? false,
|
|
212
|
+
configFile: options.configFile ?? false,
|
|
145
213
|
sourceMaps: false,
|
|
146
214
|
minified: false,
|
|
147
215
|
...options,
|
|
@@ -169,7 +169,12 @@ function analyzeBody(body: any, names: Set<string>): BodyFacts {
|
|
|
169
169
|
hasLabeledJump: false,
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
function walk(
|
|
172
|
+
function walk(
|
|
173
|
+
node: any,
|
|
174
|
+
inNestedBreakable: boolean,
|
|
175
|
+
inNestedLoop: boolean,
|
|
176
|
+
inFunction: boolean
|
|
177
|
+
) {
|
|
173
178
|
if (!node || typeof node !== 'object') return
|
|
174
179
|
|
|
175
180
|
if (FUNCTION_TYPES.has(node.type)) {
|
|
@@ -284,7 +289,10 @@ function transformOnce(
|
|
|
284
289
|
// declarations are made fresh just by moving into a function body.
|
|
285
290
|
const names: string[] = []
|
|
286
291
|
const decl = headDeclaration(node)
|
|
287
|
-
if (
|
|
292
|
+
if (
|
|
293
|
+
decl?.type === 'VariableDeclaration' &&
|
|
294
|
+
(decl.kind === 'let' || decl.kind === 'const')
|
|
295
|
+
) {
|
|
288
296
|
for (const d of decl.declarations || []) collectPatternNames(d.id, names)
|
|
289
297
|
}
|
|
290
298
|
const shared = [...names]
|
|
@@ -366,12 +374,22 @@ function transformOnce(
|
|
|
366
374
|
* completion and a `continue` both return undefined, which is exactly right,
|
|
367
375
|
* since falling out of _loop continues the loop.
|
|
368
376
|
*/
|
|
369
|
-
function rewriteJumps(
|
|
377
|
+
function rewriteJumps(
|
|
378
|
+
bodyText: string,
|
|
379
|
+
bodyNode: any,
|
|
380
|
+
code: string,
|
|
381
|
+
names: Set<string>
|
|
382
|
+
): string {
|
|
370
383
|
const offset = bodyNode.start
|
|
371
384
|
const s = new MagicString(bodyText)
|
|
372
385
|
const pad = bodyNode.type === 'BlockStatement' ? 0 : 2
|
|
373
386
|
|
|
374
|
-
function walk(
|
|
387
|
+
function walk(
|
|
388
|
+
node: any,
|
|
389
|
+
inNestedBreakable: boolean,
|
|
390
|
+
inNestedLoop: boolean,
|
|
391
|
+
inFunction: boolean
|
|
392
|
+
) {
|
|
375
393
|
if (!node || typeof node !== 'object') return
|
|
376
394
|
|
|
377
395
|
if (FUNCTION_TYPES.has(node.type)) {
|
package/src/transformSWC.test.ts
CHANGED
|
@@ -71,22 +71,25 @@ class Sample {
|
|
|
71
71
|
expect(res!.code).toContain('this.publicField = 100')
|
|
72
72
|
})
|
|
73
73
|
|
|
74
|
-
it.each(['MyComponent.tsx', 'MyComponent.js', 'MyComponent.mjs', 'MyComponent.cjs'])(
|
|
75
|
-
|
|
74
|
+
it.each(['MyComponent.tsx', 'MyComponent.js', 'MyComponent.mjs', 'MyComponent.cjs'])(
|
|
75
|
+
'lowers JSX in %s to react automatic runtime calls',
|
|
76
|
+
async (filename) => {
|
|
77
|
+
const input = `
|
|
76
78
|
export function MyComponent() {
|
|
77
79
|
return <div className="test"><span>Hello</span></div>
|
|
78
80
|
}
|
|
79
81
|
`
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
const res = await transformSWC(filename, input, {
|
|
83
|
+
environment: 'client',
|
|
84
|
+
mode: 'build',
|
|
85
|
+
})
|
|
84
86
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
expect(res).toBeDefined()
|
|
88
|
+
expect(res!.code).not.toContain('<div')
|
|
89
|
+
expect(res!.code).not.toContain('<span>')
|
|
90
|
+
expect(res!.code).toContain('_jsx')
|
|
91
|
+
}
|
|
92
|
+
)
|
|
90
93
|
|
|
91
94
|
it('respects sourcemaps option', async () => {
|
|
92
95
|
const input = `
|
package/src/transformSWC.ts
CHANGED
|
@@ -20,7 +20,8 @@ export function shouldStripFlow(id: string, code: string): boolean {
|
|
|
20
20
|
}
|
|
21
21
|
// scan the complete comment preamble, including license blocks before @flow.
|
|
22
22
|
const header =
|
|
23
|
-
code.match(/^(?:#![^\r\n]*(?:\r?\n|$))?(?:\s|\/\*[\s\S]*?\*\/|\/\/[^\r\n]*)*/)?.[0] ||
|
|
23
|
+
code.match(/^(?:#![^\r\n]*(?:\r?\n|$))?(?:\s|\/\*[\s\S]*?\*\/|\/\/[^\r\n]*)*/)?.[0] ||
|
|
24
|
+
''
|
|
24
25
|
return /@flow\b/.test(header) || /\b(?:import|export)\s+type\b/.test(code)
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -200,15 +200,17 @@ describe('transformWorklets', () => {
|
|
|
200
200
|
|
|
201
201
|
// the inner worklet's init data is declared inside the outer function body,
|
|
202
202
|
// not hoisted to module scope where the worklet runtime cannot see it.
|
|
203
|
-
const innerVar = result.code.match(
|
|
203
|
+
const innerVar = result.code.match(
|
|
204
|
+
/var (_worklet_\d+_init_data) = \{\s*code: "function _worklet/
|
|
205
|
+
)
|
|
204
206
|
expect(innerVar, 'inner worklet init data').toBeTruthy()
|
|
205
207
|
// only look past the serialized string, which mentions the same name inside
|
|
206
208
|
// its escaped body.
|
|
207
209
|
const emitted = result.code.slice(result.code.indexOf('export var installUnpacker'))
|
|
208
210
|
expect(emitted).toContain(`var ${innerVar![1]} = {`)
|
|
209
|
-
expect(
|
|
210
|
-
|
|
211
|
-
)
|
|
211
|
+
expect(
|
|
212
|
+
result.code.slice(0, result.code.indexOf('export var installUnpacker'))
|
|
213
|
+
).not.toContain(`\nvar ${innerVar![1]} = {`)
|
|
212
214
|
})
|
|
213
215
|
|
|
214
216
|
it('autoworkletizes hooks like useAnimatedStyle and withTiming', async () => {
|
|
@@ -555,7 +557,11 @@ describe('transformWorklets', () => {
|
|
|
555
557
|
expect(computeFn({ x: 2 })).toBe(12) // (2 + 1 + 0) * 4 = 12
|
|
556
558
|
|
|
557
559
|
const reconstructed = eval(`(${computeFn.__initData.code})`)
|
|
558
|
-
const uiRes = reconstructed.call(
|
|
560
|
+
const uiRes = reconstructed.call(
|
|
561
|
+
{ __closure: computeFn.__closure },
|
|
562
|
+
{ x: 2, y: 3 },
|
|
563
|
+
5
|
|
564
|
+
)
|
|
559
565
|
expect(uiRes).toBe(40) // (2 + 3 + 5) * 4 = 40
|
|
560
566
|
})
|
|
561
567
|
|
|
@@ -692,9 +698,6 @@ describe('transformWorklets', () => {
|
|
|
692
698
|
})
|
|
693
699
|
})
|
|
694
700
|
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
701
|
describe('worklet detection gate', () => {
|
|
699
702
|
it('accepts files whose only worklets come from gesture callbacks', () => {
|
|
700
703
|
// .onBegin/.onEnd/.onTouchesMove are auto-workletized by the transform, so
|
package/src/transformWorklets.ts
CHANGED
|
@@ -2,7 +2,10 @@ import fs from 'node:fs'
|
|
|
2
2
|
import { createRequire } from 'node:module'
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { configuration, isNativeWorkletsEnabled } from './configure'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
AUTOWORKLET_FUNCTION_ARGS,
|
|
7
|
+
GESTURE_BUILDER_METHODS,
|
|
8
|
+
} from './worklets/autoworklet'
|
|
6
9
|
|
|
7
10
|
// every callee the transform auto-workletizes has to be in this gate, or files
|
|
8
11
|
// whose only worklets come from gesture callbacks (`.onBegin`, `.onEnd`,
|
|
@@ -173,7 +173,11 @@ function isChainedCallback(callee: any): boolean {
|
|
|
173
173
|
}
|
|
174
174
|
|
|
175
175
|
// the worklets directives, in the order the runtime expects to find them.
|
|
176
|
-
export const WORKLET_DIRECTIVES = [
|
|
176
|
+
export const WORKLET_DIRECTIVES = [
|
|
177
|
+
'worklet',
|
|
178
|
+
'no-worklet-closure',
|
|
179
|
+
'limit-init-data-hoisting',
|
|
180
|
+
]
|
|
177
181
|
|
|
178
182
|
function statementDirective(stmt: any): string | undefined {
|
|
179
183
|
if (!stmt || stmt.type !== 'ExpressionStatement') return undefined
|
|
@@ -219,7 +223,8 @@ export function hasWorkletDirective(fnNode: any): boolean {
|
|
|
219
223
|
*/
|
|
220
224
|
export function bodyStartAfterDirectives(fnNode: any, code: string): number {
|
|
221
225
|
let start = fnNode.body.start + 1
|
|
222
|
-
if (fnNode.body.type !== 'BlockStatement' || !Array.isArray(fnNode.body.body))
|
|
226
|
+
if (fnNode.body.type !== 'BlockStatement' || !Array.isArray(fnNode.body.body))
|
|
227
|
+
return start
|
|
223
228
|
for (const stmt of fnNode.body.body) {
|
|
224
229
|
const found = statementDirective(stmt)
|
|
225
230
|
if (found === undefined || !WORKLET_DIRECTIVES.includes(found)) break
|
|
@@ -287,7 +292,9 @@ export function findWorkletCandidates(program: any): WorkletCandidate[] {
|
|
|
287
292
|
}
|
|
288
293
|
} else if (
|
|
289
294
|
node.type === 'Property' &&
|
|
290
|
-
(node.method ||
|
|
295
|
+
(node.method ||
|
|
296
|
+
node.value?.type === 'FunctionExpression' ||
|
|
297
|
+
node.value?.type === 'ArrowFunctionExpression')
|
|
291
298
|
) {
|
|
292
299
|
const fn = node.value
|
|
293
300
|
if (hasWorkletDirective(fn)) {
|
|
@@ -312,7 +319,8 @@ export function findWorkletCandidates(program: any): WorkletCandidate[] {
|
|
|
312
319
|
const argIndices = calleeName ? AUTOWORKLET_FUNCTION_ARGS[calleeName] : undefined
|
|
313
320
|
const chained = !argIndices && isChainedCallback(node.callee)
|
|
314
321
|
const indices =
|
|
315
|
-
argIndices ??
|
|
322
|
+
argIndices ??
|
|
323
|
+
(chained ? node.arguments.map((_: unknown, i: number) => i) : undefined)
|
|
316
324
|
if (indices) {
|
|
317
325
|
for (const idx of indices) {
|
|
318
326
|
const arg = node.arguments[idx]
|
package/src/worklets/scope.ts
CHANGED
|
@@ -130,7 +130,8 @@ export function getClosureVariables(fnNode: any, globals: Set<string>): string[]
|
|
|
130
130
|
return
|
|
131
131
|
case 'VariableDeclaration':
|
|
132
132
|
if (node.kind === 'var') {
|
|
133
|
-
for (const d of node.declarations)
|
|
133
|
+
for (const d of node.declarations)
|
|
134
|
+
addBindingsOnly(d.id, currentScope.varBindings)
|
|
134
135
|
} else if (direct) {
|
|
135
136
|
for (const d of node.declarations) addBindingsOnly(d.id, currentScope.bindings)
|
|
136
137
|
}
|
|
@@ -51,9 +51,10 @@ export function serializeWorkletForUI(
|
|
|
51
51
|
rawBody = `return ${code.slice(fnNode.body.start, fnNode.body.end)};`
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
const unpacker =
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
const unpacker =
|
|
55
|
+
closureVars.length > 0
|
|
56
|
+
? `const { ${closureVars.join(', ')} } = this.__closure ?? this._closure;\n`
|
|
57
|
+
: ''
|
|
57
58
|
|
|
58
59
|
const asyncPrefix = fnNode.async ? 'async ' : ''
|
|
59
60
|
const genPrefix = fnNode.generator ? '*' : ''
|
|
@@ -2,7 +2,11 @@ import path from 'node:path'
|
|
|
2
2
|
import MagicString from 'magic-string'
|
|
3
3
|
import remapping from '@jridgewell/remapping'
|
|
4
4
|
import { parseSync } from 'oxc-parser'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
bodyStartAfterDirectives,
|
|
7
|
+
findWorkletCandidates,
|
|
8
|
+
hasDirective,
|
|
9
|
+
} from './autoworklet'
|
|
6
10
|
import { createGlobalsSet } from './globals'
|
|
7
11
|
import { calculateWorkletHash } from './hash'
|
|
8
12
|
import { getClosureVariables } from './scope'
|
|
@@ -27,7 +31,9 @@ export function prepareWorkletsForReactCompiler(
|
|
|
27
31
|
})
|
|
28
32
|
if (parsed.errors.length) {
|
|
29
33
|
const error = parsed.errors[0]
|
|
30
|
-
throw new Error(
|
|
34
|
+
throw new Error(
|
|
35
|
+
error.codeframe || error.message || 'Syntax Error while parsing worklet'
|
|
36
|
+
)
|
|
31
37
|
}
|
|
32
38
|
const candidates = findWorkletCandidates(parsed.program).filter(
|
|
33
39
|
(candidate) => candidate.isAutoWorklet && !hasDirective(candidate.fnNode, 'worklet')
|
|
@@ -160,7 +166,9 @@ export function executeWorkletTransform(
|
|
|
160
166
|
|
|
161
167
|
if (parseResult.errors && parseResult.errors.length > 0) {
|
|
162
168
|
const err = parseResult.errors[0]
|
|
163
|
-
throw new Error(
|
|
169
|
+
throw new Error(
|
|
170
|
+
err.codeframe || err.message || 'Syntax Error while parsing worklet'
|
|
171
|
+
)
|
|
164
172
|
}
|
|
165
173
|
|
|
166
174
|
const candidates = findWorkletCandidates(parseResult.program)
|
|
@@ -179,7 +187,9 @@ export function executeWorkletTransform(
|
|
|
179
187
|
})
|
|
180
188
|
|
|
181
189
|
if (innermostCandidates.length === 0) {
|
|
182
|
-
throw new Error(
|
|
190
|
+
throw new Error(
|
|
191
|
+
`[worklets] Cyclic or unresolvable worklet nesting detected in ${cleanId}`
|
|
192
|
+
)
|
|
183
193
|
}
|
|
184
194
|
|
|
185
195
|
const ms = new MagicString(currentCode)
|
|
@@ -197,7 +207,12 @@ export function executeWorkletTransform(
|
|
|
197
207
|
: getClosureVariables(candidate.fnNode, globals)
|
|
198
208
|
const fnName = candidate.name
|
|
199
209
|
|
|
200
|
-
const serializedCode = serializeWorkletForUI(
|
|
210
|
+
const serializedCode = serializeWorkletForUI(
|
|
211
|
+
candidate.fnNode,
|
|
212
|
+
currentCode,
|
|
213
|
+
fnName,
|
|
214
|
+
closureVars
|
|
215
|
+
)
|
|
201
216
|
const workletHash = calculateWorkletHash(serializedCode)
|
|
202
217
|
const initDataVar = `_worklet_${workletHash}_init_data`
|
|
203
218
|
|
|
@@ -241,7 +256,11 @@ export function executeWorkletTransform(
|
|
|
241
256
|
|
|
242
257
|
if (candidate.kind === 'function_declaration') {
|
|
243
258
|
if (candidate.parent?.type === 'ExportNamedDeclaration') {
|
|
244
|
-
ms.overwrite(
|
|
259
|
+
ms.overwrite(
|
|
260
|
+
candidate.parent.start,
|
|
261
|
+
candidate.parent.end,
|
|
262
|
+
`export var ${candidate.name} = ${iife};`
|
|
263
|
+
)
|
|
245
264
|
} else if (candidate.parent?.type === 'ExportDefaultDeclaration') {
|
|
246
265
|
ms.overwrite(
|
|
247
266
|
candidate.parent.start,
|
|
@@ -249,10 +268,18 @@ export function executeWorkletTransform(
|
|
|
249
268
|
`var ${candidate.name || '_defaultWorklet'} = ${iife};\nexport default ${candidate.name || '_defaultWorklet'};`
|
|
250
269
|
)
|
|
251
270
|
} else {
|
|
252
|
-
ms.overwrite(
|
|
271
|
+
ms.overwrite(
|
|
272
|
+
candidate.node.start,
|
|
273
|
+
candidate.node.end,
|
|
274
|
+
`var ${candidate.name} = ${iife};`
|
|
275
|
+
)
|
|
253
276
|
}
|
|
254
277
|
} else if (candidate.kind === 'object_method') {
|
|
255
|
-
ms.overwrite(
|
|
278
|
+
ms.overwrite(
|
|
279
|
+
candidate.node.start,
|
|
280
|
+
candidate.node.end,
|
|
281
|
+
`${candidate.name}: ${iife}`
|
|
282
|
+
)
|
|
256
283
|
} else {
|
|
257
284
|
ms.overwrite(candidate.node.start, candidate.node.end, iife)
|
|
258
285
|
}
|
package/types/cache.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export declare function setCachedTransform(filePath: string, code: string, resul
|
|
|
12
12
|
code: string;
|
|
13
13
|
map?: any;
|
|
14
14
|
}, environment: string): void;
|
|
15
|
+
/** Drop every cached transform, for `react-native bundle --reset-cache`. */
|
|
16
|
+
export declare function clearTransformCache(): void;
|
|
15
17
|
export declare function getCacheStats(): CacheStats;
|
|
16
18
|
export declare function logCacheStats(): void;
|
|
17
19
|
export {};
|
package/types/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AA4BA,UAAU,UAAU;IAClB,IAAI,EAAE,CAAC,CAAA;IACP,MAAM,EAAE,CAAC,CAAA;IACT,MAAM,EAAE,CAAC,CAAA;IACT,MAAM,EAAE,CAAC,CAAA;CACV;AAiDD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,IAAI,CAoCpC;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,EACnC,WAAW,EAAE,MAAM,GAClB,IAAI,CAwBN;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,aAAa,IAAI,UAAU,CAE1C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAapC"}
|
package/types/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export * from './transformWorklets';
|
|
|
12
12
|
export * from './reactNativeCodegen';
|
|
13
13
|
export * from './transformHermesLoops';
|
|
14
14
|
export * from './transformHermesAsync';
|
|
15
|
+
export { clearTransformCache } from './cache';
|
|
15
16
|
export { JS_GLOBALS } from './worklets/globals';
|
|
16
17
|
export { getClosureVariables } from './worklets/scope';
|
|
17
18
|
export type { GetTransform } from './types';
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,MAAM,CAAA;AAcpE,OAAO,KAAK,EAAkC,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtE,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,MAAM,CAAA;AAcpE,OAAO,KAAK,EAAkC,OAAO,EAAE,MAAM,SAAS,CAAA;AAGtE,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAsS3C,wBAAsB,wBAAwB,CAC5C,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CA6VzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactNativeViewConfig.d.ts","sourceRoot":"","sources":["../src/reactNativeViewConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;
|
|
1
|
+
{"version":3,"file":"reactNativeViewConfig.d.ts","sourceRoot":"","sources":["../src/reactNativeViewConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA4dH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,GAAG,CAuBnF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,GAAG,GACX;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsE5C;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,UAEjF;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIvD"}
|
|
@@ -3,6 +3,7 @@ import type { GetTransformProps, GetTransformResponse } from './types';
|
|
|
3
3
|
type Props = GetTransformProps & {
|
|
4
4
|
userSetting?: GetTransformResponse;
|
|
5
5
|
};
|
|
6
|
+
export declare function findUserBabelConfig(projectRoot?: string): string | null;
|
|
6
7
|
export declare function getBabelOptions(props: Props): babel.TransformOptions | null;
|
|
7
8
|
/**
|
|
8
9
|
* Run the react compiler through oxc's rust port instead of babel.
|
|
@@ -13,7 +14,9 @@ export declare function getBabelOptions(props: Props): babel.TransformOptions |
|
|
|
13
14
|
* still applies the project's jsxImportSource and dev-mode settings, exactly
|
|
14
15
|
* as it did when babel only stripped types here.
|
|
15
16
|
*/
|
|
16
|
-
export declare function transformOxcReactCompiler(id: string, code: string,
|
|
17
|
+
export declare function transformOxcReactCompiler(id: string, code: string, optionsOrTarget?: '18' | '19' | (Record<string, any> & {
|
|
18
|
+
target?: '18' | '19';
|
|
19
|
+
}), sourceMap?: boolean): Promise<{
|
|
17
20
|
code: string;
|
|
18
21
|
map: any;
|
|
19
22
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformBabel.d.ts","sourceRoot":"","sources":["../src/transformBabel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformBabel.d.ts","sourceRoot":"","sources":["../src/transformBabel.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,KAAK,MAAM,aAAa,CAAA;AAKzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAEtE,KAAK,KAAK,GAAG,iBAAiB,GAAG;IAC/B,WAAW,CAAC,EAAE,oBAAoB,CAAA;CACnC,CAAA;AAcD,wBAAgB,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBvE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAkC3E;AAuDD;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,eAAe,GAAE,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAAQ,EACtF,SAAS,UAAQ;;;GAyClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,KAAK,CAAC,gBAAgB,kCAsDhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformHermesLoops.d.ts","sourceRoot":"","sources":["../src/transformHermesLoops.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformHermesLoops.d.ts","sourceRoot":"","sources":["../src/transformHermesLoops.ts"],"names":[],"mappings":"AAibA,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,GAAG,EAAE,CAAA;CAAE,GAAG,IAAI,CAgBtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformSWC.d.ts","sourceRoot":"","sources":["../src/transformSWC.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAKD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"transformSWC.d.ts","sourceRoot":"","sources":["../src/transformSWC.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAKD,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAWjE;AAED,wBAAsB,YAAY,CAChC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,EACpC,UAAU,CAAC,EAAE,GAAG,GACf,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkI7B;AAED,eAAO,MAAM,YAAY,qBAAe,CAAA;AA+HxC,wBAAgB,eAAe,YAE9B;AAyBD,eAAO,MAAM,oBAAoB,GAAU,IAAI,MAAM,EAAE,MAAM,MAAM;;SAwBxB,GAAG;cAC7C,CAAA;AAED,eAAO,MAAM,oBAAoB,OA3Bc,MAAM,QAAQ,MAAM;;SAwBxB,GAAG;cAGU,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformWorklets.d.ts","sourceRoot":"","sources":["../src/transformWorklets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformWorklets.d.ts","sourceRoot":"","sources":["../src/transformWorklets.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,sCAAsC,UAiBlD,CAAA;AAiCD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,WAWjF;AAED,wBAAgB,kBAAkB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA8DlF;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,CAAA;AAGD,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAA;AAEtE,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,UAAU,UAAQ,EAClB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAEtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoworklet.d.ts","sourceRoot":"","sources":["../../src/worklets/autoworklet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAK/C,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAoC9D,CAAA;AAOD,eAAO,MAAM,uBAAuB,aAWlC,CAAA;AAoHF,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"autoworklet.d.ts","sourceRoot":"","sources":["../../src/worklets/autoworklet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAK/C,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAoC9D,CAAA;AAOD,eAAO,MAAM,uBAAuB,aAWlC,CAAA;AAoHF,eAAO,MAAM,kBAAkB,UAI9B,CAAA;AAWD,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAsBpE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAa1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,GAAG,GAAG,gBAAgB,EAAE,CAgKtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/worklets/scope.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/worklets/scope.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAoY/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/worklets/serialize.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../src/worklets/serialize.ts"],"names":[],"mappings":"AA0BA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,CA+BR;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,GAAG,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,MAAM,CAqCR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/worklets/transform.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../src/worklets/transform.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAA;AAQvD,wBAAgB,+BAA+B,CAC7C,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,UAAU,UAAQ,GACjB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,IAAI,CAiCpC;AAsCD,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,UAAU,UAAQ,EAClB,OAAO,CAAC,EAAE,wBAAwB,EAClC,gBAAgB,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,GACrE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,CAmP7B"}
|