@vxrn/compiler 1.1.546 → 1.1.547-1762219526973

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.
@@ -21,12 +21,10 @@ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
21
  }), mod);
22
22
  var index_exports = {};
23
23
  __export(index_exports, {
24
- clearCompilerCache: () => clearCompilerCache,
25
24
  createVXRNCompilerPlugin: () => createVXRNCompilerPlugin
26
25
  });
27
26
  module.exports = __toCommonJS(index_exports);
28
27
  var import_utils = require("@vxrn/utils"),
29
- import_node_crypto = require("node:crypto"),
30
28
  import_node_fs = require("node:fs"),
31
29
  import_promises = require("node:fs/promises"),
32
30
  import_node_path = require("node:path"),
@@ -38,14 +36,85 @@ var import_utils = require("@vxrn/utils"),
38
36
  __reExport(index_exports, require("./configure.cjs"), module.exports);
39
37
  __reExport(index_exports, require("./transformBabel.cjs"), module.exports);
40
38
  __reExport(index_exports, require("./transformSWC.cjs"), module.exports);
41
- const import_meta = {},
42
- getCacheId = (environment, id) => `${environment}${id}`,
43
- getCacheHash = code => (0, import_node_crypto.createHash)("sha1").update(code).digest("base64"),
44
- clearCompilerCache = () => {
45
- memoryCache = {}, cacheSize = 0;
46
- };
47
- let memoryCache = {},
48
- cacheSize = 0;
39
+ const import_meta = {};
40
+ async function performBabelTransform({
41
+ id,
42
+ code,
43
+ environment,
44
+ production,
45
+ reactForRNVersion,
46
+ optionsIn
47
+ }) {
48
+ const transformProps = {
49
+ id,
50
+ code,
51
+ development: !production,
52
+ environment,
53
+ reactForRNVersion
54
+ },
55
+ userTransform = optionsIn?.transform?.(transformProps);
56
+ if (userTransform === !1) return null;
57
+ if (!id.startsWith("vxrn-swc-preprocess:") && userTransform !== "swc") {
58
+ const babelOptions = (0, import_transformBabel.getBabelOptions)({
59
+ ...transformProps,
60
+ userSetting: userTransform
61
+ });
62
+ if (babelOptions) {
63
+ const babelOut = await (0, import_transformBabel.transformBabel)(id, code, babelOptions);
64
+ if (babelOut?.code) return (0, import_constants.debug)?.(`[babel] ${id}`), {
65
+ code: `${babelOut.code}
66
+ // vxrn-did-babel`,
67
+ map: babelOut.map
68
+ };
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ async function performFullTransform({
74
+ codeIn,
75
+ _id,
76
+ environment,
77
+ production,
78
+ reactForRNVersion,
79
+ optionsIn,
80
+ mode
81
+ }) {
82
+ const shouldDebug = process.env.NODE_ENV === "development" && codeIn.startsWith("// debug");
83
+ shouldDebug && (console.info(`[one] ${_id} input:`), console.info(codeIn));
84
+ let id = _id.split("?")[0];
85
+ const extension = (0, import_node_path.extname)(id);
86
+ if (extension === ".css" || !import_constants.validParsers.has(extension)) return;
87
+ const isPreProcess = id.startsWith("vxrn-swc-preprocess:");
88
+ if (isPreProcess && (id = id.replace("vxrn-swc-preprocess:", "")), id.includes("virtual:")) return;
89
+ let code = codeIn,
90
+ out = null;
91
+ if (codeIn.endsWith("// vxrn-did-babel")) (0, import_constants.debug)?.(`[skip babel] ${id}`);else {
92
+ const babelResult = await performBabelTransform({
93
+ id,
94
+ code,
95
+ environment,
96
+ production,
97
+ reactForRNVersion,
98
+ optionsIn
99
+ });
100
+ babelResult && (out = babelResult, code = babelResult.code);
101
+ }
102
+ const swcOptions = {
103
+ environment,
104
+ mode: optionsIn?.mode || mode,
105
+ production,
106
+ ...optionsIn
107
+ },
108
+ swcOut = await (0, import_transformSWC.transformSWC)(id, code, {
109
+ es5: !0,
110
+ noHMR: isPreProcess || environment === "ssr",
111
+ ...swcOptions
112
+ });
113
+ return swcOut && ((0, import_constants.debug)?.(`[swc] ${id}`), out = {
114
+ code: swcOut.code,
115
+ map: swcOut.map
116
+ }), shouldDebug && (console.info("swcOptions", swcOptions), console.info("final output:", out?.code)), out;
117
+ }
49
118
  async function createVXRNCompilerPlugin(optionsIn) {
50
119
  const reactVersion = await (async () => {
51
120
  const path = (0, import_utils.resolvePath)("react/package.json");
@@ -114,19 +183,48 @@ ${rootJS.code}
114
183
  name: "one:compiler",
115
184
  enforce: "pre",
116
185
  config: () => {
117
- const config2 = {
118
- esbuild: !1,
186
+ const createEnvironmentConfig = environment => ({
119
187
  optimizeDeps: {
120
- noDiscovery: !0
188
+ esbuildOptions: {
189
+ plugins: [{
190
+ name: `transform-before-optimize-deps-${environment}`,
191
+ setup(build) {
192
+ build.onLoad({
193
+ filter: /node_modules\/.*\.(tsx?|jsx?|mjs|cjs)$/
194
+ }, async args => {
195
+ const production = process.env.NODE_ENV === "production",
196
+ code = await (0, import_promises.readFile)(args.path, "utf-8");
197
+ (0, import_constants.debug)?.(`[esbuild optimizeDeps] ${args.path}`);
198
+ const result = await performBabelTransform({
199
+ id: args.path,
200
+ code,
201
+ environment,
202
+ production,
203
+ reactForRNVersion,
204
+ optionsIn
205
+ });
206
+ if (!result) return null;
207
+ const ext = (0, import_node_path.extname)(args.path),
208
+ loader = ext === ".tsx" ? "tsx" : ext === ".ts" ? "ts" : ext === ".jsx" ? "jsx" : "js";
209
+ return {
210
+ contents: result.code,
211
+ loader
212
+ };
213
+ });
214
+ }
215
+ }]
216
+ }
121
217
  },
122
218
  define: {
123
- "process.env.NATIVEWIND_OS": "native"
219
+ "process.env.NATIVEWIND_OS": JSON.stringify(environment === "ios" || environment === "android" ? "native" : "web")
124
220
  }
125
- };
221
+ });
126
222
  return {
127
223
  environments: {
128
- ios: config2,
129
- android: config2
224
+ ios: createEnvironmentConfig("ios"),
225
+ android: createEnvironmentConfig("android"),
226
+ client: createEnvironmentConfig("client"),
227
+ ssr: createEnvironmentConfig("ssr")
130
228
  }
131
229
  };
132
230
  },
@@ -138,62 +236,17 @@ ${rootJS.code}
138
236
  const environment = getEnvName(this.environment.name),
139
237
  isNative = environment === "ios" || environment === "android",
140
238
  production = process.env.NODE_ENV === "production" || JSON.parse(this.environment.config?.define?.["process.env.NODE_ENV"] || '""') === "production";
141
- if (_id.includes("one-entry-native")) return isNative && !production && (code = `import '@vxrn/vite-native-client'
239
+ return _id.includes("one-entry-native") ? (isNative && !production && (code = `import '@vxrn/vite-native-client'
142
240
  ${code}`), isNative && import_configure.configuration.enableNativewind && (code = `import * as x from 'nativewind'
143
- ${code}`), code;
144
- const shouldDebug = process.env.NODE_ENV === "development" && codeIn.startsWith("// debug");
145
- shouldDebug && (console.info(`[one] ${_id} input:`), console.info(codeIn));
146
- const cacheId = getCacheId(environment, _id),
147
- cacheHash = getCacheHash(code),
148
- cached = memoryCache[cacheId];
149
- if (cached?.hash === cacheHash) return (0, import_constants.debug)?.(`Using cache ${_id} ${cacheId}`), cached.out;
150
- let id = _id.split("?")[0];
151
- const extension = (0, import_node_path.extname)(id);
152
- if (extension === ".css" || !import_constants.validParsers.has(extension)) return;
153
- const isPreProcess = id.startsWith("vxrn-swc-preprocess:");
154
- if (isPreProcess && (id = id.replace("vxrn-swc-preprocess:", "")), id.includes("virtual:")) return;
155
- const transformProps = {
156
- id,
157
- code,
158
- development: !production,
159
- environment,
160
- reactForRNVersion
161
- },
162
- userTransform = optionsIn?.transform?.(transformProps);
163
- if (userTransform === !1) return;
164
- let out = null;
165
- if (!isPreProcess && userTransform !== "swc") {
166
- const babelOptions = (0, import_transformBabel.getBabelOptions)({
167
- ...transformProps,
168
- userSetting: userTransform
169
- });
170
- if (babelOptions) {
171
- const babelOut = await (0, import_transformBabel.transformBabel)(id, code, babelOptions);
172
- babelOut?.code && ((0, import_constants.debug)?.(`[${id}] transformed with babel options: ${JSON.stringify(babelOptions)}`), out = {
173
- code: babelOut.code,
174
- map: babelOut.map
175
- });
176
- }
177
- }
178
- const swcOptions = {
179
- environment,
180
- mode: optionsIn?.mode || config.command,
181
- production,
182
- ...optionsIn
183
- },
184
- swcOut = await (0, import_transformSWC.transformSWC)(id, out?.code || code, {
185
- es5: !0,
186
- // dont need refresh for ssr, but do for client
187
- noHMR: isPreProcess || environment === "ssr",
188
- ...swcOptions
189
- });
190
- return swcOut && (out = {
191
- code: swcOut?.code,
192
- map: swcOut?.map
193
- }), shouldDebug && (console.info("swcOptions", swcOptions), console.info("final output:", out?.code)), out && (cacheSize += out?.code.length, cacheSize > 52428800 && clearCompilerCache(), memoryCache[cacheId] = {
194
- out,
195
- hash: cacheHash
196
- }), out;
241
+ ${code}`), code) : performFullTransform({
242
+ codeIn,
243
+ _id,
244
+ environment,
245
+ production,
246
+ reactForRNVersion,
247
+ optionsIn,
248
+ mode: config.command
249
+ });
197
250
  }
198
251
  }];
199
252
  }
package/dist/cjs/index.js CHANGED
@@ -14,18 +14,92 @@ var __export = (target, all) => {
14
14
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: !0 }), mod);
15
15
  var index_exports = {};
