@vxrn/vite-plugin-metro 2.0.0-beta.53.1 → 2.0.0-beta.57.1
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 +0 -2
- package/dist/cjs/index.native.cjs +0 -2
- package/dist/cjs/index.native.js +0 -2
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.cjs +48 -38
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.cjs +62 -42
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js +62 -42
- package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
- package/dist/cjs/transformer/babel-transformer.cjs +53 -4
- package/dist/cjs/transformer/babel-transformer.native.cjs +65 -6
- package/dist/cjs/transformer/babel-transformer.native.js +65 -6
- package/dist/cjs/transformer/babel-transformer.native.js.map +1 -1
- package/dist/cjs/transformer/expoVirtualEnv.cjs +92 -0
- package/dist/cjs/transformer/expoVirtualEnv.native.cjs +113 -0
- package/dist/cjs/transformer/expoVirtualEnv.native.js +115 -0
- package/dist/cjs/transformer/expoVirtualEnv.native.js.map +1 -0
- package/dist/cjs/transformer/loadBabelConfig.cjs +1 -1
- package/dist/cjs/transformer/loadBabelConfig.native.cjs +1 -1
- package/dist/cjs/transformer/loadBabelConfig.native.js +1 -1
- package/dist/cjs/transformer/loadBabelConfig.native.js.map +1 -1
- package/dist/cjs/transformer/metroNativeWorker.cjs +8 -20
- package/dist/cjs/transformer/metroNativeWorker.native.cjs +8 -20
- package/dist/cjs/transformer/metroNativeWorker.native.js +8 -20
- package/dist/cjs/transformer/metroNativeWorker.native.js.map +1 -1
- package/dist/cjs/transformer/transformSync.cjs +3 -3
- package/dist/cjs/transformer/transformSync.native.cjs +3 -3
- package/dist/cjs/transformer/transformSync.native.js +3 -3
- package/dist/cjs/transformer/transformSync.native.js.map +1 -1
- package/dist/cjs/utils/exit.cjs +1 -1
- package/dist/cjs/utils/exit.native.cjs +1 -1
- package/dist/cjs/utils/exit.native.js +1 -1
- package/dist/cjs/utils/exit.native.js.map +1 -1
- package/dist/esm/index.js +1 -2
- package/dist/esm/index.mjs +1 -2
- package/dist/esm/index.native.js +1 -2
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs +48 -38
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs.map +1 -1
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js +62 -42
- package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
- package/dist/esm/transformer/babel-transformer.mjs +133 -96
- package/dist/esm/transformer/babel-transformer.mjs.map +1 -1
- package/dist/esm/transformer/babel-transformer.native.js +147 -103
- package/dist/esm/transformer/babel-transformer.native.js.map +1 -1
- package/dist/esm/transformer/expoVirtualEnv.mjs +67 -0
- package/dist/esm/transformer/expoVirtualEnv.mjs.map +1 -0
- package/dist/esm/transformer/expoVirtualEnv.native.js +86 -0
- package/dist/esm/transformer/expoVirtualEnv.native.js.map +1 -0
- package/dist/esm/transformer/loadBabelConfig.mjs +1 -1
- package/dist/esm/transformer/loadBabelConfig.mjs.map +1 -1
- package/dist/esm/transformer/loadBabelConfig.native.js +1 -1
- package/dist/esm/transformer/loadBabelConfig.native.js.map +1 -1
- package/dist/esm/transformer/metroNativeWorker.mjs +8 -20
- package/dist/esm/transformer/metroNativeWorker.mjs.map +1 -1
- package/dist/esm/transformer/metroNativeWorker.native.js +8 -20
- package/dist/esm/transformer/metroNativeWorker.native.js.map +1 -1
- package/dist/esm/transformer/transformSync.mjs +3 -3
- package/dist/esm/transformer/transformSync.mjs.map +1 -1
- package/dist/esm/transformer/transformSync.native.js +3 -3
- package/dist/esm/transformer/transformSync.native.js.map +1 -1
- package/dist/esm/utils/exit.mjs +1 -1
- package/dist/esm/utils/exit.mjs.map +1 -1
- package/dist/esm/utils/exit.native.js +1 -1
- package/dist/esm/utils/exit.native.js.map +1 -1
- package/package.json +7 -9
- package/src/index.ts +0 -2
- package/src/metro-config/getMetroConfigFromViteConfig.test.ts +5 -0
- package/src/metro-config/getMetroConfigFromViteConfig.ts +81 -96
- package/src/plugins/metroPlugin.ts +3 -6
- package/src/transformer/babel-transformer.test.ts +118 -0
- package/src/transformer/babel-transformer.ts +82 -15
- package/src/transformer/expoVirtualEnv.integration.test.ts +106 -0
- package/src/transformer/expoVirtualEnv.test.ts +72 -0
- package/src/transformer/expoVirtualEnv.ts +115 -0
- package/src/transformer/loadBabelConfig.ts +1 -1
- package/src/transformer/metroNativeWorker.test.ts +105 -1
- package/src/transformer/metroNativeWorker.ts +12 -33
- package/src/transformer/transformSync.test.ts +22 -0
- package/src/transformer/transformSync.ts +4 -4
- package/src/utils/exit.ts +2 -2
- package/src/utils/getTerminalReporter.ts +1 -1
- package/src/utils/projectImport.ts +2 -2
- package/types/index.d.ts +0 -2
- package/types/index.d.ts.map +1 -1
- package/types/metro-config/getMetroConfigFromViteConfig.d.ts +2 -2
- package/types/metro-config/getMetroConfigFromViteConfig.d.ts.map +1 -1
- package/types/plugins/metroPlugin.d.ts +2 -4
- package/types/plugins/metroPlugin.d.ts.map +1 -1
- package/types/transformer/babel-transformer.d.ts +10 -1
- package/types/transformer/babel-transformer.d.ts.map +1 -1
- package/types/transformer/expoVirtualEnv.d.ts +8 -0
- package/types/transformer/expoVirtualEnv.d.ts.map +1 -0
- package/types/transformer/metroNativeWorker.d.ts.map +1 -1
- package/types/utils/projectImport.d.ts +2 -2
- package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.cjs +0 -59
- package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.cjs +0 -62
- package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js +0 -64
- package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
- package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.cjs +0 -35
- package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.cjs +0 -37
- package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -39
- package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
- package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs +0 -40
- package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs.map +0 -1
- package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js +0 -41
- package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
- package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs +0 -15
- package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs.map +0 -1
- package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -15
- package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
- package/src/plugins/expoManifestRequestHandlerPlugin.ts +0 -88
- package/src/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.ts +0 -28
- package/types/plugins/expoManifestRequestHandlerPlugin.d.ts +0 -14
- package/types/plugins/expoManifestRequestHandlerPlugin.d.ts.map +0 -1
- package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts +0 -5
- package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts.map +0 -1
|
@@ -25,12 +25,12 @@ function transformSync(src, babelConfig, { hermesParser }) {
|
|
|
25
25
|
return parseWithBabel(src, loadedBabelConfig);
|
|
26
26
|
}
|
|
27
27
|
if (!isTypeScript && (hermesParser || src.includes(" @flow"))) {
|
|
28
|
-
return
|
|
28
|
+
return parseWithFlow(src, loadedBabelConfig);
|
|
29
29
|
}
|
|
30
30
|
return parseWithBabel(src, loadedBabelConfig);
|
|
31
31
|
}
|
|
32
|
-
function
|
|
33
|
-
const sourceAst = require("
|
|
32
|
+
function parseWithFlow(src, babelConfig) {
|
|
33
|
+
const sourceAst = require("flow-parser").parse(src, {
|
|
34
34
|
babel: true,
|
|
35
35
|
sourceType: babelConfig.sourceType
|
|
36
36
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformSync.js","names":[],"sources":["esm/transformer/transformSync.js"],"sourcesContent":["import * as babel from \"./babel-core\";\nfunction isTypeScriptSource(fileName) {\n return fileName?.endsWith(\".ts\");\n}\nfunction isTSXSource(fileName) {\n return fileName?.endsWith(\".tsx\");\n}\nfunction transformSync(src, babelConfig, { hermesParser }) {\n const loadedBabelConfig = babel.loadOptions(\n babelConfig\n );\n if (!loadedBabelConfig) return null;\n let hasWorkletsPlugin = false;\n loadedBabelConfig.plugins = loadedBabelConfig.plugins?.filter((plugin) => {\n const workletsPlugin = plugin;\n if (workletsPlugin.key !== \"worklets\") return true;\n if (workletsPlugin.options && \"workletizableModules\" in workletsPlugin.options) {\n throw new Error(\n \"[vxrn] `workletizableModules` was removed from react-native-worklets. use `importForwarding.moduleNames`.\"\n );\n }\n if (hasWorkletsPlugin) return false;\n hasWorkletsPlugin = true;\n return true;\n });\n const isTypeScript = isTypeScriptSource(loadedBabelConfig.filename ?? \"\") || isTSXSource(loadedBabelConfig.filename ?? \"\");\n if (isTypeScript) {\n return parseWithBabel(src, loadedBabelConfig);\n }\n if (!isTypeScript && // The Hermes parser doesn't support comments or babel proposals such as export default from, meaning it has lower compatibility with larger parts\n // of the ecosystem.\n // However, React Native ships with flow syntax that isn't supported in Babel so we need to use Hermes for those files.\n // We can try to quickly detect if the file uses flow syntax by checking for the @flow pragma which is present in every React Native file.\n (hermesParser || src.includes(\" @flow\"))) {\n return
|
|
1
|
+
{"version":3,"file":"transformSync.js","names":[],"sources":["esm/transformer/transformSync.js"],"sourcesContent":["import * as babel from \"./babel-core\";\nfunction isTypeScriptSource(fileName) {\n return fileName?.endsWith(\".ts\");\n}\nfunction isTSXSource(fileName) {\n return fileName?.endsWith(\".tsx\");\n}\nfunction transformSync(src, babelConfig, { hermesParser }) {\n const loadedBabelConfig = babel.loadOptions(\n babelConfig\n );\n if (!loadedBabelConfig) return null;\n let hasWorkletsPlugin = false;\n loadedBabelConfig.plugins = loadedBabelConfig.plugins?.filter((plugin) => {\n const workletsPlugin = plugin;\n if (workletsPlugin.key !== \"worklets\") return true;\n if (workletsPlugin.options && \"workletizableModules\" in workletsPlugin.options) {\n throw new Error(\n \"[vxrn] `workletizableModules` was removed from react-native-worklets. use `importForwarding.moduleNames`.\"\n );\n }\n if (hasWorkletsPlugin) return false;\n hasWorkletsPlugin = true;\n return true;\n });\n const isTypeScript = isTypeScriptSource(loadedBabelConfig.filename ?? \"\") || isTSXSource(loadedBabelConfig.filename ?? \"\");\n if (isTypeScript) {\n return parseWithBabel(src, loadedBabelConfig);\n }\n if (!isTypeScript && // The Hermes parser doesn't support comments or babel proposals such as export default from, meaning it has lower compatibility with larger parts\n // of the ecosystem.\n // However, React Native ships with flow syntax that isn't supported in Babel so we need to use Hermes for those files.\n // We can try to quickly detect if the file uses flow syntax by checking for the @flow pragma which is present in every React Native file.\n (hermesParser || src.includes(\" @flow\"))) {\n return parseWithFlow(src, loadedBabelConfig);\n }\n return parseWithBabel(src, loadedBabelConfig);\n}\nfunction parseWithFlow(src, babelConfig) {\n const sourceAst = require(\"flow-parser\").parse(src, {\n babel: true,\n sourceType: babelConfig.sourceType\n });\n return babel.transformFromAstSync(sourceAst, src, babelConfig);\n}\nfunction parseWithBabel(src, babelConfig) {\n return babel.transformSync(src, babelConfig);\n}\nexport {\n transformSync\n};\n//# sourceMappingURL=transformSync.js.map\n"],"mappings":";;;;;;;;;;AACA,SAAS,mBAAmB,UAAU;CACpC,OAAO,UAAU,SAAS,KAAK;AACjC;AACA,SAAS,YAAY,UAAU;CAC7B,OAAO,UAAU,SAAS,MAAM;AAClC;AACA,SAAS,cAAc,KAAK,aAAa,EAAE,gBAAgB;CACzD,MAAM,oBAAoB,MAAM,YAC9B,WACF;CACA,IAAI,CAAC,mBAAmB,OAAO;CAC/B,IAAI,oBAAoB;CACxB,kBAAkB,UAAU,kBAAkB,SAAS,QAAQ,WAAW;EACxE,MAAM,iBAAiB;EACvB,IAAI,eAAe,QAAQ,YAAY,OAAO;EAC9C,IAAI,eAAe,WAAW,0BAA0B,eAAe,SAAS;GAC9E,MAAM,IAAI,MACR,2GACF;EACF;EACA,IAAI,mBAAmB,OAAO;EAC9B,oBAAoB;EACpB,OAAO;CACT,CAAC;CACD,MAAM,eAAe,mBAAmB,kBAAkB,YAAY,EAAE,KAAK,YAAY,kBAAkB,YAAY,EAAE;CACzH,IAAI,cAAc;EAChB,OAAO,eAAe,KAAK,iBAAiB;CAC9C;CACA,IAAI,CAAC,iBAIJ,gBAAgB,IAAI,SAAS,QAAQ,IAAI;EACxC,OAAO,cAAc,KAAK,iBAAiB;CAC7C;CACA,OAAO,eAAe,KAAK,iBAAiB;AAC9C;AACA,SAAS,cAAc,KAAK,aAAa;CACvC,MAAM,sBAAoB,aAAa,CAAC,CAAC,MAAM,KAAK;EAClD,OAAO;EACP,YAAY,YAAY;CAC1B,CAAC;CACD,OAAO,MAAM,qBAAqB,WAAW,KAAK,WAAW;AAC/D;AACA,SAAS,eAAe,KAAK,aAAa;CACxC,OAAO,MAAM,cAAc,KAAK,WAAW;AAC7C"}
|
|
@@ -28,12 +28,12 @@ function transformSync(src, babelConfig, param) {
|
|
|
28
28
|
return parseWithBabel(src, loadedBabelConfig);
|
|
29
29
|
}
|
|
30
30
|
if (!isTypeScript && (hermesParser || src.includes(" @flow"))) {
|
|
31
|
-
return
|
|
31
|
+
return parseWithFlow(src, loadedBabelConfig);
|
|
32
32
|
}
|
|
33
33
|
return parseWithBabel(src, loadedBabelConfig);
|
|
34
34
|
}
|
|
35
|
-
function
|
|
36
|
-
var sourceAst = require("
|
|
35
|
+
function parseWithFlow(src, babelConfig) {
|
|
36
|
+
var sourceAst = require("flow-parser").parse(src, {
|
|
37
37
|
babel: true,
|
|
38
38
|
sourceType: babelConfig.sourceType
|
|
39
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transformSync.native.js","names":[],"sources":["esm/transformer/transformSync.native.js"],"sourcesContent":["import * as babel from \"./babel-core\";\nfunction isTypeScriptSource(fileName) {\n return fileName === null || fileName === void 0 ? void 0 : fileName.endsWith(\".ts\");\n}\nfunction isTSXSource(fileName) {\n return fileName === null || fileName === void 0 ? void 0 : fileName.endsWith(\".tsx\");\n}\nfunction transformSync(src, babelConfig, param) {\n var { hermesParser } = param;\n var _loadedBabelConfig_filename, _loadedBabelConfig_filename1;\n var _loadedBabelConfig_plugins;\n var loadedBabelConfig = babel.loadOptions(babelConfig);\n if (!loadedBabelConfig) return null;\n var hasWorkletsPlugin = false;\n loadedBabelConfig.plugins = (_loadedBabelConfig_plugins = loadedBabelConfig.plugins) === null || _loadedBabelConfig_plugins === void 0 ? void 0 : _loadedBabelConfig_plugins.filter(function(plugin) {\n var workletsPlugin = plugin;\n if (workletsPlugin.key !== \"worklets\") return true;\n if (workletsPlugin.options && \"workletizableModules\" in workletsPlugin.options) {\n throw new Error(\"[vxrn] `workletizableModules` was removed from react-native-worklets. use `importForwarding.moduleNames`.\");\n }\n if (hasWorkletsPlugin) return false;\n hasWorkletsPlugin = true;\n return true;\n });\n var isTypeScript = isTypeScriptSource((_loadedBabelConfig_filename = loadedBabelConfig.filename) !== null && _loadedBabelConfig_filename !== void 0 ? _loadedBabelConfig_filename : \"\") || isTSXSource((_loadedBabelConfig_filename1 = loadedBabelConfig.filename) !== null && _loadedBabelConfig_filename1 !== void 0 ? _loadedBabelConfig_filename1 : \"\");\n if (isTypeScript) {\n return parseWithBabel(src, loadedBabelConfig);\n }\n if (!isTypeScript && // The Hermes parser doesn't support comments or babel proposals such as export default from, meaning it has lower compatibility with larger parts\n // of the ecosystem.\n // However, React Native ships with flow syntax that isn't supported in Babel so we need to use Hermes for those files.\n // We can try to quickly detect if the file uses flow syntax by checking for the @flow pragma which is present in every React Native file.\n (hermesParser || src.includes(\" @flow\"))) {\n return
|
|
1
|
+
{"version":3,"file":"transformSync.native.js","names":[],"sources":["esm/transformer/transformSync.native.js"],"sourcesContent":["import * as babel from \"./babel-core\";\nfunction isTypeScriptSource(fileName) {\n return fileName === null || fileName === void 0 ? void 0 : fileName.endsWith(\".ts\");\n}\nfunction isTSXSource(fileName) {\n return fileName === null || fileName === void 0 ? void 0 : fileName.endsWith(\".tsx\");\n}\nfunction transformSync(src, babelConfig, param) {\n var { hermesParser } = param;\n var _loadedBabelConfig_filename, _loadedBabelConfig_filename1;\n var _loadedBabelConfig_plugins;\n var loadedBabelConfig = babel.loadOptions(babelConfig);\n if (!loadedBabelConfig) return null;\n var hasWorkletsPlugin = false;\n loadedBabelConfig.plugins = (_loadedBabelConfig_plugins = loadedBabelConfig.plugins) === null || _loadedBabelConfig_plugins === void 0 ? void 0 : _loadedBabelConfig_plugins.filter(function(plugin) {\n var workletsPlugin = plugin;\n if (workletsPlugin.key !== \"worklets\") return true;\n if (workletsPlugin.options && \"workletizableModules\" in workletsPlugin.options) {\n throw new Error(\"[vxrn] `workletizableModules` was removed from react-native-worklets. use `importForwarding.moduleNames`.\");\n }\n if (hasWorkletsPlugin) return false;\n hasWorkletsPlugin = true;\n return true;\n });\n var isTypeScript = isTypeScriptSource((_loadedBabelConfig_filename = loadedBabelConfig.filename) !== null && _loadedBabelConfig_filename !== void 0 ? _loadedBabelConfig_filename : \"\") || isTSXSource((_loadedBabelConfig_filename1 = loadedBabelConfig.filename) !== null && _loadedBabelConfig_filename1 !== void 0 ? _loadedBabelConfig_filename1 : \"\");\n if (isTypeScript) {\n return parseWithBabel(src, loadedBabelConfig);\n }\n if (!isTypeScript && // The Hermes parser doesn't support comments or babel proposals such as export default from, meaning it has lower compatibility with larger parts\n // of the ecosystem.\n // However, React Native ships with flow syntax that isn't supported in Babel so we need to use Hermes for those files.\n // We can try to quickly detect if the file uses flow syntax by checking for the @flow pragma which is present in every React Native file.\n (hermesParser || src.includes(\" @flow\"))) {\n return parseWithFlow(src, loadedBabelConfig);\n }\n return parseWithBabel(src, loadedBabelConfig);\n}\nfunction parseWithFlow(src, babelConfig) {\n var sourceAst = require(\"flow-parser\").parse(src, {\n babel: true,\n sourceType: babelConfig.sourceType\n });\n return babel.transformFromAstSync(sourceAst, src, babelConfig);\n}\nfunction parseWithBabel(src, babelConfig) {\n return babel.transformSync(src, babelConfig);\n}\nexport {\n transformSync\n};\n//# sourceMappingURL=transformSync.js.map\n"],"mappings":";;;;;;;;;;AACA,SAAS,mBAAmB,UAAU;CACpC,OAAO,aAAa,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,SAAS,SAAS,KAAK;AACpF;AACA,SAAS,YAAY,UAAU;CAC7B,OAAO,aAAa,QAAQ,aAAa,KAAK,IAAI,KAAK,IAAI,SAAS,SAAS,MAAM;AACrF;AACA,SAAS,cAAc,KAAK,aAAa,OAAO;CAC9C,IAAI,EAAE,iBAAiB;CACvB,IAAI,6BAA6B;CACjC,IAAI;CACJ,IAAI,oBAAoB,MAAM,YAAY,WAAW;CACrD,IAAI,CAAC,mBAAmB,OAAO;CAC/B,IAAI,oBAAoB;CACxB,kBAAkB,WAAW,6BAA6B,kBAAkB,aAAa,QAAQ,+BAA+B,KAAK,IAAI,KAAK,IAAI,2BAA2B,OAAO,SAAS,QAAQ;EACnM,IAAI,iBAAiB;EACrB,IAAI,eAAe,QAAQ,YAAY,OAAO;EAC9C,IAAI,eAAe,WAAW,0BAA0B,eAAe,SAAS;GAC9E,MAAM,IAAI,MAAM,2GAA2G;EAC7H;EACA,IAAI,mBAAmB,OAAO;EAC9B,oBAAoB;EACpB,OAAO;CACT,CAAC;CACD,IAAI,eAAe,oBAAoB,8BAA8B,kBAAkB,cAAc,QAAQ,gCAAgC,KAAK,IAAI,8BAA8B,EAAE,KAAK,aAAa,+BAA+B,kBAAkB,cAAc,QAAQ,iCAAiC,KAAK,IAAI,+BAA+B,EAAE;CAC1V,IAAI,cAAc;EAChB,OAAO,eAAe,KAAK,iBAAiB;CAC9C;CACA,IAAI,CAAC,iBAIJ,gBAAgB,IAAI,SAAS,QAAQ,IAAI;EACxC,OAAO,cAAc,KAAK,iBAAiB;CAC7C;CACA,OAAO,eAAe,KAAK,iBAAiB;AAC9C;AACA,SAAS,cAAc,KAAK,aAAa;CACvC,IAAI,sBAAoB,aAAa,CAAC,CAAC,MAAM,KAAK;EAChD,OAAO;EACP,YAAY,YAAY;CAC1B,CAAC;CACD,OAAO,MAAM,qBAAqB,WAAW,KAAK,WAAW;AAC/D;AACA,SAAS,eAAe,KAAK,aAAa;CACxC,OAAO,MAAM,cAAc,KAAK,WAAW;AAC7C"}
|
package/dist/esm/utils/exit.mjs
CHANGED
|
@@ -119,7 +119,7 @@ function tryWarnActiveProcesses() {
|
|
|
119
119
|
debug("failed to get active process information:", error);
|
|
120
120
|
}
|
|
121
121
|
if (!activeProcesses.length) {
|
|
122
|
-
warn("Something prevented
|
|
122
|
+
warn("Something prevented the command from exiting, forcefully exiting now.");
|
|
123
123
|
} else {
|
|
124
124
|
const singularOrPlural = activeProcesses.length === 1 ? "1 process" : `${activeProcesses.length} processes`;
|
|
125
125
|
warn(`Detected ${singularOrPlural} preventing process from exiting, forcefully exiting now.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit.js","names":[],"sources":["esm/utils/exit.js"],"sourcesContent":["import { ChildProcess } from \"node:child_process\";\nimport process from \"node:process\";\nimport colors from \"picocolors\";\nconst debug = ((..._) => {\n});\nconst PRE_EXIT_SIGNALS = [\"SIGHUP\", \"SIGINT\", \"SIGTERM\", \"SIGBREAK\"];\nconst queue = [];\nlet unsubscribe = null;\nfunction installExitHooks(asyncExitHook) {\n if (!queue.length) {\n unsubscribe = attachMasterListener();\n }\n queue.push(asyncExitHook);\n return () => {\n const index = queue.indexOf(asyncExitHook);\n if (index >= 0) {\n queue.splice(index, 1);\n }\n if (!queue.length) {\n unsubscribe?.();\n }\n };\n}\nfunction createExitHook(signal) {\n return guardAsync(async () => {\n debug(`pre-exit (signal: ${signal}, queue length: ${queue.length})`);\n for (const [index, hookAsync] of Object.entries(queue)) {\n try {\n await hookAsync(signal);\n } catch (error) {\n debug(`Error in exit hook: %O (queue: ${index})`, error);\n }\n }\n debug(`post-exit (code: ${process.exitCode ?? 0})`);\n process.exit();\n });\n}\nfunction attachMasterListener() {\n const hooks = [];\n for (const signal of PRE_EXIT_SIGNALS) {\n const hook = createExitHook(signal);\n hooks.push([signal, hook]);\n process.on(signal, hook);\n }\n return () => {\n for (const [signal, hook] of hooks) {\n process.removeListener(signal, hook);\n }\n };\n}\nfunction ensureProcessExitsAfterDelay(waitUntilExitMs = 1e4, startedAtMs = Date.now()) {\n const expectedResources = [\n process.stdout.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stderr.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stdin.isTTY ? \"TTYWrap\" : \"PipeWrap\"\n ];\n const activeResources = process.getActiveResourcesInfo();\n const unexpectedActiveResources = activeResources.filter((activeResource) => {\n const index = expectedResources.indexOf(activeResource);\n if (index >= 0) {\n expectedResources.splice(index, 1);\n return false;\n }\n return true;\n });\n const canExitProcess = !unexpectedActiveResources.length;\n if (canExitProcess) {\n return debug(\"no active resources detected, process can safely exit\");\n }\n debug(\n `process is trying to exit, but is stuck on unexpected active resources:`,\n unexpectedActiveResources\n );\n const elapsedTime = Date.now() - startedAtMs;\n const killedChildren = killActiveChildProcesses(\n elapsedTime < 200 ? \"SIGTERM\" : \"SIGKILL\"\n );\n if (killedChildren > 0) {\n const recheck = setTimeout(() => {\n clearTimeout(recheck);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 50);\n return;\n }\n if (elapsedTime > waitUntilExitMs) {\n debug(\n \"active handles detected past the exit delay, forcefully exiting:\",\n activeResources\n );\n tryWarnActiveProcesses();\n return process.exit(0);\n }\n const timeoutId = setTimeout(() => {\n clearTimeout(timeoutId);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 100);\n}\nfunction killActiveChildProcesses(signal) {\n try {\n const children = process._getActiveHandles().filter((handle) => handle instanceof ChildProcess);\n for (const child of children) {\n try {\n child.kill(signal);\n } catch (err) {\n debug(\"failed to kill child process:\", err);\n }\n }\n return children.length;\n } catch (err) {\n debug(\"failed to enumerate active child processes:\", err);\n return 0;\n }\n}\nfunction tryWarnActiveProcesses() {\n let activeProcesses = [];\n try {\n const children = process._getActiveHandles().filter((handle) => handle instanceof ChildProcess);\n if (children.length) {\n activeProcesses = children.map((child) => child.spawnargs.join(\" \"));\n }\n } catch (error) {\n debug(\"failed to get active process information:\", error);\n }\n if (!activeProcesses.length) {\n warn(\"Something prevented
|
|
1
|
+
{"version":3,"file":"exit.js","names":[],"sources":["esm/utils/exit.js"],"sourcesContent":["import { ChildProcess } from \"node:child_process\";\nimport process from \"node:process\";\nimport colors from \"picocolors\";\nconst debug = ((..._) => {\n});\nconst PRE_EXIT_SIGNALS = [\"SIGHUP\", \"SIGINT\", \"SIGTERM\", \"SIGBREAK\"];\nconst queue = [];\nlet unsubscribe = null;\nfunction installExitHooks(asyncExitHook) {\n if (!queue.length) {\n unsubscribe = attachMasterListener();\n }\n queue.push(asyncExitHook);\n return () => {\n const index = queue.indexOf(asyncExitHook);\n if (index >= 0) {\n queue.splice(index, 1);\n }\n if (!queue.length) {\n unsubscribe?.();\n }\n };\n}\nfunction createExitHook(signal) {\n return guardAsync(async () => {\n debug(`pre-exit (signal: ${signal}, queue length: ${queue.length})`);\n for (const [index, hookAsync] of Object.entries(queue)) {\n try {\n await hookAsync(signal);\n } catch (error) {\n debug(`Error in exit hook: %O (queue: ${index})`, error);\n }\n }\n debug(`post-exit (code: ${process.exitCode ?? 0})`);\n process.exit();\n });\n}\nfunction attachMasterListener() {\n const hooks = [];\n for (const signal of PRE_EXIT_SIGNALS) {\n const hook = createExitHook(signal);\n hooks.push([signal, hook]);\n process.on(signal, hook);\n }\n return () => {\n for (const [signal, hook] of hooks) {\n process.removeListener(signal, hook);\n }\n };\n}\nfunction ensureProcessExitsAfterDelay(waitUntilExitMs = 1e4, startedAtMs = Date.now()) {\n const expectedResources = [\n process.stdout.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stderr.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stdin.isTTY ? \"TTYWrap\" : \"PipeWrap\"\n ];\n const activeResources = process.getActiveResourcesInfo();\n const unexpectedActiveResources = activeResources.filter((activeResource) => {\n const index = expectedResources.indexOf(activeResource);\n if (index >= 0) {\n expectedResources.splice(index, 1);\n return false;\n }\n return true;\n });\n const canExitProcess = !unexpectedActiveResources.length;\n if (canExitProcess) {\n return debug(\"no active resources detected, process can safely exit\");\n }\n debug(\n `process is trying to exit, but is stuck on unexpected active resources:`,\n unexpectedActiveResources\n );\n const elapsedTime = Date.now() - startedAtMs;\n const killedChildren = killActiveChildProcesses(\n elapsedTime < 200 ? \"SIGTERM\" : \"SIGKILL\"\n );\n if (killedChildren > 0) {\n const recheck = setTimeout(() => {\n clearTimeout(recheck);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 50);\n return;\n }\n if (elapsedTime > waitUntilExitMs) {\n debug(\n \"active handles detected past the exit delay, forcefully exiting:\",\n activeResources\n );\n tryWarnActiveProcesses();\n return process.exit(0);\n }\n const timeoutId = setTimeout(() => {\n clearTimeout(timeoutId);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 100);\n}\nfunction killActiveChildProcesses(signal) {\n try {\n const children = process._getActiveHandles().filter((handle) => handle instanceof ChildProcess);\n for (const child of children) {\n try {\n child.kill(signal);\n } catch (err) {\n debug(\"failed to kill child process:\", err);\n }\n }\n return children.length;\n } catch (err) {\n debug(\"failed to enumerate active child processes:\", err);\n return 0;\n }\n}\nfunction tryWarnActiveProcesses() {\n let activeProcesses = [];\n try {\n const children = process._getActiveHandles().filter((handle) => handle instanceof ChildProcess);\n if (children.length) {\n activeProcesses = children.map((child) => child.spawnargs.join(\" \"));\n }\n } catch (error) {\n debug(\"failed to get active process information:\", error);\n }\n if (!activeProcesses.length) {\n warn(\"Something prevented the command from exiting, forcefully exiting now.\");\n } else {\n const singularOrPlural = activeProcesses.length === 1 ? \"1 process\" : `${activeProcesses.length} processes`;\n warn(\n `Detected ${singularOrPlural} preventing process from exiting, forcefully exiting now.`\n );\n warn(\" - \" + activeProcesses.join(\"\\n - \"));\n }\n}\nfunction guardAsync(fn) {\n let invoked = false;\n let returnValue;\n const guard = async (...args) => {\n if (!invoked) {\n invoked = true;\n returnValue = await fn(...args);\n }\n return returnValue;\n };\n return guard;\n}\nfunction warn(...message) {\n console.warn(...message.map((value) => colors.yellow(value)));\n}\nexport {\n ensureProcessExitsAfterDelay,\n guardAsync,\n installExitHooks,\n warn\n};\n//# sourceMappingURL=exit.js.map\n"],"mappings":";;;;;AAGA,MAAM,UAAU,GAAG,MAAM,CACzB;AACA,MAAM,mBAAmB;CAAC;CAAU;CAAU;CAAW;AAAU;AACnE,MAAM,QAAQ,CAAC;AACf,IAAI,cAAc;AAClB,SAAS,iBAAiB,eAAe;CACvC,IAAI,CAAC,MAAM,QAAQ;EACjB,cAAc,qBAAqB;CACrC;CACA,MAAM,KAAK,aAAa;CACxB,aAAa;EACX,MAAM,QAAQ,MAAM,QAAQ,aAAa;EACzC,IAAI,SAAS,GAAG;GACd,MAAM,OAAO,OAAO,CAAC;EACvB;EACA,IAAI,CAAC,MAAM,QAAQ;GACjB,cAAc;EAChB;CACF;AACF;AACA,SAAS,eAAe,QAAQ;CAC9B,OAAO,WAAW,YAAY;EAC5B,MAAM,qBAAqB,OAAO,kBAAkB,MAAM,OAAO,EAAE;EACnE,KAAK,MAAM,CAAC,OAAO,cAAc,OAAO,QAAQ,KAAK,GAAG;GACtD,IAAI;IACF,MAAM,UAAU,MAAM;GACxB,SAAS,OAAO;IACd,MAAM,kCAAkC,MAAM,IAAI,KAAK;GACzD;EACF;EACA,MAAM,oBAAoB,QAAQ,YAAY,EAAE,EAAE;EAClD,QAAQ,KAAK;CACf,CAAC;AACH;AACA,SAAS,uBAAuB;CAC9B,MAAM,QAAQ,CAAC;CACf,KAAK,MAAM,UAAU,kBAAkB;EACrC,MAAM,OAAO,eAAe,MAAM;EAClC,MAAM,KAAK,CAAC,QAAQ,IAAI,CAAC;EACzB,QAAQ,GAAG,QAAQ,IAAI;CACzB;CACA,aAAa;EACX,KAAK,MAAM,CAAC,QAAQ,SAAS,OAAO;GAClC,QAAQ,eAAe,QAAQ,IAAI;EACrC;CACF;AACF;AACA,SAAS,6BAA6B,kBAAkB,KAAK,cAAc,KAAK,IAAI,GAAG;CACrF,MAAM,oBAAoB;EACxB,QAAQ,OAAO,QAAQ,YAAY;EACnC,QAAQ,OAAO,QAAQ,YAAY;EACnC,QAAQ,MAAM,QAAQ,YAAY;CACpC;CACA,MAAM,kBAAkB,QAAQ,uBAAuB;CACvD,MAAM,4BAA4B,gBAAgB,QAAQ,mBAAmB;EAC3E,MAAM,QAAQ,kBAAkB,QAAQ,cAAc;EACtD,IAAI,SAAS,GAAG;GACd,kBAAkB,OAAO,OAAO,CAAC;GACjC,OAAO;EACT;EACA,OAAO;CACT,CAAC;CACD,MAAM,iBAAiB,CAAC,0BAA0B;CAClD,IAAI,gBAAgB;EAClB,OAAO,MAAM,uDAAuD;CACtE;CACA,MACE,2EACA,yBACF;CACA,MAAM,cAAc,KAAK,IAAI,IAAI;CACjC,MAAM,iBAAiB,yBACrB,cAAc,MAAM,YAAY,SAClC;CACA,IAAI,iBAAiB,GAAG;EACtB,MAAM,UAAU,iBAAiB;GAC/B,aAAa,OAAO;GACpB,6BAA6B,iBAAiB,WAAW;EAC3D,GAAG,EAAE;EACL;CACF;CACA,IAAI,cAAc,iBAAiB;EACjC,MACE,oEACA,eACF;EACA,uBAAuB;EACvB,OAAO,QAAQ,KAAK,CAAC;CACvB;CACA,MAAM,YAAY,iBAAiB;EACjC,aAAa,SAAS;EACtB,6BAA6B,iBAAiB,WAAW;CAC3D,GAAG,GAAG;AACR;AACA,SAAS,yBAAyB,QAAQ;CACxC,IAAI;EACF,MAAM,WAAW,QAAQ,kBAAkB,CAAC,CAAC,QAAQ,WAAW,kBAAkB,YAAY;EAC9F,KAAK,MAAM,SAAS,UAAU;GAC5B,IAAI;IACF,MAAM,KAAK,MAAM;GACnB,SAAS,KAAK;IACZ,MAAM,iCAAiC,GAAG;GAC5C;EACF;EACA,OAAO,SAAS;CAClB,SAAS,KAAK;EACZ,MAAM,+CAA+C,GAAG;EACxD,OAAO;CACT;AACF;AACA,SAAS,yBAAyB;CAChC,IAAI,kBAAkB,CAAC;CACvB,IAAI;EACF,MAAM,WAAW,QAAQ,kBAAkB,CAAC,CAAC,QAAQ,WAAW,kBAAkB,YAAY;EAC9F,IAAI,SAAS,QAAQ;GACnB,kBAAkB,SAAS,KAAK,UAAU,MAAM,UAAU,KAAK,GAAG,CAAC;EACrE;CACF,SAAS,OAAO;EACd,MAAM,6CAA6C,KAAK;CAC1D;CACA,IAAI,CAAC,gBAAgB,QAAQ;EAC3B,KAAK,uEAAuE;CAC9E,OAAO;EACL,MAAM,mBAAmB,gBAAgB,WAAW,IAAI,cAAc,GAAG,gBAAgB,OAAO;EAChG,KACE,YAAY,iBAAiB,0DAC/B;EACA,KAAK,SAAS,gBAAgB,KAAK,QAAQ,CAAC;CAC9C;AACF;AACA,SAAS,WAAW,IAAI;CACtB,IAAI,UAAU;CACd,IAAI;CACJ,MAAM,QAAQ,OAAO,GAAG,SAAS;EAC/B,IAAI,CAAC,SAAS;GACZ,UAAU;GACV,cAAc,MAAM,GAAG,GAAG,IAAI;EAChC;EACA,OAAO;CACT;CACA,OAAO;AACT;AACA,SAAS,KAAK,GAAG,SAAS;CACxB,QAAQ,KAAK,GAAG,QAAQ,KAAK,UAAU,OAAO,OAAO,KAAK,CAAC,CAAC;AAC9D"}
|
|
@@ -199,7 +199,7 @@ function tryWarnActiveProcesses() {
|
|
|
199
199
|
debug("failed to get active process information:", error);
|
|
200
200
|
}
|
|
201
201
|
if (!activeProcesses.length) {
|
|
202
|
-
warn("Something prevented
|
|
202
|
+
warn("Something prevented the command from exiting, forcefully exiting now.");
|
|
203
203
|
} else {
|
|
204
204
|
var singularOrPlural = activeProcesses.length === 1 ? "1 process" : `${activeProcesses.length} processes`;
|
|
205
205
|
warn(`Detected ${singularOrPlural} preventing process from exiting, forcefully exiting now.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exit.native.js","names":[],"sources":["esm/utils/exit.native.js"],"sourcesContent":["import { ChildProcess } from \"child_process\";\nimport process from \"process\";\nimport colors from \"picocolors\";\nvar debug = function() {\n for (var _len = arguments.length, _ = new Array(_len), _key = 0; _key < _len; _key++) {\n _[_key] = arguments[_key];\n }\n};\nvar PRE_EXIT_SIGNALS = [\n \"SIGHUP\",\n \"SIGINT\",\n \"SIGTERM\",\n \"SIGBREAK\"\n];\nvar queue = [];\nvar unsubscribe = null;\nfunction installExitHooks(asyncExitHook) {\n if (!queue.length) {\n unsubscribe = attachMasterListener();\n }\n queue.push(asyncExitHook);\n return function() {\n var index = queue.indexOf(asyncExitHook);\n if (index >= 0) {\n queue.splice(index, 1);\n }\n if (!queue.length) {\n unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();\n }\n };\n}\nfunction createExitHook(signal) {\n return guardAsync(async function() {\n var _process_exitCode;\n debug(`pre-exit (signal: ${signal}, queue length: ${queue.length})`);\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = Object.entries(queue)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var [index, hookAsync] = _step.value;\n try {\n await hookAsync(signal);\n } catch (error) {\n debug(`Error in exit hook: %O (queue: ${index})`, error);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n debug(`post-exit (code: ${(_process_exitCode = process.exitCode) !== null && _process_exitCode !== void 0 ? _process_exitCode : 0})`);\n process.exit();\n });\n}\nfunction attachMasterListener() {\n var hooks = [];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = PRE_EXIT_SIGNALS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var signal = _step.value;\n var hook = createExitHook(signal);\n hooks.push([\n signal,\n hook\n ]);\n process.on(signal, hook);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return function() {\n var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;\n try {\n for (var _iterator2 = hooks[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var [signal2, hook2] = _step2.value;\n process.removeListener(signal2, hook2);\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n };\n}\nfunction ensureProcessExitsAfterDelay() {\n var waitUntilExitMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1e4, startedAtMs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Date.now();\n var expectedResources = [\n process.stdout.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stderr.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stdin.isTTY ? \"TTYWrap\" : \"PipeWrap\"\n ];\n var activeResources = process.getActiveResourcesInfo();\n var unexpectedActiveResources = activeResources.filter(function(activeResource) {\n var index = expectedResources.indexOf(activeResource);\n if (index >= 0) {\n expectedResources.splice(index, 1);\n return false;\n }\n return true;\n });\n var canExitProcess = !unexpectedActiveResources.length;\n if (canExitProcess) {\n return debug(\"no active resources detected, process can safely exit\");\n }\n debug(`process is trying to exit, but is stuck on unexpected active resources:`, unexpectedActiveResources);\n var elapsedTime = Date.now() - startedAtMs;\n var killedChildren = killActiveChildProcesses(elapsedTime < 200 ? \"SIGTERM\" : \"SIGKILL\");\n if (killedChildren > 0) {\n var recheck = setTimeout(function() {\n clearTimeout(recheck);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 50);\n return;\n }\n if (elapsedTime > waitUntilExitMs) {\n debug(\"active handles detected past the exit delay, forcefully exiting:\", activeResources);\n tryWarnActiveProcesses();\n return process.exit(0);\n }\n var timeoutId = setTimeout(function() {\n clearTimeout(timeoutId);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 100);\n}\nfunction killActiveChildProcesses(signal) {\n try {\n var children = process._getActiveHandles().filter(function(handle) {\n return handle instanceof ChildProcess;\n });\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var child = _step.value;\n try {\n child.kill(signal);\n } catch (err) {\n debug(\"failed to kill child process:\", err);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return children.length;\n } catch (err) {\n debug(\"failed to enumerate active child processes:\", err);\n return 0;\n }\n}\nfunction tryWarnActiveProcesses() {\n var activeProcesses = [];\n try {\n var children = process._getActiveHandles().filter(function(handle) {\n return handle instanceof ChildProcess;\n });\n if (children.length) {\n activeProcesses = children.map(function(child) {\n return child.spawnargs.join(\" \");\n });\n }\n } catch (error) {\n debug(\"failed to get active process information:\", error);\n }\n if (!activeProcesses.length) {\n warn(\"Something prevented Expo from exiting, forcefully exiting now.\");\n } else {\n var singularOrPlural = activeProcesses.length === 1 ? \"1 process\" : `${activeProcesses.length} processes`;\n warn(`Detected ${singularOrPlural} preventing process from exiting, forcefully exiting now.`);\n warn(\" - \" + activeProcesses.join(\"\\n - \"));\n }\n}\nfunction guardAsync(fn) {\n var invoked = false;\n var returnValue;\n var guard = async function() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (!invoked) {\n invoked = true;\n returnValue = await fn(...args);\n }\n return returnValue;\n };\n return guard;\n}\nfunction warn() {\n for (var _len = arguments.length, message = new Array(_len), _key = 0; _key < _len; _key++) {\n message[_key] = arguments[_key];\n }\n console.warn(...message.map(function(value) {\n return colors.yellow(value);\n }));\n}\nexport {\n ensureProcessExitsAfterDelay,\n guardAsync,\n installExitHooks,\n warn\n};\n//# sourceMappingURL=exit.js.map\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exit.native.js","names":[],"sources":["esm/utils/exit.native.js"],"sourcesContent":["import { ChildProcess } from \"child_process\";\nimport process from \"process\";\nimport colors from \"picocolors\";\nvar debug = function() {\n for (var _len = arguments.length, _ = new Array(_len), _key = 0; _key < _len; _key++) {\n _[_key] = arguments[_key];\n }\n};\nvar PRE_EXIT_SIGNALS = [\n \"SIGHUP\",\n \"SIGINT\",\n \"SIGTERM\",\n \"SIGBREAK\"\n];\nvar queue = [];\nvar unsubscribe = null;\nfunction installExitHooks(asyncExitHook) {\n if (!queue.length) {\n unsubscribe = attachMasterListener();\n }\n queue.push(asyncExitHook);\n return function() {\n var index = queue.indexOf(asyncExitHook);\n if (index >= 0) {\n queue.splice(index, 1);\n }\n if (!queue.length) {\n unsubscribe === null || unsubscribe === void 0 ? void 0 : unsubscribe();\n }\n };\n}\nfunction createExitHook(signal) {\n return guardAsync(async function() {\n var _process_exitCode;\n debug(`pre-exit (signal: ${signal}, queue length: ${queue.length})`);\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = Object.entries(queue)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var [index, hookAsync] = _step.value;\n try {\n await hookAsync(signal);\n } catch (error) {\n debug(`Error in exit hook: %O (queue: ${index})`, error);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n debug(`post-exit (code: ${(_process_exitCode = process.exitCode) !== null && _process_exitCode !== void 0 ? _process_exitCode : 0})`);\n process.exit();\n });\n}\nfunction attachMasterListener() {\n var hooks = [];\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = PRE_EXIT_SIGNALS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var signal = _step.value;\n var hook = createExitHook(signal);\n hooks.push([\n signal,\n hook\n ]);\n process.on(signal, hook);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return function() {\n var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = void 0;\n try {\n for (var _iterator2 = hooks[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {\n var [signal2, hook2] = _step2.value;\n process.removeListener(signal2, hook2);\n }\n } catch (err) {\n _didIteratorError2 = true;\n _iteratorError2 = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion2 && _iterator2.return != null) {\n _iterator2.return();\n }\n } finally {\n if (_didIteratorError2) {\n throw _iteratorError2;\n }\n }\n }\n };\n}\nfunction ensureProcessExitsAfterDelay() {\n var waitUntilExitMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1e4, startedAtMs = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : Date.now();\n var expectedResources = [\n process.stdout.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stderr.isTTY ? \"TTYWrap\" : \"PipeWrap\",\n process.stdin.isTTY ? \"TTYWrap\" : \"PipeWrap\"\n ];\n var activeResources = process.getActiveResourcesInfo();\n var unexpectedActiveResources = activeResources.filter(function(activeResource) {\n var index = expectedResources.indexOf(activeResource);\n if (index >= 0) {\n expectedResources.splice(index, 1);\n return false;\n }\n return true;\n });\n var canExitProcess = !unexpectedActiveResources.length;\n if (canExitProcess) {\n return debug(\"no active resources detected, process can safely exit\");\n }\n debug(`process is trying to exit, but is stuck on unexpected active resources:`, unexpectedActiveResources);\n var elapsedTime = Date.now() - startedAtMs;\n var killedChildren = killActiveChildProcesses(elapsedTime < 200 ? \"SIGTERM\" : \"SIGKILL\");\n if (killedChildren > 0) {\n var recheck = setTimeout(function() {\n clearTimeout(recheck);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 50);\n return;\n }\n if (elapsedTime > waitUntilExitMs) {\n debug(\"active handles detected past the exit delay, forcefully exiting:\", activeResources);\n tryWarnActiveProcesses();\n return process.exit(0);\n }\n var timeoutId = setTimeout(function() {\n clearTimeout(timeoutId);\n ensureProcessExitsAfterDelay(waitUntilExitMs, startedAtMs);\n }, 100);\n}\nfunction killActiveChildProcesses(signal) {\n try {\n var children = process._getActiveHandles().filter(function(handle) {\n return handle instanceof ChildProcess;\n });\n var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;\n try {\n for (var _iterator = children[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var child = _step.value;\n try {\n child.kill(signal);\n } catch (err) {\n debug(\"failed to kill child process:\", err);\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n return children.length;\n } catch (err) {\n debug(\"failed to enumerate active child processes:\", err);\n return 0;\n }\n}\nfunction tryWarnActiveProcesses() {\n var activeProcesses = [];\n try {\n var children = process._getActiveHandles().filter(function(handle) {\n return handle instanceof ChildProcess;\n });\n if (children.length) {\n activeProcesses = children.map(function(child) {\n return child.spawnargs.join(\" \");\n });\n }\n } catch (error) {\n debug(\"failed to get active process information:\", error);\n }\n if (!activeProcesses.length) {\n warn(\"Something prevented the command from exiting, forcefully exiting now.\");\n } else {\n var singularOrPlural = activeProcesses.length === 1 ? \"1 process\" : `${activeProcesses.length} processes`;\n warn(`Detected ${singularOrPlural} preventing process from exiting, forcefully exiting now.`);\n warn(\" - \" + activeProcesses.join(\"\\n - \"));\n }\n}\nfunction guardAsync(fn) {\n var invoked = false;\n var returnValue;\n var guard = async function() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n if (!invoked) {\n invoked = true;\n returnValue = await fn(...args);\n }\n return returnValue;\n };\n return guard;\n}\nfunction warn() {\n for (var _len = arguments.length, message = new Array(_len), _key = 0; _key < _len; _key++) {\n message[_key] = arguments[_key];\n }\n console.warn(...message.map(function(value) {\n return colors.yellow(value);\n }));\n}\nexport {\n ensureProcessExitsAfterDelay,\n guardAsync,\n installExitHooks,\n warn\n};\n//# sourceMappingURL=exit.js.map\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vxrn/vite-plugin-metro",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.57.1",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/cjs",
|
|
@@ -61,8 +61,6 @@
|
|
|
61
61
|
"typecheck": "tsc --noEmit"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
|
-
"@expo/metro-config": "58.0.0-canary-20260909-ea7a89a",
|
|
65
|
-
"expo": "58.0.0-canary-20260909-ea7a89a",
|
|
66
64
|
"metro": "^0.87.0",
|
|
67
65
|
"metro-config": "^0.87.0",
|
|
68
66
|
"react-native": "0.87.1",
|
|
@@ -74,11 +72,13 @@
|
|
|
74
72
|
"@jridgewell/remapping": "^2.3.0",
|
|
75
73
|
"@jridgewell/trace-mapping": "^0.3.25",
|
|
76
74
|
"@oxc-project/runtime": "^0.112.0",
|
|
77
|
-
"@
|
|
78
|
-
"@
|
|
79
|
-
"@vxrn/
|
|
80
|
-
"
|
|
75
|
+
"@react-native/babel-preset": "^0.87.1",
|
|
76
|
+
"@react-native/metro-config": "^0.87.1",
|
|
77
|
+
"@vxrn/compiler": "2.0.0-beta.57.1",
|
|
78
|
+
"@vxrn/debug": "2.0.0-beta.57.1",
|
|
79
|
+
"@vxrn/utils": "2.0.0-beta.57.1",
|
|
81
80
|
"esbuild": "^0.25.12",
|
|
81
|
+
"flow-parser": "^0.331.0",
|
|
82
82
|
"launch-editor": "^2.10.0",
|
|
83
83
|
"magic-string": "^0.30.21",
|
|
84
84
|
"micromatch": "^4.0.8",
|
|
@@ -88,13 +88,11 @@
|
|
|
88
88
|
},
|
|
89
89
|
"devDependencies": {
|
|
90
90
|
"@biomejs/biome": "2.3.3",
|
|
91
|
-
"@expo/metro-config": "58.0.0-canary-20260909-ea7a89a",
|
|
92
91
|
"@react-native/dev-middleware": "^0.87.1",
|
|
93
92
|
"@tamagui/build": "3.0.0-beta.1309.1",
|
|
94
93
|
"@types/babel__helper-plugin-utils": "^7",
|
|
95
94
|
"@types/node": "^24.10.0",
|
|
96
95
|
"depcheck": "^1.4.7",
|
|
97
|
-
"expo": "58.0.0-canary-20260909-ea7a89a",
|
|
98
96
|
"metro": "^0.87.0",
|
|
99
97
|
"metro-config": "^0.87.0",
|
|
100
98
|
"react-native": "0.87.1",
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export { metroPlugin } from './plugins/metroPlugin'
|
|
2
2
|
export type { MetroPluginOptions } from './plugins/metroPlugin'
|
|
3
|
-
export { expoManifestRequestHandlerPlugin } from './plugins/expoManifestRequestHandlerPlugin'
|
|
4
|
-
export type { ExpoManifestRequestHandlerPluginPluginOptions } from './plugins/expoManifestRequestHandlerPlugin'
|
|
5
3
|
export {
|
|
6
4
|
getPlatformEnv,
|
|
7
5
|
getPlatformEnvDefine,
|
|
@@ -35,6 +35,11 @@ describe('bare main module entry', () => {
|
|
|
35
35
|
} as any
|
|
36
36
|
)
|
|
37
37
|
|
|
38
|
+
expect((defaultConfig as any).watchFolders).toContain(workspaceRoot)
|
|
39
|
+
expect((defaultConfig as any).resolver.nodeModulesPaths).toContain(
|
|
40
|
+
path.join(workspaceRoot, 'node_modules')
|
|
41
|
+
)
|
|
42
|
+
|
|
38
43
|
const context = {
|
|
39
44
|
originModulePath: `${fixtureRoot}/.`,
|
|
40
45
|
resolveRequest: (_ctx: any, name: string) => {
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { searchForWorkspaceRoot, type ResolvedConfig } from 'vite'
|
|
2
2
|
import { spawn } from 'node:child_process'
|
|
3
3
|
import { resolve } from 'node:path'
|
|
4
4
|
import micromatch from 'micromatch'
|
|
5
|
+
import { getDefaultConfig } from '@react-native/metro-config'
|
|
5
6
|
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// at runtime to ensure they are loaded from the user's project root.
|
|
7
|
+
// metro itself is loaded from the app so its cli and config stay aligned.
|
|
8
|
+
// the base config belongs to this package and matches its react-native peer.
|
|
9
9
|
import type { loadConfig as loadConfigT } from 'metro'
|
|
10
|
-
import type { getDefaultConfig as getDefaultConfigT } from '@expo/metro-config'
|
|
11
10
|
|
|
12
11
|
import { findUserBabelConfig } from '@vxrn/compiler'
|
|
13
12
|
import { projectImport, projectResolve } from '../utils/projectImport'
|
|
14
13
|
import { getTerminalReporter } from '../utils/getTerminalReporter'
|
|
15
|
-
import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from '../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName'
|
|
16
14
|
import type { MetroPluginOptions } from '../plugins/metroPlugin'
|
|
17
15
|
import type { ExtraConfig, MetroConfigExtended } from './types'
|
|
18
16
|
|
|
19
|
-
type MetroInputConfig = Parameters<typeof loadConfigT>[1]
|
|
17
|
+
type MetroInputConfig = NonNullable<Parameters<typeof loadConfigT>[1]>
|
|
20
18
|
|
|
21
19
|
const WATCHMAN_PROBE_TIMEOUT_MS = 2000
|
|
20
|
+
const expoEnvAdditionalExts = ['env', 'local', 'development']
|
|
22
21
|
const watchmanResponsivePromises = new Map<string, Promise<boolean>>()
|
|
23
22
|
let didWarnAboutWatchmanFallback = false
|
|
24
23
|
const rootIndexBundleRequestPattern = /^(https?:\/\/[^/]+)?\/index\.bundle(?=$|[?#])/
|
|
@@ -32,6 +31,36 @@ const metroWatchExclusions = [
|
|
|
32
31
|
/[/\\]node_modules[/\\]\.vxrn(?:[/\\]|$)/,
|
|
33
32
|
]
|
|
34
33
|
|
|
34
|
+
function enforceWorkspaceVisibility(
|
|
35
|
+
config: MetroInputConfig,
|
|
36
|
+
projectRoot: string
|
|
37
|
+
): MetroInputConfig {
|
|
38
|
+
const workspaceRoot = searchForWorkspaceRoot(projectRoot)
|
|
39
|
+
if (workspaceRoot === projectRoot) return config
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
...config,
|
|
43
|
+
watchFolders: [...new Set([...(config.watchFolders ?? []), workspaceRoot])],
|
|
44
|
+
resolver: {
|
|
45
|
+
...config.resolver,
|
|
46
|
+
nodeModulesPaths: [
|
|
47
|
+
...new Set([
|
|
48
|
+
...(config.resolver?.nodeModulesPaths ?? []),
|
|
49
|
+
resolve(projectRoot, 'node_modules'),
|
|
50
|
+
resolve(workspaceRoot, 'node_modules'),
|
|
51
|
+
]),
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function getReactNativeDefaultConfig(projectRoot: string): MetroInputConfig {
|
|
58
|
+
return enforceWorkspaceVisibility(
|
|
59
|
+
getDefaultConfig(projectRoot) as MetroInputConfig,
|
|
60
|
+
projectRoot
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
35
64
|
function getPlatformFromBundleUrl(url: string): 'ios' | 'android' {
|
|
36
65
|
const platform = url.match(/[?&]platform=(ios|android)(?:&|$)/)?.[1]
|
|
37
66
|
return platform === 'android' ? 'android' : 'ios'
|
|
@@ -45,10 +74,6 @@ function rewriteMainModuleBundleUrl(
|
|
|
45
74
|
platform: getPlatformFromBundleUrl(url),
|
|
46
75
|
})
|
|
47
76
|
|
|
48
|
-
if (url.includes('/.expo/.virtual-metro-entry.bundle?')) {
|
|
49
|
-
return url.replace('.expo/.virtual-metro-entry', resolvedMainModulePath)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
77
|
return url.replace(rootIndexBundleRequestPattern, `$1/${resolvedMainModulePath}.bundle`)
|
|
53
78
|
}
|
|
54
79
|
|
|
@@ -169,7 +194,7 @@ function resolveNativeTransforms(
|
|
|
169
194
|
* Build the Metro config input WITHOUT calling Metro's `loadConfig`. Returns
|
|
170
195
|
* the same shape Metro `loadConfig` expects as its second argument. Use this
|
|
171
196
|
* from a project's `metro.config.cjs` so the outer `loadConfig` (driven by
|
|
172
|
-
*
|
|
197
|
+
* the Metro CLI) is the only one that runs. this avoids infinite
|
|
173
198
|
* recursion that would happen if the inner pipeline also called `loadConfig`
|
|
174
199
|
* and re-read the same metro.config.cjs.
|
|
175
200
|
*/
|
|
@@ -190,53 +215,20 @@ export async function buildMetroConfigInputFromViteConfig(
|
|
|
190
215
|
)
|
|
191
216
|
}
|
|
192
217
|
|
|
193
|
-
const
|
|
194
|
-
getDefaultConfig: typeof getDefaultConfigT
|
|
195
|
-
}>(projectRoot, '@expo/metro-config')
|
|
196
|
-
|
|
197
|
-
const _defaultConfig: MetroInputConfig = getDefaultConfig(projectRoot) as any
|
|
218
|
+
const _defaultConfig = getReactNativeDefaultConfig(projectRoot)
|
|
198
219
|
|
|
199
220
|
if (mainModuleName) {
|
|
200
|
-
const origRewriteRequestUrl = _defaultConfig!.server
|
|
201
|
-
|
|
202
|
-
const resolveMainModuleName: (p: { platform: 'ios' | 'android' }) => string =
|
|
203
|
-
await (async () => {
|
|
204
|
-
const ExpoGoManifestHandlerMiddleware = (
|
|
205
|
-
await projectImport(
|
|
206
|
-
projectRoot,
|
|
207
|
-
'@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js'
|
|
208
|
-
)
|
|
209
|
-
).default.ExpoGoManifestHandlerMiddleware
|
|
210
|
-
|
|
211
|
-
const manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(
|
|
212
|
-
projectRoot,
|
|
213
|
-
{}
|
|
214
|
-
)
|
|
215
|
-
|
|
216
|
-
patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
|
|
217
|
-
manifestHandlerMiddleware,
|
|
218
|
-
mainModuleName
|
|
219
|
-
)
|
|
220
|
-
|
|
221
|
-
return (p) => {
|
|
222
|
-
return manifestHandlerMiddleware.resolveMainModuleName({
|
|
223
|
-
pkg: { main: mainModuleName },
|
|
224
|
-
platform: p.platform,
|
|
225
|
-
})
|
|
226
|
-
}
|
|
227
|
-
})()
|
|
221
|
+
const origRewriteRequestUrl = _defaultConfig!.server?.rewriteRequestUrl
|
|
222
|
+
const resolveMainModuleName = () => mainModuleName
|
|
228
223
|
|
|
229
224
|
extraConfig.getResolveMainModuleName = resolveMainModuleName
|
|
230
225
|
|
|
231
226
|
// @ts-expect-error Metro 0.83 made this read-only in types but we need to patch it
|
|
232
227
|
_defaultConfig!.server!.rewriteRequestUrl = (url) => {
|
|
233
|
-
if (
|
|
234
|
-
url.includes('/.expo/.virtual-metro-entry.bundle?') ||
|
|
235
|
-
rootIndexBundleRequestPattern.test(url)
|
|
236
|
-
) {
|
|
228
|
+
if (rootIndexBundleRequestPattern.test(url)) {
|
|
237
229
|
return rewriteMainModuleBundleUrl(url, resolveMainModuleName)
|
|
238
230
|
}
|
|
239
|
-
return origRewriteRequestUrl(url)
|
|
231
|
+
return origRewriteRequestUrl?.(url) ?? url
|
|
240
232
|
}
|
|
241
233
|
}
|
|
242
234
|
|
|
@@ -267,6 +259,15 @@ export async function buildMetroConfigInputFromViteConfig(
|
|
|
267
259
|
|
|
268
260
|
const defaultConfig: MetroInputConfig = {
|
|
269
261
|
..._defaultConfig,
|
|
262
|
+
watcher: {
|
|
263
|
+
..._defaultConfig?.watcher,
|
|
264
|
+
additionalExts: [
|
|
265
|
+
...new Set([
|
|
266
|
+
...(_defaultConfig?.watcher?.additionalExts ?? []),
|
|
267
|
+
...expoEnvAdditionalExts,
|
|
268
|
+
]),
|
|
269
|
+
],
|
|
270
|
+
},
|
|
270
271
|
resolver: {
|
|
271
272
|
..._defaultConfig?.resolver,
|
|
272
273
|
useWatchman,
|
|
@@ -303,6 +304,10 @@ export async function buildMetroConfigInputFromViteConfig(
|
|
|
303
304
|
},
|
|
304
305
|
transformer: {
|
|
305
306
|
..._defaultConfig?.transformer,
|
|
307
|
+
// one's router and Expo's optional development env module both use
|
|
308
|
+
// require.context. Metro installs a throwing runtime stub unless this
|
|
309
|
+
// graph feature is enabled.
|
|
310
|
+
unstable_allowRequireContext: true,
|
|
306
311
|
babelTransformerPath: projectResolve(
|
|
307
312
|
projectRoot,
|
|
308
313
|
'@vxrn/vite-plugin-metro/babel-transformer'
|
|
@@ -322,7 +327,10 @@ export async function buildMetroConfigInputFromViteConfig(
|
|
|
322
327
|
}
|
|
323
328
|
|
|
324
329
|
return {
|
|
325
|
-
defaultConfig: enforceBareMainModuleEntry(
|
|
330
|
+
defaultConfig: enforceBareMainModuleEntry(
|
|
331
|
+
enforceWorkspaceVisibility(merged, projectRoot),
|
|
332
|
+
mainModuleName
|
|
333
|
+
),
|
|
326
334
|
projectRoot,
|
|
327
335
|
extraConfig,
|
|
328
336
|
}
|
|
@@ -351,60 +359,21 @@ export async function getMetroConfigFromViteConfig(
|
|
|
351
359
|
const { loadConfig } = await projectImport<{
|
|
352
360
|
loadConfig: typeof loadConfigT
|
|
353
361
|
}>(projectRoot, 'metro')
|
|
354
|
-
const
|
|
355
|
-
getDefaultConfig: typeof getDefaultConfigT
|
|
356
|
-
}>(projectRoot, '@expo/metro-config')
|
|
357
|
-
|
|
358
|
-
const _defaultConfig: MetroInputConfig = getDefaultConfig(projectRoot) as any
|
|
362
|
+
const _defaultConfig = getReactNativeDefaultConfig(projectRoot)
|
|
359
363
|
|
|
360
364
|
if (mainModuleName) {
|
|
361
|
-
const origRewriteRequestUrl = _defaultConfig!.server
|
|
362
|
-
|
|
363
|
-
// We need to patch Expo's default `config.server.rewriteRequestUrl`
|
|
364
|
-
// to change how URLs like '/.expo/.virtual-metro-entry.bundle?' are
|
|
365
|
-
// rewritten.
|
|
366
|
-
// But since that function is difficult to override, here we borrow
|
|
367
|
-
// the ExpoGoManifestHandlerMiddleware and use it to resolve the
|
|
368
|
-
// URL to the main module name.
|
|
369
|
-
const resolveMainModuleName: (p: { platform: 'ios' | 'android' }) => string =
|
|
370
|
-
await (async () => {
|
|
371
|
-
const ExpoGoManifestHandlerMiddleware = (
|
|
372
|
-
await projectImport(
|
|
373
|
-
projectRoot,
|
|
374
|
-
'@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js'
|
|
375
|
-
)
|
|
376
|
-
).default.ExpoGoManifestHandlerMiddleware
|
|
377
|
-
|
|
378
|
-
const manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(
|
|
379
|
-
projectRoot,
|
|
380
|
-
{}
|
|
381
|
-
)
|
|
382
|
-
|
|
383
|
-
patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
|
|
384
|
-
manifestHandlerMiddleware,
|
|
385
|
-
mainModuleName
|
|
386
|
-
)
|
|
387
|
-
|
|
388
|
-
return (p) => {
|
|
389
|
-
return manifestHandlerMiddleware.resolveMainModuleName({
|
|
390
|
-
pkg: { main: mainModuleName },
|
|
391
|
-
platform: p.platform,
|
|
392
|
-
})
|
|
393
|
-
}
|
|
394
|
-
})()
|
|
365
|
+
const origRewriteRequestUrl = _defaultConfig!.server?.rewriteRequestUrl
|
|
366
|
+
const resolveMainModuleName = () => mainModuleName
|
|
395
367
|
|
|
396
368
|
extraConfig.getResolveMainModuleName = resolveMainModuleName
|
|
397
369
|
|
|
398
370
|
// @ts-expect-error Metro 0.83 made this read-only in types but we need to patch it
|
|
399
371
|
_defaultConfig!.server!.rewriteRequestUrl = (url) => {
|
|
400
|
-
if (
|
|
401
|
-
url.includes('/.expo/.virtual-metro-entry.bundle?') ||
|
|
402
|
-
rootIndexBundleRequestPattern.test(url)
|
|
403
|
-
) {
|
|
372
|
+
if (rootIndexBundleRequestPattern.test(url)) {
|
|
404
373
|
return rewriteMainModuleBundleUrl(url, resolveMainModuleName)
|
|
405
374
|
}
|
|
406
375
|
|
|
407
|
-
return origRewriteRequestUrl(url)
|
|
376
|
+
return origRewriteRequestUrl?.(url) ?? url
|
|
408
377
|
}
|
|
409
378
|
}
|
|
410
379
|
|
|
@@ -435,6 +404,15 @@ export async function getMetroConfigFromViteConfig(
|
|
|
435
404
|
|
|
436
405
|
const defaultConfig: MetroInputConfig = {
|
|
437
406
|
..._defaultConfig,
|
|
407
|
+
watcher: {
|
|
408
|
+
..._defaultConfig?.watcher,
|
|
409
|
+
additionalExts: [
|
|
410
|
+
...new Set([
|
|
411
|
+
...(_defaultConfig?.watcher?.additionalExts ?? []),
|
|
412
|
+
...expoEnvAdditionalExts,
|
|
413
|
+
]),
|
|
414
|
+
],
|
|
415
|
+
},
|
|
438
416
|
resolver: {
|
|
439
417
|
..._defaultConfig?.resolver,
|
|
440
418
|
useWatchman,
|
|
@@ -479,6 +457,10 @@ export async function getMetroConfigFromViteConfig(
|
|
|
479
457
|
},
|
|
480
458
|
transformer: {
|
|
481
459
|
..._defaultConfig?.transformer,
|
|
460
|
+
// one's router and Expo's optional development env module both use
|
|
461
|
+
// require.context. Metro installs a throwing runtime stub unless this
|
|
462
|
+
// graph feature is enabled.
|
|
463
|
+
unstable_allowRequireContext: true,
|
|
482
464
|
babelTransformerPath: projectResolve(
|
|
483
465
|
projectRoot,
|
|
484
466
|
'@vxrn/vite-plugin-metro/babel-transformer'
|
|
@@ -506,7 +488,10 @@ export async function getMetroConfigFromViteConfig(
|
|
|
506
488
|
)
|
|
507
489
|
|
|
508
490
|
return {
|
|
509
|
-
...enforceBareMainModuleEntry(
|
|
491
|
+
...enforceBareMainModuleEntry(
|
|
492
|
+
enforceWorkspaceVisibility(metroConfig, projectRoot),
|
|
493
|
+
mainModuleName
|
|
494
|
+
),
|
|
510
495
|
...extraConfig,
|
|
511
496
|
} as MetroConfigExtended
|
|
512
497
|
}
|
|
@@ -9,8 +9,7 @@ import { checkAndClearMetroCacheFromVite } from '../utils/metroCacheManager'
|
|
|
9
9
|
|
|
10
10
|
const { debug } = createDebugger('vite-plugin-metro')
|
|
11
11
|
|
|
12
|
-
//
|
|
13
|
-
// We use `projectImport` to dynamically import the actual modules
|
|
12
|
+
// for Metro, we only import types here. `projectImport` loads the actual modules
|
|
14
13
|
// at runtime to ensure they are loaded from the user's project root.
|
|
15
14
|
import type MetroT from 'metro'
|
|
16
15
|
import type { loadConfig as loadConfigT } from 'metro'
|
|
@@ -72,10 +71,8 @@ export type MetroPluginOptions = {
|
|
|
72
71
|
/**
|
|
73
72
|
* Overrides the main module name which is normally defined as the `main` field in `package.json`.
|
|
74
73
|
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* It can be used to change the entry point of the React Native app without the need of using
|
|
78
|
-
* the `main` field in `package.json`.
|
|
74
|
+
* Changes the React Native entry point without requiring a `main` field in
|
|
75
|
+
* `package.json`.
|
|
79
76
|
*/
|
|
80
77
|
mainModuleName?: string
|
|
81
78
|
/**
|