@expo/cli 0.7.0 → 0.8.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/README.md +1 -1
- package/build/bin/cli +12 -3
- package/build/bin/cli.map +1 -1
- package/build/src/api/getExpoGoIntermediateCertificate.js +0 -2
- package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -1
- package/build/src/api/getProjectDevelopmentCertificate.js +0 -2
- package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -1
- package/build/src/api/graphql/queries/AppQuery.js +39 -0
- package/build/src/api/graphql/queries/AppQuery.js.map +1 -0
- package/build/src/api/graphql/queries/UserQuery.js +10 -3
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
- package/build/src/api/graphql/types/App.js +23 -0
- package/build/src/api/graphql/types/App.js.map +1 -0
- package/build/src/api/signManifest.js +0 -12
- package/build/src/api/signManifest.js.map +1 -1
- package/build/src/api/user/UserSettings.js.map +1 -1
- package/build/src/api/user/user.js.map +1 -1
- package/build/src/config/configAsync.js +3 -0
- package/build/src/config/configAsync.js.map +1 -1
- package/build/src/customize/customizeAsync.js +3 -0
- package/build/src/customize/customizeAsync.js.map +1 -1
- package/build/src/export/createBundles.js +7 -3
- package/build/src/export/createBundles.js.map +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +24 -0
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -0
- package/build/src/export/embed/index.js +117 -0
- package/build/src/export/embed/index.js.map +1 -0
- package/build/src/export/embed/resolveOptions.js +63 -0
- package/build/src/export/embed/resolveOptions.js.map +1 -0
- package/build/src/export/exportApp.js +56 -29
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +17 -0
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/exportAsync.js +3 -0
- package/build/src/export/exportAsync.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +179 -0
- package/build/src/export/exportStaticAsync.js.map +1 -0
- package/build/src/export/fork-bundleAsync.js +15 -42
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/html.js +21 -0
- package/build/src/export/html.js.map +1 -0
- package/build/src/export/printBundleSizes.js +2 -2
- package/build/src/export/printBundleSizes.js.map +1 -1
- package/build/src/export/web/exportWebAsync.js +3 -0
- package/build/src/export/web/exportWebAsync.js.map +1 -1
- package/build/src/export/writeContents.js +5 -2
- package/build/src/export/writeContents.js.map +1 -1
- package/build/src/graphql/generated.js +462 -0
- package/build/src/graphql/generated.js.map +1 -0
- package/build/src/install/installAsync.js +3 -0
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/prebuild/clearNativeFolder.js +6 -1
- package/build/src/prebuild/clearNativeFolder.js.map +1 -1
- package/build/src/prebuild/ensureConfigAsync.js +1 -12
- package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +7 -2
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveOptions.js +7 -8
- package/build/src/prebuild/resolveOptions.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +5 -0
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +6 -1
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/prebuild/validateTemplatePlatforms.js +48 -0
- package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -0
- package/build/src/run/android/runAndroidAsync.js +4 -0
- package/build/src/run/android/runAndroidAsync.js.map +1 -1
- package/build/src/run/ios/appleDevice/AppleDevice.js +25 -19
- package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
- package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
- package/build/src/run/ios/options/resolveNativeScheme.js +13 -4
- package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -1
- package/build/src/run/ios/runIosAsync.js +3 -0
- package/build/src/run/ios/runIosAsync.js.map +1 -1
- package/build/src/run/startBundler.js +4 -0
- package/build/src/run/startBundler.js.map +1 -1
- package/build/src/start/doctor/Prerequisite.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +12 -6
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +1 -3
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +31 -5
- package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
- package/build/src/start/doctor/typescript/updateTSConfig.js +6 -0
- package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +1 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
- package/build/src/start/platforms/android/adb.js +1 -1
- package/build/src/start/platforms/android/adb.js.map +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
- package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js +16 -2
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +33 -2
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/getStaticRenderFunctions.js +166 -0
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -0
- package/build/src/start/server/metro/MetroBundlerDevServer.js +279 -3
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +2 -34
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/externals.js +95 -0
- package/build/src/start/server/metro/externals.js.map +1 -0
- package/build/src/start/server/metro/getCssModulesFromBundler.js +77 -0
- package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -0
- package/build/src/start/server/metro/inspector-proxy/index.js +2 -2
- package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
- package/build/src/start/server/metro/inspector-proxy/proxy.js +1 -3
- package/build/src/start/server/metro/inspector-proxy/proxy.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +44 -48
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +114 -0
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -0
- package/build/src/start/server/metro/metroWatchTypeScriptFiles.js +51 -0
- package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -0
- package/build/src/start/server/metro/resolveFromProject.js +26 -3
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
- package/build/src/start/server/metro/router.js +4 -0
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +108 -0
- package/build/src/start/server/metro/runServer-fork.js.map +1 -0
- package/build/src/start/server/metro/symbolicate.js +6 -0
- package/build/src/start/server/metro/symbolicate.js.map +1 -0
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +70 -0
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -0
- package/build/src/start/server/metro/withMetroMultiPlatform.js +181 -44
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +8 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +38 -32
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +53 -19
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/type-generation/expo-env.js +27 -0
- package/build/src/start/server/type-generation/expo-env.js.map +1 -0
- package/build/src/start/server/type-generation/index.js +49 -0
- package/build/src/start/server/type-generation/index.js.map +1 -0
- package/build/src/start/server/type-generation/routes.js +292 -0
- package/build/src/start/server/type-generation/routes.js.map +1 -0
- package/build/src/start/server/type-generation/tsconfig.js +89 -0
- package/build/src/start/server/type-generation/tsconfig.js.map +1 -0
- package/build/src/start/server/webTemplate.js +20 -4
- package/build/src/start/server/webTemplate.js.map +1 -1
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +4 -6
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
- package/build/src/start/startAsync.js +30 -8
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/FileNotifier.js +11 -4
- package/build/src/utils/FileNotifier.js.map +1 -1
- package/build/src/utils/analytics/getMetroProperties.js +1 -1
- package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/codesigning.js +31 -7
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/env.js +3 -0
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/mergeGitIgnorePaths.js +42 -0
- package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
- package/build/src/utils/nodeEnv.js +11 -0
- package/build/src/utils/nodeEnv.js.map +1 -0
- package/build/src/utils/resolveArgs.js +43 -0
- package/build/src/utils/resolveArgs.js.map +1 -1
- package/build/src/utils/template.js +21 -0
- package/build/src/utils/template.js.map +1 -0
- package/build/src/utils/tsconfig/evaluateTsConfig.js +61 -0
- package/build/src/utils/tsconfig/evaluateTsConfig.js.map +1 -0
- package/build/src/utils/tsconfig/loadTsConfigPaths.js +69 -0
- package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -0
- package/build/src/utils/tsconfig/matchTsConfigPathAlias.js +88 -0
- package/build/src/utils/tsconfig/matchTsConfigPathAlias.js.map +1 -0
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +41 -0
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -0
- package/package.json +16 -8
- package/static/template/metro.config.js +4 -1
- package/build/src/api/getProject.js +0 -19
- package/build/src/api/getProject.js.map +0 -1
- package/build/src/api/graphql/generated.js +0 -113
- package/build/src/api/graphql/generated.js.map +0 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.getNodeExternalModuleId = getNodeExternalModuleId;
|
|
6
|
+
exports.setupNodeExternals = setupNodeExternals;
|
|
7
|
+
exports.isNodeExternal = isNodeExternal;
|
|
8
|
+
exports.METRO_EXTERNALS_FOLDER = exports.EXTERNAL_REQUIRE_NATIVE_POLYFILL = exports.EXTERNAL_REQUIRE_POLYFILL = exports.NODE_STDLIB_MODULES = void 0;
|
|
9
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
10
|
+
var _path = _interopRequireDefault(require("path"));
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const NODE_STDLIB_MODULES = [
|
|
17
|
+
"assert",
|
|
18
|
+
"async_hooks",
|
|
19
|
+
"buffer",
|
|
20
|
+
"child_process",
|
|
21
|
+
"cluster",
|
|
22
|
+
"crypto",
|
|
23
|
+
"dgram",
|
|
24
|
+
"dns",
|
|
25
|
+
"domain",
|
|
26
|
+
"events",
|
|
27
|
+
"fs",
|
|
28
|
+
"fs/promises",
|
|
29
|
+
"http",
|
|
30
|
+
"https",
|
|
31
|
+
"net",
|
|
32
|
+
"os",
|
|
33
|
+
"path",
|
|
34
|
+
"punycode",
|
|
35
|
+
"querystring",
|
|
36
|
+
"readline",
|
|
37
|
+
"repl",
|
|
38
|
+
"stream",
|
|
39
|
+
"string_decoder",
|
|
40
|
+
"tls",
|
|
41
|
+
"tty",
|
|
42
|
+
"url",
|
|
43
|
+
"util",
|
|
44
|
+
"v8",
|
|
45
|
+
"vm",
|
|
46
|
+
"zlib",
|
|
47
|
+
];
|
|
48
|
+
exports.NODE_STDLIB_MODULES = NODE_STDLIB_MODULES;
|
|
49
|
+
const EXTERNAL_REQUIRE_POLYFILL = ".expo/metro/polyfill.js";
|
|
50
|
+
exports.EXTERNAL_REQUIRE_POLYFILL = EXTERNAL_REQUIRE_POLYFILL;
|
|
51
|
+
const EXTERNAL_REQUIRE_NATIVE_POLYFILL = ".expo/metro/polyfill.native.js";
|
|
52
|
+
exports.EXTERNAL_REQUIRE_NATIVE_POLYFILL = EXTERNAL_REQUIRE_NATIVE_POLYFILL;
|
|
53
|
+
const METRO_EXTERNALS_FOLDER = ".expo/metro/externals";
|
|
54
|
+
exports.METRO_EXTERNALS_FOLDER = METRO_EXTERNALS_FOLDER;
|
|
55
|
+
function getNodeExternalModuleId(fromModule, moduleId) {
|
|
56
|
+
return _path.default.relative(_path.default.dirname(fromModule), _path.default.join(METRO_EXTERNALS_FOLDER, moduleId, "index.js"));
|
|
57
|
+
}
|
|
58
|
+
async function setupNodeExternals(projectRoot) {
|
|
59
|
+
await tapExternalRequirePolyfill(projectRoot);
|
|
60
|
+
await tapNodeShims(projectRoot);
|
|
61
|
+
}
|
|
62
|
+
async function tapExternalRequirePolyfill(projectRoot) {
|
|
63
|
+
await _fs.default.promises.mkdir(_path.default.join(projectRoot, _path.default.dirname(EXTERNAL_REQUIRE_POLYFILL)), {
|
|
64
|
+
recursive: true
|
|
65
|
+
});
|
|
66
|
+
await _fs.default.promises.writeFile(_path.default.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL), 'global.$$require_external = typeof window === "undefined" ? require : () => null;');
|
|
67
|
+
await _fs.default.promises.writeFile(_path.default.join(projectRoot, EXTERNAL_REQUIRE_NATIVE_POLYFILL), "global.$$require_external = (moduleId) => {throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);}");
|
|
68
|
+
}
|
|
69
|
+
function isNodeExternal(moduleName) {
|
|
70
|
+
const moduleId = moduleName.replace(/^node:/, "");
|
|
71
|
+
if (NODE_STDLIB_MODULES.includes(moduleId)) {
|
|
72
|
+
return moduleId;
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
function tapNodeShimContents(moduleId) {
|
|
77
|
+
return `module.exports = $$require_external('node:${moduleId}');`;
|
|
78
|
+
}
|
|
79
|
+
// Ensure Node.js shims which require using `$$require_external` are available inside the project.
|
|
80
|
+
async function tapNodeShims(projectRoot) {
|
|
81
|
+
const externals = {};
|
|
82
|
+
for (const moduleId of NODE_STDLIB_MODULES){
|
|
83
|
+
const shimDir = _path.default.join(projectRoot, METRO_EXTERNALS_FOLDER, moduleId);
|
|
84
|
+
const shimPath = _path.default.join(shimDir, "index.js");
|
|
85
|
+
externals[moduleId] = shimPath;
|
|
86
|
+
if (!_fs.default.existsSync(shimPath)) {
|
|
87
|
+
await _fs.default.promises.mkdir(shimDir, {
|
|
88
|
+
recursive: true
|
|
89
|
+
});
|
|
90
|
+
await _fs.default.promises.writeFile(shimPath, tapNodeShimContents(moduleId));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=externals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/externals.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport path from 'path';\n\n// A list of the Node.js standard library modules.\nexport const NODE_STDLIB_MODULES = [\n 'assert',\n 'async_hooks',\n 'buffer',\n 'child_process',\n 'cluster',\n 'crypto',\n 'dgram',\n 'dns',\n 'domain',\n 'events',\n 'fs',\n 'fs/promises',\n 'http',\n 'https',\n 'net',\n 'os',\n 'path',\n 'punycode',\n 'querystring',\n 'readline',\n 'repl',\n 'stream',\n 'string_decoder',\n 'tls',\n 'tty',\n 'url',\n 'util',\n 'v8',\n 'vm',\n 'zlib',\n];\n\nexport const EXTERNAL_REQUIRE_POLYFILL = '.expo/metro/polyfill.js';\nexport const EXTERNAL_REQUIRE_NATIVE_POLYFILL = '.expo/metro/polyfill.native.js';\nexport const METRO_EXTERNALS_FOLDER = '.expo/metro/externals';\n\nexport function getNodeExternalModuleId(fromModule: string, moduleId: string) {\n return path.relative(\n path.dirname(fromModule),\n path.join(METRO_EXTERNALS_FOLDER, moduleId, 'index.js')\n );\n}\n\nexport async function setupNodeExternals(projectRoot: string) {\n await tapExternalRequirePolyfill(projectRoot);\n await tapNodeShims(projectRoot);\n}\n\nasync function tapExternalRequirePolyfill(projectRoot: string) {\n await fs.promises.mkdir(path.join(projectRoot, path.dirname(EXTERNAL_REQUIRE_POLYFILL)), {\n recursive: true,\n });\n await fs.promises.writeFile(\n path.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL),\n 'global.$$require_external = typeof window === \"undefined\" ? require : () => null;'\n );\n await fs.promises.writeFile(\n path.join(projectRoot, EXTERNAL_REQUIRE_NATIVE_POLYFILL),\n 'global.$$require_external = (moduleId) => {throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);}'\n );\n}\n\nexport function isNodeExternal(moduleName: string): string | null {\n const moduleId = moduleName.replace(/^node:/, '');\n if (NODE_STDLIB_MODULES.includes(moduleId)) {\n return moduleId;\n }\n return null;\n}\n\nfunction tapNodeShimContents(moduleId: string): string {\n return `module.exports = $$require_external('node:${moduleId}');`;\n}\n\n// Ensure Node.js shims which require using `$$require_external` are available inside the project.\nasync function tapNodeShims(projectRoot: string) {\n const externals: Record<string, string> = {};\n for (const moduleId of NODE_STDLIB_MODULES) {\n const shimDir = path.join(projectRoot, METRO_EXTERNALS_FOLDER, moduleId);\n const shimPath = path.join(shimDir, 'index.js');\n externals[moduleId] = shimPath;\n\n if (!fs.existsSync(shimPath)) {\n await fs.promises.mkdir(shimDir, { recursive: true });\n await fs.promises.writeFile(shimPath, tapNodeShimContents(moduleId));\n }\n }\n}\n"],"names":["getNodeExternalModuleId","setupNodeExternals","isNodeExternal","NODE_STDLIB_MODULES","EXTERNAL_REQUIRE_POLYFILL","EXTERNAL_REQUIRE_NATIVE_POLYFILL","METRO_EXTERNALS_FOLDER","fromModule","moduleId","path","relative","dirname","join","projectRoot","tapExternalRequirePolyfill","tapNodeShims","fs","promises","mkdir","recursive","writeFile","moduleName","replace","includes","tapNodeShimContents","externals","shimDir","shimPath","existsSync"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.getCssModulesFromBundler = getCssModulesFromBundler;
|
|
6
|
+
exports.getFileName = getFileName;
|
|
7
|
+
var _crypto = _interopRequireDefault(require("crypto"));
|
|
8
|
+
var _js = require("metro/src/DeltaBundler/Serializers/helpers/js");
|
|
9
|
+
var _splitBundleOptions = _interopRequireDefault(require("metro/src/lib/splitBundleOptions"));
|
|
10
|
+
var _path = _interopRequireDefault(require("path"));
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
// s = static
|
|
17
|
+
const STATIC_EXPORT_DIRECTORY = "_expo/static/css";
|
|
18
|
+
async function getCssModulesFromBundler(config, incrementalBundler, options) {
|
|
19
|
+
// Static CSS is a web-only feature.
|
|
20
|
+
if (options.platform !== "web") {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const { entryFile , onProgress , resolverOptions , transformOptions } = (0, _splitBundleOptions).default(options);
|
|
24
|
+
const dependencies = await incrementalBundler.getDependencies([
|
|
25
|
+
entryFile
|
|
26
|
+
], transformOptions, resolverOptions, {
|
|
27
|
+
onProgress,
|
|
28
|
+
shallow: false
|
|
29
|
+
});
|
|
30
|
+
var _unstable_serverRoot;
|
|
31
|
+
return getCssModules(dependencies, {
|
|
32
|
+
processModuleFilter: config.serializer.processModuleFilter,
|
|
33
|
+
assetPlugins: config.transformer.assetPlugins,
|
|
34
|
+
platform: transformOptions.platform,
|
|
35
|
+
projectRoot: (_unstable_serverRoot = config.server.unstable_serverRoot) != null ? _unstable_serverRoot : config.projectRoot,
|
|
36
|
+
publicPath: config.transformer.publicPath
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function hashString(str) {
|
|
40
|
+
return _crypto.default.createHash("md5").update(str).digest("hex");
|
|
41
|
+
}
|
|
42
|
+
function getCssModules(dependencies, { processModuleFilter , projectRoot }) {
|
|
43
|
+
const promises = [];
|
|
44
|
+
for (const module of dependencies.values()){
|
|
45
|
+
if ((0, _js).isJsModule(module) && processModuleFilter(module) && (0, _js).getJsOutput(module).type === "js/module" && _path.default.relative(projectRoot, module.path) !== "package.json") {
|
|
46
|
+
const cssMetadata = getCssMetadata(module);
|
|
47
|
+
if (cssMetadata) {
|
|
48
|
+
const contents = cssMetadata.code;
|
|
49
|
+
const filename = _path.default.join(// Consistent location
|
|
50
|
+
STATIC_EXPORT_DIRECTORY, // Hashed file contents + name for caching
|
|
51
|
+
getFileName(module.path) + "-" + hashString(module.path + contents) + ".css");
|
|
52
|
+
promises.push({
|
|
53
|
+
originFilename: _path.default.relative(projectRoot, module.path),
|
|
54
|
+
filename,
|
|
55
|
+
source: contents
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return promises;
|
|
61
|
+
}
|
|
62
|
+
function getCssMetadata(module) {
|
|
63
|
+
var ref;
|
|
64
|
+
const data = (ref = module.output[0]) == null ? void 0 : ref.data;
|
|
65
|
+
if (data && typeof data === "object" && "css" in data) {
|
|
66
|
+
if (typeof data.css !== "object" || !("code" in data.css)) {
|
|
67
|
+
throw new Error(`Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`);
|
|
68
|
+
}
|
|
69
|
+
return data.css;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function getFileName(module) {
|
|
74
|
+
return _path.default.basename(module).replace(/\.[^.]+$/, "");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=getCssModulesFromBundler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/getCssModulesFromBundler.ts"],"sourcesContent":["import { MetroConfig } from '@expo/metro-config';\nimport crypto from 'crypto';\nimport type { Module } from 'metro';\nimport { getJsOutput, isJsModule } from 'metro/src/DeltaBundler/Serializers/helpers/js';\n// @ts-expect-error: TODO: Use Metro upstream types: https://github.com/facebook/metro/commit/07732e778b0587ce7e92571e66243c7546781f7c\nimport type IncrementalBundler from 'metro/src/IncrementalBundler';\nimport splitBundleOptions from 'metro/src/lib/splitBundleOptions';\nimport path from 'path';\n\n// import { getAssetData } from 'metro/src/Assets';\nexport type ReadOnlyDependencies<T = any> = Map<string, Module<T>>;\n\ntype Options = {\n processModuleFilter: (modules: Module) => boolean;\n assetPlugins: readonly string[];\n platform?: string | null;\n projectRoot: string;\n publicPath: string;\n};\n\ntype MetroModuleCSSMetadata = {\n code: string;\n lineCount: number;\n map: any[];\n};\n\nexport type CSSAsset = {\n // 'styles.css'\n originFilename: string;\n // '_expo/static/css/bc6aa0a69dcebf8e8cac1faa76705756.css'\n filename: string;\n // '\\ndiv {\\n background: cyan;\\n}\\n\\n'\n source: string;\n};\n\n// s = static\nconst STATIC_EXPORT_DIRECTORY = '_expo/static/css';\n\n/** @returns the static CSS assets used in a given bundle. CSS assets are only enabled if the `@expo/metro-config` `transformerPath` is used. */\nexport async function getCssModulesFromBundler(\n config: MetroConfig,\n incrementalBundler: IncrementalBundler,\n options: any\n): Promise<CSSAsset[]> {\n // Static CSS is a web-only feature.\n if (options.platform !== 'web') {\n return [];\n }\n\n const { entryFile, onProgress, resolverOptions, transformOptions } = splitBundleOptions(options);\n\n const dependencies = await incrementalBundler.getDependencies(\n [entryFile],\n transformOptions,\n resolverOptions,\n { onProgress, shallow: false }\n );\n\n return getCssModules(dependencies, {\n processModuleFilter: config.serializer.processModuleFilter,\n assetPlugins: config.transformer.assetPlugins,\n platform: transformOptions.platform,\n projectRoot: config.server.unstable_serverRoot ?? config.projectRoot,\n publicPath: config.transformer.publicPath,\n });\n}\n\nfunction hashString(str: string) {\n return crypto.createHash('md5').update(str).digest('hex');\n}\n\nfunction getCssModules(\n dependencies: ReadOnlyDependencies,\n { processModuleFilter, projectRoot }: Options\n) {\n const promises = [];\n\n for (const module of dependencies.values()) {\n if (\n isJsModule(module) &&\n processModuleFilter(module) &&\n getJsOutput(module).type === 'js/module' &&\n path.relative(projectRoot, module.path) !== 'package.json'\n ) {\n const cssMetadata = getCssMetadata(module);\n if (cssMetadata) {\n const contents = cssMetadata.code;\n const filename = path.join(\n // Consistent location\n STATIC_EXPORT_DIRECTORY,\n // Hashed file contents + name for caching\n getFileName(module.path) + '-' + hashString(module.path + contents) + '.css'\n );\n promises.push({\n originFilename: path.relative(projectRoot, module.path),\n filename,\n source: contents,\n });\n }\n }\n }\n\n return promises;\n}\n\nfunction getCssMetadata(module: Module): MetroModuleCSSMetadata | null {\n const data = module.output[0]?.data;\n if (data && typeof data === 'object' && 'css' in data) {\n if (typeof data.css !== 'object' || !('code' in (data as any).css)) {\n throw new Error(\n `Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`\n );\n }\n return data.css as MetroModuleCSSMetadata;\n }\n return null;\n}\n\nexport function getFileName(module: string) {\n return path.basename(module).replace(/\\.[^.]+$/, '');\n}\n"],"names":["getCssModulesFromBundler","getFileName","STATIC_EXPORT_DIRECTORY","config","incrementalBundler","options","platform","entryFile","onProgress","resolverOptions","transformOptions","splitBundleOptions","dependencies","getDependencies","shallow","getCssModules","processModuleFilter","serializer","assetPlugins","transformer","projectRoot","server","unstable_serverRoot","publicPath","hashString","str","crypto","createHash","update","digest","promises","module","values","isJsModule","getJsOutput","type","path","relative","cssMetadata","getCssMetadata","contents","code","filename","join","push","originFilename","source","data","output","css","Error","JSON","stringify","basename","replace"],"mappings":"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"}
|
|
@@ -9,12 +9,12 @@ Object.defineProperty(exports, "ExpoInspectorProxy", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
exports.createInspectorProxy = createInspectorProxy;
|
|
12
|
-
var _log = require("../../../../log");
|
|
13
12
|
var _resolveFromProject = require("../resolveFromProject");
|
|
14
13
|
var _device = require("./device");
|
|
15
14
|
var _proxy = require("./proxy");
|
|
15
|
+
const debug = require("debug")("expo:metro:inspector-proxy");
|
|
16
16
|
function createInspectorProxy(metroBundler, projectRoot) {
|
|
17
|
-
|
|
17
|
+
debug("Experimental inspector proxy enabled");
|
|
18
18
|
// Import the installed `metro-inspector-proxy` from the project
|
|
19
19
|
// We use these base classes to extend functionality
|
|
20
20
|
const { InspectorProxy: MetroInspectorProxy } = (0, _resolveFromProject).importMetroInspectorProxyFromProject(projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/index.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/index.ts"],"sourcesContent":["import { MetroBundlerDevServer } from '../MetroBundlerDevServer';\nimport {\n importMetroInspectorDeviceFromProject,\n importMetroInspectorProxyFromProject,\n} from '../resolveFromProject';\nimport { createInspectorDeviceClass } from './device';\nimport { ExpoInspectorProxy } from './proxy';\n\nexport { ExpoInspectorProxy } from './proxy';\n\nconst debug = require('debug')('expo:metro:inspector-proxy') as typeof console.log;\n\nexport function createInspectorProxy(metroBundler: MetroBundlerDevServer, projectRoot: string) {\n debug('Experimental inspector proxy enabled');\n\n // Import the installed `metro-inspector-proxy` from the project\n // We use these base classes to extend functionality\n const { InspectorProxy: MetroInspectorProxy } = importMetroInspectorProxyFromProject(projectRoot);\n // The device is slightly more complicated, we need to extend that class\n const ExpoInspectorDevice = createInspectorDeviceClass(\n metroBundler,\n importMetroInspectorDeviceFromProject(projectRoot)\n );\n\n const inspectorProxy = new ExpoInspectorProxy(\n new MetroInspectorProxy(projectRoot),\n ExpoInspectorDevice\n );\n\n return inspectorProxy;\n}\n"],"names":["ExpoInspectorProxy","createInspectorProxy","debug","require","metroBundler","projectRoot","InspectorProxy","MetroInspectorProxy","importMetroInspectorProxyFromProject","ExpoInspectorDevice","createInspectorDeviceClass","importMetroInspectorDeviceFromProject","inspectorProxy"],"mappings":"AAAA;;;;+BAQSA,oBAAkB;;;eAFQ,MAAS,CAEnCA,kBAAkB;;;QAIXC,oBAAoB,GAApBA,oBAAoB;AAR7B,IAAA,mBAAuB,WAAvB,uBAAuB,CAAA;AACa,IAAA,OAAU,WAAV,UAAU,CAAA;AAClB,IAAA,MAAS,WAAT,SAAS,CAAA;AAI5C,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,4BAA4B,CAAC,AAAsB,AAAC;AAE5E,SAASF,oBAAoB,CAACG,YAAmC,EAAEC,WAAmB,EAAE;IAC7FH,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAE9C,gEAAgE;IAChE,oDAAoD;IACpD,MAAM,EAAEI,cAAc,EAAEC,mBAAmB,CAAA,EAAE,GAAGC,CAAAA,GAAAA,mBAAoC,AAAa,CAAA,qCAAb,CAACH,WAAW,CAAC,AAAC;IAClG,wEAAwE;IACxE,MAAMI,mBAAmB,GAAGC,CAAAA,GAAAA,OAA0B,AAGrD,CAAA,2BAHqD,CACpDN,YAAY,EACZO,CAAAA,GAAAA,mBAAqC,AAAa,CAAA,sCAAb,CAACN,WAAW,CAAC,CACnD,AAAC;IAEF,MAAMO,cAAc,GAAG,IAAIZ,MAAkB,mBAAA,CAC3C,IAAIO,mBAAmB,CAACF,WAAW,CAAC,EACpCI,mBAAmB,CACpB,AAAC;IAEF,OAAOG,cAAc,CAAC;CACvB"}
|
|
@@ -45,9 +45,7 @@ class ExpoInspectorProxy {
|
|
|
45
45
|
this.metroProxy.processRequest(req, res, next);
|
|
46
46
|
}
|
|
47
47
|
createWebSocketListeners(server) {
|
|
48
|
-
|
|
49
|
-
this.setServerAddress(server);
|
|
50
|
-
}
|
|
48
|
+
this.setServerAddress(server);
|
|
51
49
|
return {
|
|
52
50
|
[WS_DEVICE_URL]: this.createDeviceWebSocketServer(),
|
|
53
51
|
[WS_DEBUGGER_URL]: this.createDebuggerWebSocketServer()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/proxy.ts"],"sourcesContent":["import type { Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { InspectorProxy as MetroProxy, Device as MetroDevice } from 'metro-inspector-proxy';\nimport { parse } from 'url';\nimport WS, { Server as WSServer } from 'ws';\n\nimport { Log } from '../../../../log';\n\nconst WS_DEVICE_URL = '/inspector/device';\nconst WS_DEBUGGER_URL = '/inspector/debug';\nconst WS_GENERIC_ERROR_STATUS = 1011;\n\nconst debug = require('debug')('expo:metro:inspector-proxy:proxy') as typeof console.log;\n\n// This is a workaround for `ConstructorType` not working on dynamically generated classes\ntype Instantiatable<Instance> = new (...args: any) => Instance;\n\nexport class ExpoInspectorProxy<D extends MetroDevice = MetroDevice> {\n constructor(\n public readonly metroProxy: MetroProxy,\n private DeviceClass: Instantiatable<D>,\n public readonly devices: Map<number, D> = new Map()\n ) {\n // monkey-patch the device list to expose it within the metro inspector\n this.metroProxy._devices = this.devices;\n\n // force httpEndpointMiddleware to be bound to this proxy instance\n this.processRequest = this.processRequest.bind(this);\n }\n\n /**\n * Initialize the server address from the metro server.\n * This is required to properly reference sourcemaps for the debugger.\n */\n public setServerAddress(server: HttpServer | HttpsServer) {\n const addressInfo = server.address();\n\n if (typeof addressInfo === 'string') {\n throw new Error(`Inspector proxy could not resolve the server address, got \"${addressInfo}\"`);\n } else if (addressInfo === null) {\n throw new Error(`Inspector proxy could not resolve the server address, got \"null\"`);\n }\n\n const { address, port, family } = addressInfo;\n\n if (family === 'IPv6') {\n this.metroProxy._serverAddressWithPort = `[${address ?? '::1'}]:${port}`;\n } else {\n this.metroProxy._serverAddressWithPort = `${address ?? 'localhost'}:${port}`;\n }\n }\n\n /** @see https://chromedevtools.github.io/devtools-protocol/#endpoints */\n public processRequest(req: IncomingMessage, res: ServerResponse, next: (error?: Error) => any) {\n this.metroProxy.processRequest(req, res, next);\n }\n\n public createWebSocketListeners(server?: HttpServer | HttpsServer): Record<string, WSServer> {\n if (server) {\n this.setServerAddress(server);\n }\n\n return {\n [WS_DEVICE_URL]: this.createDeviceWebSocketServer(),\n [WS_DEBUGGER_URL]: this.createDebuggerWebSocketServer(),\n };\n }\n\n private createDeviceWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L157\n wss.on('connection', (socket, request) => {\n try {\n const deviceId = this.metroProxy._deviceCounter++;\n const { deviceName, appName } = getNewDeviceInfo(request.url);\n\n this.devices.set(\n deviceId,\n new this.DeviceClass(deviceId, deviceName, appName, socket, this.metroProxy._projectRoot)\n );\n\n debug('New device connected: device=%s, app=%s', deviceName, appName);\n\n socket.on('close', () => {\n this.devices.delete(deviceId);\n debug('Device disconnected: device=%s, app=%s', deviceName, appName);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to on-device debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to on-device debugger (Hermes engine).');\n Log.exception(error);\n } else {\n Log.error(\n 'Failed to create a socket connection to on-device debugger (Hermes engine), unknown error.'\n );\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n\n private createDebuggerWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L193\n wss.on('connection', (socket, request) => {\n try {\n const { deviceId, pageId } = getExistingDeviceInfo(request.url);\n if (!deviceId || !pageId) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Missing \"device\" and/or \"page\" IDs in query parameters`);\n }\n\n const device = this.devices.get(parseInt(deviceId, 10));\n if (!device) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Device with ID \"${deviceId}\" not found.`);\n }\n\n debug('New debugger connected: device=%s, app=%s', device._name, device._app);\n\n device.handleDebuggerConnection(socket, pageId);\n\n socket.on('close', () => {\n debug('Debugger disconnected: device=%s, app=%s', device._name, device._app);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to the debugger.');\n Log.exception(error);\n } else {\n Log.error('Failed to create a socket connection to the debugger, unkown error.');\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n}\n\nfunction asString(value: string | string[] = ''): string {\n return Array.isArray(value) ? value.join() : value;\n}\n\nfunction getNewDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceName: asString(query.name) || 'Unknown device name',\n appName: asString(query.app) || 'Unknown app name',\n };\n}\n\nfunction getExistingDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceId: asString(query.device),\n pageId: asString(query.page),\n };\n}\n"],"names":["WS_DEVICE_URL","WS_DEBUGGER_URL","WS_GENERIC_ERROR_STATUS","debug","require","ExpoInspectorProxy","constructor","metroProxy","DeviceClass","devices","Map","_devices","processRequest","bind","setServerAddress","server","addressInfo","address","Error","port","family","_serverAddressWithPort","req","res","next","createWebSocketListeners","createDeviceWebSocketServer","createDebuggerWebSocketServer","wss","WS","Server","noServer","perMessageDeflate","on","socket","request","deviceId","_deviceCounter","deviceName","appName","getNewDeviceInfo","url","set","_projectRoot","delete","error","message","toString","Log","exception","close","pageId","getExistingDeviceInfo","device","get","parseInt","_name","_app","handleDebuggerConnection","asString","value","Array","isArray","join","query","parse","name","app","page"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/proxy.ts"],"sourcesContent":["import type { Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { InspectorProxy as MetroProxy, Device as MetroDevice } from 'metro-inspector-proxy';\nimport { parse } from 'url';\nimport WS, { Server as WSServer } from 'ws';\n\nimport { Log } from '../../../../log';\n\nconst WS_DEVICE_URL = '/inspector/device';\nconst WS_DEBUGGER_URL = '/inspector/debug';\nconst WS_GENERIC_ERROR_STATUS = 1011;\n\nconst debug = require('debug')('expo:metro:inspector-proxy:proxy') as typeof console.log;\n\n// This is a workaround for `ConstructorType` not working on dynamically generated classes\ntype Instantiatable<Instance> = new (...args: any) => Instance;\n\nexport class ExpoInspectorProxy<D extends MetroDevice = MetroDevice> {\n constructor(\n public readonly metroProxy: MetroProxy,\n private DeviceClass: Instantiatable<D>,\n public readonly devices: Map<number, D> = new Map()\n ) {\n // monkey-patch the device list to expose it within the metro inspector\n this.metroProxy._devices = this.devices;\n\n // force httpEndpointMiddleware to be bound to this proxy instance\n this.processRequest = this.processRequest.bind(this);\n }\n\n /**\n * Initialize the server address from the metro server.\n * This is required to properly reference sourcemaps for the debugger.\n */\n private setServerAddress(server: HttpServer | HttpsServer) {\n const addressInfo = server.address();\n\n if (typeof addressInfo === 'string') {\n throw new Error(`Inspector proxy could not resolve the server address, got \"${addressInfo}\"`);\n } else if (addressInfo === null) {\n throw new Error(`Inspector proxy could not resolve the server address, got \"null\"`);\n }\n\n const { address, port, family } = addressInfo;\n\n if (family === 'IPv6') {\n this.metroProxy._serverAddressWithPort = `[${address ?? '::1'}]:${port}`;\n } else {\n this.metroProxy._serverAddressWithPort = `${address ?? 'localhost'}:${port}`;\n }\n }\n\n /** @see https://chromedevtools.github.io/devtools-protocol/#endpoints */\n public processRequest(req: IncomingMessage, res: ServerResponse, next: (error?: Error) => any) {\n this.metroProxy.processRequest(req, res, next);\n }\n\n public createWebSocketListeners(server: HttpServer | HttpsServer): Record<string, WSServer> {\n this.setServerAddress(server);\n\n return {\n [WS_DEVICE_URL]: this.createDeviceWebSocketServer(),\n [WS_DEBUGGER_URL]: this.createDebuggerWebSocketServer(),\n };\n }\n\n private createDeviceWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L157\n wss.on('connection', (socket, request) => {\n try {\n const deviceId = this.metroProxy._deviceCounter++;\n const { deviceName, appName } = getNewDeviceInfo(request.url);\n\n this.devices.set(\n deviceId,\n new this.DeviceClass(deviceId, deviceName, appName, socket, this.metroProxy._projectRoot)\n );\n\n debug('New device connected: device=%s, app=%s', deviceName, appName);\n\n socket.on('close', () => {\n this.devices.delete(deviceId);\n debug('Device disconnected: device=%s, app=%s', deviceName, appName);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to on-device debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to on-device debugger (Hermes engine).');\n Log.exception(error);\n } else {\n Log.error(\n 'Failed to create a socket connection to on-device debugger (Hermes engine), unknown error.'\n );\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n\n private createDebuggerWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L193\n wss.on('connection', (socket, request) => {\n try {\n const { deviceId, pageId } = getExistingDeviceInfo(request.url);\n if (!deviceId || !pageId) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Missing \"device\" and/or \"page\" IDs in query parameters`);\n }\n\n const device = this.devices.get(parseInt(deviceId, 10));\n if (!device) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Device with ID \"${deviceId}\" not found.`);\n }\n\n debug('New debugger connected: device=%s, app=%s', device._name, device._app);\n\n device.handleDebuggerConnection(socket, pageId);\n\n socket.on('close', () => {\n debug('Debugger disconnected: device=%s, app=%s', device._name, device._app);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to the debugger.');\n Log.exception(error);\n } else {\n Log.error('Failed to create a socket connection to the debugger, unkown error.');\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n}\n\nfunction asString(value: string | string[] = ''): string {\n return Array.isArray(value) ? value.join() : value;\n}\n\nfunction getNewDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceName: asString(query.name) || 'Unknown device name',\n appName: asString(query.app) || 'Unknown app name',\n };\n}\n\nfunction getExistingDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceId: asString(query.device),\n pageId: asString(query.page),\n };\n}\n"],"names":["WS_DEVICE_URL","WS_DEBUGGER_URL","WS_GENERIC_ERROR_STATUS","debug","require","ExpoInspectorProxy","constructor","metroProxy","DeviceClass","devices","Map","_devices","processRequest","bind","setServerAddress","server","addressInfo","address","Error","port","family","_serverAddressWithPort","req","res","next","createWebSocketListeners","createDeviceWebSocketServer","createDebuggerWebSocketServer","wss","WS","Server","noServer","perMessageDeflate","on","socket","request","deviceId","_deviceCounter","deviceName","appName","getNewDeviceInfo","url","set","_projectRoot","delete","error","message","toString","Log","exception","close","pageId","getExistingDeviceInfo","device","get","parseInt","_name","_app","handleDebuggerConnection","asString","value","Array","isArray","join","query","parse","name","app","page"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
exports.loadMetroConfigAsync = loadMetroConfigAsync;
|
|
5
6
|
exports.instantiateMetroAsync = instantiateMetroAsync;
|
|
6
7
|
exports.isWatchEnabled = isWatchEnabled;
|
|
7
8
|
var _config = require("@expo/config");
|
|
@@ -12,24 +13,27 @@ var _getMetroProperties = require("../../../utils/analytics/getMetroProperties")
|
|
|
12
13
|
var _metroDebuggerMiddleware = require("../../../utils/analytics/metroDebuggerMiddleware");
|
|
13
14
|
var _rudderstackClient = require("../../../utils/analytics/rudderstackClient");
|
|
14
15
|
var _env = require("../../../utils/env");
|
|
16
|
+
var _manifestMiddleware = require("../middleware/ManifestMiddleware");
|
|
15
17
|
var _createDevServerMiddleware = require("../middleware/createDevServerMiddleware");
|
|
16
18
|
var _platformBundlers = require("../platformBundlers");
|
|
17
19
|
var _metroTerminalReporter = require("./MetroTerminalReporter");
|
|
18
|
-
var _inspectorProxy = require("./inspector-proxy");
|
|
19
20
|
var _resolveFromProject = require("./resolveFromProject");
|
|
21
|
+
var _runServerFork = require("./runServer-fork");
|
|
20
22
|
var _withMetroMultiPlatform = require("./withMetroMultiPlatform");
|
|
21
23
|
function _interopRequireDefault(obj) {
|
|
22
24
|
return obj && obj.__esModule ? obj : {
|
|
23
25
|
default: obj
|
|
24
26
|
};
|
|
25
27
|
}
|
|
26
|
-
async function
|
|
27
|
-
|
|
28
|
+
async function loadMetroConfigAsync(projectRoot, options, { exp =(0, _config).getConfig(projectRoot, {
|
|
29
|
+
skipSDKVersionRequirement: true,
|
|
30
|
+
skipPlugins: true
|
|
31
|
+
}).exp } = {}) {
|
|
32
|
+
var ref, ref1;
|
|
28
33
|
let reportEvent;
|
|
29
|
-
const
|
|
30
|
-
const ExpoMetroConfig = (0, _resolveFromProject).importExpoMetroConfigFromProject(projectRoot);
|
|
34
|
+
const serverRoot = (0, _manifestMiddleware).getMetroServerRoot(projectRoot);
|
|
31
35
|
const terminal = new _metroCore.Terminal(process.stdout);
|
|
32
|
-
const terminalReporter = new _metroTerminalReporter.MetroTerminalReporter(
|
|
36
|
+
const terminalReporter = new _metroTerminalReporter.MetroTerminalReporter(serverRoot, terminal);
|
|
33
37
|
const reporter = {
|
|
34
38
|
update (event) {
|
|
35
39
|
terminalReporter.update(event);
|
|
@@ -38,70 +42,62 @@ async function instantiateMetroAsync(metroBundler, options) {
|
|
|
38
42
|
}
|
|
39
43
|
}
|
|
40
44
|
};
|
|
41
|
-
|
|
45
|
+
const ExpoMetroConfig = (0, _resolveFromProject).importExpoMetroConfig(projectRoot);
|
|
46
|
+
let config = await ExpoMetroConfig.loadAsync(projectRoot, {
|
|
42
47
|
reporter,
|
|
43
48
|
...options
|
|
44
49
|
});
|
|
50
|
+
const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
|
|
51
|
+
var ref2;
|
|
52
|
+
config = await (0, _withMetroMultiPlatform).withMetroMultiPlatformAsync(projectRoot, {
|
|
53
|
+
config,
|
|
54
|
+
platformBundlers,
|
|
55
|
+
isTsconfigPathsEnabled: !!((ref = exp.experiments) == null ? void 0 : ref.tsconfigPaths),
|
|
56
|
+
webOutput: (ref2 = (ref1 = exp.web) == null ? void 0 : ref1.output) != null ? ref2 : "single"
|
|
57
|
+
});
|
|
58
|
+
(0, _rudderstackClient).logEventAsync("metro config", (0, _getMetroProperties).getMetroProperties(projectRoot, exp, config));
|
|
59
|
+
return {
|
|
60
|
+
config,
|
|
61
|
+
setEventReporter: (logger)=>reportEvent = logger
|
|
62
|
+
,
|
|
63
|
+
reporter: terminalReporter
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async function instantiateMetroAsync(metroBundler, options) {
|
|
67
|
+
const projectRoot = metroBundler.projectRoot;
|
|
45
68
|
// TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.
|
|
46
69
|
const { exp } = (0, _config).getConfig(projectRoot, {
|
|
47
70
|
skipSDKVersionRequirement: true,
|
|
48
71
|
skipPlugins: true
|
|
49
72
|
});
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const { middleware ,
|
|
54
|
-
websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint , } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
|
|
73
|
+
const { config: metroConfig , setEventReporter } = await loadMetroConfigAsync(projectRoot, options, {
|
|
74
|
+
exp
|
|
75
|
+
});
|
|
76
|
+
const { middleware , websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
|
|
55
77
|
port: metroConfig.server.port,
|
|
56
78
|
watchFolders: metroConfig.watchFolders
|
|
57
79
|
});
|
|
58
80
|
const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;
|
|
59
|
-
// @ts-
|
|
81
|
+
// @ts-expect-error: can't mutate readonly config
|
|
60
82
|
metroConfig.server.enhanceMiddleware = (metroMiddleware, server)=>{
|
|
61
83
|
if (customEnhanceMiddleware) {
|
|
62
84
|
metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);
|
|
63
85
|
}
|
|
64
86
|
return middleware.use(metroMiddleware);
|
|
65
87
|
};
|
|
66
|
-
// Create the custom inspector proxy only when enabled and opt-in
|
|
67
|
-
const inspectorProxy = metroConfig.server.runInspectorProxy && _env.env.EXPO_USE_CUSTOM_INSPECTOR_PROXY ? (0, _inspectorProxy).createInspectorProxy(metroBundler, metroBundler.projectRoot) : null;
|
|
68
|
-
if (inspectorProxy) {
|
|
69
|
-
// @ts-expect-error Property is read-only, but we need to disable it
|
|
70
|
-
metroConfig.server.runInspectorProxy = false;
|
|
71
|
-
}
|
|
72
88
|
middleware.use((0, _metroDebuggerMiddleware).createDebuggerTelemetryMiddleware(projectRoot, exp));
|
|
73
|
-
const server1 = await
|
|
89
|
+
const { server: server1 , metro } = await (0, _runServerFork).runServer(metroBundler, metroConfig, {
|
|
74
90
|
hmrEnabled: true,
|
|
75
|
-
websocketEndpoints
|
|
76
|
-
...websocketEndpoints,
|
|
77
|
-
...inspectorProxy ? inspectorProxy.createWebSocketListeners() : {}
|
|
78
|
-
},
|
|
79
|
-
// @ts-expect-error Property was added in 0.73.4, remove this statement when updating Metro
|
|
91
|
+
websocketEndpoints,
|
|
80
92
|
watch: isWatchEnabled()
|
|
81
93
|
});
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const { messageSocket , eventsSocket } = attachToServer(server1);
|
|
90
|
-
reportEvent = eventsSocket.reportEvent;
|
|
91
|
-
return {
|
|
92
|
-
server: server1,
|
|
93
|
-
middleware,
|
|
94
|
-
messageSocket
|
|
95
|
-
};
|
|
96
|
-
} else {
|
|
97
|
-
// RN +68 -- Expo SDK +45
|
|
98
|
-
reportEvent = eventsSocketEndpoint.reportEvent;
|
|
99
|
-
return {
|
|
100
|
-
server: server1,
|
|
101
|
-
middleware,
|
|
102
|
-
messageSocket: messageSocketEndpoint
|
|
103
|
-
};
|
|
104
|
-
}
|
|
94
|
+
setEventReporter(eventsSocketEndpoint.reportEvent);
|
|
95
|
+
return {
|
|
96
|
+
metro,
|
|
97
|
+
server: server1,
|
|
98
|
+
middleware,
|
|
99
|
+
messageSocket: messageSocketEndpoint
|
|
100
|
+
};
|
|
105
101
|
}
|
|
106
102
|
function isWatchEnabled() {
|
|
107
103
|
if (_env.env.CI) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { MetroDevServerOptions } from '@expo/dev-server';\nimport chalk from 'chalk';\nimport http from 'http';\nimport Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { MetroDevServerOptions } from '@expo/dev-server';\nimport type { LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport type Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfig } from './resolveFromProject';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true, skipPlugins: true }).exp,\n }: { exp?: ExpoConfig } = {}\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n const ExpoMetroConfig = importExpoMetroConfig(projectRoot);\n let config = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n const platformBundlers = getPlatformBundlers(exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n platformBundlers,\n isTsconfigPathsEnabled: !!exp.experiments?.tsconfigPaths,\n webOutput: exp.web?.output ?? 'single',\n });\n\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n { exp }\n );\n\n const { middleware, websocketEndpoints, eventsSocketEndpoint, messageSocketEndpoint } =\n createDevServerMiddleware(projectRoot, {\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n hmrEnabled: true,\n websocketEndpoints,\n watch: isWatchEnabled(),\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","projectRoot","options","exp","getConfig","skipSDKVersionRequirement","skipPlugins","reportEvent","serverRoot","getMetroServerRoot","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","ExpoMetroConfig","importExpoMetroConfig","config","loadAsync","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","experiments","tsconfigPaths","webOutput","web","output","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","middleware","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","metro","runServer","hmrEnabled","watch","messageSocket","env","CI","Log","log","chalk"],"mappings":"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"}
|