16
16
  __export(index_exports, {
17
- clearCompilerCache: () => clearCompilerCache,
18
17
  createVXRNCompilerPlugin: () => createVXRNCompilerPlugin
19
18
  });
20
19
  module.exports = __toCommonJS(index_exports);
21
- var import_utils = require("@vxrn/utils"), import_node_crypto = require("node:crypto"), import_node_fs = require("node:fs"), import_promises = require("node:fs/promises"), import_node_path = require("node:path"), import_css_to_rn = require("react-native-css-interop/css-to-rn/index.js"), import_configure = require("./configure"), import_constants = require("./constants"), import_transformBabel = require("./transformBabel"), import_transformSWC = require("./transformSWC");
20
+ var import_utils = require("@vxrn/utils"), import_node_fs = require("node:fs"), import_promises = require("node:fs/promises"), import_node_path = require("node:path"), import_css_to_rn = require("react-native-css-interop/css-to-rn/index.js"), import_configure = require("./configure"), import_constants = require("./constants"), import_transformBabel = require("./transformBabel"), import_transformSWC = require("./transformSWC");
22
21
  __reExport(index_exports, require("./configure"), module.exports);
23
22
  __reExport(index_exports, require("./transformBabel"), module.exports);
24
23
  __reExport(index_exports, require("./transformSWC"), module.exports);
