@vxrn/compiler 1.1.546 → 1.1.547-1762235181981
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/index.cjs +127 -74
- package/dist/cjs/index.js +127 -60
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/transformBabel.cjs +29 -31
- package/dist/cjs/transformBabel.js +29 -34
- package/dist/cjs/transformBabel.js.map +1 -1
- package/dist/cjs/transformSWC.cjs +3 -3
- package/dist/cjs/transformSWC.js +2 -2
- package/dist/cjs/transformSWC.js.map +1 -1
- package/dist/esm/index.js +126 -61
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/index.mjs +126 -72
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/transformBabel.js +29 -34
- package/dist/esm/transformBabel.js.map +1 -1
- package/dist/esm/transformBabel.mjs +28 -30
- package/dist/esm/transformBabel.mjs.map +1 -1
- package/dist/esm/transformSWC.js +2 -2
- package/dist/esm/transformSWC.js.map +1 -1
- package/dist/esm/transformSWC.mjs +2 -2
- package/dist/esm/transformSWC.mjs.map +1 -1
- package/package.json +7 -11
- package/src/index.ts +218 -131
- package/src/transformBabel.ts +36 -41
- package/src/transformSWC.ts +3 -3
- package/types/index.d.ts +0 -1
- package/types/index.d.ts.map +1 -1
- package/types/transformBabel.d.ts.map +1 -1
- package/types/transformSWC.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["extname","sep","transform","merge","configuration","asyncGeneratorRegex","debug","parsers","runtimePublicPath","ignoreId","RegExp","transformSWC","id","code","options","swcOptions","test","split","replace","process","cwd","parser","getParser","forceJSX","refresh","environment","production","noHMR","includes","reactConfig","development","runtime","importSource","enableNativewind","transformOptions","sourceMaps","shouldSourceMap","jsc","target","useDefineForClassFields","react","opts","es5","env","VXRN_USE_BABEL_FOR_GENERATORS","SWC_ENV","module","importInterop","type","mode","strict","finalOptions","filename","swcrc","configFile","result","JSON","stringify","e","message","fileStartIndex","indexOf","match","slice","line","column","enableNativeCSS","hasRefreshRuntime","refreshContentRE","fixNonTypeSpecificImports","syntax","typeExportsMatch","typeExport","Array","from","_export","_type","name","startsWith","fakeExport","console","info","wrapSourceInRefreshRuntime","wrapSourceInRefreshRuntimeWeb","wrapSourceInRefreshRuntimeNative","sourceMap","map","parse","mappings","postfixCode","prefixCode","prefixLen","length","fill","join","targets","node","include","exclude","VXRN_ENABLE_SOURCE_MAP","endsWith","extension","transformSWCStripJSX"],"sources":["../../src/transformSWC.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,OAAA,EAASC,GAAA,QAAW;AAC7B,SAKEC,SAAA,QACK;AACP,SAASC,KAAA,QAAa;AACtB,SAASC,aAAA,QAAqB;AAC9B,SAASC,mBAAA,EAAqBC,KAAA,EAAOC,OAAA,EAASC,iBAAA,QAAyB;AAGvE,MAAMC,QAAA,GAAW,IAAIC,MAAA,CAAO,iBAAiBT,GAAG,mBAAmBA,GAAG,EAAE;AAExE,eAAsBU,aACpBC,EAAA,EACAC,IAAA,EACAC,OAAA,EACAC,UAAA,EACA;EAUA,IATIN,QAAA,CAASO,IAAA,CAAKJ,EAAE,MAIpBA,EAAA,GAAKA,EAAA,CACFK,KAAA,CAAM,GAAG,EAAE,CAAC,EAEZC,OAAA,CAAQC,OAAA,CAAQC,GAAA,CAAI,GAAG,EAAE,GAExBR,EAAA,KAAOJ,iBAAA,GACT;EAGF,MAAMa,MAAA,GAASC,SAAA,CAAUV,EAAA,EAAIE,OAAA,CAAQS,QAAQ;EAE7C,IAAI,CAACF,MAAA,EACH;EAGF,MAAMG,OAAA,GACJV,OAAA,CAAQW,WAAA,KAAgB,SACxB,CAACX,OAAA,CAAQY,UAAA,IACT,CAACZ,OAAA,CAAQa,KAAA,IACT,CAACb,OAAA,CAAQS,QAAA,IACT,CAACX,EAAA,CAAGgB,QAAA,CAAS,cAAc;IAEvBC,WAAA,GAAc;MAClBL,OAAA;MACAM,WAAA,EAAa,CAAChB,OAAA,CAAQS,QAAA,IAAY,CAACT,OAAA,CAAQY,UAAA;MAC3CK,OAAA,EAAS;MACTC,YAAA,EAAc;MACd,IAAI5B,aAAA,CAAc6B,gBAAA,IAAoB,CAACrB,EAAA,CAAGgB,QAAA,CAAS,cAAc,IAC7D;QACEI,YAAA,EAAc;QAAA;QAAA;QAAA;QAAA;MAKhB,IACA,CAAC;IACP;IAEME,gBAAA,IAAoB,MAAkB;MAC1C,IAAIpB,OAAA,CAAQW,WAAA,KAAgB,YAAYX,OAAA,CAAQW,WAAA,KAAgB,OAC9D,OAAO;QACLU,UAAA,EAAYC,eAAA,CAAgB;QAC5BC,GAAA,EAAK;UACHC,MAAA,EAAQ;UACRjB,MAAA;UACAnB,SAAA,EAAW;YACTqC,uBAAA,EAAyB;YACzBC,KAAA,EAAOX;UACT;QACF;MACF;MAMF,MAAMY,IAAA,GAFJ3B,OAAA,CAAQ4B,GAAA,IAAQ,CAACvB,OAAA,CAAQwB,GAAA,CAAIC,6BAAA,IAAiCvC,mBAAA,CAAoBW,IAAA,CAAKH,IAAI,IAGzF;QACEwB,GAAA,EAAK;UACHhB,MAAA;UACAiB,MAAA,EAAQ;UACRpC,SAAA,EAAW;YACTqC,uBAAA,EAAyB;YACzBC,KAAA,EAAOX;UACT;QACF;MACF,IACA;QACE,IAAI,CAACf,OAAA,CAAQS,QAAA,IAAY;UAAEoB,GAAA,EAAKE;QAAQ;QACxCR,GAAA,EAAK;UACH,IAAIvB,OAAA,CAAQS,QAAA,IAAY;YAAEe,MAAA,EAAQ;UAAS;UAC3CjB,MAAA;UACAnB,SAAA,EAAW;YACTqC,uBAAA,EAAyB;YACzBC,KAAA,EAAOX;UACT;QACF;MACF;MAEJ,OAAO;QACLM,UAAA,EAAYC,eAAA,CAAgB;QAC5BU,MAAA,EAAQ;UACNC,aAAA,EAAe;UACfC,IAAA,EAAM;QACR;QACA,IAAIlC,OAAA,CAAQmC,IAAA,KAAS,eAAe;UAClCH,MAAA,EAAQ;YACNC,aAAA,EAAe;YACfC,IAAA,EAAM;YACNE,MAAA,EAAQ;UACV;QACF;QACA,GAAGT;MACL;IACF,GAAG;IAEGU,YAAA,GAAehD,KAAA,CACnB;MACEiD,QAAA,EAAUxC,EAAA;MACVyC,KAAA,EAAO;MACPC,UAAA,EAAY;MACZ,GAAGpB;IACL,GACAnB,UAAA,IAAc,CAAC,CACjB;IAEMwC,MAAA,GAAiB,OAAO,YAAY;MACxC,IAAI;QACF,OAAAjD,KAAA,GAAQ,gBAAgBM,EAAE;AAAA,EAAoB4C,IAAA,CAAKC,SAAA,CAAUN,YAAA,EAAc,MAAM,CAAC,CAAC,EAAE,GAE9E,MAAMjD,SAAA,CAAUW,IAAA,EAAMsC,YAAY;MAC3C,SAASO,CAAA,EAAQ;QACf,MAAMC,OAAA,GAAkBD,CAAA,CAAEC,OAAA;UACpBC,cAAA,GAAiBD,OAAA,CAAQE,OAAA,CAAQ,eAAK;QAC5C,IAAID,cAAA,KAAmB,IAAI;UACzB,MAAME,KAAA,GAAQH,OAAA,CAAQI,KAAA,CAAMH,cAAc,EAAEE,KAAA,CAAM,eAAe;UAC7DA,KAAA,KACFJ,CAAA,CAAEM,IAAA,GAAOF,KAAA,CAAM,CAAC,GAChBJ,CAAA,CAAEO,MAAA,GAASH,KAAA,CAAM,CAAC;QAEtB;QACA,MAAMJ,CAAA;MACR;IACF,GAAG;EAECtD,aAAA,CAAc8D,eAAA,IACZX,MAAA,CAAO1C,IAAA,CAAKe,QAAA,CAAS,uBAAuB,MAE9C2B,MAAA,CAAO1C,IAAA,GAAO;AAAA,EAAkH0C,MAAA,CAAO1C,IAAI;EAI/I,MAAMsD,iBAAA,GAAoB3C,OAAA,IAAW4C,gBAAA,CAAiBpD,IAAA,CAAKuC,MAAA,CAAO1C,IAAI;EAGtE,IACEC,OAAA,CAAQuD,yBAAA,IACPzD,EAAA,CAAGgB,QAAA,CAAS,cAAc,KAAKP,MAAA,CAAOiD,MAAA,KAAW,cAClD;IAEA,MAAMC,gBAAA,GAAmB1D,IAAA,CAAKiD,KAAA,CAAM,gCAAgC;IACpE,IAAIS,gBAAA,EACF,WAAWC,UAAA,IAAcC,KAAA,CAAMC,IAAA,CAAKH,gBAAgB,GAAG;MACrD,MAAM,CAACI,OAAA,EAASC,KAAA,EAAOC,IAAI,IAAIL,UAAA,CAAWvD,KAAA,CAAM,KAAK;MAKrD,IAHI4D,IAAA,CAAKC,UAAA,CAAW,GAAG,KAGnBD,IAAA,CAAKjD,QAAA,CAAS,GAAG,GAAG;MAOxB,IAAI,CAJoB,IAAIlB,MAAA,CAAO,qCAAqCmE,IAAI,MAAM,EAAE7D,IAAA,CAClFuC,MAAA,CAAO1C,IACT,GAEsB;QACpB,MAAMkE,UAAA,GAAa,cAAcF,IAAI;QACrCG,OAAA,CAAQC,IAAA,CACN,gGAAsFF,UAAU,OAAOnE,EAAE,EAC3G,GACA2C,MAAA,CAAO1C,IAAA,IAAQ;AAAA,EAAKkE,UAAU;AAAA;MAChC;IACF;EAEJ;EAEA,OAAIxB,MAAA,IAAU,CAACzC,OAAA,CAAQY,UAAA,IAAc,CAACZ,OAAA,CAAQa,KAAA,GACrCuD,0BAAA,CAA2BtE,EAAA,EAAI2C,MAAA,EAAQzC,OAAA,EAASqD,iBAAiB,IAGnEZ,MAAA;AACT;AAEA,SAAS2B,2BACPtE,EAAA,EACA2C,MAAA,EACAzC,OAAA,EACAqD,iBAAA,EACA;EACA,OAAIrD,OAAA,CAAQW,WAAA,KAAgB,QACnB8B,MAAA,GAELzC,OAAA,CAAQW,WAAA,KAAgB,WACnB0D,6BAAA,CAA8BvE,EAAA,EAAI2C,MAAA,EAAQY,iBAAiB,IAE7DiB,gCAAA,CAAiCxE,EAAA,EAAI2C,MAAA,EAAQzC,OAAA,EAASqD,iBAAiB;AAChF;AAEA,SAASgB,8BAA8BvE,EAAA,EAAY2C,MAAA,EAAgBY,iBAAA,EAA4B;EAC7F,MAAMkB,SAAA,GAAY9B,MAAA,CAAO+B,GAAA,GAAM9B,IAAA,CAAK+B,KAAA,CAAMhC,MAAA,CAAO+B,GAAG,IAAI;EACxD,OAAID,SAAA,KACFA,SAAA,CAAUG,QAAA,GAAW,OAAOH,SAAA,CAAUG,QAAA,GAGxCjC,MAAA,CAAO1C,IAAA,GAAO,oCAAoCL,iBAAiB;AAAA;AAAA,EAEnE+C,MAAA,CAAO1C,IAAI,IAEPsD,iBAAA,KACEkB,SAAA,KACFA,SAAA,CAAUG,QAAA,GAAW,WAAWH,SAAA,CAAUG,QAAA,GAE5CjC,MAAA,CAAO1C,IAAA,GAAO;AAAA;AAAA;AAAA,sDAGoCD,EAAE;AAAA;AAAA;AAAA,EAGtD2C,MAAA,CAAO1C,IAAI;AAAA;AAAA;AAAA;AAAA,IAOX0C,MAAA,CAAO1C,IAAA,IAAQ;AAAA;AAAA,mDAEkCD,EAAE;AAAA;AAAA;AAAA,wFAGmCA,EAAE;AAAA;AAAA;AAAA;AAAA,GAMjF;IAAEC,IAAA,EAAM0C,MAAA,CAAO1C,IAAA;IAAMyE,GAAA,EAAKD;EAAU;AAC7C;AAEA,SAASD,iCACPxE,EAAA,EACA2C,MAAA,EACAzC,OAAA,EACAqD,iBAAA,EACA;EACA,MAAMsB,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQpB,IAAItB,iBAAA,EAAmB;IAErB,MAAMuB,UAAA,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yEAMkD9E,EAAE;AAAA;AAAA,gBAE3DA,EAAE;AAAA;MAGRyE,SAAA,GAAY9B,MAAA,CAAO+B,GAAA,GAAM9B,IAAA,CAAK+B,KAAA,CAAMhC,MAAA,CAAO+B,GAAG,IAAI;IAExD,IAAID,SAAA,EAAW;MAEb,MAAMM,SAAA,GAAYD,UAAA,CAAWzE,KAAA,CAAM;AAAA,CAAI,EAAE2E,MAAA,GAAS;MAClDP,SAAA,CAAUG,QAAA,GAAW,IAAIf,KAAA,CAAMkB,SAAS,EAAEE,IAAA,CAAK,GAAG,EAAEC,IAAA,CAAK,EAAE,IAAIT,SAAA,CAAUG,QAAA;IAC3E;IAEA,OAAO;MACL3E,IAAA,EAAM,GAAG6E,UAAU;AAAA,EACvBnC,MAAA,CAAO1C,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQX4E,WAAW;AAAA;MAEPH,GAAA,EAAKD;IACP;EACF;EAEA,OAAA9B,MAAA,CAAO1C,IAAA,IAAQ4E,WAAA,EACRlC,MAAA;AACT;AAEA,MAAMV,OAAA,GAAU;IACdkD,OAAA,EAAS;MACPC,IAAA,EAAM;IACR;IAAA;IAEAC,OAAA,EAAS,EAAC;IAAA;IAEVC,OAAA,EAAS,CACP,oBACA,2BACA;IAAA;IAAA;IAAA;IAAA;IAKA,gCACA;IAAA;IAAA;EAEJ;EAEM9B,gBAAA,GAAmB;AAEzB,SAAShC,gBAAA,EAAkB;EACzB,OAAOjB,OAAA,CAAQwB,GAAA,CAAIwD,sBAAA,KAA2B;AAChD;AAEA,SAAS7E,UAAUV,EAAA,EAAYW,QAAA,GAAW,IAAO;EAC/C,IAAIX,EAAA,CAAGwF,QAAA,CAAS,kBAAkB,GAChC,OAAO7F,OAAA,CAAQ,MAAM;EAGvB,MAAM8F,SAAA,GAAYrG,OAAA,CAAQY,EAAE;EAC5B,IAAIS,MAAA,GAAwBgF,SAAA,GAA6B9F,OAAA,CAAQ8F,SAAS,IAAlC9F,OAAA,CAAQ,KAAK;EAErD,QAAI8F,SAAA,KAAc,SAASA,SAAA,KAAc,YACnC9E,QAAA,KACFF,MAAA,GAASd,OAAA,CAAQ,MAAM,IAGrBK,EAAA,CAAGgB,QAAA,CAAS,mBAAmB,MACjCP,MAAA,GAASd,OAAA,CAAQ,MAAM,KAIpBc,MAAA;AACT;AAEO,MAAMiF,oBAAA,GAAuB,MAAAA,CAAO1F,EAAA,EAAYC,IAAA,KAAiB;EACtE,MAAMQ,MAAA,GAASC,SAAA,CAAUV,EAAE;EAC3B,IAAKS,MAAA,EACL,OAAO,MAAMnB,SAAA,CAAUW,IAAA,EAAM;IAC3BuC,QAAA,EAAUxC,EAAA;IACVyC,KAAA,EAAO;IACPC,UAAA,EAAY;IACZnB,UAAA,EAAYC,eAAA,CAAgB;IAC5BC,GAAA,EAAK;MACHC,MAAA,EAAQ;MACRjB,MAAA;MACAnB,SAAA,EAAW;QACTqC,uBAAA,EAAyB;QACzBC,KAAA,EAAO;UACLV,WAAA,EAAa;UACbC,OAAA,EAAS;UACTP,OAAA,EAAS;QACX;MACF;IACF;EACF,CAAC;AACH","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxrn/compiler",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.547-1762235181981",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
"./package.json": "./package.json",
|
|
@@ -30,26 +30,22 @@
|
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@babel/core": "^7.28.5",
|
|
32
32
|
"@babel/plugin-transform-destructuring": "^7.28.5",
|
|
33
|
-
"@babel/plugin-transform-private-methods": "^7.27.1",
|
|
34
33
|
"@babel/plugin-transform-react-jsx": "^7.27.1",
|
|
35
34
|
"@babel/plugin-transform-regenerator": "^7.28.4",
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"@vxrn/
|
|
39
|
-
"
|
|
35
|
+
"@react-native/babel-plugin-codegen": "^0.82.1",
|
|
36
|
+
"@swc/core": "^1.14.0",
|
|
37
|
+
"@vxrn/utils": "1.1.547-1762235181981",
|
|
38
|
+
"@vxrn/vite-native-client": "1.1.547-1762235181981",
|
|
39
|
+
"babel-plugin-react-compiler": "^1.0.0",
|
|
40
40
|
"react-native-css-interop": "^0.1.22",
|
|
41
41
|
"ts-deepmerge": "^7.0.2",
|
|
42
42
|
"vite": "^7.1.12"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
-
"@tamagui/build": "^1.
|
|
45
|
+
"@tamagui/build": "^1.136.1",
|
|
46
46
|
"depcheck": "^1.4.7",
|
|
47
|
-
"react-native": "~0.79.2",
|
|
48
47
|
"rollup": "^4.29.1"
|
|
49
48
|
},
|
|
50
|
-
"peerDependencies": {
|
|
51
|
-
"react-native": "*"
|
|
52
|
-
},
|
|
53
49
|
"publishConfig": {
|
|
54
50
|
"access": "public"
|
|
55
51
|
}
|
package/src/index.ts
CHANGED
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
* to work on both native and web, and with reanimated and other babel fallbacks
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { resolvePath } from '@vxrn/utils'
|
|
7
|
-
import { createHash } from 'node:crypto'
|
|
8
6
|
import { readFileSync } from 'node:fs'
|
|
9
7
|
import { readFile } from 'node:fs/promises'
|
|
10
8
|
import { extname, join, sep } from 'node:path'
|
|
9
|
+
import { resolvePath } from '@vxrn/utils'
|
|
11
10
|
import { cssToReactNativeRuntime } from 'react-native-css-interop/css-to-rn/index.js'
|
|
12
11
|
import type { OutputChunk } from 'rollup'
|
|
13
12
|
import type { PluginOption, ResolvedConfig, UserConfig } from 'vite'
|
|
@@ -22,16 +21,157 @@ export * from './transformBabel'
|
|
|
22
21
|
export * from './transformSWC'
|
|
23
22
|
export type { GetTransform } from './types'
|
|
24
23
|
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
// Shared Babel transform logic
|
|
25
|
+
async function performBabelTransform({
|
|
26
|
+
id,
|
|
27
|
+
code,
|
|
28
|
+
environment,
|
|
29
|
+
production,
|
|
30
|
+
reactForRNVersion,
|
|
31
|
+
optionsIn,
|
|
32
|
+
}: {
|
|
33
|
+
id: string
|
|
34
|
+
code: string
|
|
35
|
+
environment: Environment
|
|
36
|
+
production: boolean
|
|
37
|
+
reactForRNVersion: '18' | '19'
|
|
38
|
+
optionsIn?: Partial<Options>
|
|
39
|
+
}) {
|
|
40
|
+
const transformProps: GetTransformProps = {
|
|
41
|
+
id,
|
|
42
|
+
code,
|
|
43
|
+
development: !production,
|
|
44
|
+
environment,
|
|
45
|
+
reactForRNVersion,
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const userTransform = optionsIn?.transform?.(transformProps)
|
|
27
49
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
50
|
+
if (userTransform === false) {
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const isPreProcess = id.startsWith(`vxrn-swc-preprocess:`)
|
|
55
|
+
|
|
56
|
+
if (!isPreProcess && userTransform !== 'swc') {
|
|
57
|
+
const babelOptions = getBabelOptions({
|
|
58
|
+
...transformProps,
|
|
59
|
+
userSetting: userTransform,
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
if (babelOptions) {
|
|
63
|
+
const babelOut = await transformBabel(id, code, babelOptions)
|
|
64
|
+
if (babelOut?.code) {
|
|
65
|
+
debug?.(`[babel] ${id}`)
|
|
66
|
+
const outCode = `${babelOut.code}\n// vxrn-did-babel`
|
|
67
|
+
return { code: outCode, map: babelOut.map }
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return null
|
|
31
73
|
}
|
|
32
74
|
|
|
33
|
-
|
|
34
|
-
|
|
75
|
+
// Full transform (Babel + SWC) for Vite transform hook
|
|
76
|
+
async function performFullTransform({
|
|
77
|
+
codeIn,
|
|
78
|
+
_id,
|
|
79
|
+
environment,
|
|
80
|
+
production,
|
|
81
|
+
reactForRNVersion,
|
|
82
|
+
optionsIn,
|
|
83
|
+
mode,
|
|
84
|
+
}: {
|
|
85
|
+
codeIn: string
|
|
86
|
+
_id: string
|
|
87
|
+
environment: Environment
|
|
88
|
+
production: boolean
|
|
89
|
+
reactForRNVersion: '18' | '19'
|
|
90
|
+
optionsIn?: Partial<Options>
|
|
91
|
+
mode: 'serve' | 'build'
|
|
92
|
+
}) {
|
|
93
|
+
const shouldDebug = process.env.NODE_ENV === 'development' && codeIn.startsWith('// debug')
|
|
94
|
+
|
|
95
|
+
if (shouldDebug) {
|
|
96
|
+
console.info(`[one] ${_id} input:`)
|
|
97
|
+
console.info(codeIn)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let id = _id.split('?')[0]
|
|
101
|
+
|
|
102
|
+
const extension = extname(id)
|
|
103
|
+
|
|
104
|
+
if (extension === '.css') {
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (!validParsers.has(extension)) {
|
|
109
|
+
return
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const isPreProcess = id.startsWith(`vxrn-swc-preprocess:`)
|
|
113
|
+
if (isPreProcess) {
|
|
114
|
+
id = id.replace(`vxrn-swc-preprocess:`, '')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (id.includes(`virtual:`)) {
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
let code = codeIn
|
|
122
|
+
let out: {
|
|
123
|
+
code: string
|
|
124
|
+
map: any
|
|
125
|
+
} | null = null
|
|
126
|
+
|
|
127
|
+
// avoid double-processing files already handled by optimizeDeps
|
|
128
|
+
if (codeIn.endsWith(`// vxrn-did-babel`)) {
|
|
129
|
+
debug?.(`[skip babel] ${id}`)
|
|
130
|
+
} else {
|
|
131
|
+
const babelResult = await performBabelTransform({
|
|
132
|
+
id,
|
|
133
|
+
code,
|
|
134
|
+
environment,
|
|
135
|
+
production,
|
|
136
|
+
reactForRNVersion,
|
|
137
|
+
optionsIn,
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
if (babelResult) {
|
|
141
|
+
out = babelResult
|
|
142
|
+
code = babelResult.code
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Always run SWC for class transforms + react refresh
|
|
147
|
+
const swcOptions = {
|
|
148
|
+
environment,
|
|
149
|
+
mode: optionsIn?.mode || mode,
|
|
150
|
+
production,
|
|
151
|
+
...optionsIn,
|
|
152
|
+
} satisfies Options
|
|
153
|
+
|
|
154
|
+
const swcOut = await transformSWC(id, code, {
|
|
155
|
+
es5: true,
|
|
156
|
+
noHMR: isPreProcess || environment === 'ssr',
|
|
157
|
+
...swcOptions,
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
if (swcOut) {
|
|
161
|
+
debug?.(`[swc] ${id}`)
|
|
162
|
+
out = {
|
|
163
|
+
code: swcOut.code,
|
|
164
|
+
map: swcOut.map,
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (shouldDebug) {
|
|
169
|
+
console.info(`swcOptions`, swcOptions)
|
|
170
|
+
console.info(`final output:`, out?.code)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return out
|
|
174
|
+
}
|
|
35
175
|
|
|
36
176
|
export async function createVXRNCompilerPlugin(
|
|
37
177
|
optionsIn?: Partial<Options>
|
|
@@ -141,21 +281,72 @@ ${rootJS.code}
|
|
|
141
281
|
enforce: 'pre',
|
|
142
282
|
|
|
143
283
|
config: () => {
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
284
|
+
const createEnvironmentConfig = (environment: Environment) => {
|
|
285
|
+
return {
|
|
286
|
+
optimizeDeps: {
|
|
287
|
+
esbuildOptions: {
|
|
288
|
+
plugins: [
|
|
289
|
+
{
|
|
290
|
+
name: `transform-before-optimize-deps-${environment}`,
|
|
291
|
+
setup(build) {
|
|
292
|
+
build.onLoad(
|
|
293
|
+
{ filter: /node_modules\/.*\.(tsx?|jsx?|mjs|cjs)$/ },
|
|
294
|
+
async (args) => {
|
|
295
|
+
const production = process.env.NODE_ENV === 'production'
|
|
296
|
+
const code = await readFile(args.path, 'utf-8')
|
|
297
|
+
|
|
298
|
+
debug?.(`[esbuild optimizeDeps] ${args.path}`)
|
|
299
|
+
|
|
300
|
+
const result = await performBabelTransform({
|
|
301
|
+
id: args.path,
|
|
302
|
+
code,
|
|
303
|
+
environment,
|
|
304
|
+
production,
|
|
305
|
+
reactForRNVersion,
|
|
306
|
+
optionsIn,
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
if (!result) {
|
|
310
|
+
return null
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Determine loader based on file extension
|
|
314
|
+
const ext = extname(args.path)
|
|
315
|
+
const loader =
|
|
316
|
+
ext === '.tsx'
|
|
317
|
+
? 'tsx'
|
|
318
|
+
: ext === '.ts'
|
|
319
|
+
? 'ts'
|
|
320
|
+
: ext === '.jsx'
|
|
321
|
+
? 'jsx'
|
|
322
|
+
: 'js'
|
|
323
|
+
|
|
324
|
+
return {
|
|
325
|
+
contents: result.code,
|
|
326
|
+
loader,
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
)
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
],
|
|
333
|
+
},
|
|
334
|
+
},
|
|
335
|
+
|
|
336
|
+
define: {
|
|
337
|
+
'process.env.NATIVEWIND_OS': JSON.stringify(
|
|
338
|
+
environment === 'ios' || environment === 'android' ? 'native' : 'web'
|
|
339
|
+
),
|
|
340
|
+
},
|
|
341
|
+
} satisfies UserConfig
|
|
342
|
+
}
|
|
154
343
|
|
|
155
344
|
return {
|
|
156
345
|
environments: {
|
|
157
|
-
ios:
|
|
158
|
-
android:
|
|
346
|
+
ios: createEnvironmentConfig('ios'),
|
|
347
|
+
android: createEnvironmentConfig('android'),
|
|
348
|
+
client: createEnvironmentConfig('client'),
|
|
349
|
+
ssr: createEnvironmentConfig('ssr'),
|
|
159
350
|
},
|
|
160
351
|
}
|
|
161
352
|
},
|
|
@@ -190,119 +381,15 @@ ${rootJS.code}
|
|
|
190
381
|
return code
|
|
191
382
|
}
|
|
192
383
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
console.info(`[one] ${_id} input:`)
|
|
197
|
-
console.info(codeIn)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const cacheId = getCacheId(environment, _id)
|
|
201
|
-
const cacheHash = getCacheHash(code)
|
|
202
|
-
const cached = memoryCache[cacheId]
|
|
203
|
-
|
|
204
|
-
if (cached?.hash === cacheHash) {
|
|
205
|
-
debug?.(`Using cache ${_id} ${cacheId}`)
|
|
206
|
-
return cached.out
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
let id = _id.split('?')[0]
|
|
210
|
-
|
|
211
|
-
const extension = extname(id)
|
|
212
|
-
|
|
213
|
-
if (extension === '.css') {
|
|
214
|
-
// handled in one:compiler-css-to-js
|
|
215
|
-
return
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (!validParsers.has(extension)) {
|
|
219
|
-
return
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// pre process = hmr just are removing jsx but leaving imports as esm
|
|
223
|
-
const isPreProcess = id.startsWith(`vxrn-swc-preprocess:`)
|
|
224
|
-
if (isPreProcess) {
|
|
225
|
-
id = id.replace(`vxrn-swc-preprocess:`, '')
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
if (id.includes(`virtual:`)) {
|
|
229
|
-
return
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const transformProps: GetTransformProps = {
|
|
233
|
-
id,
|
|
234
|
-
code,
|
|
235
|
-
development: !production,
|
|
384
|
+
return performFullTransform({
|
|
385
|
+
codeIn,
|
|
386
|
+
_id,
|
|
236
387
|
environment,
|
|
237
|
-
reactForRNVersion,
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
const userTransform = optionsIn?.transform?.(transformProps)
|
|
241
|
-
|
|
242
|
-
if (userTransform === false) {
|
|
243
|
-
return
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
let out: {
|
|
247
|
-
code: string
|
|
248
|
-
map: any
|
|
249
|
-
} | null = null
|
|
250
|
-
|
|
251
|
-
if (!isPreProcess && userTransform !== 'swc') {
|
|
252
|
-
const babelOptions = getBabelOptions({
|
|
253
|
-
...transformProps,
|
|
254
|
-
userSetting: userTransform,
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
if (babelOptions) {
|
|
258
|
-
const babelOut = await transformBabel(id, code, babelOptions)
|
|
259
|
-
if (babelOut?.code) {
|
|
260
|
-
debug?.(`[${id}] transformed with babel options: ${JSON.stringify(babelOptions)}`)
|
|
261
|
-
// TODO we may want to just avoid SWC after babel it likely is faster
|
|
262
|
-
// we'd need to have metro or metro-like preset
|
|
263
|
-
out = { code: babelOut.code, map: babelOut.map }
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// on native we always go to swc for now to ensure class transforms + react refesh
|
|
269
|
-
// we could make the babel plugin support those if we want to avoid
|
|
270
|
-
const swcOptions = {
|
|
271
|
-
environment,
|
|
272
|
-
mode: optionsIn?.mode || config.command,
|
|
273
388
|
production,
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
const swcOut = await transformSWC(id, out?.code || code, {
|
|
278
|
-
es5: true,
|
|
279
|
-
// dont need refresh for ssr, but do for client
|
|
280
|
-
noHMR: isPreProcess || environment === 'ssr',
|
|
281
|
-
...swcOptions,
|
|
389
|
+
reactForRNVersion,
|
|
390
|
+
optionsIn,
|
|
391
|
+
mode: config.command,
|
|
282
392
|
})
|
|
283
|
-
|
|
284
|
-
if (swcOut) {
|
|
285
|
-
out = {
|
|
286
|
-
code: swcOut?.code,
|
|
287
|
-
map: swcOut?.map,
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if (shouldDebug) {
|
|
292
|
-
console.info(`swcOptions`, swcOptions)
|
|
293
|
-
console.info(`final output:`, out?.code)
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
if (out) {
|
|
297
|
-
cacheSize += out?.code.length
|
|
298
|
-
// ~100Mb cache for recent compiler files
|
|
299
|
-
if (cacheSize > 52_428_800) {
|
|
300
|
-
clearCompilerCache()
|
|
301
|
-
}
|
|
302
|
-
memoryCache[cacheId] = { out, hash: cacheHash }
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
return out
|
|
306
393
|
},
|
|
307
394
|
},
|
|
308
395
|
]
|
package/src/transformBabel.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { extname, relative } from 'node:path'
|
|
1
2
|
import babel from '@babel/core'
|
|
2
3
|
import { resolvePath } from '@vxrn/utils'
|
|
3
|
-
import { extname, relative } from 'node:path'
|
|
4
4
|
import { configuration } from './configure'
|
|
5
5
|
import { asyncGeneratorRegex, debug } from './constants'
|
|
6
6
|
import type { GetTransformProps, GetTransformResponse } from './types'
|
|
@@ -26,7 +26,6 @@ export function getBabelOptions(props: Props): babel.TransformOptions | null {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
const getOptions = (props: Props, force = false): babel.TransformOptions | null => {
|
|
29
|
-
const presets: string[] = []
|
|
30
29
|
let plugins: babel.PluginItem[] = []
|
|
31
30
|
|
|
32
31
|
if (force || shouldBabelGenerators(props)) {
|
|
@@ -48,7 +47,7 @@ const getOptions = (props: Props, force = false): babel.TransformOptions | null
|
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
if (enableNativewind || shouldBabelReanimated(props)) {
|
|
51
|
-
debug?.(`Using babel reanimated on file`)
|
|
50
|
+
debug?.(`Using babel reanimated on file ${props.id}`)
|
|
52
51
|
plugins.push(
|
|
53
52
|
// TODO make this configurable
|
|
54
53
|
process.env.VXRN_WORKLET_PLUGIN
|
|
@@ -67,8 +66,8 @@ const getOptions = (props: Props, force = false): babel.TransformOptions | null
|
|
|
67
66
|
plugins.push('@react-native/babel-plugin-codegen')
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
if (plugins.length
|
|
71
|
-
return { plugins
|
|
69
|
+
if (plugins.length) {
|
|
70
|
+
return { plugins }
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
return null
|
|
@@ -79,43 +78,39 @@ const getOptions = (props: Props, force = false): babel.TransformOptions | null
|
|
|
79
78
|
*/
|
|
80
79
|
export async function transformBabel(id: string, code: string, options: babel.TransformOptions) {
|
|
81
80
|
const compilerPlugin = options.plugins?.find((x) => x && x[0] === 'babel-plugin-react-compiler')
|
|
81
|
+
const extension = extname(id)
|
|
82
|
+
const isTSX = extension === '.tsx'
|
|
83
|
+
const isTS = isTSX || extension === '.ts'
|
|
84
|
+
const babelOptions = {
|
|
85
|
+
filename: id,
|
|
86
|
+
compact: false,
|
|
87
|
+
babelrc: false,
|
|
88
|
+
configFile: false,
|
|
89
|
+
sourceMaps: false,
|
|
90
|
+
minified: false,
|
|
91
|
+
...options,
|
|
92
|
+
presets: [
|
|
93
|
+
isTS
|
|
94
|
+
? [
|
|
95
|
+
'@babel/preset-typescript',
|
|
96
|
+
{
|
|
97
|
+
isTSX,
|
|
98
|
+
allExtensions: isTSX,
|
|
99
|
+
},
|
|
100
|
+
]
|
|
101
|
+
: '',
|
|
102
|
+
...(options.presets || []),
|
|
103
|
+
].filter(Boolean),
|
|
104
|
+
}
|
|
82
105
|
|
|
83
106
|
try {
|
|
84
|
-
const extension = extname(id)
|
|
85
|
-
const isTSX = extension === '.tsx'
|
|
86
|
-
const isTS = isTSX || extension === '.ts'
|
|
87
|
-
|
|
88
107
|
const out = await new Promise<babel.BabelFileResult>((res, rej) => {
|
|
89
|
-
babel.transform(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
filename: id,
|
|
93
|
-
compact: false,
|
|
94
|
-
babelrc: false,
|
|
95
|
-
configFile: false,
|
|
96
|
-
sourceMaps: false,
|
|
97
|
-
minified: false,
|
|
98
|
-
...options,
|
|
99
|
-
presets: [
|
|
100
|
-
isTS
|
|
101
|
-
? [
|
|
102
|
-
'@babel/preset-typescript',
|
|
103
|
-
{
|
|
104
|
-
isTSX,
|
|
105
|
-
allExtensions: isTSX,
|
|
106
|
-
},
|
|
107
|
-
]
|
|
108
|
-
: '',
|
|
109
|
-
...(options.presets || []),
|
|
110
|
-
].filter(Boolean),
|
|
111
|
-
},
|
|
112
|
-
(err: any, result) => {
|
|
113
|
-
if (!result || err) {
|
|
114
|
-
return rej(err || 'no res')
|
|
115
|
-
}
|
|
116
|
-
res(result!)
|
|
108
|
+
babel.transform(code, babelOptions, (err: any, result) => {
|
|
109
|
+
if (!result || err) {
|
|
110
|
+
return rej(err || 'no res')
|
|
117
111
|
}
|
|
118
|
-
|
|
112
|
+
res(result!)
|
|
113
|
+
})
|
|
119
114
|
})
|
|
120
115
|
|
|
121
116
|
if (
|
|
@@ -130,7 +125,7 @@ export async function transformBabel(id: string, code: string, options: babel.Tr
|
|
|
130
125
|
|
|
131
126
|
return out
|
|
132
127
|
} catch (err) {
|
|
133
|
-
console.error(`[vxrn:compiler] babel transform error`, err)
|
|
128
|
+
console.error(`[vxrn:compiler] babel transform error`, err, `with options`, babelOptions)
|
|
134
129
|
console.error('code', code)
|
|
135
130
|
console.error('id', id)
|
|
136
131
|
}
|
|
@@ -162,7 +157,7 @@ const getBasePlugins = ({ development }: Props) =>
|
|
|
162
157
|
// * https://reactnative.dev/docs/turbo-native-modules-introduction#1-declare-typed-specification
|
|
163
158
|
|
|
164
159
|
const NATIVE_COMPONENT_RE = /NativeComponent\.[jt]sx?$/
|
|
165
|
-
const SPEC_FILE_RE = /[
|
|
160
|
+
const SPEC_FILE_RE = /[/\\]specs?[/\\]/
|
|
166
161
|
|
|
167
162
|
const shouldBabelReactNativeCodegen = ({ id, environment }: Props) => {
|
|
168
163
|
return (
|
|
@@ -188,7 +183,7 @@ const shouldBabelReactCompiler = (props: Props) => {
|
|
|
188
183
|
return false
|
|
189
184
|
}
|
|
190
185
|
}
|
|
191
|
-
if (
|
|
186
|
+
if (!/(\.tsx?)$/.test(props.id)) return false
|
|
192
187
|
// disable node modules for now...
|
|
193
188
|
if (props.id.includes('node_modules')) return false
|
|
194
189
|
// we had OG image generation on the server using react, this fixes a bug because compiler breaks @vercel/og
|
package/src/transformSWC.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
+
import { extname, sep } from 'node:path'
|
|
1
2
|
import {
|
|
2
|
-
transform,
|
|
3
3
|
type Output,
|
|
4
4
|
type ParserConfig,
|
|
5
5
|
type Options as SWCOptions,
|
|
6
6
|
type TransformConfig,
|
|
7
|
+
transform,
|
|
7
8
|
} from '@swc/core'
|
|
8
|
-
import { extname, sep } from 'node:path'
|
|
9
9
|
import { merge } from 'ts-deepmerge'
|
|
10
10
|
import { configuration } from './configure'
|
|
11
11
|
import { asyncGeneratorRegex, debug, parsers, runtimePublicPath } from './constants'
|
|
@@ -181,7 +181,7 @@ export async function transformSWC(
|
|
|
181
181
|
if (!alreadyExported) {
|
|
182
182
|
const fakeExport = `export let ${name} = {};`
|
|
183
183
|
console.info(
|
|
184
|
-
` ⚠️ Fixing non-type-
|
|
184
|
+
` ⚠️ Fixing non-type-specific import in node_module, this should be fixed upstream: ${fakeExport} in ${id}`
|
|
185
185
|
)
|
|
186
186
|
result.code += `\n${fakeExport}\n`
|
|
187
187
|
}
|
package/types/index.d.ts
CHANGED
|
@@ -8,6 +8,5 @@ export * from './configure';
|
|
|
8
8
|
export * from './transformBabel';
|
|
9
9
|
export * from './transformSWC';
|
|
10
10
|
export type { GetTransform } from './types';
|
|
11
|
-
export declare const clearCompilerCache: () => void;
|
|
12
11
|
export declare function createVXRNCompilerPlugin(optionsIn?: Partial<Options>): Promise<PluginOption[]>;
|
|
13
12
|
//# sourceMappingURL=index.d.ts.map
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,YAAY,EAA8B,MAAM,MAAM,CAAA;AAKpE,OAAO,KAAK,EAAkC,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtE,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AA0J3C,wBAAsB,wBAAwB,CAC5C,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CA0NzB"}
|
|
@@ -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":"AACA,OAAO,KAAK,MAAM,aAAa,CAAA;AAI/B,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;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAc3E;AAkDD;;GAEG;AACH,wBAAsB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,gBAAgB,8CAqD7F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformSWC.d.ts","sourceRoot":"","sources":["../src/transformSWC.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transformSWC.d.ts","sourceRoot":"","sources":["../src/transformSWC.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,MAAM,EAEX,KAAK,OAAO,IAAI,UAAU,EAG3B,MAAM,WAAW,CAAA;AAIlB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,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,UAAU;;;eAiLxB;AAgKD,eAAO,MAAM,oBAAoB,GAAU,IAAI,MAAM,EAAE,MAAM,MAAM,gCAqBlE,CAAA"}
|