@expo/cli 0.14.0 → 0.16.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/build/bin/cli +13 -5
- package/build/bin/cli.map +1 -1
- package/build/src/api/getVersions.js.map +1 -1
- package/build/src/api/rest/cache/response.js.map +1 -1
- package/build/src/api/rest/client.js +2 -2
- package/build/src/api/rest/client.js.map +1 -1
- package/build/src/api/user/actions.js +1 -1
- package/build/src/api/user/actions.js.map +1 -1
- package/build/src/customize/typescript.js +3 -1
- package/build/src/customize/typescript.js.map +1 -1
- package/build/src/export/createMetadataJson.js +5 -3
- package/build/src/export/createMetadataJson.js.map +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +92 -18
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
- package/build/src/export/embed/resolveOptions.js +3 -3
- package/build/src/export/embed/resolveOptions.js.map +1 -1
- package/build/src/export/embed/xcodeCompilerLogger.js +97 -0
- package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -0
- package/build/src/export/exportApp.js +106 -130
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +93 -38
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/exportAsync.js +1 -1
- package/build/src/export/exportAsync.js.map +1 -1
- package/build/src/export/exportHermes.js +0 -90
- package/build/src/export/exportHermes.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +165 -101
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/favicon.js +13 -5
- package/build/src/export/favicon.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +84 -57
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/index.js +9 -7
- package/build/src/export/index.js.map +1 -1
- package/build/src/export/metroAssetLocalPath.js +101 -0
- package/build/src/export/metroAssetLocalPath.js.map +1 -0
- package/build/src/export/persistMetroAssets.js +115 -31
- package/build/src/export/persistMetroAssets.js.map +1 -1
- package/build/src/export/publicFolder.js +7 -0
- package/build/src/export/publicFolder.js.map +1 -1
- package/build/src/export/resolveOptions.js +1 -1
- package/build/src/export/resolveOptions.js.map +1 -1
- package/build/src/export/saveAssets.js +168 -43
- package/build/src/export/saveAssets.js.map +1 -1
- package/build/src/export/web/exportWebAsync.js +1 -1
- package/build/src/export/web/exportWebAsync.js.map +1 -1
- package/build/src/export/writeContents.js +8 -106
- package/build/src/export/writeContents.js.map +1 -1
- package/build/src/install/applyPlugins.js +52 -0
- package/build/src/install/applyPlugins.js.map +1 -0
- package/build/src/install/checkPackages.js +2 -2
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/install/fixPackages.js +84 -0
- package/build/src/install/fixPackages.js.map +1 -0
- package/build/src/install/installAsync.js +50 -60
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/install/installExpoPackage.js +79 -0
- package/build/src/install/installExpoPackage.js.map +1 -0
- package/build/src/prebuild/clearNativeFolder.js +1 -1
- package/build/src/prebuild/clearNativeFolder.js.map +1 -1
- package/build/src/prebuild/configureProjectAsync.js +3 -3
- package/build/src/prebuild/configureProjectAsync.js.map +1 -1
- package/build/src/prebuild/copyTemplateFiles.js +21 -30
- package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +45 -16
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveOptions.js +2 -2
- package/build/src/prebuild/resolveOptions.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +6 -6
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/prebuild/updatePackageJson.js +49 -36
- package/build/src/prebuild/updatePackageJson.js.map +1 -1
- package/build/src/prebuild/validateTemplatePlatforms.js +2 -2
- package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -1
- package/build/src/run/hints.js +4 -0
- package/build/src/run/hints.js.map +1 -1
- package/build/src/run/index.js +101 -0
- package/build/src/run/index.js.map +1 -0
- package/build/src/start/doctor/dependencies/bundledNativeModules.js +2 -2
- package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
- package/build/src/start/doctor/dependencies/getVersionedPackages.js +22 -7
- package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
- package/build/src/start/doctor/dependencies/resolvePackages.js +66 -0
- package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -0
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +22 -33
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/interface/interactiveActions.js +54 -19
- package/build/src/start/interface/interactiveActions.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js +14 -10
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +6 -1
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/DevToolsPluginManager.js +63 -0
- package/build/src/start/server/DevToolsPluginManager.js.map +1 -0
- package/build/src/start/server/getStaticRenderFunctions.js +25 -23
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +76 -69
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +6 -2
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/TerminalReporter.js +18 -1
- package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/bundleApiRoutes.js +5 -3
- package/build/src/start/server/metro/bundleApiRoutes.js.map +1 -1
- package/build/src/start/server/metro/createExpoMetroResolver.js +80 -46
- package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
- package/build/src/start/server/metro/createJResolver.js +152 -0
- package/build/src/start/server/metro/createJResolver.js.map +1 -0
- package/build/src/start/server/metro/createServerRouteMiddleware.js +15 -2
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
- package/build/src/start/server/metro/{inspector-proxy/device.js → debugging/InspectorDevice.js} +10 -38
- package/build/src/start/server/metro/debugging/InspectorDevice.js.map +1 -0
- package/build/src/start/server/metro/debugging/InspectorProxy.js +116 -0
- package/build/src/start/server/metro/debugging/InspectorProxy.js.map +1 -0
- package/build/src/start/server/metro/debugging/createDebugMiddleware.js +45 -0
- package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -0
- package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/NetworkResponse.js +3 -4
- package/build/src/start/server/metro/debugging/inspectorHandlers/NetworkResponse.js.map +1 -0
- package/build/src/start/server/metro/debugging/inspectorHandlers/PageReload.js.map +1 -0
- package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerGetPossibleBreakpoints.js +5 -6
- package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -0
- package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerScriptParsed.js +3 -2
- package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerScriptParsed.js.map +1 -0
- package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerSetBreakpointByUrl.js +3 -2
- package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -0
- package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js +24 -0
- package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js.map +1 -0
- package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeGetProperties.js +5 -4
- package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeGetProperties.js.map +1 -0
- package/build/src/start/server/metro/debugging/inspectorHandlers/types.js.map +1 -0
- package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js +20 -0
- package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js.map +1 -0
- package/build/src/start/server/metro/externals.js +25 -3
- package/build/src/start/server/metro/externals.js.map +1 -1
- package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +40 -15
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +3 -2
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/metro/router.js +5 -6
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +17 -27
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/serializeHtml.js +59 -0
- package/build/src/start/server/metro/serializeHtml.js.map +1 -0
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +1 -2
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +237 -214
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/metro/withMetroResolvers.js +114 -40
- package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
- package/build/src/start/server/middleware/DevToolsPluginMiddleware.js +61 -0
- package/build/src/start/server/middleware/DevToolsPluginMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ExpoMiddleware.js +2 -2
- package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +22 -66
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/inspector/JsInspector.js +23 -2
- package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
- package/build/src/start/server/middleware/inspector/LaunchBrowser.js +30 -26
- package/build/src/start/server/middleware/inspector/LaunchBrowser.js.map +1 -1
- package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js +7 -7
- package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js.map +1 -1
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js +5 -2
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js.map +1 -1
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js +3 -2
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js.map +1 -1
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js +8 -7
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js.map +1 -1
- package/build/src/start/server/middleware/metroOptions.js +176 -0
- package/build/src/start/server/middleware/metroOptions.js.map +1 -0
- package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
- package/build/src/start/server/type-generation/__typetests__/route.test.js +11 -3
- package/build/src/start/server/type-generation/__typetests__/route.test.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +6 -4
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +1 -1
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
- package/build/src/utils/analytics/getMetroDebugProperties.js +1 -2
- package/build/src/utils/analytics/getMetroDebugProperties.js.map +1 -1
- package/build/src/utils/analytics/getMetroProperties.js +1 -2
- package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/args.js +4 -2
- package/build/src/utils/args.js.map +1 -1
- package/build/src/utils/cocoapods.js +1 -1
- package/build/src/utils/cocoapods.js.map +1 -1
- package/build/src/utils/codesigning.js +11 -1
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/dir.js +18 -8
- package/build/src/utils/dir.js.map +1 -1
- package/build/src/utils/env.js +10 -1
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/getOrPromptApplicationId.js +2 -4
- package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
- package/build/src/utils/prompts.js +1 -28
- package/build/src/utils/prompts.js.map +1 -1
- package/build/src/utils/tsconfig/loadTsConfigPaths.js +3 -11
- package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +22 -12
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
- package/package.json +19 -18
- package/static/shims/react-native-web/dist/cjs/exports/AppRegistry/AppContainer.js +13 -0
- package/static/shims/react-native-web/dist/exports/AppRegistry/AppContainer.js +12 -0
- package/static/template/index.html +14 -95
- package/build/src/export/printBundleSizes.js +0 -101
- package/build/src/export/printBundleSizes.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/device.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/index.js +0 -27
- package/build/src/start/server/metro/inspector-proxy/index.js.map +0 -1
- package/build/src/start/server/metro/inspector-proxy/proxy.js +0 -169
- package/build/src/start/server/metro/inspector-proxy/proxy.js.map +0 -1
- package/build/src/start/server/metro/resolveFromProject.js +0 -90
- package/build/src/start/server/metro/resolveFromProject.js.map +0 -1
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +0 -64
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +0 -1
- /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/PageReload.js +0 -0
- /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/types.js +0 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.default = void 0;
|
|
6
|
+
var _assert = _interopRequireDefault(require("assert"));
|
|
7
|
+
var _path = require("path");
|
|
8
|
+
var _resolve = require("resolve");
|
|
9
|
+
var resolve = _interopRequireWildcard(require("resolve.exports"));
|
|
10
|
+
var _dir = require("../../../utils/dir");
|
|
11
|
+
function _interopRequireDefault(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function _interopRequireWildcard(obj) {
|
|
17
|
+
if (obj && obj.__esModule) {
|
|
18
|
+
return obj;
|
|
19
|
+
} else {
|
|
20
|
+
var newObj = {};
|
|
21
|
+
if (obj != null) {
|
|
22
|
+
for(var key in obj){
|
|
23
|
+
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
24
|
+
var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
|
|
25
|
+
if (desc.get || desc.set) {
|
|
26
|
+
Object.defineProperty(newObj, key, desc);
|
|
27
|
+
} else {
|
|
28
|
+
newObj[key] = obj[key];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
newObj.default = obj;
|
|
34
|
+
return newObj;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const defaultResolver = (path, { enablePackageExports , blockList =[] , ...options })=>{
|
|
38
|
+
// @ts-expect-error
|
|
39
|
+
const resolveOptions = {
|
|
40
|
+
...options,
|
|
41
|
+
isDirectory (file) {
|
|
42
|
+
if (blockList.some((regex)=>regex.test(file)
|
|
43
|
+
)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return (0, _dir).directoryExistsSync(file);
|
|
47
|
+
},
|
|
48
|
+
isFile (file) {
|
|
49
|
+
if (blockList.some((regex)=>regex.test(file)
|
|
50
|
+
)) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return (0, _dir).fileExistsSync(file);
|
|
54
|
+
},
|
|
55
|
+
preserveSymlinks: options.preserveSymlinks,
|
|
56
|
+
defaultResolver
|
|
57
|
+
};
|
|
58
|
+
// resolveSync dereferences symlinks to ensure we don't create a separate
|
|
59
|
+
// module instance depending on how it was referenced.
|
|
60
|
+
const result = (0, _resolve).sync(enablePackageExports ? getPathInModule(path, resolveOptions) : path, {
|
|
61
|
+
...resolveOptions,
|
|
62
|
+
preserveSymlinks: !options.preserveSymlinks
|
|
63
|
+
});
|
|
64
|
+
return result;
|
|
65
|
+
};
|
|
66
|
+
var _default = defaultResolver;
|
|
67
|
+
exports.default = _default;
|
|
68
|
+
/*
|
|
69
|
+
* helper functions
|
|
70
|
+
*/ function getPathInModule(path, options) {
|
|
71
|
+
if (shouldIgnoreRequestForExports(path)) {
|
|
72
|
+
return path;
|
|
73
|
+
}
|
|
74
|
+
const segments = path.split("/");
|
|
75
|
+
let moduleName = segments.shift();
|
|
76
|
+
if (moduleName) {
|
|
77
|
+
if (moduleName.startsWith("@")) {
|
|
78
|
+
moduleName = `${moduleName}/${segments.shift()}`;
|
|
79
|
+
}
|
|
80
|
+
// Disable package exports for babel/runtime for https://github.com/facebook/metro/issues/984/
|
|
81
|
+
if (moduleName === "@babel/runtime") {
|
|
82
|
+
return path;
|
|
83
|
+
}
|
|
84
|
+
// self-reference
|
|
85
|
+
const closestPackageJson = findClosestPackageJson(options.basedir, options);
|
|
86
|
+
if (closestPackageJson) {
|
|
87
|
+
const pkg = options.readPackageSync(options.readFileSync, closestPackageJson);
|
|
88
|
+
(0, _assert).default(pkg, "package.json should be read by `readPackageSync`");
|
|
89
|
+
if (pkg.name === moduleName) {
|
|
90
|
+
const resolved = resolve.exports(pkg, segments.join("/") || ".", createResolveOptions(options.conditions));
|
|
91
|
+
if (resolved) {
|
|
92
|
+
return (0, _path).resolve((0, _path).dirname(closestPackageJson), resolved[0]);
|
|
93
|
+
}
|
|
94
|
+
if (pkg.exports) {
|
|
95
|
+
throw new Error("`exports` exists, but no results - this is a bug in Expo CLI's Metro resolver. Please report an issue");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
let packageJsonPath = "";
|
|
100
|
+
try {
|
|
101
|
+
packageJsonPath = (0, _resolve).sync(`${moduleName}/package.json`, options);
|
|
102
|
+
} catch {
|
|
103
|
+
// ignore if package.json cannot be found
|
|
104
|
+
}
|
|
105
|
+
if (packageJsonPath && options.isFile(packageJsonPath)) {
|
|
106
|
+
const pkg = options.readPackageSync(options.readFileSync, packageJsonPath);
|
|
107
|
+
(0, _assert).default(pkg, "package.json should be read by `readPackageSync`");
|
|
108
|
+
const resolved = resolve.exports(pkg, segments.join("/") || ".", createResolveOptions(options.conditions));
|
|
109
|
+
if (resolved) {
|
|
110
|
+
return (0, _path).resolve((0, _path).dirname(packageJsonPath), resolved[0]);
|
|
111
|
+
}
|
|
112
|
+
if (pkg.exports) {
|
|
113
|
+
throw new Error("`exports` exists, but no results - this is a bug in Expo CLI's Metro resolver. Please report an issue");
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return path;
|
|
118
|
+
}
|
|
119
|
+
function createResolveOptions(conditions) {
|
|
120
|
+
return conditions ? {
|
|
121
|
+
conditions,
|
|
122
|
+
unsafe: true
|
|
123
|
+
} : {
|
|
124
|
+
browser: false,
|
|
125
|
+
require: true
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// if it's a relative import or an absolute path, imports/exports are ignored
|
|
129
|
+
const shouldIgnoreRequestForExports = (path)=>path.startsWith(".") || (0, _path).isAbsolute(path)
|
|
130
|
+
;
|
|
131
|
+
// adapted from
|
|
132
|
+
// https://github.com/lukeed/escalade/blob/2477005062cdbd8407afc90d3f48f4930354252b/src/sync.js
|
|
133
|
+
function findClosestPackageJson(start, options) {
|
|
134
|
+
let dir = (0, _path).resolve(".", start);
|
|
135
|
+
if (!options.isDirectory(dir)) {
|
|
136
|
+
dir = (0, _path).dirname(dir);
|
|
137
|
+
}
|
|
138
|
+
while(true){
|
|
139
|
+
const pkgJsonFile = (0, _path).resolve(dir, "./package.json");
|
|
140
|
+
const hasPackageJson = options.isFile(pkgJsonFile);
|
|
141
|
+
if (hasPackageJson) {
|
|
142
|
+
return pkgJsonFile;
|
|
143
|
+
}
|
|
144
|
+
const prevDir = dir;
|
|
145
|
+
dir = (0, _path).dirname(dir);
|
|
146
|
+
if (prevDir === dir) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
//# sourceMappingURL=createJResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/createJResolver.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\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 *\n * Fork of the jest resolver but with additional settings for Metro and pnp removed.\n * https://github.com/jestjs/jest/blob/d1a2ed7fea4bdc19836274cd810c8360e3ab62f3/packages/jest-resolve/src/defaultResolver.ts#L1\n */\nimport type { JSONObject as PackageJSON } from '@expo/json-file';\nimport assert from 'assert';\nimport { dirname, isAbsolute, resolve as pathResolve } from 'path';\nimport { sync as resolveSync, SyncOpts as UpstreamResolveOptions } from 'resolve';\nimport * as resolve from 'resolve.exports';\n\nimport { directoryExistsSync, fileExistsSync } from '../../../utils/dir';\n\n/**\n * Allows transforming parsed `package.json` contents.\n *\n * @param pkg - Parsed `package.json` contents.\n * @param file - Path to `package.json` file.\n * @param dir - Directory that contains the `package.json`.\n *\n * @returns Transformed `package.json` contents.\n */\ntype PackageFilter = (pkg: PackageJSON, file: string, dir: string) => PackageJSON;\n\n/**\n * Allows transforming a path within a package.\n *\n * @param pkg - Parsed `package.json` contents.\n * @param path - Path being resolved.\n * @param relativePath - Path relative from the `package.json` location.\n *\n * @returns Relative path that will be joined from the `package.json` location.\n */\ntype PathFilter = (pkg: PackageJSON, path: string, relativePath: string) => string;\n\ntype ResolverOptions = {\n /** Directory to begin resolving from. */\n basedir: string;\n /** List of export conditions. */\n conditions?: string[];\n /** Instance of default resolver. */\n defaultResolver: typeof defaultResolver;\n /** List of file extensions to search in order. */\n extensions?: string[];\n /**\n * List of directory names to be looked up for modules recursively.\n *\n * @defaultValue\n * The default is `['node_modules']`.\n */\n moduleDirectory?: string[];\n /**\n * List of `require.paths` to use if nothing is found in `node_modules`.\n *\n * @defaultValue\n * The default is `undefined`.\n */\n paths?: string[];\n /** Allows transforming parsed `package.json` contents. */\n packageFilter?: PackageFilter;\n /** Allows transforms a path within a package. */\n pathFilter?: PathFilter;\n /** Current root directory. */\n rootDir?: string;\n\n enablePackageExports?: boolean;\n\n blockList: RegExp[];\n\n getPackageForModule: import('metro-resolver').CustomResolutionContext['getPackageForModule'];\n} & Pick<\n UpstreamResolveOptions,\n | 'readPackageSync'\n | 'realpathSync'\n | 'moduleDirectory'\n | 'extensions'\n | 'preserveSymlinks'\n | 'includeCoreModules'\n>;\n\ntype UpstreamResolveOptionsWithConditions = UpstreamResolveOptions & ResolverOptions;\n\nconst defaultResolver = (\n path: string,\n {\n enablePackageExports,\n blockList = [],\n ...options\n }: Omit<ResolverOptions, 'defaultResolver' | 'getPackageForModule'>\n): string => {\n // @ts-expect-error\n const resolveOptions: UpstreamResolveOptionsWithConditions = {\n ...options,\n\n isDirectory(file) {\n if (blockList.some((regex) => regex.test(file))) {\n return false;\n }\n return directoryExistsSync(file);\n },\n isFile(file) {\n if (blockList.some((regex) => regex.test(file))) {\n return false;\n }\n return fileExistsSync(file);\n },\n preserveSymlinks: options.preserveSymlinks,\n defaultResolver,\n };\n\n // resolveSync dereferences symlinks to ensure we don't create a separate\n // module instance depending on how it was referenced.\n const result = resolveSync(enablePackageExports ? getPathInModule(path, resolveOptions) : path, {\n ...resolveOptions,\n preserveSymlinks: !options.preserveSymlinks,\n });\n\n return result;\n};\n\nexport default defaultResolver;\n\n/*\n * helper functions\n */\n\nfunction getPathInModule(path: string, options: UpstreamResolveOptionsWithConditions): string {\n if (shouldIgnoreRequestForExports(path)) {\n return path;\n }\n\n const segments = path.split('/');\n\n let moduleName = segments.shift();\n\n if (moduleName) {\n if (moduleName.startsWith('@')) {\n moduleName = `${moduleName}/${segments.shift()}`;\n }\n\n // Disable package exports for babel/runtime for https://github.com/facebook/metro/issues/984/\n if (moduleName === '@babel/runtime') {\n return path;\n }\n\n // self-reference\n const closestPackageJson = findClosestPackageJson(options.basedir, options);\n if (closestPackageJson) {\n const pkg = options.readPackageSync!(options.readFileSync!, closestPackageJson);\n assert(pkg, 'package.json should be read by `readPackageSync`');\n\n if (pkg.name === moduleName) {\n const resolved = resolve.exports(\n pkg,\n (segments.join('/') || '.') as resolve.Exports.Entry,\n createResolveOptions(options.conditions)\n );\n\n if (resolved) {\n return pathResolve(dirname(closestPackageJson), resolved[0]);\n }\n\n if (pkg.exports) {\n throw new Error(\n \"`exports` exists, but no results - this is a bug in Expo CLI's Metro resolver. Please report an issue\"\n );\n }\n }\n }\n\n let packageJsonPath = '';\n\n try {\n packageJsonPath = resolveSync(`${moduleName}/package.json`, options);\n } catch {\n // ignore if package.json cannot be found\n }\n\n if (packageJsonPath && options.isFile!(packageJsonPath)) {\n const pkg = options.readPackageSync!(options.readFileSync!, packageJsonPath);\n assert(pkg, 'package.json should be read by `readPackageSync`');\n\n const resolved = resolve.exports(\n pkg,\n (segments.join('/') || '.') as resolve.Exports.Entry,\n createResolveOptions(options.conditions)\n );\n\n if (resolved) {\n return pathResolve(dirname(packageJsonPath), resolved[0]);\n }\n\n if (pkg.exports) {\n throw new Error(\n \"`exports` exists, but no results - this is a bug in Expo CLI's Metro resolver. Please report an issue\"\n );\n }\n }\n }\n\n return path;\n}\n\nfunction createResolveOptions(conditions: string[] | undefined): resolve.Options {\n return conditions\n ? { conditions, unsafe: true }\n : // no conditions were passed - let's assume this is Jest internal and it should be `require`\n { browser: false, require: true };\n}\n\n// if it's a relative import or an absolute path, imports/exports are ignored\nconst shouldIgnoreRequestForExports = (path: string) => path.startsWith('.') || isAbsolute(path);\n\n// adapted from\n// https://github.com/lukeed/escalade/blob/2477005062cdbd8407afc90d3f48f4930354252b/src/sync.js\nfunction findClosestPackageJson(\n start: string,\n options: UpstreamResolveOptions\n): string | undefined {\n let dir = pathResolve('.', start);\n if (!options.isDirectory!(dir)) {\n dir = dirname(dir);\n }\n\n while (true) {\n const pkgJsonFile = pathResolve(dir, './package.json');\n const hasPackageJson = options.isFile!(pkgJsonFile);\n\n if (hasPackageJson) {\n return pkgJsonFile;\n }\n\n const prevDir = dir;\n dir = dirname(dir);\n\n if (prevDir === dir) {\n return undefined;\n }\n }\n}\n"],"names":["resolve","defaultResolver","path","enablePackageExports","blockList","options","resolveOptions","isDirectory","file","some","regex","test","directoryExistsSync","isFile","fileExistsSync","preserveSymlinks","result","resolveSync","getPathInModule","shouldIgnoreRequestForExports","segments","split","moduleName","shift","startsWith","closestPackageJson","findClosestPackageJson","basedir","pkg","readPackageSync","readFileSync","assert","name","resolved","exports","join","createResolveOptions","conditions","pathResolve","dirname","Error","packageJsonPath","unsafe","browser","require","isAbsolute","start","dir","pkgJsonFile","hasPackageJson","prevDir","undefined"],"mappings":"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"}
|
|
@@ -29,7 +29,19 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
29
29
|
debug("manifest", manifest);
|
|
30
30
|
// NOTE: no app dir if null
|
|
31
31
|
// TODO: Redirect to 404 page
|
|
32
|
-
return manifest
|
|
32
|
+
return manifest != null ? manifest : {
|
|
33
|
+
// Support the onboarding screen if there's no manifest
|
|
34
|
+
htmlRoutes: [
|
|
35
|
+
{
|
|
36
|
+
file: "index.js",
|
|
37
|
+
page: "/index",
|
|
38
|
+
routeKeys: {},
|
|
39
|
+
namedRegex: /^\/(?:index)?\/?$/i
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
apiRoutes: [],
|
|
43
|
+
notFoundRoutes: []
|
|
44
|
+
};
|
|
33
45
|
},
|
|
34
46
|
async getHtml (request) {
|
|
35
47
|
try {
|
|
@@ -48,7 +60,8 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
48
60
|
try {
|
|
49
61
|
return new _server.ExpoResponse(await (0, _metroErrorInterface).getErrorOverlayHtmlAsync({
|
|
50
62
|
error,
|
|
51
|
-
projectRoot
|
|
63
|
+
projectRoot,
|
|
64
|
+
routerRoot: options.routerRoot
|
|
52
65
|
}), {
|
|
53
66
|
status: 500,
|
|
54
67
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/createServerRouteMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 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 { ExpoResponse } from '@expo/server';\nimport { createRequestHandler } from '@expo/server/build/vendor/http';\nimport requireString from 'require-from-string';\nimport resolve from 'resolve';\nimport { promisify } from 'util';\n\nimport { ForwardHtmlError } from './MetroBundlerDevServer';\nimport { bundleApiRoute } from './bundleApiRoutes';\nimport { fetchManifest } from './fetchRouterManifest';\nimport { getErrorOverlayHtmlAsync, logMetroError, logMetroErrorAsync } from './metroErrorInterface';\nimport { Log } from '../../../log';\n\nconst debug = require('debug')('expo:start:server:metro') as typeof console.log;\n\nconst resolveAsync = promisify(resolve) as any as (\n id: string,\n opts: resolve.AsyncOpts\n) => Promise<string | null>;\n\nexport function createRouteHandlerMiddleware(\n projectRoot: string,\n options: {\n mode?: string;\n appDir: string;\n port?: number;\n getWebBundleUrl: () => string;\n getStaticPageAsync: (pathname: string) => Promise<{ content: string }>;\n }\n) {\n return createRequestHandler(\n { build: '' },\n {\n async getRoutesManifest() {\n const manifest = await fetchManifest<RegExp>(projectRoot, options);\n debug('manifest', manifest);\n // NOTE: no app dir if null\n // TODO: Redirect to 404 page\n return manifest;\n },\n async getHtml(request) {\n try {\n const { content } = await options.getStaticPageAsync(request.url);\n return content;\n } catch (error: any) {\n // Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.\n if (error instanceof ForwardHtmlError) {\n return new ExpoResponse(error.html, {\n status: error.statusCode,\n headers: {\n 'Content-Type': 'text/html',\n },\n });\n }\n\n try {\n return new ExpoResponse(\n await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n } catch (staticError: any) {\n // Fallback error for when Expo Router is misconfigured in the project.\n return new ExpoResponse(\n '<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>' +\n error.message +\n '<br/><br/>' +\n staticError.message +\n '</span>',\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n }\n },\n logApiRouteExecutionError(error) {\n logMetroError(projectRoot, { error });\n },\n async getApiRoute(route) {\n const resolvedFunctionPath = await resolveAsync(route.page, {\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n basedir: options.appDir,\n });\n\n const middlewareContents = await bundleApiRoute(\n projectRoot,\n resolvedFunctionPath!,\n options\n );\n if (!middlewareContents) {\n // TODO: Error handling\n return null;\n }\n\n try {\n debug(`Bundling middleware at: ${resolvedFunctionPath}`);\n return requireString(middlewareContents);\n } catch (error: any) {\n if (error instanceof Error) {\n await logMetroErrorAsync({ projectRoot, error });\n } else {\n Log.error('Failed to load middleware: ' + error);\n }\n return new ExpoResponse(\n 'Failed to load middleware: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n }\n );\n}\n"],"names":["createRouteHandlerMiddleware","debug","require","resolveAsync","promisify","resolve","projectRoot","options","createRequestHandler","build","getRoutesManifest","manifest","fetchManifest","getHtml","request","content","getStaticPageAsync","url","error","ForwardHtmlError","ExpoResponse","html","status","statusCode","headers","getErrorOverlayHtmlAsync","staticError","message","logApiRouteExecutionError","logMetroError","getApiRoute","route","resolvedFunctionPath","
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/createServerRouteMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 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 { ExpoResponse } from '@expo/server';\nimport { createRequestHandler } from '@expo/server/build/vendor/http';\nimport requireString from 'require-from-string';\nimport resolve from 'resolve';\nimport { promisify } from 'util';\n\nimport { ForwardHtmlError } from './MetroBundlerDevServer';\nimport { bundleApiRoute } from './bundleApiRoutes';\nimport { fetchManifest } from './fetchRouterManifest';\nimport { getErrorOverlayHtmlAsync, logMetroError, logMetroErrorAsync } from './metroErrorInterface';\nimport { Log } from '../../../log';\n\nconst debug = require('debug')('expo:start:server:metro') as typeof console.log;\n\nconst resolveAsync = promisify(resolve) as any as (\n id: string,\n opts: resolve.AsyncOpts\n) => Promise<string | null>;\n\nexport function createRouteHandlerMiddleware(\n projectRoot: string,\n options: {\n mode?: string;\n appDir: string;\n routerRoot: string;\n port?: number;\n baseUrl: string;\n getWebBundleUrl: () => string;\n getStaticPageAsync: (pathname: string) => Promise<{ content: string }>;\n }\n) {\n return createRequestHandler(\n { build: '' },\n {\n async getRoutesManifest() {\n const manifest = await fetchManifest<RegExp>(projectRoot, options);\n debug('manifest', manifest);\n // NOTE: no app dir if null\n // TODO: Redirect to 404 page\n return (\n manifest ?? {\n // Support the onboarding screen if there's no manifest\n htmlRoutes: [\n {\n file: 'index.js',\n page: '/index',\n routeKeys: {},\n namedRegex: /^\\/(?:index)?\\/?$/i,\n },\n ],\n apiRoutes: [],\n notFoundRoutes: [],\n }\n );\n },\n async getHtml(request) {\n try {\n const { content } = await options.getStaticPageAsync(request.url);\n return content;\n } catch (error: any) {\n // Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.\n if (error instanceof ForwardHtmlError) {\n return new ExpoResponse(error.html, {\n status: error.statusCode,\n headers: {\n 'Content-Type': 'text/html',\n },\n });\n }\n\n try {\n return new ExpoResponse(\n await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n } catch (staticError: any) {\n // Fallback error for when Expo Router is misconfigured in the project.\n return new ExpoResponse(\n '<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>' +\n error.message +\n '<br/><br/>' +\n staticError.message +\n '</span>',\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n }\n },\n logApiRouteExecutionError(error) {\n logMetroError(projectRoot, { error });\n },\n async getApiRoute(route) {\n const resolvedFunctionPath = await resolveAsync(route.page, {\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n basedir: options.appDir,\n });\n\n const middlewareContents = await bundleApiRoute(\n projectRoot,\n resolvedFunctionPath!,\n options\n );\n if (!middlewareContents) {\n // TODO: Error handling\n return null;\n }\n\n try {\n debug(`Bundling middleware at: ${resolvedFunctionPath}`);\n return requireString(middlewareContents);\n } catch (error: any) {\n if (error instanceof Error) {\n await logMetroErrorAsync({ projectRoot, error });\n } else {\n Log.error('Failed to load middleware: ' + error);\n }\n return new ExpoResponse(\n 'Failed to load middleware: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n }\n );\n}\n"],"names":["createRouteHandlerMiddleware","debug","require","resolveAsync","promisify","resolve","projectRoot","options","createRequestHandler","build","getRoutesManifest","manifest","fetchManifest","htmlRoutes","file","page","routeKeys","namedRegex","apiRoutes","notFoundRoutes","getHtml","request","content","getStaticPageAsync","url","error","ForwardHtmlError","ExpoResponse","html","status","statusCode","headers","getErrorOverlayHtmlAsync","routerRoot","staticError","message","logApiRouteExecutionError","logMetroError","getApiRoute","route","resolvedFunctionPath","extensions","basedir","appDir","middlewareContents","bundleApiRoute","requireString","Error","logMetroErrorAsync","Log"],"mappings":"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"}
|
package/build/src/start/server/metro/{inspector-proxy/device.js → debugging/InspectorDevice.js}
RENAMED
|
@@ -4,12 +4,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
exports.createInspectorDeviceClass = createInspectorDeviceClass;
|
|
6
6
|
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
7
|
-
var _networkResponse = require("./
|
|
8
|
-
var _pageReload = require("./
|
|
9
|
-
var _vscodeDebuggerGetPossibleBreakpoints = require("./
|
|
10
|
-
var _vscodeDebuggerScriptParsed = require("./
|
|
11
|
-
var _vscodeDebuggerSetBreakpointByUrl = require("./
|
|
12
|
-
var
|
|
7
|
+
var _networkResponse = require("./inspectorHandlers/NetworkResponse");
|
|
8
|
+
var _pageReload = require("./inspectorHandlers/PageReload");
|
|
9
|
+
var _vscodeDebuggerGetPossibleBreakpoints = require("./inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints");
|
|
10
|
+
var _vscodeDebuggerScriptParsed = require("./inspectorHandlers/VscodeDebuggerScriptParsed");
|
|
11
|
+
var _vscodeDebuggerSetBreakpointByUrl = require("./inspectorHandlers/VscodeDebuggerSetBreakpointByUrl");
|
|
12
|
+
var _vscodeRuntimeCallFunctionOn = require("./inspectorHandlers/VscodeRuntimeCallFunctionOn");
|
|
13
|
+
var _vscodeRuntimeGetProperties = require("./inspectorHandlers/VscodeRuntimeGetProperties");
|
|
13
14
|
function _interopRequireDefault(obj) {
|
|
14
15
|
return obj && obj.__esModule ? obj : {
|
|
15
16
|
default: obj
|
|
@@ -17,7 +18,6 @@ function _interopRequireDefault(obj) {
|
|
|
17
18
|
}
|
|
18
19
|
function createInspectorDeviceClass(metroBundler, MetroDeviceClass) {
|
|
19
20
|
return class ExpoInspectorDevice extends MetroDeviceClass {
|
|
20
|
-
/** Stores information about currently connected debugger (if any). */ _debuggerConnection = null;
|
|
21
21
|
/** All handlers that should be used to intercept or reply to CDP events */ handlers = [
|
|
22
22
|
// Generic handlers
|
|
23
23
|
new _networkResponse.NetworkResponseHandler(),
|
|
@@ -26,7 +26,8 @@ function createInspectorDeviceClass(metroBundler, MetroDeviceClass) {
|
|
|
26
26
|
new _vscodeDebuggerGetPossibleBreakpoints.VscodeDebuggerGetPossibleBreakpointsHandler(),
|
|
27
27
|
new _vscodeDebuggerScriptParsed.VscodeDebuggerScriptParsedHandler(this),
|
|
28
28
|
new _vscodeDebuggerSetBreakpointByUrl.VscodeDebuggerSetBreakpointByUrlHandler(),
|
|
29
|
-
new _vscodeRuntimeGetProperties.VscodeRuntimeGetPropertiesHandler(),
|
|
29
|
+
new _vscodeRuntimeGetProperties.VscodeRuntimeGetPropertiesHandler(),
|
|
30
|
+
new _vscodeRuntimeCallFunctionOn.VscodeRuntimeCallFunctionOnHandler(),
|
|
30
31
|
];
|
|
31
32
|
onDeviceMessage(message, info) {
|
|
32
33
|
var ref;
|
|
@@ -40,35 +41,6 @@ function createInspectorDeviceClass(metroBundler, MetroDeviceClass) {
|
|
|
40
41
|
return (ref = handler.onDebuggerMessage == null ? void 0 : handler.onDebuggerMessage(message, info)) != null ? ref : false;
|
|
41
42
|
});
|
|
42
43
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Handle a new device connection with the same device identifier.
|
|
45
|
-
* When the app and device name matches, we can reuse the debugger connection.
|
|
46
|
-
* Else, we have to shut the debugger connection down.
|
|
47
|
-
*/ handleDuplicateDeviceConnection(newDevice) {
|
|
48
|
-
if (this._app !== newDevice._app || this._name !== newDevice._name) {
|
|
49
|
-
var ref;
|
|
50
|
-
this._deviceSocket.close();
|
|
51
|
-
(ref = this._debuggerConnection) == null ? void 0 : ref.socket.close();
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
const oldDebugger = this._debuggerConnection;
|
|
55
|
-
this._debuggerConnection = null;
|
|
56
|
-
if (oldDebugger) {
|
|
57
|
-
oldDebugger.socket.removeAllListeners();
|
|
58
|
-
this._deviceSocket.close();
|
|
59
|
-
newDevice.handleDebuggerConnection(oldDebugger.socket, oldDebugger.pageId);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Handle a new debugger connection to this device.
|
|
64
|
-
* This adds the `debuggerType` property to the `DebuggerInfo` object.
|
|
65
|
-
* With that information, we can enable or disable debugger-specific handlers.
|
|
66
|
-
*/ handleDebuggerConnectionWithType(socket, pageId, debuggerType) {
|
|
67
|
-
this.handleDebuggerConnection(socket, pageId);
|
|
68
|
-
if (this._debuggerConnection) {
|
|
69
|
-
this._debuggerConnection.debuggerType = debuggerType;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
44
|
/** Hook into the message life cycle to answer more complex CDP messages */ async _processMessageFromDevice(message, info) {
|
|
73
45
|
if (!this.onDeviceMessage(message, info)) {
|
|
74
46
|
await super._processMessageFromDevice(message, info);
|
|
@@ -105,4 +77,4 @@ function createInspectorDeviceClass(metroBundler, MetroDeviceClass) {
|
|
|
105
77
|
};
|
|
106
78
|
}
|
|
107
79
|
|
|
108
|
-
//# sourceMappingURL=
|
|
80
|
+
//# sourceMappingURL=InspectorDevice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/InspectorDevice.ts"],"sourcesContent":["import type { unstable_Device } from '@react-native/dev-middleware';\nimport fetch from 'node-fetch';\nimport type WS from 'ws';\n\nimport { NetworkResponseHandler } from './inspectorHandlers/NetworkResponse';\nimport { PageReloadHandler } from './inspectorHandlers/PageReload';\nimport { VscodeDebuggerGetPossibleBreakpointsHandler } from './inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints';\nimport { VscodeDebuggerScriptParsedHandler } from './inspectorHandlers/VscodeDebuggerScriptParsed';\nimport { VscodeDebuggerSetBreakpointByUrlHandler } from './inspectorHandlers/VscodeDebuggerSetBreakpointByUrl';\nimport { VscodeRuntimeCallFunctionOnHandler } from './inspectorHandlers/VscodeRuntimeCallFunctionOn';\nimport { VscodeRuntimeGetPropertiesHandler } from './inspectorHandlers/VscodeRuntimeGetProperties';\nimport { DebuggerMetadata, DeviceRequest, InspectorHandler } from './inspectorHandlers/types';\nimport { type MetroBundlerDevServer } from '../MetroBundlerDevServer';\n\nexport function createInspectorDeviceClass(\n metroBundler: MetroBundlerDevServer,\n MetroDeviceClass: typeof unstable_Device\n): typeof unstable_Device {\n return class ExpoInspectorDevice extends MetroDeviceClass implements InspectorHandler {\n /** All handlers that should be used to intercept or reply to CDP events */\n public handlers: InspectorHandler[] = [\n // Generic handlers\n new NetworkResponseHandler(),\n new PageReloadHandler(metroBundler),\n // Vscode-specific handlers\n new VscodeDebuggerGetPossibleBreakpointsHandler(),\n new VscodeDebuggerScriptParsedHandler(this),\n new VscodeDebuggerSetBreakpointByUrlHandler(),\n new VscodeRuntimeGetPropertiesHandler(),\n new VscodeRuntimeCallFunctionOnHandler(),\n ];\n\n onDeviceMessage(message: any, info: DebuggerMetadata): boolean {\n return this.handlers.some((handler) => handler.onDeviceMessage?.(message, info) ?? false);\n }\n\n onDebuggerMessage(message: any, info: DebuggerMetadata): boolean {\n return this.handlers.some((handler) => handler.onDebuggerMessage?.(message, info) ?? false);\n }\n\n /** Hook into the message life cycle to answer more complex CDP messages */\n async _processMessageFromDevice(message: DeviceRequest<any>, info: DebuggerMetadata) {\n if (!this.onDeviceMessage(message, info)) {\n await super._processMessageFromDevice(message, info);\n }\n }\n\n /** Hook into the message life cycle to answer more complex CDP messages */\n _interceptMessageFromDebugger(\n request: Parameters<unstable_Device['_interceptMessageFromDebugger']>[0],\n info: DebuggerMetadata,\n socket: WS\n ): boolean {\n // Note, `socket` is the exact same as `info.socket`\n if (this.onDebuggerMessage(request, info)) {\n return true;\n }\n\n return super._interceptMessageFromDebugger(request, info, socket);\n }\n\n /**\n * Overwrite the default text fetcher, to load sourcemaps from sources other than `localhost`.\n * @todo Cedric: remove the custom `DebuggerScriptSource` handler when switching over to `metro@>=0.75.1`\n * @see https://github.com/facebook/metro/blob/77f445f1bcd2264ad06174dbf8d542bc75834d29/packages/metro-inspector-proxy/src/Device.js#L573-L588\n * @since metro-inspector-proxy@0.75.1\n */\n async _fetchText(url: URL): Promise<string> {\n const LENGTH_LIMIT_BYTES = 350_000_000; // 350mb\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Received status ${response.status} while fetching: ${url}`);\n }\n\n const contentLength = response.headers.get('Content-Length');\n if (contentLength && Number(contentLength) > LENGTH_LIMIT_BYTES) {\n throw new Error('Expected file size is too large (more than 350mb)');\n }\n\n const text = await response.text();\n if (Buffer.byteLength(text, 'utf8') > LENGTH_LIMIT_BYTES) {\n throw new Error('File size is too large (more than 350mb)');\n }\n\n return text;\n }\n };\n}\n"],"names":["createInspectorDeviceClass","metroBundler","MetroDeviceClass","ExpoInspectorDevice","handlers","NetworkResponseHandler","PageReloadHandler","VscodeDebuggerGetPossibleBreakpointsHandler","VscodeDebuggerScriptParsedHandler","VscodeDebuggerSetBreakpointByUrlHandler","VscodeRuntimeGetPropertiesHandler","VscodeRuntimeCallFunctionOnHandler","onDeviceMessage","message","info","handler","some","onDebuggerMessage","_processMessageFromDevice","_interceptMessageFromDebugger","request","socket","_fetchText","url","LENGTH_LIMIT_BYTES","response","fetch","ok","Error","status","contentLength","headers","get","Number","text","Buffer","byteLength"],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.createInspectorProxyClass = createInspectorProxyClass;
|
|
6
|
+
var _url = _interopRequireDefault(require("url"));
|
|
7
|
+
var _ws = _interopRequireDefault(require("ws"));
|
|
8
|
+
function _interopRequireDefault(obj) {
|
|
9
|
+
return obj && obj.__esModule ? obj : {
|
|
10
|
+
default: obj
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const debug = require("debug")("expo:metro:inspector-proxy:proxy");
|
|
14
|
+
/** Web socket error code for unknown internal errors */ const INTERNAL_ERROR_CODE = 1011;
|
|
15
|
+
function createInspectorProxyClass(MetroInspectorProxyClass, MetroDeviceClass) {
|
|
16
|
+
return class ExpoInspectorProxy extends MetroInspectorProxyClass {
|
|
17
|
+
/**
|
|
18
|
+
* This method is overwritten to inject our own device class.
|
|
19
|
+
* @see https://github.com/facebook/react-native/blob/f1df4ceb8479a6fc9c30f7571f5aeec255b116d2/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js#L179-L227
|
|
20
|
+
*/ _createDeviceConnectionWSServer() {
|
|
21
|
+
const wss = new _ws.default.Server({
|
|
22
|
+
noServer: true,
|
|
23
|
+
perMessageDeflate: true,
|
|
24
|
+
// Don't crash on exceptionally large messages - assume the device is
|
|
25
|
+
// well-behaved and the debugger is prepared to handle large messages.
|
|
26
|
+
maxPayload: 0
|
|
27
|
+
});
|
|
28
|
+
wss.on("connection", async (socket, req)=>{
|
|
29
|
+
try {
|
|
30
|
+
const fallbackDeviceId = String(this._deviceCounter++);
|
|
31
|
+
const query = _url.default.parse(req.url || "", true).query || {};
|
|
32
|
+
const deviceId = asString(query.device) || fallbackDeviceId;
|
|
33
|
+
const deviceName = asString(query.name) || "Unknown";
|
|
34
|
+
const appName = asString(query.app) || "Unknown";
|
|
35
|
+
const oldDevice = this._devices.get(deviceId);
|
|
36
|
+
// FIX: Create a new device instance using our own extended class
|
|
37
|
+
const newDevice = new MetroDeviceClass(deviceId, deviceName, appName, socket, this._projectRoot, this._eventReporter);
|
|
38
|
+
if (oldDevice) {
|
|
39
|
+
oldDevice.handleDuplicateDeviceConnection(newDevice);
|
|
40
|
+
}
|
|
41
|
+
this._devices.set(deviceId, newDevice);
|
|
42
|
+
debug(`Got new connection: name=${deviceName}, app=${appName}, device=${deviceId}`);
|
|
43
|
+
socket.on("close", ()=>{
|
|
44
|
+
// FIX: Only clean up the device reference, if not replaced by new device
|
|
45
|
+
if (this._devices.get(deviceId) === newDevice) {
|
|
46
|
+
this._devices.delete(deviceId);
|
|
47
|
+
debug(`Device ${deviceName} disconnected.`);
|
|
48
|
+
} else {
|
|
49
|
+
debug(`Device ${deviceName} reconnected.`);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
} catch (e) {
|
|
53
|
+
var // FIX: add missing event reporter
|
|
54
|
+
ref;
|
|
55
|
+
console.error("error", e);
|
|
56
|
+
var ref1;
|
|
57
|
+
socket.close(INTERNAL_ERROR_CODE, (ref1 = e == null ? void 0 : e.toString()) != null ? ref1 : "Unknown error");
|
|
58
|
+
(ref = this._eventReporter) == null ? void 0 : ref.logEvent({
|
|
59
|
+
type: "connect_debugger_app",
|
|
60
|
+
status: "error",
|
|
61
|
+
error: e
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return wss;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* This method is overwritten to allow user agents to be passed as query parameter.
|
|
69
|
+
* The built-in debugger in vscode does not add any user agent headers.
|
|
70
|
+
* @see https://github.com/facebook/react-native/blob/f1df4ceb8479a6fc9c30f7571f5aeec255b116d2/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js#L234-L272
|
|
71
|
+
*/ _createDebuggerConnectionWSServer() {
|
|
72
|
+
const wss = new _ws.default.Server({
|
|
73
|
+
noServer: true,
|
|
74
|
+
perMessageDeflate: false,
|
|
75
|
+
// Don't crash on exceptionally large messages - assume the debugger is
|
|
76
|
+
// well-behaved and the device is prepared to handle large messages.
|
|
77
|
+
maxPayload: 0
|
|
78
|
+
});
|
|
79
|
+
wss.on("connection", async (socket, req)=>{
|
|
80
|
+
try {
|
|
81
|
+
const query = _url.default.parse(req.url || "", true).query || {};
|
|
82
|
+
const deviceId = asString(query.device);
|
|
83
|
+
const pageId = asString(query.page);
|
|
84
|
+
// FIX: Determine the user agent from query paramter or header
|
|
85
|
+
const userAgent = asString(query.userAgent) || req.headers["user-agent"] || null;
|
|
86
|
+
if (deviceId == null || pageId == null) {
|
|
87
|
+
throw new Error("Incorrect URL - must provide device and page IDs");
|
|
88
|
+
}
|
|
89
|
+
const device = this._devices.get(deviceId);
|
|
90
|
+
if (device == null) {
|
|
91
|
+
throw new Error("Unknown device with ID " + deviceId);
|
|
92
|
+
}
|
|
93
|
+
device.handleDebuggerConnection(socket, pageId, {
|
|
94
|
+
userAgent
|
|
95
|
+
});
|
|
96
|
+
} catch (e) {
|
|
97
|
+
var ref;
|
|
98
|
+
console.error(e);
|
|
99
|
+
var ref2;
|
|
100
|
+
socket.close(INTERNAL_ERROR_CODE, (ref2 = e == null ? void 0 : e.toString()) != null ? ref2 : "Unknown error");
|
|
101
|
+
(ref = this._eventReporter) == null ? void 0 : ref.logEvent({
|
|
102
|
+
type: "connect_debugger_frontend",
|
|
103
|
+
status: "error",
|
|
104
|
+
error: e
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
return wss;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Convert the query paramters to plain string */ function asString(value = "") {
|
|
113
|
+
return Array.isArray(value) ? value.join() : value;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
//# sourceMappingURL=InspectorProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/InspectorProxy.ts"],"sourcesContent":["import type { unstable_InspectorProxy, unstable_Device } from '@react-native/dev-middleware';\nimport url from 'url';\nimport WS from 'ws';\n\nconst debug = require('debug')('expo:metro:inspector-proxy:proxy') as typeof console.log;\n\n/** Web socket error code for unknown internal errors */\nconst INTERNAL_ERROR_CODE = 1011;\n\n/**\n * Create a new Expo proxy inspector class that uses the feature-extended device class.\n * Everything else is reused from the original class.\n *\n * @see https://github.com/facebook/react-native/blob/f1df4ceb8479a6fc9c30f7571f5aeec255b116d2/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js\n */\nexport function createInspectorProxyClass(\n MetroInspectorProxyClass: typeof unstable_InspectorProxy,\n MetroDeviceClass: typeof unstable_Device\n): typeof unstable_InspectorProxy {\n return class ExpoInspectorProxy extends MetroInspectorProxyClass {\n /**\n * This method is overwritten to inject our own device class.\n * @see https://github.com/facebook/react-native/blob/f1df4ceb8479a6fc9c30f7571f5aeec255b116d2/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js#L179-L227\n */\n _createDeviceConnectionWSServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: true,\n // Don't crash on exceptionally large messages - assume the device is\n // well-behaved and the debugger is prepared to handle large messages.\n maxPayload: 0,\n });\n\n wss.on('connection', async (socket: WS, req) => {\n try {\n const fallbackDeviceId = String(this._deviceCounter++);\n\n const query = url.parse(req.url || '', true).query || {};\n const deviceId = asString(query.device) || fallbackDeviceId;\n const deviceName = asString(query.name) || 'Unknown';\n const appName = asString(query.app) || 'Unknown';\n\n const oldDevice = this._devices.get(deviceId);\n // FIX: Create a new device instance using our own extended class\n const newDevice = new MetroDeviceClass(\n deviceId,\n deviceName,\n appName,\n socket,\n this._projectRoot,\n this._eventReporter\n );\n\n if (oldDevice) {\n oldDevice.handleDuplicateDeviceConnection(newDevice);\n }\n\n this._devices.set(deviceId, newDevice);\n\n debug(`Got new connection: name=${deviceName}, app=${appName}, device=${deviceId}`);\n\n socket.on('close', () => {\n // FIX: Only clean up the device reference, if not replaced by new device\n if (this._devices.get(deviceId) === newDevice) {\n this._devices.delete(deviceId);\n debug(`Device ${deviceName} disconnected.`);\n } else {\n debug(`Device ${deviceName} reconnected.`);\n }\n });\n } catch (e) {\n console.error('error', e);\n socket.close(INTERNAL_ERROR_CODE, e?.toString() ?? 'Unknown error');\n // FIX: add missing event reporter\n this._eventReporter?.logEvent({\n type: 'connect_debugger_app',\n status: 'error',\n error: e,\n });\n }\n });\n\n return wss;\n }\n\n /**\n * This method is overwritten to allow user agents to be passed as query parameter.\n * The built-in debugger in vscode does not add any user agent headers.\n * @see https://github.com/facebook/react-native/blob/f1df4ceb8479a6fc9c30f7571f5aeec255b116d2/packages/dev-middleware/src/inspector-proxy/InspectorProxy.js#L234-L272\n */\n _createDebuggerConnectionWSServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n // Don't crash on exceptionally large messages - assume the debugger is\n // well-behaved and the device is prepared to handle large messages.\n maxPayload: 0,\n });\n\n wss.on('connection', async (socket: WS, req) => {\n try {\n const query = url.parse(req.url || '', true).query || {};\n const deviceId = asString(query.device);\n const pageId = asString(query.page);\n // FIX: Determine the user agent from query paramter or header\n const userAgent = asString(query.userAgent) || req.headers['user-agent'] || null;\n\n if (deviceId == null || pageId == null) {\n throw new Error('Incorrect URL - must provide device and page IDs');\n }\n\n const device = this._devices.get(deviceId);\n if (device == null) {\n throw new Error('Unknown device with ID ' + deviceId);\n }\n\n device.handleDebuggerConnection(socket, pageId, { userAgent });\n } catch (e) {\n console.error(e);\n socket.close(INTERNAL_ERROR_CODE, e?.toString() ?? 'Unknown error');\n this._eventReporter?.logEvent({\n type: 'connect_debugger_frontend',\n status: 'error',\n error: e,\n });\n }\n });\n\n return wss;\n }\n };\n}\n\n/** Convert the query paramters to plain string */\nfunction asString(value: string | string[] = ''): string {\n return Array.isArray(value) ? value.join() : value;\n}\n"],"names":["createInspectorProxyClass","debug","require","INTERNAL_ERROR_CODE","MetroInspectorProxyClass","MetroDeviceClass","ExpoInspectorProxy","_createDeviceConnectionWSServer","wss","WS","Server","noServer","perMessageDeflate","maxPayload","on","socket","req","fallbackDeviceId","String","_deviceCounter","query","url","parse","deviceId","asString","device","deviceName","name","appName","app","oldDevice","_devices","get","newDevice","_projectRoot","_eventReporter","handleDuplicateDeviceConnection","set","delete","e","console","error","close","toString","logEvent","type","status","_createDebuggerConnectionWSServer","pageId","page","userAgent","headers","Error","handleDebuggerConnection","value","Array","isArray","join"],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.createDebugMiddleware = createDebugMiddleware;
|
|
6
|
+
var _chalk = _interopRequireDefault(require("chalk"));
|
|
7
|
+
var _inspectorDevice = require("./InspectorDevice");
|
|
8
|
+
var _inspectorProxy = require("./InspectorProxy");
|
|
9
|
+
var _log = require("../../../../log");
|
|
10
|
+
function _interopRequireDefault(obj) {
|
|
11
|
+
return obj && obj.__esModule ? obj : {
|
|
12
|
+
default: obj
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function createDebugMiddleware(metroBundler) {
|
|
16
|
+
// Load the React Native debugging tools from project
|
|
17
|
+
// TODO: check if this works with isolated modules
|
|
18
|
+
const { createDevMiddleware , unstable_Device , unstable_InspectorProxy } = require("@react-native/dev-middleware");
|
|
19
|
+
// Create the extended inspector proxy, using our own device class
|
|
20
|
+
const ExpoInspectorProxy = (0, _inspectorProxy).createInspectorProxyClass(unstable_InspectorProxy, (0, _inspectorDevice).createInspectorDeviceClass(metroBundler, unstable_Device));
|
|
21
|
+
const { middleware , websocketEndpoints } = createDevMiddleware({
|
|
22
|
+
projectRoot: metroBundler.projectRoot,
|
|
23
|
+
serverBaseUrl: metroBundler.getJsInspectorBaseUrl(),
|
|
24
|
+
logger: createLogger(_chalk.default.bold("Debug:")),
|
|
25
|
+
unstable_InspectorProxy: ExpoInspectorProxy,
|
|
26
|
+
unstable_experiments: {
|
|
27
|
+
enableNewDebugger: true
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
debugMiddleware: middleware,
|
|
32
|
+
debugWebsocketEndpoints: websocketEndpoints
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function createLogger(logPrefix) {
|
|
36
|
+
return {
|
|
37
|
+
info: (...args)=>_log.Log.log(logPrefix, ...args)
|
|
38
|
+
,
|
|
39
|
+
warn: (...args)=>_log.Log.warn(logPrefix, ...args)
|
|
40
|
+
,
|
|
41
|
+
error: (...args)=>_log.Log.error(logPrefix, ...args)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=createDebugMiddleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/createDebugMiddleware.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { createInspectorDeviceClass } from './InspectorDevice';\nimport { createInspectorProxyClass } from './InspectorProxy';\nimport { Log } from '../../../../log';\nimport { type MetroBundlerDevServer } from '../MetroBundlerDevServer';\n\nexport function createDebugMiddleware(metroBundler: MetroBundlerDevServer) {\n // Load the React Native debugging tools from project\n // TODO: check if this works with isolated modules\n const { createDevMiddleware, unstable_Device, unstable_InspectorProxy } =\n require('@react-native/dev-middleware') as typeof import('@react-native/dev-middleware');\n\n // Create the extended inspector proxy, using our own device class\n const ExpoInspectorProxy = createInspectorProxyClass(\n unstable_InspectorProxy,\n createInspectorDeviceClass(metroBundler, unstable_Device)\n );\n\n const { middleware, websocketEndpoints } = createDevMiddleware({\n projectRoot: metroBundler.projectRoot,\n serverBaseUrl: metroBundler.getJsInspectorBaseUrl(),\n logger: createLogger(chalk.bold('Debug:')),\n unstable_InspectorProxy: ExpoInspectorProxy,\n unstable_experiments: {\n enableNewDebugger: true,\n },\n });\n\n return {\n debugMiddleware: middleware,\n debugWebsocketEndpoints: websocketEndpoints,\n };\n}\n\nfunction createLogger(\n logPrefix: string\n): Parameters<typeof import('@react-native/dev-middleware').createDevMiddleware>[0]['logger'] {\n return {\n info: (...args) => Log.log(logPrefix, ...args),\n warn: (...args) => Log.warn(logPrefix, ...args),\n error: (...args) => Log.error(logPrefix, ...args),\n };\n}\n"],"names":["createDebugMiddleware","metroBundler","createDevMiddleware","unstable_Device","unstable_InspectorProxy","require","ExpoInspectorProxy","createInspectorProxyClass","createInspectorDeviceClass","middleware","websocketEndpoints","projectRoot","serverBaseUrl","getJsInspectorBaseUrl","logger","createLogger","chalk","bold","unstable_experiments","enableNewDebugger","debugMiddleware","debugWebsocketEndpoints","logPrefix","info","args","Log","log","warn","error"],"mappings":"AAAA;;;;QAOgBA,qBAAqB,GAArBA,qBAAqB;AAPnB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEkB,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AACpB,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AACxC,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;;;;;;AAG9B,SAASA,qBAAqB,CAACC,YAAmC,EAAE;IACzE,qDAAqD;IACrD,kDAAkD;IAClD,MAAM,EAAEC,mBAAmB,CAAA,EAAEC,eAAe,CAAA,EAAEC,uBAAuB,CAAA,EAAE,GACrEC,OAAO,CAAC,8BAA8B,CAAC,AAAiD,AAAC;IAE3F,kEAAkE;IAClE,MAAMC,kBAAkB,GAAGC,CAAAA,GAAAA,eAAyB,AAGnD,CAAA,0BAHmD,CAClDH,uBAAuB,EACvBI,CAAAA,GAAAA,gBAA0B,AAA+B,CAAA,2BAA/B,CAACP,YAAY,EAAEE,eAAe,CAAC,CAC1D,AAAC;IAEF,MAAM,EAAEM,UAAU,CAAA,EAAEC,kBAAkB,CAAA,EAAE,GAAGR,mBAAmB,CAAC;QAC7DS,WAAW,EAAEV,YAAY,CAACU,WAAW;QACrCC,aAAa,EAAEX,YAAY,CAACY,qBAAqB,EAAE;QACnDC,MAAM,EAAEC,YAAY,CAACC,MAAK,QAAA,CAACC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1Cb,uBAAuB,EAAEE,kBAAkB;QAC3CY,oBAAoB,EAAE;YACpBC,iBAAiB,EAAE,IAAI;SACxB;KACF,CAAC,AAAC;IAEH,OAAO;QACLC,eAAe,EAAEX,UAAU;QAC3BY,uBAAuB,EAAEX,kBAAkB;KAC5C,CAAC;CACH;AAED,SAASK,YAAY,CACnBO,SAAiB,EAC2E;IAC5F,OAAO;QACLC,IAAI,EAAE,CAAIC,GAAAA,IAAI,GAAKC,IAAG,IAAA,CAACC,GAAG,CAACJ,SAAS,KAAKE,IAAI,CAAC;QAAA;QAC9CG,IAAI,EAAE,CAAIH,GAAAA,IAAI,GAAKC,IAAG,IAAA,CAACE,IAAI,CAACL,SAAS,KAAKE,IAAI,CAAC;QAAA;QAC/CI,KAAK,EAAE,CAAIJ,GAAAA,IAAI,GAAKC,IAAG,IAAA,CAACG,KAAK,CAACN,SAAS,KAAKE,IAAI,CAAC;KAClD,CAAC;CACH"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
var _utils = require("./utils");
|
|
5
6
|
class NetworkResponseHandler {
|
|
6
7
|
/** All known responses, mapped by request id */ storage = new Map();
|
|
7
8
|
onDeviceMessage(message) {
|
|
@@ -14,12 +15,10 @@ class NetworkResponseHandler {
|
|
|
14
15
|
}
|
|
15
16
|
onDebuggerMessage(message, { socket }) {
|
|
16
17
|
if (message.method === "Network.getResponseBody" && this.storage.has(message.params.requestId)) {
|
|
17
|
-
|
|
18
|
+
return (0, _utils).respond(socket, {
|
|
18
19
|
id: message.id,
|
|
19
20
|
result: this.storage.get(message.params.requestId)
|
|
20
|
-
};
|
|
21
|
-
socket.send(JSON.stringify(response));
|
|
22
|
-
return true;
|
|
21
|
+
});
|
|
23
22
|
}
|
|
24
23
|
return false;
|
|
25
24
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/start/server/metro/debugging/inspectorHandlers/NetworkResponse.ts"],"sourcesContent":["import type { Protocol } from 'devtools-protocol';\n\nimport {\n CdpMessage,\n InspectorHandler,\n DebuggerMetadata,\n DeviceRequest,\n DebuggerRequest,\n DebuggerResponse,\n DeviceResponse,\n} from './types';\nimport { respond } from './utils';\n\nexport class NetworkResponseHandler implements InspectorHandler {\n /** All known responses, mapped by request id */\n storage = new Map<string, DebuggerResponse<NetworkGetResponseBody>['result']>();\n\n onDeviceMessage(message: DeviceRequest<NetworkReceivedResponseBody>) {\n if (message.method === 'Expo(Network.receivedResponseBody)') {\n const { requestId, ...requestInfo } = message.params;\n this.storage.set(requestId, requestInfo);\n return true;\n }\n\n return false;\n }\n\n onDebuggerMessage(\n message: DebuggerRequest<NetworkGetResponseBody>,\n { socket }: DebuggerMetadata\n ) {\n if (\n message.method === 'Network.getResponseBody' &&\n this.storage.has(message.params.requestId)\n ) {\n return respond<DeviceResponse<NetworkGetResponseBody>>(socket, {\n id: message.id,\n result: this.storage.get(message.params.requestId)!,\n });\n }\n\n return false;\n }\n}\n\n/** Custom message to transfer the response body data to the proxy */\nexport type NetworkReceivedResponseBody = CdpMessage<\n 'Expo(Network.receivedResponseBody)',\n Protocol.Network.GetResponseBodyRequest & Protocol.Network.GetResponseBodyResponse,\n never\n>;\n\n/** @see https://chromedevtools.github.io/devtools-protocol/1-2/Network/#method-getResponseBody */\nexport type NetworkGetResponseBody = CdpMessage<\n 'Network.getResponseBody',\n Protocol.Network.GetResponseBodyRequest,\n Protocol.Network.GetResponseBodyResponse\n>;\n"],"names":["NetworkResponseHandler","storage","Map","onDeviceMessage","message","method","requestId","requestInfo","params","set","onDebuggerMessage","socket","has","respond","id","result","get"],"mappings":"AAAA;;;;AAWwB,IAAA,MAAS,WAAT,SAAS,CAAA;AAE1B,MAAMA,sBAAsB;IACjC,gDAAgD,CAChDC,OAAO,GAAG,IAAIC,GAAG,EAA8D,CAAC;IAEhFC,eAAe,CAACC,OAAmD,EAAE;QACnE,IAAIA,OAAO,CAACC,MAAM,KAAK,oCAAoC,EAAE;YAC3D,MAAM,EAAEC,SAAS,CAAA,EAAE,GAAGC,WAAW,EAAE,GAAGH,OAAO,CAACI,MAAM,AAAC;YACrD,IAAI,CAACP,OAAO,CAACQ,GAAG,CAACH,SAAS,EAAEC,WAAW,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;KACd;IAEDG,iBAAiB,CACfN,OAAgD,EAChD,EAAEO,MAAM,CAAA,EAAoB,EAC5B;QACA,IACEP,OAAO,CAACC,MAAM,KAAK,yBAAyB,IAC5C,IAAI,CAACJ,OAAO,CAACW,GAAG,CAACR,OAAO,CAACI,MAAM,CAACF,SAAS,CAAC,EAC1C;YACA,OAAOO,CAAAA,GAAAA,MAAO,AAGZ,CAAA,QAHY,CAAyCF,MAAM,EAAE;gBAC7DG,EAAE,EAAEV,OAAO,CAACU,EAAE;gBACdC,MAAM,EAAE,IAAI,CAACd,OAAO,CAACe,GAAG,CAACZ,OAAO,CAACI,MAAM,CAACF,SAAS,CAAC;aACnD,CAAC,CAAC;SACJ;QAED,OAAO,KAAK,CAAC;KACd;CACF;QA9BYN,sBAAsB,GAAtBA,sBAAsB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/start/server/metro/debugging/inspectorHandlers/PageReload.ts"],"sourcesContent":["import type { Protocol } from 'devtools-protocol';\n\nimport { CdpMessage, DebuggerMetadata, DebuggerRequest, InspectorHandler } from './types';\nimport { MetroBundlerDevServer } from '../../MetroBundlerDevServer';\n\nexport class PageReloadHandler implements InspectorHandler {\n constructor(private readonly metroBundler: MetroBundlerDevServer) {}\n\n onDebuggerMessage(message: DebuggerRequest<PageReload>, { socket }: DebuggerMetadata) {\n if (message.method === 'Page.reload') {\n this.metroBundler.broadcastMessage('reload');\n socket.send(JSON.stringify({ id: message.id }));\n return true;\n }\n\n return false;\n }\n}\n\n/** @see https://chromedevtools.github.io/devtools-protocol/1-2/Page/#method-reload */\nexport type PageReload = CdpMessage<'Page.reload', Protocol.Page.ReloadRequest, never>;\n"],"names":["PageReloadHandler","constructor","metroBundler","onDebuggerMessage","message","socket","method","broadcastMessage","send","JSON","stringify","id"],"mappings":"AAAA;;;;AAKO,MAAMA,iBAAiB;IAC5BC,YAA6BC,YAAmC,CAAE;aAArCA,YAAmC,GAAnCA,YAAmC;KAAI;IAEpEC,iBAAiB,CAACC,OAAoC,EAAE,EAAEC,MAAM,CAAA,EAAoB,EAAE;QACpF,IAAID,OAAO,CAACE,MAAM,KAAK,aAAa,EAAE;YACpC,IAAI,CAACJ,YAAY,CAACK,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7CF,MAAM,CAACG,IAAI,CAACC,IAAI,CAACC,SAAS,CAAC;gBAAEC,EAAE,EAAEP,OAAO,CAACO,EAAE;aAAE,CAAC,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;KACd;CACF;QAZYX,iBAAiB,GAAjBA,iBAAiB"}
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
var _utils = require("./utils");
|
|
5
6
|
class VscodeDebuggerGetPossibleBreakpointsHandler {
|
|
6
|
-
onDebuggerMessage(message, { socket ,
|
|
7
|
-
if (
|
|
8
|
-
|
|
7
|
+
onDebuggerMessage(message, { socket , userAgent }) {
|
|
8
|
+
if ((0, _utils).getDebuggerType(userAgent) === "vscode" && message.method === "Debugger.getPossibleBreakpoints") {
|
|
9
|
+
return (0, _utils).respond(socket, {
|
|
9
10
|
id: message.id,
|
|
10
11
|
result: {
|
|
11
12
|
locations: []
|
|
12
13
|
}
|
|
13
|
-
};
|
|
14
|
-
socket.send(JSON.stringify(response));
|
|
15
|
-
return true;
|
|
14
|
+
});
|
|
16
15
|
}
|
|
17
16
|
return false;
|
|
18
17
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints.ts"],"sourcesContent":["import Protocol from 'devtools-protocol';\n\nimport {\n CdpMessage,\n DebuggerMetadata,\n DebuggerRequest,\n DeviceResponse,\n InspectorHandler,\n} from './types';\nimport { getDebuggerType, respond } from './utils';\n\n/**\n * Hermes doesn't seem to handle this request, but `locations` have to be returned.\n * Respond with an empty location to make it \"spec compliant\" with Chrome DevTools.\n */\nexport class VscodeDebuggerGetPossibleBreakpointsHandler implements InspectorHandler {\n onDebuggerMessage(\n message: DebuggerRequest<DebuggerGetPossibleBreakpoints>,\n { socket, userAgent }: DebuggerMetadata\n ): boolean {\n if (\n getDebuggerType(userAgent) === 'vscode' &&\n message.method === 'Debugger.getPossibleBreakpoints'\n ) {\n return respond<DeviceResponse<DebuggerGetPossibleBreakpoints>>(socket, {\n id: message.id,\n result: { locations: [] },\n });\n }\n\n return false;\n }\n}\n\n/** @see https://chromedevtools.github.io/devtools-protocol/v8/Debugger/#method-getPossibleBreakpoints */\nexport type DebuggerGetPossibleBreakpoints = CdpMessage<\n 'Debugger.getPossibleBreakpoints',\n Protocol.Debugger.GetPossibleBreakpointsRequest,\n Protocol.Debugger.GetPossibleBreakpointsResponse\n>;\n"],"names":["VscodeDebuggerGetPossibleBreakpointsHandler","onDebuggerMessage","message","socket","userAgent","getDebuggerType","method","respond","id","result","locations"],"mappings":"AAAA;;;;AASyC,IAAA,MAAS,WAAT,SAAS,CAAA;AAM3C,MAAMA,2CAA2C;IACtDC,iBAAiB,CACfC,OAAwD,EACxD,EAAEC,MAAM,CAAA,EAAEC,SAAS,CAAA,EAAoB,EAC9B;QACT,IACEC,CAAAA,GAAAA,MAAe,AAAW,CAAA,gBAAX,CAACD,SAAS,CAAC,KAAK,QAAQ,IACvCF,OAAO,CAACI,MAAM,KAAK,iCAAiC,EACpD;YACA,OAAOC,CAAAA,GAAAA,MAAO,AAGZ,CAAA,QAHY,CAAiDJ,MAAM,EAAE;gBACrEK,EAAE,EAAEN,OAAO,CAACM,EAAE;gBACdC,MAAM,EAAE;oBAAEC,SAAS,EAAE,EAAE;iBAAE;aAC1B,CAAC,CAAC;SACJ;QAED,OAAO,KAAK,CAAC;KACd;CACF;QAjBYV,2CAA2C,GAA3CA,2CAA2C"}
|