25
- const import_meta = {}, getCacheId = (environment, id) => `${environment}${id}`, getCacheHash = (code) => (0, import_node_crypto.createHash)("sha1").update(code).digest("base64"), clearCompilerCache = () => {
26
- memoryCache = {}, cacheSize = 0;
27
- };
28
- let memoryCache = {}, cacheSize = 0;
24
+ const import_meta = {};
25
+ async function performBabelTransform({
26
+ id,
27
+ code,
28
+ environment,
29
+ production,
30
+ reactForRNVersion,
31
+ optionsIn
32
+ }) {
33
+ const transformProps = {
34
+ id,
35
+ code,
36
+ development: !production,
37
+ environment,
38
+ reactForRNVersion
39
+ }, userTransform = optionsIn?.transform?.(transformProps);
40
+ if (userTransform === !1)
41
+ return null;
42
+ if (!id.startsWith("vxrn-swc-preprocess:") && userTransform !== "swc") {
43
+ const babelOptions = (0, import_transformBabel.getBabelOptions)({
44
+ ...transformProps,
45
+ userSetting: userTransform
46
+ });
47
+ if (babelOptions) {
48
+ const babelOut = await (0, import_transformBabel.transformBabel)(id, code, babelOptions);
49
+ if (babelOut?.code)
50
+ return (0, import_constants.debug)?.(`[babel] ${id}`), { code: `${babelOut.code}
51
+ // vxrn-did-babel`, map: babelOut.map };
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+ async function performFullTransform({
57
+ codeIn,
58
+ _id,
59
+ environment,
60
+ production,
61
+ reactForRNVersion,
62
+ optionsIn,
63
+ mode
64
+ }) {
65
+ const shouldDebug = process.env.NODE_ENV === "development" && codeIn.startsWith("// debug");
66
+ shouldDebug && (console.info(`[one] ${_id} input:`), console.info(codeIn));
67
+ let id = _id.split("?")[0];
68
+ const extension = (0, import_node_path.extname)(id);
69
+ if (extension === ".css" || !import_constants.validParsers.has(extension))
70
+ return;
71
+ const isPreProcess = id.startsWith("vxrn-swc-preprocess:");
72
+ if (isPreProcess && (id = id.replace("vxrn-swc-preprocess:", "")), id.includes("virtual:"))
73
+ return;
74
+ let code = codeIn, out = null;
75
+ if (codeIn.endsWith("// vxrn-did-babel"))
76
+ (0, import_constants.debug)?.(`[skip babel] ${id}`);
77
+ else {
78
+ const babelResult = await performBabelTransform({
79
+ id,
80
+ code,
81
+ environment,
82
+ production,
83
+ reactForRNVersion,
84
+ optionsIn
85
+ });
86
+ babelResult && (out = babelResult, code = babelResult.code);
87
+ }
88
+ const swcOptions = {
89
+ environment,
90
+ mode: optionsIn?.mode || mode,
91
+ production,
92
+ ...optionsIn
93
+ }, swcOut = await (0, import_transformSWC.transformSWC)(id, code, {
94
+ es5: !0,
95
+ noHMR: isPreProcess || environment === "ssr",
96
+ ...swcOptions
97
+ });
98
+ return swcOut && ((0, import_constants.debug)?.(`[swc] ${id}`), out = {
99
+ code: swcOut.code,
100
+ map: swcOut.map
101
+ }), shouldDebug && (console.info("swcOptions", swcOptions), console.info("final output:", out?.code)), out;
102
+ }
29
103
  async function createVXRNCompilerPlugin(optionsIn) {
30
104
  const reactVersion = await (async () => {
31
105
  const path = (0, import_utils.resolvePath)("react/package.json");
@@ -91,19 +165,52 @@ ${rootJS.code}
91
165
  name: "one:compiler",
92
166
  enforce: "pre",
93
167
  config: () => {
94
- const config2 = {
95
- esbuild: !1,
168
+ const createEnvironmentConfig = (environment) => ({
96
169
  optimizeDeps: {
97
- noDiscovery: !0
170
+ esbuildOptions: {
171
+ plugins: [
172
+ {
173
+ name: `transform-before-optimize-deps-${environment}`,
174
+ setup(build) {
175
+ build.onLoad(
176
+ { filter: /node_modules\/.*\.(tsx?|jsx?|mjs|cjs)$/ },
177
+ async (args) => {
178
+ const production = process.env.NODE_ENV === "production", code = await (0, import_promises.readFile)(args.path, "utf-8");
179
+ (0, import_constants.debug)?.(`[esbuild optimizeDeps] ${args.path}`);
180
+ const result = await performBabelTransform({
181
+ id: args.path,
182
+ code,
183
+ environment,
184
+ production,
185
+ reactForRNVersion,
186
+ optionsIn
187
+ });
188
+ if (!result)
189
+ return null;
190
+ const ext = (0, import_node_path.extname)(args.path), loader = ext === ".tsx" ? "tsx" : ext === ".ts" ? "ts" : ext === ".jsx" ? "jsx" : "js";
191
+ return {
192
+ contents: result.code,
193
+ loader
194
+ };
195
+ }
196
+ );
197
+ }
198
+ }
199
+ ]
200
+ }
98
201
  },
99
202
  define: {
100
- "process.env.NATIVEWIND_OS": "native"
203
+ "process.env.NATIVEWIND_OS": JSON.stringify(
204
+ environment === "ios" || environment === "android" ? "native" : "web"
205
+ )
101
206
  }
102
- };
207
+ });
103
208
  return {
104
209
  environments: {
105
- ios: config2,
106
- android: config2
210
+ ios: createEnvironmentConfig("ios"),
211
+ android: createEnvironmentConfig("android"),
212
+ client: createEnvironmentConfig("client"),
213
+ ssr: createEnvironmentConfig("ssr")
107
214
  }
108
215
  };
109
216
  },
@@ -113,57 +220,17 @@ ${rootJS.code}
113
220
  async transform(codeIn, _id) {
114
221
  let code = codeIn;
115
222
  const environment = getEnvName(this.environment.name), isNative = environment === "ios" || environment === "android", production = process.env.NODE_ENV === "production" || JSON.parse(this.environment.config?.define?.["process.env.NODE_ENV"] || '""') === "production";
116
- if (_id.includes("one-entry-native"))
117
- return isNative && !production && (code = `import '@vxrn/vite-native-client'
223
+ return _id.includes("one-entry-native") ? (isNative && !production && (code = `import '@vxrn/vite-native-client'
118
224
  ${code}`), isNative && import_configure.configuration.enableNativewind && (code = `import * as x from 'nativewind'
119
- ${code}`), code;
120
- const shouldDebug = process.env.NODE_ENV === "development" && codeIn.startsWith("// debug");
121
- shouldDebug && (console.info(`[one] ${_id} input:`), console.info(codeIn));
122
- const cacheId = getCacheId(environment, _id), cacheHash = getCacheHash(code), cached = memoryCache[cacheId];
123
- if (cached?.hash === cacheHash)
124
- return (0, import_constants.debug)?.(`Using cache ${_id} ${cacheId}`), cached.out;
125
- let id = _id.split("?")[0];
126
- const extension = (0, import_node_path.extname)(id);
127
- if (extension === ".css" || !import_constants.validParsers.has(extension))
128
- return;
129
- const isPreProcess = id.startsWith("vxrn-swc-preprocess:");
130
- if (isPreProcess && (id = id.replace("vxrn-swc-preprocess:", "")), id.includes("virtual:"))
131
- return;
132
- const transformProps = {
133
- id,
134
- code,
135
- development: !production,
136
- environment,
137
- reactForRNVersion
138
- }, userTransform = optionsIn?.transform?.(transformProps);
139
- if (userTransform === !1)
140
- return;
141
- let out = null;
142
- if (!isPreProcess && userTransform !== "swc") {
143
- const babelOptions = (0, import_transformBabel.getBabelOptions)({
144
- ...transformProps,
145
- userSetting: userTransform
146
- });
147
- if (babelOptions) {
148
- const babelOut = await (0, import_transformBabel.transformBabel)(id, code, babelOptions);
149
- babelOut?.code && ((0, import_constants.debug)?.(`[${id}] transformed with babel options: ${JSON.stringify(babelOptions)}`), out = { code: babelOut.code, map: babelOut.map });
150
- }
151
- }
152
- const swcOptions = {
225
+ ${code}`), code) : performFullTransform({
226
+ codeIn,
227
+ _id,
153
228
  environment,
154
- mode: optionsIn?.mode || config.command,
155
229
  production,
156
- ...optionsIn
157
- }, swcOut = await (0, import_transformSWC.transformSWC)(id, out?.code || code, {
158
- es5: !0,
159
- // dont need refresh for ssr, but do for client
160
- noHMR: isPreProcess || environment === "ssr",
161
- ...swcOptions
230
+ reactForRNVersion,
231
+ optionsIn,
232
+ mode: config.command
162
233
  });
163
- return swcOut && (out = {
164
- code: swcOut?.code,
165
- map: swcOut?.map
166
- }), shouldDebug && (console.info("swcOptions", swcOptions), console.info("final output:", out?.code)), out && (cacheSize += out?.code.length, cacheSize > 52428800 && clearCompilerCache(), memoryCache[cacheId] = { out, hash: cacheHash }), out;
167
234
  }
168
235
  }
169
236
  ];
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "mappings": "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",
5
- "names": ["config"]
4
+ "mappings": "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",
5
+ "names": []
6
6
  }
@@ -44,7 +44,6 @@ function getBabelOptions(props) {
44
44
  return props.userSetting === "babel" ? getOptions(props, !0) : typeof props.userSetting > "u" || typeof props.userSetting == "object" && props.userSetting.transform === "babel" ? props.userSetting?.excludeDefaultPlugins ? props.userSetting : getOptions(props) : null;
45
45
  }
46
46
  const getOptions = (props, force = !1) => {
47
- const presets = [];
48
47
  let plugins = [];
49
48
  (force || shouldBabelGenerators(props)) && (plugins = getBasePlugins(props));
50
49
  const enableNativewind = import_configure.configuration.enableNativewind && (props.environment === "ios" || props.environment === "android") &&
@@ -52,42 +51,41 @@ const getOptions = (props, force = !1) => {
52
51
  !/node_modules/.test(props.id) &&
53
52
  // only needed for createElement calls, so be a bit conservative
54
53
  props.code.includes("createElement");
55
- return enableNativewind && (props.id.includes("node_modules") || plugins.push((0, import_utils.resolvePath)("react-native-css-interop/dist/babel-plugin.js"))), (enableNativewind || shouldBabelReanimated(props)) && ((0, import_constants.debug)?.("Using babel reanimated on file"), plugins.push(
54
+ return enableNativewind && (props.id.includes("node_modules") || plugins.push((0, import_utils.resolvePath)("react-native-css-interop/dist/babel-plugin.js"))), (enableNativewind || shouldBabelReanimated(props)) && ((0, import_constants.debug)?.(`Using babel reanimated on file ${props.id}`), plugins.push(
56
55
  // TODO make this configurable
57
- process.env.VXRN_WORKLET_PLUGIN ? "react-native-worklets/plugin" : "react-native-reanimated/plugin")), shouldBabelReactCompiler(props) && ((0, import_constants.debug)?.("Using babel react compiler on file"), plugins.push(getBabelReactCompilerPlugin(props))), shouldBabelReactNativeCodegen(props) && ((0, import_constants.debug)?.("Using babel @react-native/babel-plugin-codegen on file"), plugins.push("@react-native/babel-plugin-codegen")), plugins.length || presets.length ? {
58
- plugins,
59
- presets
56
+ process.env.VXRN_WORKLET_PLUGIN ? "react-native-worklets/plugin" : "react-native-reanimated/plugin")), shouldBabelReactCompiler(props) && ((0, import_constants.debug)?.("Using babel react compiler on file"), plugins.push(getBabelReactCompilerPlugin(props))), shouldBabelReactNativeCodegen(props) && ((0, import_constants.debug)?.("Using babel @react-native/babel-plugin-codegen on file"), plugins.push("@react-native/babel-plugin-codegen")), plugins.length ? {
57
+ plugins
60
58
  } : null;
61
59
  };
62
60
  async function transformBabel(id, code, options) {
63
- const compilerPlugin = options.plugins?.find(x => x && x[0] === "babel-plugin-react-compiler");
61
+ const compilerPlugin = options.plugins?.find(x => x && x[0] === "babel-plugin-react-compiler"),
62
+ extension = (0, import_node_path.extname)(id),
63
+ isTSX = extension === ".tsx",
64
+ babelOptions = {
65
+ filename: id,
66
+ compact: !1,
67
+ babelrc: !1,
68
+ configFile: !1,
69
+ sourceMaps: !1,
70
+ minified: !1,
71
+ ...options,
72
+ presets: [isTSX || extension === ".ts" ? ["@babel/preset-typescript", {
73
+ isTSX,
74
+ allExtensions: isTSX
75
+ }] : "", ...(options.presets || [])].filter(Boolean)
76
+ };
64
77
  try {
65
- const extension = (0, import_node_path.extname)(id),
66
- isTSX = extension === ".tsx",
67
- isTS = isTSX || extension === ".ts",
68
- out = await new Promise((res, rej) => {
69
- import_core.default.transform(code, {
70
- filename: id,
71
- compact: !1,
72
- babelrc: !1,
73
- configFile: !1,
74
- sourceMaps: !1,
75
- minified: !1,
76
- ...options,
77
- presets: [isTS ? ["@babel/preset-typescript", {
78
- isTSX,
79
- allExtensions: isTSX
80
- }] : "", ...(options.presets || [])].filter(Boolean)
81
- }, (err, result) => {
82
- if (!result || err) return rej(err || "no res");
83
- res(result);
84
- });
78
+ const out = await new Promise((res, rej) => {
79
+ import_core.default.transform(code, babelOptions, (err, result) => {
80
+ if (!result || err) return rej(err || "no res");
81
+ res(result);
85
82
  });
83
+ });
86
84
  return compilerPlugin &&
87
85
  // TODO this detection could be a lot faster
88
86
  out.code?.includes(compilerPlugin[1] === "18" ? "react-compiler-runtime" : "react/compiler-runtime") && console.info(` \u{1FA84} [compiler] ${(0, import_node_path.relative)(process.cwd(), id)}`), out;
89
87
  } catch (err) {
90
- console.error("[vxrn:compiler] babel transform error", err), console.error("code", code), console.error("id", id);
88
+ console.error("[vxrn:compiler] babel transform error", err, "with options", babelOptions), console.error("code", code), console.error("id", id);
91
89
  }
92
90
  }
93
91
  const getBasePlugins = ({
@@ -105,7 +103,7 @@ const getBasePlugins = ({
105
103
  id,
106
104
  environment
107
105
  }) => (environment === "ios" || environment === "android") && (NATIVE_COMPONENT_RE.test(id) || SPEC_FILE_RE.test(id)),
108
- shouldBabelReactCompiler = props => !(props.environment === "ssr" || !import_configure.configuration.enableCompiler || Array.isArray(import_configure.configuration.enableCompiler) && !import_configure.configuration.enableCompiler.includes(props.environment) || !/.*(.tsx?)$/.test(props.id) || props.id.includes("node_modules") || props.id.includes("+api.") || props.code.startsWith("// disable-compiler")),
106
+ shouldBabelReactCompiler = props => !(props.environment === "ssr" || !import_configure.configuration.enableCompiler || Array.isArray(import_configure.configuration.enableCompiler) && !import_configure.configuration.enableCompiler.includes(props.environment) || !/(\.tsx?)$/.test(props.id) || props.id.includes("node_modules") || props.id.includes("+api.") || props.code.startsWith("// disable-compiler")),
109
107
  getBabelReactCompilerPlugin = props => ["babel-plugin-react-compiler", {
110
108
  target: props.reactForRNVersion === "18" && (props.environment === "ios" || props.environment === "android") ? "18" : "19"
111
109
  }];