vxrn 2.8.0 → 2.9.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/exports/clean.mjs +128 -19
- package/dist/exports/clean.mjs.map +1 -1
- package/dist/exports/clean.native.js +147 -21
- package/dist/exports/clean.native.js.map +1 -1
- package/dist/exports/prebuild.mjs +2 -1
- package/dist/exports/prebuild.mjs.map +1 -1
- package/dist/exports/prebuild.native.js +2 -1
- package/dist/exports/prebuild.native.js.map +1 -1
- package/dist/exports/prebuildWithoutExpo.mjs +196 -7
- package/dist/exports/prebuildWithoutExpo.mjs.map +1 -1
- package/dist/exports/prebuildWithoutExpo.native.js +280 -42
- package/dist/exports/prebuildWithoutExpo.native.js.map +1 -1
- package/dist/plugins/reactNativeDevServer.mjs +1 -1
- package/dist/plugins/reactNativeDevServer.mjs.map +1 -1
- package/dist/plugins/reactNativeDevServer.native.js +1 -1
- package/dist/plugins/reactNativeDevServer.native.js.map +1 -1
- package/dist/user-interface/index.mjs +31 -24
- package/dist/user-interface/index.mjs.map +1 -1
- package/dist/user-interface/index.native.js +32 -25
- package/dist/user-interface/index.native.js.map +1 -1
- package/dist/utils/createNativeDevEngine.mjs +111 -14
- package/dist/utils/createNativeDevEngine.mjs.map +1 -1
- package/dist/utils/createNativeDevEngine.native.js +143 -14
- package/dist/utils/createNativeDevEngine.native.js.map +1 -1
- package/dist/utils/scanDepsToOptimize.mjs +10 -6
- package/dist/utils/scanDepsToOptimize.mjs.map +1 -1
- package/dist/utils/scanDepsToOptimize.native.js +12 -6
- package/dist/utils/scanDepsToOptimize.native.js.map +1 -1
- package/expo-plugin.cjs +71 -8
- package/package.json +13 -13
- package/src/exports/clean.test.ts +502 -5
- package/src/exports/clean.ts +176 -19
- package/src/exports/expoPlugin.test.mjs +44 -1
- package/src/exports/prebuild.ts +6 -0
- package/src/exports/prebuildWithoutExpo.test.ts +134 -2
- package/src/exports/prebuildWithoutExpo.ts +235 -10
- package/src/plugins/reactNativeDevServer.ts +1 -1
- package/src/user-interface/index.ts +50 -42
- package/src/utils/createNativeDevEngine.test.ts +486 -7
- package/src/utils/createNativeDevEngine.ts +220 -17
- package/src/utils/imageSizePatch.test.ts +3 -3
- package/src/utils/scanDepsToOptimize.test.ts +35 -2
- package/src/utils/scanDepsToOptimize.ts +25 -8
- package/types/exports/clean.d.ts.map +1 -1
- package/types/exports/prebuild.d.ts +2 -1
- package/types/exports/prebuild.d.ts.map +1 -1
- package/types/exports/prebuildWithoutExpo.d.ts.map +1 -1
- package/types/user-interface/index.d.ts.map +1 -1
- package/types/utils/createNativeDevEngine.d.ts +1 -1
- package/types/utils/createNativeDevEngine.d.ts.map +1 -1
- package/types/utils/scanDepsToOptimize.d.ts +25 -0
- package/types/utils/scanDepsToOptimize.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.js","names":[],"sources":["user-interface/index.native.js"],"sourcesContent":["import { exec } from \"child_process\";\nimport { getBoundPort } from \"../utils/getBoundPort\";\nimport { nativeRun } from \"../utils/nativeRun\";\nvar COMMANDS = [\n {\n keys: \"ow\",\n label: \"open web\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1mw\\x1B[0meb\",\n action: function action(ctx) {\n var _ctx_server_resolvedUrls;\n var url = (_ctx_server_resolvedUrls = ctx.server.resolvedUrls) === null || _ctx_server_resolvedUrls === void 0 ? void 0 : _ctx_server_resolvedUrls.local[0];\n if (!url) {\n console.warn(\"Cannot get the local server URL.\");\n return;\n }\n nativeOpen(url);\n }\n },\n {\n keys: \"oi\",\n label: \"open app in iOS Simulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mi\\x1B[0mOS Simulator\",\n action: function action2(ctx) {\n openIos(ctx);\n }\n },\n {\n keys: \"oa\",\n label: \"open app in Android Emulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mA\\x1B[0mndroid Emulator\",\n action: function action3(ctx) {\n openAndroid(ctx);\n }\n },\n {\n keys: \"oe\",\n label: \"open editor\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1me\\x1B[0mditor\",\n action: async function action4(ctx) {\n var { defaultEditor } = await import(\"env-editor\");\n exec(`${defaultEditor().binary} .`);\n }\n },\n // TODO this would need to be per-platform\n {\n keys: \"dt\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native \\x1B[1mD\\x1B[0mev\\x1B[1mT\\x1B[0mools\",\n action: function action5(ctx) {\n var { host, port } = ctx.server.config.server;\n var serverUrl = `http://${typeof host === \"string\" && !!host ? host : \"localhost\"}:${port}`;\n var url = new URL(\"/open-debugger\", serverUrl);\n (async function() {\n var response = await fetch(url, {\n method: \"POST\",\n signal: AbortSignal.timeout(3e3)\n }).catch(function(error) {\n if (error.name === \"TimeoutError\") {\n return null;\n }\n throw error;\n });\n if (!response) {\n } else if (response.ok === false) {\n var responseText = await response.text();\n if (responseText.includes(\"Unable to find debugger target\")) {\n return;\n }\n console.warn(`Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`);\n }\n })();\n }\n },\n {\n keys: \"?\",\n label: \"open editor\",\n terminalLabel: \"show this menu\",\n action: async function action6(ctx) {\n }\n }\n];\nasync function startUserInterface(context) {\n if (!supportsKeyboardCommands()) {\n return;\n }\n printCommandsTable(context);\n startInterceptingKeyStrokes(context);\n}\nfunction printCommandsTable(context) {\n var longestKeyLength = COMMANDS.reduce(function(max, command) {\n return Math.max(max, command.keys.length);\n }, 0);\n var commandsInfo = COMMANDS.map(function(cmd) {\n return getCommandInfoInTerminal(cmd, {\n longestKeyLength\n });\n }).join(\"\\n\");\n console.info(`\n${commandsInfo}\n`);\n}\nfunction getCommandInfoInTerminal(command) {\n var { longestKeyLength = 0 } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n return `\\x1B[90m\\u203A\\x1B[0m Press \\x1B[1m${longestKeyLength ? command.keys.padEnd(longestKeyLength, \" \") : command.keys}\\x1B[0m \\x1B[90m\\u2502\\x1B[0m ${command.terminalLabel}`;\n}\nfunction restoreTerminal() {\n var { stdin } = process;\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch (unused) {\n }\n }\n process.stdout.write(\"\\x1B[0m\");\n}\nfunction supportsKeyboardCommands() {\n var { stdin } = process;\n return Boolean(stdin.isTTY && stdin.setRawMode);\n}\nfunction startInterceptingKeyStrokes(context) {\n var { stdin } = process;\n if (!supportsKeyboardCommands()) {\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n stdin.on(\"data\", handleKeypress.bind(null, context));\n stdin.unref();\n process.on(\"exit\", restoreTerminal);\n process.on(\"SIGINT\", function() {\n restoreTerminal();\n process.exit(0);\n });\n process.on(\"SIGTERM\", function() {\n restoreTerminal();\n process.exit(0);\n });\n}\nvar pressedKeys = \"\";\nvar clearPressedKeysTimer = null;\nfunction clearPressedKeys() {\n pressedKeys = \"\";\n clearPrintedInfo();\n}\nfunction resetClearPressedKeysTimer() {\n if (clearPressedKeysTimer) {\n clearTimeout(clearPressedKeysTimer);\n }\n clearPressedKeysTimer = setTimeout(clearPressedKeys, 3e3);\n clearPressedKeysTimer.unref();\n}\nfunction handleKeypress(context, key) {\n if (key === \"\\x1B\") {\n clearPrintedInfo();\n pressedKeys = \"\";\n return;\n }\n if (key === \"?\" || key === \"/\") {\n clearPrintedInfo();\n console.info(\"> ?\\n\\u21D2 Available commands:\");\n printCommandsTable(context);\n return;\n }\n resetClearPressedKeysTimer();\n if (key === \"\\x7F\") {\n pressedKeys = pressedKeys.slice(0, -1);\n } else {\n key = key.toLowerCase();\n if (/^[a-z]$/.test(key)) {\n pressedKeys += key;\n }\n }\n if (pressedKeys.length === 0) {\n clearPrintedInfo();\n return;\n }\n var matchedCommand = COMMANDS.find(function(command) {\n return command.keys === pressedKeys;\n });\n if (matchedCommand) {\n clearPrintedInfo();\n console.info(`> ${matchedCommand.keys}\n\\u21D2 ${matchedCommand.label}...`);\n pressedKeys = \"\";\n setTimeout(function() {\n var _matchedCommand_action;\n return (_matchedCommand_action = matchedCommand.action) === null || _matchedCommand_action === void 0 ? void 0 : _matchedCommand_action.call(matchedCommand, context);\n }, 500);\n return;\n }\n if (pressedKeys.length >= 3) {\n clearPrintedInfo();\n console.info(`> ${pressedKeys}\nNo matching command for \"${pressedKeys}\"! Press \"?\" for help.`);\n pressedKeys = \"\";\n return;\n }\n var possibleCommands = COMMANDS.filter(function(command) {\n return command.keys.startsWith(pressedKeys);\n });\n var commandsInfo = possibleCommands.map(function(command) {\n var matchedPart = command.keys.slice(0, pressedKeys.length);\n var remainingPart = command.keys.slice(pressedKeys.length);\n return ` \\x1B[4m${matchedPart}\\x1B[0m\\x1B[1m${remainingPart}\\x1B[0m\\x1B[90m - \\x1B[0m${command.terminalLabel}`;\n }).join(\"\\n\");\n var infoToPrint = `\n${commandsInfo}\n> ${pressedKeys}`;\n printInfo(infoToPrint);\n}\nvar lastPrintedInfo = \"\";\nfunction printInfo(info) {\n clearPrintedInfo();\n lastPrintedInfo = info;\n process.stdout.write(info);\n}\nfunction clearPrintedInfo() {\n if (lastPrintedInfo) {\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[1A\\x1B[2K\".repeat(lastPrintedInfo.split(\"\\n\").length - 1));\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[G\");\n }\n lastPrintedInfo = \"\";\n}\nfunction nativeOpen(url) {\n var start = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${start} ${url}`);\n}\nasync function openIos(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"ios\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in iOS Simulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nasync function openAndroid(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"android\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in Android Emulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nexport {\n startUserInterface\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":";;;;;AAGA,IAAI,WAAW;CACb;EACE,MAAM;EACN,OAAO;EACP,eAAe;EACf,QAAQ,SAAS,OAAO,KAAK;GAC3B,IAAI;GACJ,IAAI,OAAO,2BAA2B,IAAI,OAAO,kBAAkB,QAAQ,6BAA6B,KAAK,IAAI,KAAK,IAAI,yBAAyB,MAAM;GACzJ,IAAI,CAAC,KAAK;IACR,QAAQ,KAAK,kCAAkC;IAC/C;GACF;GACA,WAAW,GAAG;EAChB;CACF;CACA;EACE,MAAM;EACN,OAAO;EACP,eAAe;EACf,QAAQ,SAAS,QAAQ,KAAK;GAC5B,QAAQ,GAAG;EACb;CACF;CACA;EACE,MAAM;EACN,OAAO;EACP,eAAe;EACf,QAAQ,SAAS,QAAQ,KAAK;GAC5B,YAAY,GAAG;EACjB;CACF;CACA;EACE,MAAM;EACN,OAAO;EACP,eAAe;EACf,QAAQ,eAAe,QAAQ,KAAK;GAClC,IAAI,EAAE,kBAAkB,MAAM,OAAO;GACrC,KAAK,GAAG,cAAc,CAAC,CAAC,OAAO,GAAG;EACpC;CACF;CAEA;EACE,MAAM;EACN,OAAO;EACP,eAAe;EACf,QAAQ,SAAS,QAAQ,KAAK;GAC5B,IAAI,EAAE,MAAM,SAAS,IAAI,OAAO,OAAO;GACvC,IAAI,YAAY,UAAU,OAAO,SAAS,YAAY,CAAC,CAAC,OAAO,OAAO,YAAY,GAAG;GACrF,IAAI,MAAM,IAAI,IAAI,kBAAkB,SAAS;GAC7C,CAAC,iBAAiB;IAChB,IAAI,WAAW,MAAM,MAAM,KAAK;KAC9B,QAAQ;KACR,QAAQ,YAAY,QAAQ,GAAG;IACjC,CAAC,CAAC,CAAC,MAAM,SAAS,OAAO;KACvB,IAAI,MAAM,SAAS,gBAAgB;MACjC,OAAO;KACT;KACA,MAAM;IACR,CAAC;IACD,IAAI,CAAC,UAAU,CACf,OAAO,IAAI,SAAS,OAAO,OAAO;KAChC,IAAI,eAAe,MAAM,SAAS,KAAK;KACvC,IAAI,aAAa,SAAS,gCAAgC,GAAG;MAC3D;KACF;KACA,QAAQ,KAAK,yCAAyC,IAAI,WAAW,SAAS,OAAO,IAAI,aAAa,EAAE;IAC1G;GACF,EAAC,CAAE;EACL;CACF;CACA;EACE,MAAM;EACN,OAAO;EACP,eAAe;EACf,QAAQ,eAAe,QAAQ,KAAK,CACpC;CACF;AACF;AACA,eAAe,mBAAmB,SAAS;CACzC,IAAI,CAAC,yBAAyB,GAAG;EAC/B;CACF;CACA,mBAAmB,OAAO;CAC1B,4BAA4B,OAAO;AACrC;AACA,SAAS,mBAAmB,SAAS;CACnC,IAAI,mBAAmB,SAAS,OAAO,SAAS,KAAK,SAAS;EAC5D,OAAO,KAAK,IAAI,KAAK,QAAQ,KAAK,MAAM;CAC1C,GAAG,CAAC;CACJ,IAAI,eAAe,SAAS,IAAI,SAAS,KAAK;EAC5C,OAAO,yBAAyB,KAAK,EACnC,iBACF,CAAC;CACH,CAAC,CAAC,CAAC,KAAK,IAAI;CACZ,QAAQ,KAAK;EACb,aAAa;CACd;AACD;AACA,SAAS,yBAAyB,SAAS;CACzC,IAAI,EAAE,mBAAmB,MAAM,UAAU,SAAS,KAAK,UAAU,OAAO,KAAK,IAAI,UAAU,KAAK,CAAC;CACjG,OAAO,sCAAsC,mBAAmB,QAAQ,KAAK,OAAO,kBAAkB,GAAG,IAAI,QAAQ,KAAK,gCAAgC,QAAQ;AACpK;AACA,SAAS,kBAAkB;CACzB,IAAI,EAAE,UAAU;CAChB,IAAI,MAAM,SAAS,MAAM,YAAY;EACnC,IAAI;GACF,MAAM,WAAW,KAAK;EACxB,SAAS,QAAQ,CACjB;CACF;CACA,QAAQ,OAAO,MAAM,SAAS;AAChC;AACA,SAAS,2BAA2B;CAClC,IAAI,EAAE,UAAU;CAChB,OAAO,QAAQ,MAAM,SAAS,MAAM,UAAU;AAChD;AACA,SAAS,4BAA4B,SAAS;CAC5C,IAAI,EAAE,UAAU;CAChB,IAAI,CAAC,yBAAyB,GAAG;EAC/B;CACF;CACA,MAAM,WAAW,IAAI;CACrB,MAAM,OAAO;CACb,MAAM,YAAY,MAAM;CACxB,MAAM,GAAG,QAAQ,eAAe,KAAK,MAAM,OAAO,CAAC;CACnD,MAAM,MAAM;CACZ,QAAQ,GAAG,QAAQ,eAAe;CAClC,QAAQ,GAAG,UAAU,WAAW;EAC9B,gBAAgB;EAChB,QAAQ,KAAK,CAAC;CAChB,CAAC;CACD,QAAQ,GAAG,WAAW,WAAW;EAC/B,gBAAgB;EAChB,QAAQ,KAAK,CAAC;CAChB,CAAC;AACH;AACA,IAAI,cAAc;AAClB,IAAI,wBAAwB;AAC5B,SAAS,mBAAmB;CAC1B,cAAc;CACd,iBAAiB;AACnB;AACA,SAAS,6BAA6B;CACpC,IAAI,uBAAuB;EACzB,aAAa,qBAAqB;CACpC;CACA,wBAAwB,WAAW,kBAAkB,GAAG;CACxD,sBAAsB,MAAM;AAC9B;AACA,SAAS,eAAe,SAAS,KAAK;CACpC,IAAI,QAAQ,QAAQ;EAClB,iBAAiB;EACjB,cAAc;EACd;CACF;CACA,IAAI,QAAQ,OAAO,QAAQ,KAAK;EAC9B,iBAAiB;EACjB,QAAQ,KAAK,4BAAiC;EAC9C,mBAAmB,OAAO;EAC1B;CACF;CACA,2BAA2B;CAC3B,IAAI,QAAQ,KAAQ;EAClB,cAAc,YAAY,MAAM,GAAG,CAAC,CAAC;CACvC,OAAO;EACL,MAAM,IAAI,YAAY;EACtB,IAAI,UAAU,KAAK,GAAG,GAAG;GACvB,eAAe;EACjB;CACF;CACA,IAAI,YAAY,WAAW,GAAG;EAC5B,iBAAiB;EACjB;CACF;CACA,IAAI,iBAAiB,SAAS,KAAK,SAAS,SAAS;EACnD,OAAO,QAAQ,SAAS;CAC1B,CAAC;CACD,IAAI,gBAAgB;EAClB,iBAAiB;EACjB,QAAQ,KAAK,KAAK,eAAe,KAAK;SACjC,eAAe,MAAM,IAAI;EAC9B,cAAc;EACd,WAAW,WAAW;GACpB,IAAI;GACJ,QAAQ,yBAAyB,eAAe,YAAY,QAAQ,2BAA2B,KAAK,IAAI,KAAK,IAAI,uBAAuB,KAAK,gBAAgB,OAAO;EACtK,GAAG,GAAG;EACN;CACF;CACA,IAAI,YAAY,UAAU,GAAG;EAC3B,iBAAiB;EACjB,QAAQ,KAAK,KAAK,YAAY;2BACP,YAAY,uBAAuB;EAC1D,cAAc;EACd;CACF;CACA,IAAI,mBAAmB,SAAS,OAAO,SAAS,SAAS;EACvD,OAAO,QAAQ,KAAK,WAAW,WAAW;CAC5C,CAAC;CACD,IAAI,eAAe,iBAAiB,IAAI,SAAS,SAAS;EACxD,IAAI,cAAc,QAAQ,KAAK,MAAM,GAAG,YAAY,MAAM;EAC1D,IAAI,gBAAgB,QAAQ,KAAK,MAAM,YAAY,MAAM;EACzD,OAAO,YAAY,YAAY,gBAAgB,cAAc,2BAA2B,QAAQ;CAClG,CAAC,CAAC,CAAC,KAAK,IAAI;CACZ,IAAI,cAAc;EAClB,aAAa;IACX;CACF,UAAU,WAAW;AACvB;AACA,IAAI,kBAAkB;AACtB,SAAS,UAAU,MAAM;CACvB,iBAAiB;CACjB,kBAAkB;CAClB,QAAQ,OAAO,MAAM,IAAI;AAC3B;AACA,SAAS,mBAAmB;CAC1B,IAAI,iBAAiB;EACnB,QAAQ,OAAO,MAAM,SAAS;EAC9B,QAAQ,OAAO,MAAM,iBAAiB,OAAO,gBAAgB,MAAM,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;EACpF,QAAQ,OAAO,MAAM,SAAS;EAC9B,QAAQ,OAAO,MAAM,QAAQ;CAC/B;CACA,kBAAkB;AACpB;AACA,SAAS,WAAW,KAAK;CACvB,IAAI,QAAQ,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;CAC9F,KAAK,GAAG,MAAM,GAAG,KAAK;AACxB;AACA,eAAe,QAAQ,KAAK;CAC1B,IAAI,cAAc,IAAI,OAAO,OAAO;CACpC,IAAI,OAAO,aAAa,IAAI,MAAM;CAClC,IAAI;EACF,MAAM,UAAU;GACd,MAAM;GACN,UAAU;GACV;EACF,CAAC;CACH,SAAS,GAAG;EACV,IAAI,QAAQ,aAAa,QAAQ,EAAE,QAAQ;EAC3C,QAAQ,MAAM,wCAAwC,IAAI,QAAQ;EACpE,UAAU,IAAI;CACd;AACF;AACA,eAAe,YAAY,KAAK;CAC9B,IAAI,cAAc,IAAI,OAAO,OAAO;CACpC,IAAI,OAAO,aAAa,IAAI,MAAM;CAClC,IAAI;EACF,MAAM,UAAU;GACd,MAAM;GACN,UAAU;GACV;EACF,CAAC;CACH,SAAS,GAAG;EACV,IAAI,QAAQ,aAAa,QAAQ,EAAE,QAAQ;EAC3C,QAAQ,MAAM,2CAA2C,IAAI,QAAQ;EACvE,UAAU,IAAI;CACd;AACF"}
|
|
1
|
+
{"version":3,"file":"index.native.js","names":[],"sources":["user-interface/index.native.js"],"sourcesContent":["import { exec } from \"child_process\";\nimport { getBoundPort } from \"../utils/getBoundPort\";\nimport { nativeRun } from \"../utils/nativeRun\";\nvar COMMANDS = [\n {\n keys: \"ow\",\n label: \"open web\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1mw\\x1B[0meb\",\n action: function action(ctx) {\n var _ctx_server_resolvedUrls;\n var url = (_ctx_server_resolvedUrls = ctx.server.resolvedUrls) === null || _ctx_server_resolvedUrls === void 0 ? void 0 : _ctx_server_resolvedUrls.local[0];\n if (!url) {\n console.warn(\"Cannot get the local server URL.\");\n return;\n }\n nativeOpen(url);\n }\n },\n {\n keys: \"oi\",\n label: \"open app in iOS Simulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mi\\x1B[0mOS Simulator\",\n action: function action2(ctx) {\n openIos(ctx);\n }\n },\n {\n keys: \"oa\",\n label: \"open app in Android Emulator\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen app in \\x1B[1mA\\x1B[0mndroid Emulator\",\n action: function action3(ctx) {\n openAndroid(ctx);\n }\n },\n {\n keys: \"oe\",\n label: \"open editor\",\n terminalLabel: \"\\x1B[1mo\\x1B[0mpen \\x1B[1me\\x1B[0mditor\",\n action: async function action4(ctx) {\n var { defaultEditor } = await import(\"env-editor\");\n exec(`${defaultEditor().binary} .`);\n }\n },\n // TODO this would need to be per-platform\n {\n keys: \"dt\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native \\x1B[1mD\\x1B[0mev\\x1B[1mT\\x1B[0mools\",\n action: openReactNativeDevTools\n },\n {\n keys: \"j\",\n label: \"open React Native DevTools\",\n terminalLabel: \"open React Native DevTools\",\n action: openReactNativeDevTools\n },\n {\n keys: \"?\",\n label: \"show commands\",\n terminalLabel: \"show this menu\",\n action: async function action5(ctx) {\n }\n }\n];\nfunction openReactNativeDevTools(ctx) {\n var { host } = ctx.server.config.server;\n var serverUrl = `http://${typeof host === \"string\" && !!host ? host : \"localhost\"}:${getBoundPort(ctx.server)}`;\n var url = new URL(\"/open-debugger\", serverUrl);\n (async function() {\n var response = await fetch(url, {\n method: \"POST\",\n signal: AbortSignal.timeout(3e3)\n }).catch(function(error) {\n if (error.name === \"TimeoutError\") {\n return null;\n }\n throw error;\n });\n if (!response) {\n } else if (response.ok === false) {\n var responseText = await response.text();\n if (responseText.includes(\"Unable to find debugger target\")) {\n return;\n }\n console.warn(`Failed to open React Native DevTools, ${url} returns ${response.status}: ${responseText}.`);\n }\n })();\n}\nasync function startUserInterface(context) {\n if (!supportsKeyboardCommands()) {\n return;\n }\n printCommandsTable(context);\n startInterceptingKeyStrokes(context);\n}\nfunction printCommandsTable(context) {\n var longestKeyLength = COMMANDS.reduce(function(max, command) {\n return Math.max(max, command.keys.length);\n }, 0);\n var commandsInfo = COMMANDS.map(function(cmd) {\n return getCommandInfoInTerminal(cmd, {\n longestKeyLength\n });\n }).join(\"\\n\");\n console.info(`\n${commandsInfo}\n`);\n}\nfunction getCommandInfoInTerminal(command) {\n var { longestKeyLength = 0 } = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n return `\\x1B[90m\\u203A\\x1B[0m Press \\x1B[1m${longestKeyLength ? command.keys.padEnd(longestKeyLength, \" \") : command.keys}\\x1B[0m \\x1B[90m\\u2502\\x1B[0m ${command.terminalLabel}`;\n}\nfunction restoreTerminal() {\n var { stdin } = process;\n if (stdin.isTTY && stdin.setRawMode) {\n try {\n stdin.setRawMode(false);\n } catch (unused) {\n }\n }\n process.stdout.write(\"\\x1B[0m\");\n}\nfunction supportsKeyboardCommands() {\n var { stdin } = process;\n return Boolean(stdin.isTTY && stdin.setRawMode);\n}\nfunction startInterceptingKeyStrokes(context) {\n var { stdin } = process;\n if (!supportsKeyboardCommands()) {\n return;\n }\n stdin.setRawMode(true);\n stdin.resume();\n stdin.setEncoding(\"utf8\");\n stdin.on(\"data\", handleKeypress.bind(null, context));\n stdin.unref();\n process.on(\"exit\", restoreTerminal);\n process.on(\"SIGINT\", function() {\n restoreTerminal();\n process.exit(0);\n });\n process.on(\"SIGTERM\", function() {\n restoreTerminal();\n process.exit(0);\n });\n}\nvar pressedKeys = \"\";\nvar clearPressedKeysTimer = null;\nfunction clearPressedKeys() {\n pressedKeys = \"\";\n clearPrintedInfo();\n}\nfunction resetClearPressedKeysTimer() {\n if (clearPressedKeysTimer) {\n clearTimeout(clearPressedKeysTimer);\n }\n clearPressedKeysTimer = setTimeout(clearPressedKeys, 3e3);\n clearPressedKeysTimer.unref();\n}\nfunction handleKeypress(context, key) {\n if (key === \"\\x1B\") {\n clearPrintedInfo();\n pressedKeys = \"\";\n return;\n }\n if (key === \"?\" || key === \"/\") {\n clearPrintedInfo();\n console.info(\"> ?\\n\\u21D2 Available commands:\");\n printCommandsTable(context);\n return;\n }\n resetClearPressedKeysTimer();\n if (key === \"\\x7F\") {\n pressedKeys = pressedKeys.slice(0, -1);\n } else {\n key = key.toLowerCase();\n if (/^[a-z]$/.test(key)) {\n pressedKeys += key;\n }\n }\n if (pressedKeys.length === 0) {\n clearPrintedInfo();\n return;\n }\n var matchedCommand = COMMANDS.find(function(command) {\n return command.keys === pressedKeys;\n });\n if (matchedCommand) {\n clearPrintedInfo();\n console.info(`> ${matchedCommand.keys}\n\\u21D2 ${matchedCommand.label}...`);\n pressedKeys = \"\";\n setTimeout(function() {\n var _matchedCommand_action;\n return (_matchedCommand_action = matchedCommand.action) === null || _matchedCommand_action === void 0 ? void 0 : _matchedCommand_action.call(matchedCommand, context);\n }, 500);\n return;\n }\n if (pressedKeys.length >= 3) {\n clearPrintedInfo();\n console.info(`> ${pressedKeys}\nNo matching command for \"${pressedKeys}\"! Press \"?\" for help.`);\n pressedKeys = \"\";\n return;\n }\n var possibleCommands = COMMANDS.filter(function(command) {\n return command.keys.startsWith(pressedKeys);\n });\n var commandsInfo = possibleCommands.map(function(command) {\n var matchedPart = command.keys.slice(0, pressedKeys.length);\n var remainingPart = command.keys.slice(pressedKeys.length);\n return ` \\x1B[4m${matchedPart}\\x1B[0m\\x1B[1m${remainingPart}\\x1B[0m\\x1B[90m - \\x1B[0m${command.terminalLabel}`;\n }).join(\"\\n\");\n var infoToPrint = `\n${commandsInfo}\n> ${pressedKeys}`;\n printInfo(infoToPrint);\n}\nvar lastPrintedInfo = \"\";\nfunction printInfo(info) {\n clearPrintedInfo();\n lastPrintedInfo = info;\n process.stdout.write(info);\n}\nfunction clearPrintedInfo() {\n if (lastPrintedInfo) {\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[1A\\x1B[2K\".repeat(lastPrintedInfo.split(\"\\n\").length - 1));\n process.stdout.write(\"\\x1B[2K\");\n process.stdout.write(\"\\x1B[G\");\n }\n lastPrintedInfo = \"\";\n}\nfunction nativeOpen(url) {\n var start = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${start} ${url}`);\n}\nasync function openIos(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"ios\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in iOS Simulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nasync function openAndroid(ctx) {\n var projectRoot = ctx.server.config.root;\n var port = getBoundPort(ctx.server);\n try {\n await nativeRun({\n root: projectRoot,\n platform: \"android\",\n port\n });\n } catch (e) {\n var stack = e instanceof Error ? e.stack : null;\n console.error(`Failed to open app in Android Emulator: ${e}${stack ? `\n${stack}` : \"\"}`);\n }\n}\nexport {\n startUserInterface\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"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"}
|
|
@@ -3,9 +3,11 @@ import { basename, dirname, extname, join, relative, resolve } from "node:path";
|
|
|
3
3
|
import { copyFileSync, existsSync, mkdirSync, readFileSync, readdirSync, realpathSync, statSync, watch, writeFileSync } from "node:fs";
|
|
4
4
|
import { pathToFileURL } from "node:url";
|
|
5
5
|
import micromatch from "micromatch";
|
|
6
|
+
import { parseSync } from "oxc-parser";
|
|
6
7
|
import { loadEnv, normalizePath } from "vite";
|
|
7
8
|
import { shouldStripFlow, transformHermesAsync } from "@vxrn/compiler";
|
|
8
9
|
import { resolvePath } from "@vxrn/resolve";
|
|
10
|
+
import { nativeAppDefines } from "@vxrn/utils/nativeAppManifest";
|
|
9
11
|
import { withExpoPublicEnvAliases } from "@vxrn/utils/publicEnv";
|
|
10
12
|
import { DEFAULT_ASSET_EXTS } from "../constants/defaults.mjs";
|
|
11
13
|
import { getNativePrelude } from "../runtime/native-prelude.mjs";
|
|
@@ -124,6 +126,7 @@ function getNativeTransformConfig(platform, dev, root) {
|
|
|
124
126
|
jsx: { runtime: "classic" },
|
|
125
127
|
define: {
|
|
126
128
|
...userDefines,
|
|
129
|
+
...nativeAppDefines(entryConfig.app),
|
|
127
130
|
...envDefines,
|
|
128
131
|
"process.env.NODE_ENV": JSON.stringify(mode),
|
|
129
132
|
"process.env.VXRN_REACT_19": "false",
|
|
@@ -150,7 +153,7 @@ function getNativeTransformConfig(platform, dev, root) {
|
|
|
150
153
|
inject: { React: "react" }
|
|
151
154
|
};
|
|
152
155
|
}
|
|
153
|
-
function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, onAsset, sourceMaps = false, userPlugins = []) {
|
|
156
|
+
function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, onAsset, sourceMaps = false, userPlugins = [], minify = false) {
|
|
154
157
|
const context = {
|
|
155
158
|
root,
|
|
156
159
|
platform,
|
|
@@ -171,6 +174,7 @@ function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest,
|
|
|
171
174
|
rnCodegenPlugin({ projectRoot: root }),
|
|
172
175
|
flowStripPlugin(),
|
|
173
176
|
vxrnCompilerPlugin(platform, dev, root, sourceMaps),
|
|
177
|
+
mixedNativeModulePlugin(sourceMaps),
|
|
174
178
|
nativeAnimatedGuardPlugin(),
|
|
175
179
|
assetPlugin({
|
|
176
180
|
root,
|
|
@@ -178,7 +182,7 @@ function getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest,
|
|
|
178
182
|
assetsDest,
|
|
179
183
|
onAsset
|
|
180
184
|
}),
|
|
181
|
-
hermesCompatSWCPlugin(dev, sourceMaps),
|
|
185
|
+
hermesCompatSWCPlugin(dev, sourceMaps, !minify),
|
|
182
186
|
hermesLoopsPlugin(sourceMaps),
|
|
183
187
|
...userPlugins,
|
|
184
188
|
nativeExportsPrecedencePlugin(root, platform),
|
|
@@ -193,11 +197,76 @@ function getNativeOutputOptions(prelude, sourcemap, minify) {
|
|
|
193
197
|
intro: prelude,
|
|
194
198
|
codeSplitting: false,
|
|
195
199
|
strictExecutionOrder: true,
|
|
196
|
-
minify: minify || "dce-only"
|
|
200
|
+
minify: minify || "dce-only",
|
|
201
|
+
keepNames: !minify
|
|
197
202
|
};
|
|
198
203
|
}
|
|
199
204
|
function normalizeNativeCommonJSInterop(code) {
|
|
200
|
-
|
|
205
|
+
if (!code.includes("__toESM")) return code;
|
|
206
|
+
const { program, errors } = parseSync("native-bundle.js", code, { lang: "js" });
|
|
207
|
+
if (errors.length) throw new Error(`[vxrn] cannot normalize native CommonJS interop: the bundle does not parse (${errors[0].message})`);
|
|
208
|
+
const deletions = [];
|
|
209
|
+
const stack = [program];
|
|
210
|
+
while (stack.length) {
|
|
211
|
+
const node = stack.pop();
|
|
212
|
+
if (Array.isArray(node)) {
|
|
213
|
+
for (let index = node.length - 1; index >= 0; index--) stack.push(node[index]);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
if (!isInteropSyntaxNode(node)) continue;
|
|
217
|
+
if (node.type === "CallExpression") {
|
|
218
|
+
const span = interopNodeModeSpan(code, node);
|
|
219
|
+
if (span) deletions.push(span);
|
|
220
|
+
}
|
|
221
|
+
for (const key of Object.keys(node)) stack.push(node[key]);
|
|
222
|
+
}
|
|
223
|
+
deletions.sort((a, b) => b[0] - a[0]);
|
|
224
|
+
for (const [start, end] of deletions) code = code.slice(0, start) + code.slice(end);
|
|
225
|
+
return code;
|
|
226
|
+
}
|
|
227
|
+
function isInteropSyntaxNode(node) {
|
|
228
|
+
if (!node || typeof node !== "object") return false;
|
|
229
|
+
const candidate = node;
|
|
230
|
+
return typeof candidate.type === "string" && typeof candidate.start === "number" && typeof candidate.end === "number";
|
|
231
|
+
}
|
|
232
|
+
const NATIVE_INTEROP_HELPER = /^__toESM(?:\$\d+)?$/;
|
|
233
|
+
const NATIVE_INTEROP_REQUIRE = /^require[\w$]*$/;
|
|
234
|
+
function interopNodeModeSpan(code, node) {
|
|
235
|
+
const callee = node["callee"];
|
|
236
|
+
if (!isInteropSyntaxNode(callee) || !isInteropHelperCallee(callee) || node["optional"] === true) return;
|
|
237
|
+
const args = node["arguments"];
|
|
238
|
+
if (!Array.isArray(args) || args.length !== 2) return void 0;
|
|
239
|
+
const [first, second] = args;
|
|
240
|
+
if (!isInteropSyntaxNode(first) || !isInteropSyntaxNode(second)) return void 0;
|
|
241
|
+
if (!isInteropFirstArgument(first)) return void 0;
|
|
242
|
+
if (second.type !== "Literal" || second["raw"] !== "1") return void 0;
|
|
243
|
+
const between = code.slice(first.end, second.start);
|
|
244
|
+
if (!/^\s*,\s*$/.test(between)) return void 0;
|
|
245
|
+
if (!/^\s*\)/.test(code.slice(second.end))) return void 0;
|
|
246
|
+
return [first.end + between.indexOf(","), second.end];
|
|
247
|
+
}
|
|
248
|
+
function isInteropHelperCallee(callee) {
|
|
249
|
+
if (callee.type === "Identifier") return typeof callee["name"] === "string" && NATIVE_INTEROP_HELPER.test(callee["name"]);
|
|
250
|
+
if ((callee.type === "MemberExpression" || callee.type === "StaticMemberExpression") && callee["computed"] !== true) {
|
|
251
|
+
const property = callee["property"];
|
|
252
|
+
return isInteropSyntaxNode(property) && property.type === "Identifier" && typeof property["name"] === "string" && NATIVE_INTEROP_HELPER.test(property["name"]);
|
|
253
|
+
}
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
function isInteropFirstArgument(node) {
|
|
257
|
+
if (node.type === "Identifier") return true;
|
|
258
|
+
if (node.type !== "CallExpression" || node["optional"] === true) return false;
|
|
259
|
+
const callee = node["callee"];
|
|
260
|
+
if (!isInteropSyntaxNode(callee)) return false;
|
|
261
|
+
const args = node["arguments"];
|
|
262
|
+
if (!Array.isArray(args)) return false;
|
|
263
|
+
if (callee.type === "Identifier") return typeof callee["name"] === "string" && NATIVE_INTEROP_REQUIRE.test(callee["name"]) && args.length === 0;
|
|
264
|
+
if ((callee.type === "MemberExpression" || callee.type === "StaticMemberExpression") && callee["computed"] !== true && callee["optional"] !== true) {
|
|
265
|
+
const object = callee["object"];
|
|
266
|
+
const property = callee["property"];
|
|
267
|
+
return isInteropSyntaxNode(object) && object.type === "Identifier" && object["name"] === "__rolldown_runtime__" && isInteropSyntaxNode(property) && property.type === "Identifier" && property["name"] === "loadExports" && args.length === 1 && isInteropSyntaxNode(args[0]) && args[0].type === "Literal" && typeof args[0]["value"] === "string";
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
201
270
|
}
|
|
202
271
|
function blankPreservingLines(match) {
|
|
203
272
|
return "\n".repeat(match.match(/\n/g)?.length ?? 0);
|
|
@@ -412,9 +481,26 @@ try {
|
|
|
412
481
|
const chunk = result.output.find((o) => o.type === "chunk" && o.isEntry);
|
|
413
482
|
if (chunk && "code" in chunk) {
|
|
414
483
|
firstBuildError = null;
|
|
415
|
-
let code
|
|
416
|
-
|
|
417
|
-
|
|
484
|
+
let code;
|
|
485
|
+
try {
|
|
486
|
+
code = postProcessNativeBundle(chunk.code);
|
|
487
|
+
code = await downlevelClassFieldsInBundle(code);
|
|
488
|
+
assertBundleLinesPreserved(chunk.code, code, "dev");
|
|
489
|
+
} catch (error) {
|
|
490
|
+
const failure = error instanceof Error ? error : new Error(String(error));
|
|
491
|
+
console.error("[vxrn] native bundle post-processing failed:", failure.message);
|
|
492
|
+
if (!currentBundle) {
|
|
493
|
+
firstBuildError = failure;
|
|
494
|
+
if (bundleReject) {
|
|
495
|
+
const reject = bundleReject;
|
|
496
|
+
bundleResolve = null;
|
|
497
|
+
bundleReject = null;
|
|
498
|
+
bundlePromise = null;
|
|
499
|
+
reject(failure);
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
418
504
|
code = wrapNativeBundleModuleScope(code);
|
|
419
505
|
if (!chunk.map) throw new Error("[vxrn] rolldown produced no source map for the dev bundle, so /symbolicate cannot resolve a frame");
|
|
420
506
|
currentBundle = {
|
|
@@ -519,7 +605,7 @@ async function buildNativeBundle(options) {
|
|
|
519
605
|
dev,
|
|
520
606
|
platform
|
|
521
607
|
}).plugin],
|
|
522
|
-
...getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, void 0, sourcemap, userPlugins),
|
|
608
|
+
...getNativePlugins(root, platform, viteImportGlobPlugin, dev, assetsDest, void 0, sourcemap, userPlugins, minify),
|
|
523
609
|
nativeBundlePostProcessPlugin()
|
|
524
610
|
],
|
|
525
611
|
output: {
|
|
@@ -1168,6 +1254,16 @@ if (import.meta.hot) {
|
|
|
1168
1254
|
}
|
|
1169
1255
|
};
|
|
1170
1256
|
}
|
|
1257
|
+
function mixedNativeModulePlugin(sourceMaps) {
|
|
1258
|
+
return {
|
|
1259
|
+
name: "vxrn:mixed-native-module",
|
|
1260
|
+
async transform(code, id) {
|
|
1261
|
+
if (!/\.[cm]?[jt]sx?$/.test(id) || id.includes("\0")) return;
|
|
1262
|
+
const { transformMixedNativeModule } = await import("@vxrn/compiler");
|
|
1263
|
+
return transformMixedNativeModule(code, id, sourceMaps);
|
|
1264
|
+
}
|
|
1265
|
+
};
|
|
1266
|
+
}
|
|
1171
1267
|
function flowStripPlugin() {
|
|
1172
1268
|
return {
|
|
1173
1269
|
name: "vxrn:flow-strip",
|
|
@@ -1285,7 +1381,7 @@ async function getNativeAssetData(id, root, platform) {
|
|
|
1285
1381
|
};
|
|
1286
1382
|
if (NATIVE_IMAGE_EXTS.has(requested.type)) try {
|
|
1287
1383
|
const { imageSize } = await import("image-size");
|
|
1288
|
-
const dims = imageSize(files[0]);
|
|
1384
|
+
const dims = imageSize(readFileSync(files[0]));
|
|
1289
1385
|
assetData.width = dims.width === void 0 ? void 0 : dims.width / scales[0];
|
|
1290
1386
|
assetData.height = dims.height === void 0 ? void 0 : dims.height / scales[0];
|
|
1291
1387
|
} catch {}
|
|
@@ -1331,7 +1427,7 @@ function copyNativeAssetFiles(asset, assetsDest, platform) {
|
|
|
1331
1427
|
copyFileSync(asset.files[index], destination);
|
|
1332
1428
|
}
|
|
1333
1429
|
}
|
|
1334
|
-
function hermesCompatSWCPlugin(dev, sourceMaps = false) {
|
|
1430
|
+
function hermesCompatSWCPlugin(dev, sourceMaps = false, keepNames = false) {
|
|
1335
1431
|
let oxc = null;
|
|
1336
1432
|
return {
|
|
1337
1433
|
name: "vxrn:hermes-compat",
|
|
@@ -1375,7 +1471,7 @@ ${err.codeframe}` : ""));
|
|
|
1375
1471
|
output = classes;
|
|
1376
1472
|
}
|
|
1377
1473
|
}
|
|
1378
|
-
const lowered = await transformHermesAsync(output?.code ?? code, id, sourceMaps);
|
|
1474
|
+
const lowered = await transformHermesAsync(output?.code ?? code, id, sourceMaps, void 0, keepNames);
|
|
1379
1475
|
if (!lowered) return output;
|
|
1380
1476
|
if (lowered.map && output?.map) {
|
|
1381
1477
|
const remapping = (await import("@jridgewell/remapping")).default;
|
|
@@ -1546,6 +1642,10 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
|
|
|
1546
1642
|
if (!this.isExecuted(changedId)) continue;
|
|
1547
1643
|
if (!this.findBoundaries(changedId, traversed, updateSet, boundaries)) return false;
|
|
1548
1644
|
}
|
|
1645
|
+
// register the patch's factories even when no changed module has run yet,
|
|
1646
|
+
// so a later first import executes the edited code rather than a stale one
|
|
1647
|
+
if (globalThis.globalEvalWithSourceUrl) globalThis.globalEvalWithSourceUrl(code);
|
|
1648
|
+
else (0, eval)(code);
|
|
1549
1649
|
if (boundaries.length === 0) return true;
|
|
1550
1650
|
|
|
1551
1651
|
var callbacks = boundaries.map(function(item) {
|
|
@@ -1566,9 +1666,6 @@ class ReactNativeDevRuntime extends BaseDevRuntime {
|
|
|
1566
1666
|
};
|
|
1567
1667
|
}, this);
|
|
1568
1668
|
|
|
1569
|
-
if (globalThis.globalEvalWithSourceUrl) globalThis.globalEvalWithSourceUrl(code);
|
|
1570
|
-
else (0, eval)(code);
|
|
1571
|
-
|
|
1572
1669
|
var modulesToReplace = Array.from(updateSet);
|
|
1573
1670
|
for (var j = 0; j < modulesToReplace.length; j++) {
|
|
1574
1671
|
if (!this.hasFactory(modulesToReplace[j])) return false;
|