@expo/cli 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +8 -3
- package/build/bin/cli.map +1 -1
- package/build/src/export/createBundles.js +1 -0
- package/build/src/export/createBundles.js.map +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +1 -2
- 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/exportApp.js +4 -4
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +18 -18
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +0 -1
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/index.js +5 -1
- package/build/src/export/index.js.map +1 -1
- package/build/src/export/resolveOptions.js +1 -0
- package/build/src/export/resolveOptions.js.map +1 -1
- package/build/src/install/checkPackages.js +6 -0
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/install/installAsync.js +15 -1
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/prebuild/copyTemplateFiles.js +3 -33
- package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
- package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +1 -1
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +1 -8
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/prebuild/updatePackageJson.js +33 -47
- package/build/src/prebuild/updatePackageJson.js.map +1 -1
- package/build/src/start/doctor/dependencies/getVersionedPackages.js +13 -2
- package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +11 -1
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js +2 -2
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/index.js +3 -1
- package/build/src/start/index.js.map +1 -1
- package/build/src/start/server/getStaticRenderFunctions.js +2 -1
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +16 -33
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/externals.js +7 -30
- 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 +7 -4
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +26 -3
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/metro/router.js +14 -5
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +0 -1
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +10 -4
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
- package/build/src/start/server/middleware/CreateFileMiddleware.js +6 -3
- package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +75 -15
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +8 -3
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/type-generation/index.js +9 -1
- package/build/src/start/server/type-generation/index.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +2 -3
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/cocoapods.js +1 -1
- package/build/src/utils/cocoapods.js.map +1 -1
- package/build/src/utils/dir.js +16 -6
- package/build/src/utils/dir.js.map +1 -1
- package/build/src/utils/downloadExpoGoAsync.js +2 -1
- package/build/src/utils/downloadExpoGoAsync.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/strings.js +24 -0
- package/build/src/utils/strings.js.map +1 -0
- package/package.json +6 -8
- package/build/src/prebuild/writeMetroConfig.js +0 -89
- package/build/src/prebuild/writeMetroConfig.js.map +0 -1
|
@@ -5,15 +5,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
exports.updatePackageJSONAsync = updatePackageJSONAsync;
|
|
6
6
|
exports.updatePkgDependencies = updatePkgDependencies;
|
|
7
7
|
exports.createDependenciesMap = createDependenciesMap;
|
|
8
|
-
exports.isPkgMainExpoAppEntry = isPkgMainExpoAppEntry;
|
|
9
8
|
exports.hashForDependencyMap = hashForDependencyMap;
|
|
10
9
|
exports.createFileHash = createFileHash;
|
|
11
|
-
exports.shouldDeleteMainField = shouldDeleteMainField;
|
|
12
10
|
var _config = require("@expo/config");
|
|
13
11
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
14
12
|
var _crypto = _interopRequireDefault(require("crypto"));
|
|
15
13
|
var _fs = _interopRequireDefault(require("fs"));
|
|
16
14
|
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
var _semver = require("semver");
|
|
17
16
|
var Log = _interopRequireWildcard(require("../log"));
|
|
18
17
|
var _isModuleSymlinked = require("../utils/isModuleSymlinked");
|
|
19
18
|
var _ora = require("../utils/ora");
|
|
@@ -55,9 +54,6 @@ async function updatePackageJSONAsync(projectRoot, { templateDirectory , pkg , s
|
|
|
55
54
|
// This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.
|
|
56
55
|
JSON.stringify(pkg, null, 2) + "\n");
|
|
57
56
|
updatingPackageJsonStep.succeed("Updated package.json and added index.js entry point for iOS and Android");
|
|
58
|
-
if (results.removedMainField) {
|
|
59
|
-
Log.log(`\u203A Removed ${_chalk.default.bold(`"main": "${results.removedMainField}"`)} from package.json because we recommend using index.js as main instead\n`);
|
|
60
|
-
}
|
|
61
57
|
return results;
|
|
62
58
|
}
|
|
63
59
|
/**
|
|
@@ -76,18 +72,12 @@ async function updatePackageJSONAsync(projectRoot, { templateDirectory , pkg , s
|
|
|
76
72
|
updatePkgScripts({
|
|
77
73
|
pkg
|
|
78
74
|
});
|
|
79
|
-
|
|
75
|
+
// TODO: Move to `npx expo-doctor`
|
|
76
|
+
return updatePkgDependencies(projectRoot, {
|
|
80
77
|
pkg,
|
|
81
78
|
templatePkg,
|
|
82
79
|
skipDependencyUpdate
|
|
83
80
|
});
|
|
84
|
-
const removedMainField = updatePkgMain({
|
|
85
|
-
pkg
|
|
86
|
-
});
|
|
87
|
-
return {
|
|
88
|
-
...results,
|
|
89
|
-
removedMainField
|
|
90
|
-
};
|
|
91
81
|
}
|
|
92
82
|
function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDependencyUpdate =[] }) {
|
|
93
83
|
if (!pkg1.devDependencies) {
|
|
@@ -100,6 +90,11 @@ function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDepe
|
|
|
100
90
|
...defaultDependencies,
|
|
101
91
|
...pkg1.dependencies
|
|
102
92
|
});
|
|
93
|
+
const addWhenMissingDependencies = [
|
|
94
|
+
"react",
|
|
95
|
+
"react-native"
|
|
96
|
+
].filter((depKey)=>!!defaultDependencies[depKey]
|
|
97
|
+
);
|
|
103
98
|
const requiredDependencies = [
|
|
104
99
|
"expo",
|
|
105
100
|
"expo-splash-screen",
|
|
@@ -108,12 +103,13 @@ function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDepe
|
|
|
108
103
|
].filter((depKey)=>!!defaultDependencies[depKey]
|
|
109
104
|
);
|
|
110
105
|
const symlinkedPackages = [];
|
|
106
|
+
const nonRecommendedPackages = [];
|
|
111
107
|
for (const dependenciesKey of requiredDependencies){
|
|
112
|
-
var
|
|
113
|
-
|
|
108
|
+
var ref;
|
|
109
|
+
// If the local package.json defined the dependency that we want to overwrite...
|
|
114
110
|
if ((ref = pkg1.dependencies) == null ? void 0 : ref[dependenciesKey]) {
|
|
115
|
-
|
|
116
|
-
(0, _isModuleSymlinked).isModuleSymlinked(projectRoot, {
|
|
111
|
+
// Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).
|
|
112
|
+
if ((0, _isModuleSymlinked).isModuleSymlinked(projectRoot, {
|
|
117
113
|
moduleId: dependenciesKey,
|
|
118
114
|
isSilent: true
|
|
119
115
|
})) {
|
|
@@ -121,9 +117,25 @@ function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDepe
|
|
|
121
117
|
symlinkedPackages.push(dependenciesKey);
|
|
122
118
|
continue;
|
|
123
119
|
}
|
|
120
|
+
// Do not modify manually skipped dependencies
|
|
124
121
|
if (skipDependencyUpdate.includes(dependenciesKey)) {
|
|
125
122
|
continue;
|
|
126
123
|
}
|
|
124
|
+
// Ensure the package only needs to be added when missing
|
|
125
|
+
if (addWhenMissingDependencies.includes(dependenciesKey)) {
|
|
126
|
+
let projectHasRecommended = null;
|
|
127
|
+
// Check if the version intersects with the recommended versions
|
|
128
|
+
try {
|
|
129
|
+
projectHasRecommended = (0, _semver).intersects(pkg1.dependencies[dependenciesKey], String(defaultDependencies[dependenciesKey]));
|
|
130
|
+
} catch {
|
|
131
|
+
// If the version is invalid, just warn the user
|
|
132
|
+
}
|
|
133
|
+
// When the versions can't be parsed `null`, or does not intersect `false`, warn the user
|
|
134
|
+
if (projectHasRecommended !== true) {
|
|
135
|
+
nonRecommendedPackages.push(`${dependenciesKey}@${defaultDependencies[dependenciesKey]}`);
|
|
136
|
+
}
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
127
139
|
}
|
|
128
140
|
combinedDependencies[dependenciesKey] = defaultDependencies[dependenciesKey];
|
|
129
141
|
}
|
|
@@ -131,6 +143,10 @@ function updatePkgDependencies(projectRoot, { pkg: pkg1 , templatePkg , skipDepe
|
|
|
131
143
|
Log.log(`\u203A Using symlinked ${symlinkedPackages.map((pkg)=>_chalk.default.bold(pkg)
|
|
132
144
|
).join(", ")} instead of recommended version(s).`);
|
|
133
145
|
}
|
|
146
|
+
if (nonRecommendedPackages.length) {
|
|
147
|
+
Log.warn(`\u203A Using current versions instead of recommended ${nonRecommendedPackages.map((pkg)=>_chalk.default.bold(pkg)
|
|
148
|
+
).join(", ")}.`);
|
|
149
|
+
}
|
|
134
150
|
const combinedDevDependencies = createDependenciesMap({
|
|
135
151
|
...defaultDevDependencies,
|
|
136
152
|
...pkg1.devDependencies
|
|
@@ -189,30 +205,6 @@ function createDependenciesMap(dependencies) {
|
|
|
189
205
|
pkg.scripts.ios = "expo run:ios";
|
|
190
206
|
}
|
|
191
207
|
}
|
|
192
|
-
/**
|
|
193
|
-
* Add new app entry points
|
|
194
|
-
*/ function updatePkgMain({ pkg }) {
|
|
195
|
-
let removedPkgMain = null;
|
|
196
|
-
// Check that the pkg.main doesn't match:
|
|
197
|
-
// - ./node_modules/expo/AppEntry
|
|
198
|
-
// - ./node_modules/expo/AppEntry.js
|
|
199
|
-
// - node_modules/expo/AppEntry.js
|
|
200
|
-
// - expo/AppEntry.js
|
|
201
|
-
// - expo/AppEntry
|
|
202
|
-
if (shouldDeleteMainField(pkg.main)) {
|
|
203
|
-
// Save the custom
|
|
204
|
-
removedPkgMain = pkg.main;
|
|
205
|
-
delete pkg.main;
|
|
206
|
-
}
|
|
207
|
-
return removedPkgMain;
|
|
208
|
-
}
|
|
209
|
-
function isPkgMainExpoAppEntry(input) {
|
|
210
|
-
const main = input || "";
|
|
211
|
-
if (main.startsWith("./")) {
|
|
212
|
-
return main.includes("node_modules/expo/AppEntry");
|
|
213
|
-
}
|
|
214
|
-
return main.includes("expo/AppEntry");
|
|
215
|
-
}
|
|
216
208
|
function normalizeDependencyMap(deps) {
|
|
217
209
|
return Object.keys(deps).map((dependency)=>`${dependency}@${deps[dependency]}`
|
|
218
210
|
).sort();
|
|
@@ -226,11 +218,5 @@ function createFileHash(contents) {
|
|
|
226
218
|
// this doesn't need to be secure, the shorter the better.
|
|
227
219
|
return _crypto.default.createHash("sha1").update(contents).digest("hex");
|
|
228
220
|
}
|
|
229
|
-
function shouldDeleteMainField(main) {
|
|
230
|
-
if (!main || !isPkgMainExpoAppEntry(main)) {
|
|
231
|
-
return false;
|
|
232
|
-
}
|
|
233
|
-
return !(main == null ? void 0 : main.startsWith("index."));
|
|
234
|
-
}
|
|
235
221
|
|
|
236
222
|
//# sourceMappingURL=updatePackageJson.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/prebuild/updatePackageJson.ts"],"sourcesContent":["import { getPackageJson, PackageJSONConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\n\nimport * as Log from '../log';\nimport { isModuleSymlinked } from '../utils/isModuleSymlinked';\nimport { logNewSection } from '../utils/ora';\n\nexport type DependenciesMap = { [key: string]: string | number };\n\nexport type PackageJsonModificationResults = DependenciesModificationResults & {\n removedMainField: string | null;\n};\n\nexport type DependenciesModificationResults = {\n /** Indicates that new values were added to the `dependencies` object in the `package.json`. */\n hasNewDependencies: boolean;\n /** Indicates that new values were added to the `devDependencies` object in the `package.json`. */\n hasNewDevDependencies: boolean;\n};\n\n/** Modifies the `package.json` with `modifyPackageJson` and format/displays the results. */\nexport async function updatePackageJSONAsync(\n projectRoot: string,\n {\n templateDirectory,\n pkg,\n skipDependencyUpdate,\n }: {\n templateDirectory: string;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): Promise<DependenciesModificationResults> {\n const updatingPackageJsonStep = logNewSection(\n 'Updating your package.json scripts, dependencies, and main file'\n );\n\n const templatePkg = getPackageJson(templateDirectory);\n\n const results = modifyPackageJson(projectRoot, {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n });\n\n await fs.promises.writeFile(\n path.resolve(projectRoot, 'package.json'),\n // Add new line to match the format of running yarn.\n // This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.\n JSON.stringify(pkg, null, 2) + '\\n'\n );\n\n updatingPackageJsonStep.succeed(\n 'Updated package.json and added index.js entry point for iOS and Android'\n );\n\n if (results.removedMainField) {\n Log.log(\n `\\u203A Removed ${chalk.bold(\n `\"main\": \"${results.removedMainField}\"`\n )} from package.json because we recommend using index.js as main instead\\n`\n );\n }\n\n return results;\n}\n\n/**\n * Make required modifications to the `package.json` file as a JSON object.\n *\n * 1. Update `package.json` `scripts`.\n * 2. Update `package.json` `dependencies` and `devDependencies`.\n * 3. Update `package.json` `main`.\n *\n * @param projectRoot The root directory of the project.\n * @param props.templatePkg Template project package.json as JSON.\n * @param props.pkg Current package.json as JSON.\n * @param props.skipDependencyUpdate Array of dependencies to skip updating.\n * @returns\n */\nfunction modifyPackageJson(\n projectRoot: string,\n {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n }: {\n templatePkg: PackageJSONConfig;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): PackageJsonModificationResults {\n updatePkgScripts({ pkg });\n\n const results = updatePkgDependencies(projectRoot, {\n pkg,\n templatePkg,\n skipDependencyUpdate,\n });\n\n const removedMainField = updatePkgMain({ pkg });\n\n return { ...results, removedMainField };\n}\n\n/**\n * Update package.json dependencies by combining the dependencies in the project we are ejecting\n * with the dependencies in the template project. Does the same for devDependencies.\n *\n * - The template may have some dependencies beyond react/react-native/react-native-unimodules,\n * for example RNGH and Reanimated. We should prefer the version that is already being used\n * in the project for those, but swap the react/react-native/react-native-unimodules versions\n * with the ones in the template.\n * - The same applies to expo-updates -- since some native project configuration may depend on the\n * version, we should always use the version of expo-updates in the template.\n *\n * > Exposed for testing.\n */\nexport function updatePkgDependencies(\n projectRoot: string,\n {\n pkg,\n templatePkg,\n skipDependencyUpdate = [],\n }: {\n pkg: PackageJSONConfig;\n templatePkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): DependenciesModificationResults {\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n const { dependencies, devDependencies } = templatePkg;\n const defaultDependencies = createDependenciesMap(dependencies);\n const defaultDevDependencies = createDependenciesMap(devDependencies);\n\n const combinedDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDependencies,\n ...pkg.dependencies,\n });\n\n const requiredDependencies = ['expo', 'expo-splash-screen', 'react', 'react-native'].filter(\n (depKey) => !!defaultDependencies[depKey]\n );\n\n const symlinkedPackages: string[] = [];\n\n for (const dependenciesKey of requiredDependencies) {\n if (\n // If the local package.json defined the dependency that we want to overwrite...\n pkg.dependencies?.[dependenciesKey]\n ) {\n if (\n // Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).\n isModuleSymlinked(projectRoot, { moduleId: dependenciesKey, isSilent: true })\n ) {\n // If the package is in the project's package.json and it's symlinked, then skip overwriting it.\n symlinkedPackages.push(dependenciesKey);\n continue;\n }\n if (skipDependencyUpdate.includes(dependenciesKey)) {\n continue;\n }\n }\n combinedDependencies[dependenciesKey] = defaultDependencies[dependenciesKey];\n }\n\n if (symlinkedPackages.length) {\n Log.log(\n `\\u203A Using symlinked ${symlinkedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')} instead of recommended version(s).`\n );\n }\n\n const combinedDevDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDevDependencies,\n ...pkg.devDependencies,\n });\n\n // Only change the dependencies if the normalized hash changes, this helps to reduce meaningless changes.\n const hasNewDependencies =\n hashForDependencyMap(pkg.dependencies) !== hashForDependencyMap(combinedDependencies);\n const hasNewDevDependencies =\n hashForDependencyMap(pkg.devDependencies) !== hashForDependencyMap(combinedDevDependencies);\n // Save the dependencies\n if (hasNewDependencies) {\n // Use Object.assign to preserve the original order of dependencies, this makes it easier to see what changed in the git diff.\n pkg.dependencies = Object.assign(pkg.dependencies ?? {}, combinedDependencies);\n }\n if (hasNewDevDependencies) {\n // Same as with dependencies\n pkg.devDependencies = Object.assign(pkg.devDependencies ?? {}, combinedDevDependencies);\n }\n\n return {\n hasNewDependencies,\n hasNewDevDependencies,\n };\n}\n\n/**\n * Create an object of type DependenciesMap a dependencies object or throw if not valid.\n *\n * @param dependencies - ideally an object of type {[key]: string} - if not then this will error.\n */\nexport function createDependenciesMap(dependencies: any): DependenciesMap {\n if (typeof dependencies !== 'object') {\n throw new Error(`Dependency map is invalid, expected object but got ${typeof dependencies}`);\n } else if (!dependencies) {\n return {};\n }\n\n const outputMap: DependenciesMap = {};\n\n for (const key of Object.keys(dependencies)) {\n const value = dependencies[key];\n if (typeof value === 'string') {\n outputMap[key] = value;\n } else {\n throw new Error(\n `Dependency for key \\`${key}\\` should be a \\`string\\`, instead got: \\`{ ${key}: ${JSON.stringify(\n value\n )} }\\``\n );\n }\n }\n return outputMap;\n}\n\n/**\n * Update package.json scripts - `npm start` should default to `expo\n * start --dev-client` rather than `expo start` after ejecting, for example.\n */\nfunction updatePkgScripts({ pkg }: { pkg: PackageJSONConfig }) {\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n if (!pkg.scripts.start?.includes('--dev-client')) {\n pkg.scripts.start = 'expo start --dev-client';\n }\n if (!pkg.scripts.android?.includes('run')) {\n pkg.scripts.android = 'expo run:android';\n }\n if (!pkg.scripts.ios?.includes('run')) {\n pkg.scripts.ios = 'expo run:ios';\n }\n}\n\n/**\n * Add new app entry points\n */\nfunction updatePkgMain({ pkg }: { pkg: PackageJSONConfig }): string | null {\n let removedPkgMain: null | string = null;\n // Check that the pkg.main doesn't match:\n // - ./node_modules/expo/AppEntry\n // - ./node_modules/expo/AppEntry.js\n // - node_modules/expo/AppEntry.js\n // - expo/AppEntry.js\n // - expo/AppEntry\n if (shouldDeleteMainField(pkg.main)) {\n // Save the custom\n removedPkgMain = pkg.main;\n delete pkg.main;\n }\n\n return removedPkgMain;\n}\n\n/**\n * Returns true if the input string matches the default expo main field.\n *\n * - ./node_modules/expo/AppEntry\n * - ./node_modules/expo/AppEntry.js\n * - node_modules/expo/AppEntry.js\n * - expo/AppEntry.js\n * - expo/AppEntry\n *\n * @param input package.json main field\n */\nexport function isPkgMainExpoAppEntry(input?: string): boolean {\n const main = input || '';\n if (main.startsWith('./')) {\n return main.includes('node_modules/expo/AppEntry');\n }\n return main.includes('expo/AppEntry');\n}\n\nfunction normalizeDependencyMap(deps: DependenciesMap): string[] {\n return Object.keys(deps)\n .map((dependency) => `${dependency}@${deps[dependency]}`)\n .sort();\n}\n\nexport function hashForDependencyMap(deps: DependenciesMap = {}): string {\n const depsList = normalizeDependencyMap(deps);\n const depsString = depsList.join('\\n');\n return createFileHash(depsString);\n}\n\nexport function createFileHash(contents: string): string {\n // this doesn't need to be secure, the shorter the better.\n return crypto.createHash('sha1').update(contents).digest('hex');\n}\n\nexport function shouldDeleteMainField(main?: any): boolean {\n if (!main || !isPkgMainExpoAppEntry(main)) {\n return false;\n }\n\n return !main?.startsWith('index.');\n}\n"],"names":["updatePackageJSONAsync","updatePkgDependencies","createDependenciesMap","isPkgMainExpoAppEntry","hashForDependencyMap","createFileHash","shouldDeleteMainField","Log","projectRoot","templateDirectory","pkg","skipDependencyUpdate","updatingPackageJsonStep","logNewSection","templatePkg","getPackageJson","results","modifyPackageJson","fs","promises","writeFile","path","resolve","JSON","stringify","succeed","removedMainField","log","chalk","bold","updatePkgScripts","updatePkgMain","devDependencies","dependencies","defaultDependencies","defaultDevDependencies","combinedDependencies","requiredDependencies","filter","depKey","symlinkedPackages","dependenciesKey","isModuleSymlinked","moduleId","isSilent","push","includes","length","map","join","combinedDevDependencies","hasNewDependencies","hasNewDevDependencies","Object","assign","Error","outputMap","key","keys","value","scripts","start","android","ios","removedPkgMain","main","input","startsWith","normalizeDependencyMap","deps","dependency","sort","depsList","depsString","contents","crypto","createHash","update","digest"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/prebuild/updatePackageJson.ts"],"sourcesContent":["import { getPackageJson, PackageJSONConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport { intersects as semverIntersects } from 'semver';\n\nimport * as Log from '../log';\nimport { isModuleSymlinked } from '../utils/isModuleSymlinked';\nimport { logNewSection } from '../utils/ora';\n\nexport type DependenciesMap = { [key: string]: string | number };\n\nexport type DependenciesModificationResults = {\n /** Indicates that new values were added to the `dependencies` object in the `package.json`. */\n hasNewDependencies: boolean;\n /** Indicates that new values were added to the `devDependencies` object in the `package.json`. */\n hasNewDevDependencies: boolean;\n};\n\n/** Modifies the `package.json` with `modifyPackageJson` and format/displays the results. */\nexport async function updatePackageJSONAsync(\n projectRoot: string,\n {\n templateDirectory,\n pkg,\n skipDependencyUpdate,\n }: {\n templateDirectory: string;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): Promise<DependenciesModificationResults> {\n const updatingPackageJsonStep = logNewSection(\n 'Updating your package.json scripts, dependencies, and main file'\n );\n\n const templatePkg = getPackageJson(templateDirectory);\n\n const results = modifyPackageJson(projectRoot, {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n });\n\n await fs.promises.writeFile(\n path.resolve(projectRoot, 'package.json'),\n // Add new line to match the format of running yarn.\n // This prevents the `package.json` from changing when running `prebuild --no-install` multiple times.\n JSON.stringify(pkg, null, 2) + '\\n'\n );\n\n updatingPackageJsonStep.succeed(\n 'Updated package.json and added index.js entry point for iOS and Android'\n );\n\n return results;\n}\n\n/**\n * Make required modifications to the `package.json` file as a JSON object.\n *\n * 1. Update `package.json` `scripts`.\n * 2. Update `package.json` `dependencies` and `devDependencies`.\n * 3. Update `package.json` `main`.\n *\n * @param projectRoot The root directory of the project.\n * @param props.templatePkg Template project package.json as JSON.\n * @param props.pkg Current package.json as JSON.\n * @param props.skipDependencyUpdate Array of dependencies to skip updating.\n * @returns\n */\nfunction modifyPackageJson(\n projectRoot: string,\n {\n templatePkg,\n pkg,\n skipDependencyUpdate,\n }: {\n templatePkg: PackageJSONConfig;\n pkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n) {\n updatePkgScripts({ pkg });\n\n // TODO: Move to `npx expo-doctor`\n return updatePkgDependencies(projectRoot, {\n pkg,\n templatePkg,\n skipDependencyUpdate,\n });\n}\n\n/**\n * Update package.json dependencies by combining the dependencies in the project we are ejecting\n * with the dependencies in the template project. Does the same for devDependencies.\n *\n * - The template may have some dependencies beyond react/react-native/react-native-unimodules,\n * for example RNGH and Reanimated. We should prefer the version that is already being used\n * in the project for those, but swap the react/react-native/react-native-unimodules versions\n * with the ones in the template.\n * - The same applies to expo-updates -- since some native project configuration may depend on the\n * version, we should always use the version of expo-updates in the template.\n *\n * > Exposed for testing.\n */\nexport function updatePkgDependencies(\n projectRoot: string,\n {\n pkg,\n templatePkg,\n skipDependencyUpdate = [],\n }: {\n pkg: PackageJSONConfig;\n templatePkg: PackageJSONConfig;\n skipDependencyUpdate?: string[];\n }\n): DependenciesModificationResults {\n if (!pkg.devDependencies) {\n pkg.devDependencies = {};\n }\n const { dependencies, devDependencies } = templatePkg;\n const defaultDependencies = createDependenciesMap(dependencies);\n const defaultDevDependencies = createDependenciesMap(devDependencies);\n\n const combinedDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDependencies,\n ...pkg.dependencies,\n });\n\n const addWhenMissingDependencies = ['react', 'react-native'].filter(\n (depKey) => !!defaultDependencies[depKey]\n );\n const requiredDependencies = ['expo', 'expo-splash-screen', 'react', 'react-native'].filter(\n (depKey) => !!defaultDependencies[depKey]\n );\n\n const symlinkedPackages: string[] = [];\n const nonRecommendedPackages: string[] = [];\n\n for (const dependenciesKey of requiredDependencies) {\n // If the local package.json defined the dependency that we want to overwrite...\n if (pkg.dependencies?.[dependenciesKey]) {\n // Then ensure it isn't symlinked (i.e. the user has a custom version in their yarn workspace).\n if (isModuleSymlinked(projectRoot, { moduleId: dependenciesKey, isSilent: true })) {\n // If the package is in the project's package.json and it's symlinked, then skip overwriting it.\n symlinkedPackages.push(dependenciesKey);\n continue;\n }\n\n // Do not modify manually skipped dependencies\n if (skipDependencyUpdate.includes(dependenciesKey)) {\n continue;\n }\n\n // Ensure the package only needs to be added when missing\n if (addWhenMissingDependencies.includes(dependenciesKey)) {\n let projectHasRecommended: boolean | null = null;\n // Check if the version intersects with the recommended versions\n try {\n projectHasRecommended = semverIntersects(\n pkg.dependencies[dependenciesKey],\n String(defaultDependencies[dependenciesKey])\n );\n } catch {\n // If the version is invalid, just warn the user\n }\n // When the versions can't be parsed `null`, or does not intersect `false`, warn the user\n if (projectHasRecommended !== true) {\n nonRecommendedPackages.push(`${dependenciesKey}@${defaultDependencies[dependenciesKey]}`);\n }\n // Do not modify add-only dependencies\n continue;\n }\n }\n combinedDependencies[dependenciesKey] = defaultDependencies[dependenciesKey];\n }\n\n if (symlinkedPackages.length) {\n Log.log(\n `\\u203A Using symlinked ${symlinkedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')} instead of recommended version(s).`\n );\n }\n\n if (nonRecommendedPackages.length) {\n Log.warn(\n `\\u203A Using current versions instead of recommended ${nonRecommendedPackages\n .map((pkg) => chalk.bold(pkg))\n .join(', ')}.`\n );\n }\n\n const combinedDevDependencies: DependenciesMap = createDependenciesMap({\n ...defaultDevDependencies,\n ...pkg.devDependencies,\n });\n\n // Only change the dependencies if the normalized hash changes, this helps to reduce meaningless changes.\n const hasNewDependencies =\n hashForDependencyMap(pkg.dependencies) !== hashForDependencyMap(combinedDependencies);\n const hasNewDevDependencies =\n hashForDependencyMap(pkg.devDependencies) !== hashForDependencyMap(combinedDevDependencies);\n // Save the dependencies\n if (hasNewDependencies) {\n // Use Object.assign to preserve the original order of dependencies, this makes it easier to see what changed in the git diff.\n pkg.dependencies = Object.assign(pkg.dependencies ?? {}, combinedDependencies);\n }\n if (hasNewDevDependencies) {\n // Same as with dependencies\n pkg.devDependencies = Object.assign(pkg.devDependencies ?? {}, combinedDevDependencies);\n }\n\n return {\n hasNewDependencies,\n hasNewDevDependencies,\n };\n}\n\n/**\n * Create an object of type DependenciesMap a dependencies object or throw if not valid.\n *\n * @param dependencies - ideally an object of type {[key]: string} - if not then this will error.\n */\nexport function createDependenciesMap(dependencies: any): DependenciesMap {\n if (typeof dependencies !== 'object') {\n throw new Error(`Dependency map is invalid, expected object but got ${typeof dependencies}`);\n } else if (!dependencies) {\n return {};\n }\n\n const outputMap: DependenciesMap = {};\n\n for (const key of Object.keys(dependencies)) {\n const value = dependencies[key];\n if (typeof value === 'string') {\n outputMap[key] = value;\n } else {\n throw new Error(\n `Dependency for key \\`${key}\\` should be a \\`string\\`, instead got: \\`{ ${key}: ${JSON.stringify(\n value\n )} }\\``\n );\n }\n }\n return outputMap;\n}\n\n/**\n * Update package.json scripts - `npm start` should default to `expo\n * start --dev-client` rather than `expo start` after ejecting, for example.\n */\nfunction updatePkgScripts({ pkg }: { pkg: PackageJSONConfig }) {\n if (!pkg.scripts) {\n pkg.scripts = {};\n }\n if (!pkg.scripts.start?.includes('--dev-client')) {\n pkg.scripts.start = 'expo start --dev-client';\n }\n if (!pkg.scripts.android?.includes('run')) {\n pkg.scripts.android = 'expo run:android';\n }\n if (!pkg.scripts.ios?.includes('run')) {\n pkg.scripts.ios = 'expo run:ios';\n }\n}\n\nfunction normalizeDependencyMap(deps: DependenciesMap): string[] {\n return Object.keys(deps)\n .map((dependency) => `${dependency}@${deps[dependency]}`)\n .sort();\n}\n\nexport function hashForDependencyMap(deps: DependenciesMap = {}): string {\n const depsList = normalizeDependencyMap(deps);\n const depsString = depsList.join('\\n');\n return createFileHash(depsString);\n}\n\nexport function createFileHash(contents: string): string {\n // this doesn't need to be secure, the shorter the better.\n return crypto.createHash('sha1').update(contents).digest('hex');\n}\n"],"names":["updatePackageJSONAsync","updatePkgDependencies","createDependenciesMap","hashForDependencyMap","createFileHash","Log","projectRoot","templateDirectory","pkg","skipDependencyUpdate","updatingPackageJsonStep","logNewSection","templatePkg","getPackageJson","results","modifyPackageJson","fs","promises","writeFile","path","resolve","JSON","stringify","succeed","updatePkgScripts","devDependencies","dependencies","defaultDependencies","defaultDevDependencies","combinedDependencies","addWhenMissingDependencies","filter","depKey","requiredDependencies","symlinkedPackages","nonRecommendedPackages","dependenciesKey","isModuleSymlinked","moduleId","isSilent","push","includes","projectHasRecommended","semverIntersects","String","length","log","map","chalk","bold","join","warn","combinedDevDependencies","hasNewDependencies","hasNewDevDependencies","Object","assign","Error","outputMap","key","keys","value","scripts","start","android","ios","normalizeDependencyMap","deps","dependency","sort","depsList","depsString","contents","crypto","createHash","update","digest"],"mappings":"AAAA;;;;QAqBsBA,sBAAsB,GAAtBA,sBAAsB;QAsF5BC,qBAAqB,GAArBA,qBAAqB;QAuHrBC,qBAAqB,GAArBA,qBAAqB;QAiDrBC,oBAAoB,GAApBA,oBAAoB;QAMpBC,cAAc,GAAdA,cAAc;AAzRoB,IAAA,OAAc,WAAd,cAAc,CAAA;AAC9C,IAAA,MAAO,kCAAP,OAAO,EAAA;AACN,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACZ,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AACwB,IAAA,OAAQ,WAAR,QAAQ,CAAA;AAE3CC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACmB,IAAA,kBAA4B,WAA5B,4BAA4B,CAAA;AAChC,IAAA,IAAc,WAAd,cAAc,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYrC,eAAeL,sBAAsB,CAC1CM,WAAmB,EACnB,EACEC,iBAAiB,CAAA,EACjBC,GAAG,CAAA,EACHC,oBAAoB,CAAA,EAKrB,EACyC;IAC1C,MAAMC,uBAAuB,GAAGC,CAAAA,GAAAA,IAAa,AAE5C,CAAA,cAF4C,CAC3C,iEAAiE,CAClE,AAAC;IAEF,MAAMC,WAAW,GAAGC,CAAAA,GAAAA,OAAc,AAAmB,CAAA,eAAnB,CAACN,iBAAiB,CAAC,AAAC;IAEtD,MAAMO,OAAO,GAAGC,iBAAiB,CAACT,WAAW,EAAE;QAC7CM,WAAW;QACXJ,GAAG;QACHC,oBAAoB;KACrB,CAAC,AAAC;IAEH,MAAMO,GAAE,QAAA,CAACC,QAAQ,CAACC,SAAS,CACzBC,KAAI,QAAA,CAACC,OAAO,CAACd,WAAW,EAAE,cAAc,CAAC,EACzC,oDAAoD;IACpD,sGAAsG;IACtGe,IAAI,CAACC,SAAS,CAACd,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACpC,CAAC;IAEFE,uBAAuB,CAACa,OAAO,CAC7B,yEAAyE,CAC1E,CAAC;IAEF,OAAOT,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;;GAYG,CACH,SAASC,iBAAiB,CACxBT,WAAmB,EACnB,EACEM,WAAW,CAAA,EACXJ,GAAG,CAAA,EACHC,oBAAoB,CAAA,EAKrB,EACD;IACAe,gBAAgB,CAAC;QAAEhB,GAAG;KAAE,CAAC,CAAC;IAE1B,kCAAkC;IAClC,OAAOP,qBAAqB,CAACK,WAAW,EAAE;QACxCE,GAAG;QACHI,WAAW;QACXH,oBAAoB;KACrB,CAAC,CAAC;CACJ;AAeM,SAASR,qBAAqB,CACnCK,WAAmB,EACnB,EACEE,GAAG,EAAHA,IAAG,CAAA,EACHI,WAAW,CAAA,EACXH,oBAAoB,EAAG,EAAE,CAAA,EAK1B,EACgC;IACjC,IAAI,CAACD,IAAG,CAACiB,eAAe,EAAE;QACxBjB,IAAG,CAACiB,eAAe,GAAG,EAAE,CAAC;KAC1B;IACD,MAAM,EAAEC,YAAY,CAAA,EAAED,eAAe,CAAA,EAAE,GAAGb,WAAW,AAAC;IACtD,MAAMe,mBAAmB,GAAGzB,qBAAqB,CAACwB,YAAY,CAAC,AAAC;IAChE,MAAME,sBAAsB,GAAG1B,qBAAqB,CAACuB,eAAe,CAAC,AAAC;IAEtE,MAAMI,oBAAoB,GAAoB3B,qBAAqB,CAAC;QAClE,GAAGyB,mBAAmB;QACtB,GAAGnB,IAAG,CAACkB,YAAY;KACpB,CAAC,AAAC;IAEH,MAAMI,0BAA0B,GAAG;QAAC,OAAO;QAAE,cAAc;KAAC,CAACC,MAAM,CACjE,CAACC,MAAM,GAAK,CAAC,CAACL,mBAAmB,CAACK,MAAM,CAAC;IAAA,CAC1C,AAAC;IACF,MAAMC,oBAAoB,GAAG;QAAC,MAAM;QAAE,oBAAoB;QAAE,OAAO;QAAE,cAAc;KAAC,CAACF,MAAM,CACzF,CAACC,MAAM,GAAK,CAAC,CAACL,mBAAmB,CAACK,MAAM,CAAC;IAAA,CAC1C,AAAC;IAEF,MAAME,iBAAiB,GAAa,EAAE,AAAC;IACvC,MAAMC,sBAAsB,GAAa,EAAE,AAAC;IAE5C,KAAK,MAAMC,eAAe,IAAIH,oBAAoB,CAAE;YAE9CzB,GAAgB;QADpB,gFAAgF;QAChF,IAAIA,CAAAA,GAAgB,GAAhBA,IAAG,CAACkB,YAAY,SAAmB,GAAnClB,KAAAA,CAAmC,GAAnCA,GAAgB,AAAE,CAAC4B,eAAe,CAAC,EAAE;YACvC,+FAA+F;YAC/F,IAAIC,CAAAA,GAAAA,kBAAiB,AAA4D,CAAA,kBAA5D,CAAC/B,WAAW,EAAE;gBAAEgC,QAAQ,EAAEF,eAAe;gBAAEG,QAAQ,EAAE,IAAI;aAAE,CAAC,EAAE;gBACjF,gGAAgG;gBAChGL,iBAAiB,CAACM,IAAI,CAACJ,eAAe,CAAC,CAAC;gBACxC,SAAS;aACV;YAED,8CAA8C;YAC9C,IAAI3B,oBAAoB,CAACgC,QAAQ,CAACL,eAAe,CAAC,EAAE;gBAClD,SAAS;aACV;YAED,yDAAyD;YACzD,IAAIN,0BAA0B,CAACW,QAAQ,CAACL,eAAe,CAAC,EAAE;gBACxD,IAAIM,qBAAqB,GAAmB,IAAI,AAAC;gBACjD,gEAAgE;gBAChE,IAAI;oBACFA,qBAAqB,GAAGC,CAAAA,GAAAA,OAAgB,AAGvC,CAAA,WAHuC,CACtCnC,IAAG,CAACkB,YAAY,CAACU,eAAe,CAAC,EACjCQ,MAAM,CAACjB,mBAAmB,CAACS,eAAe,CAAC,CAAC,CAC7C,CAAC;iBACH,CAAC,OAAM;gBACN,gDAAgD;iBACjD;gBACD,yFAAyF;gBACzF,IAAIM,qBAAqB,KAAK,IAAI,EAAE;oBAClCP,sBAAsB,CAACK,IAAI,CAAC,CAAC,EAAEJ,eAAe,CAAC,CAAC,EAAET,mBAAmB,CAACS,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3F;gBAED,SAAS;aACV;SACF;QACDP,oBAAoB,CAACO,eAAe,CAAC,GAAGT,mBAAmB,CAACS,eAAe,CAAC,CAAC;KAC9E;IAED,IAAIF,iBAAiB,CAACW,MAAM,EAAE;QAC5BxC,GAAG,CAACyC,GAAG,CACL,CAAC,uBAAuB,EAAEZ,iBAAiB,CACxCa,GAAG,CAAC,CAACvC,GAAG,GAAKwC,MAAK,QAAA,CAACC,IAAI,CAACzC,GAAG,CAAC;QAAA,CAAC,CAC7B0C,IAAI,CAAC,IAAI,CAAC,CAAC,mCAAmC,CAAC,CACnD,CAAC;KACH;IAED,IAAIf,sBAAsB,CAACU,MAAM,EAAE;QACjCxC,GAAG,CAAC8C,IAAI,CACN,CAAC,qDAAqD,EAAEhB,sBAAsB,CAC3EY,GAAG,CAAC,CAACvC,GAAG,GAAKwC,MAAK,QAAA,CAACC,IAAI,CAACzC,GAAG,CAAC;QAAA,CAAC,CAC7B0C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACjB,CAAC;KACH;IAED,MAAME,uBAAuB,GAAoBlD,qBAAqB,CAAC;QACrE,GAAG0B,sBAAsB;QACzB,GAAGpB,IAAG,CAACiB,eAAe;KACvB,CAAC,AAAC;IAEH,yGAAyG;IACzG,MAAM4B,kBAAkB,GACtBlD,oBAAoB,CAACK,IAAG,CAACkB,YAAY,CAAC,KAAKvB,oBAAoB,CAAC0B,oBAAoB,CAAC,AAAC;IACxF,MAAMyB,qBAAqB,GACzBnD,oBAAoB,CAACK,IAAG,CAACiB,eAAe,CAAC,KAAKtB,oBAAoB,CAACiD,uBAAuB,CAAC,AAAC;IAC9F,wBAAwB;IACxB,IAAIC,kBAAkB,EAAE;YAEW7C,aAAgB;QADjD,8HAA8H;QAC9HA,IAAG,CAACkB,YAAY,GAAG6B,MAAM,CAACC,MAAM,CAAChD,CAAAA,aAAgB,GAAhBA,IAAG,CAACkB,YAAY,YAAhBlB,aAAgB,GAAI,EAAE,EAAEqB,oBAAoB,CAAC,CAAC;KAChF;IACD,IAAIyB,qBAAqB,EAAE;YAEW9C,gBAAmB;QADvD,4BAA4B;QAC5BA,IAAG,CAACiB,eAAe,GAAG8B,MAAM,CAACC,MAAM,CAAChD,CAAAA,gBAAmB,GAAnBA,IAAG,CAACiB,eAAe,YAAnBjB,gBAAmB,GAAI,EAAE,EAAE4C,uBAAuB,CAAC,CAAC;KACzF;IAED,OAAO;QACLC,kBAAkB;QAClBC,qBAAqB;KACtB,CAAC;CACH;AAOM,SAASpD,qBAAqB,CAACwB,YAAiB,EAAmB;IACxE,IAAI,OAAOA,YAAY,KAAK,QAAQ,EAAE;QACpC,MAAM,IAAI+B,KAAK,CAAC,CAAC,mDAAmD,EAAE,OAAO/B,YAAY,CAAC,CAAC,CAAC,CAAC;KAC9F,MAAM,IAAI,CAACA,YAAY,EAAE;QACxB,OAAO,EAAE,CAAC;KACX;IAED,MAAMgC,SAAS,GAAoB,EAAE,AAAC;IAEtC,KAAK,MAAMC,GAAG,IAAIJ,MAAM,CAACK,IAAI,CAAClC,YAAY,CAAC,CAAE;QAC3C,MAAMmC,KAAK,GAAGnC,YAAY,CAACiC,GAAG,CAAC,AAAC;QAChC,IAAI,OAAOE,KAAK,KAAK,QAAQ,EAAE;YAC7BH,SAAS,CAACC,GAAG,CAAC,GAAGE,KAAK,CAAC;SACxB,MAAM;YACL,MAAM,IAAIJ,KAAK,CACb,CAAC,qBAAqB,EAAEE,GAAG,CAAC,4CAA4C,EAAEA,GAAG,CAAC,EAAE,EAAEtC,IAAI,CAACC,SAAS,CAC9FuC,KAAK,CACN,CAAC,IAAI,CAAC,CACR,CAAC;SACH;KACF;IACD,OAAOH,SAAS,CAAC;CAClB;AAED;;;GAGG,CACH,SAASlC,gBAAgB,CAAC,EAAEhB,GAAG,CAAA,EAA8B,EAAE;QAIxDA,GAAiB,EAGjBA,IAAmB,EAGnBA,IAAe;IATpB,IAAI,CAACA,GAAG,CAACsD,OAAO,EAAE;QAChBtD,GAAG,CAACsD,OAAO,GAAG,EAAE,CAAC;KAClB;IACD,IAAI,EAACtD,CAAAA,GAAiB,GAAjBA,GAAG,CAACsD,OAAO,CAACC,KAAK,SAAU,GAA3BvD,KAAAA,CAA2B,GAA3BA,GAAiB,CAAEiC,QAAQ,CAAC,cAAc,CAAC,CAAA,EAAE;QAChDjC,GAAG,CAACsD,OAAO,CAACC,KAAK,GAAG,yBAAyB,CAAC;KAC/C;IACD,IAAI,EAACvD,CAAAA,IAAmB,GAAnBA,GAAG,CAACsD,OAAO,CAACE,OAAO,SAAU,GAA7BxD,KAAAA,CAA6B,GAA7BA,IAAmB,CAAEiC,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAE;QACzCjC,GAAG,CAACsD,OAAO,CAACE,OAAO,GAAG,kBAAkB,CAAC;KAC1C;IACD,IAAI,EAACxD,CAAAA,IAAe,GAAfA,GAAG,CAACsD,OAAO,CAACG,GAAG,SAAU,GAAzBzD,KAAAA,CAAyB,GAAzBA,IAAe,CAAEiC,QAAQ,CAAC,KAAK,CAAC,CAAA,EAAE;QACrCjC,GAAG,CAACsD,OAAO,CAACG,GAAG,GAAG,cAAc,CAAC;KAClC;CACF;AAED,SAASC,sBAAsB,CAACC,IAAqB,EAAY;IAC/D,OAAOZ,MAAM,CAACK,IAAI,CAACO,IAAI,CAAC,CACrBpB,GAAG,CAAC,CAACqB,UAAU,GAAK,CAAC,EAAEA,UAAU,CAAC,CAAC,EAAED,IAAI,CAACC,UAAU,CAAC,CAAC,CAAC;IAAA,CAAC,CACxDC,IAAI,EAAE,CAAC;CACX;AAEM,SAASlE,oBAAoB,CAACgE,IAAqB,GAAG,EAAE,EAAU;IACvE,MAAMG,QAAQ,GAAGJ,sBAAsB,CAACC,IAAI,CAAC,AAAC;IAC9C,MAAMI,UAAU,GAAGD,QAAQ,CAACpB,IAAI,CAAC,IAAI,CAAC,AAAC;IACvC,OAAO9C,cAAc,CAACmE,UAAU,CAAC,CAAC;CACnC;AAEM,SAASnE,cAAc,CAACoE,QAAgB,EAAU;IACvD,0DAA0D;IAC1D,OAAOC,OAAM,QAAA,CAACC,UAAU,CAAC,MAAM,CAAC,CAACC,MAAM,CAACH,QAAQ,CAAC,CAACI,MAAM,CAAC,KAAK,CAAC,CAAC;CACjE"}
|
|
@@ -53,7 +53,7 @@ async function getRemoteVersionsForSdkAsync({ sdkVersion , skipCache } = {}) {
|
|
|
53
53
|
const version = sdkVersions[sdkVersion];
|
|
54
54
|
return normalizeSdkVersionObject(version);
|
|
55
55
|
}
|
|
56
|
-
async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion }) {
|
|
56
|
+
async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion , pkg }) {
|
|
57
57
|
const versionsForSdk = await getCombinedKnownVersionsAsync({
|
|
58
58
|
projectRoot,
|
|
59
59
|
sdkVersion,
|
|
@@ -61,6 +61,7 @@ async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion }
|
|
|
61
61
|
});
|
|
62
62
|
let nativeModulesCount = 0;
|
|
63
63
|
let othersCount = 0;
|
|
64
|
+
const excludedNativeModules = [];
|
|
64
65
|
const versionedPackages = packages.map((arg)=>{
|
|
65
66
|
const { name , type , raw } = (0, _npmPackageArg).default(arg);
|
|
66
67
|
if ([
|
|
@@ -68,8 +69,17 @@ async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion }
|
|
|
68
69
|
"version",
|
|
69
70
|
"range"
|
|
70
71
|
].includes(type) && name && versionsForSdk[name]) {
|
|
72
|
+
var ref, ref1, ref2;
|
|
71
73
|
// Unimodule packages from npm registry are modified to use the bundled version.
|
|
72
74
|
// Some packages have the recommended version listed in https://exp.host/--/api/v2/versions.
|
|
75
|
+
if (pkg == null ? void 0 : (ref = pkg.expo) == null ? void 0 : (ref1 = ref.install) == null ? void 0 : (ref2 = ref1.exclude) == null ? void 0 : ref2.includes(name)) {
|
|
76
|
+
othersCount++;
|
|
77
|
+
excludedNativeModules.push({
|
|
78
|
+
name,
|
|
79
|
+
bundledNativeVersion: versionsForSdk[name]
|
|
80
|
+
});
|
|
81
|
+
return raw;
|
|
82
|
+
}
|
|
73
83
|
nativeModulesCount++;
|
|
74
84
|
return `${name}@${versionsForSdk[name]}`;
|
|
75
85
|
} else {
|
|
@@ -85,7 +95,8 @@ async function getVersionedPackagesAsync(projectRoot, { packages , sdkVersion }
|
|
|
85
95
|
});
|
|
86
96
|
return {
|
|
87
97
|
packages: versionedPackages,
|
|
88
|
-
messages
|
|
98
|
+
messages,
|
|
99
|
+
excludedNativeModules
|
|
89
100
|
};
|
|
90
101
|
}
|
|
91
102
|
function getOperationLog({ nativeModulesCount , sdkVersion , othersCount }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/getVersionedPackages.ts"],"sourcesContent":["import npmPackageArg from 'npm-package-arg';\n\nimport { getVersionsAsync, SDKVersion } from '../../../api/getVersions';\nimport { getVersionedNativeModulesAsync } from './bundledNativeModules';\n\nconst debug = require('debug')(\n 'expo:doctor:dependencies:getVersionedPackages'\n) as typeof console.log;\n\nexport type DependencyList = Record<string, string>;\n\n/** Adds `react-dom`, `react`, and `react-native` to the list of known package versions (`relatedPackages`) */\nfunction normalizeSdkVersionObject(version?: SDKVersion): Record<string, string> {\n if (!version) {\n return {};\n }\n const { relatedPackages, facebookReactVersion, facebookReactNativeVersion } = version;\n\n const reactVersion = facebookReactVersion\n ? {\n react: facebookReactVersion,\n 'react-dom': facebookReactVersion,\n }\n : undefined;\n\n return {\n ...relatedPackages,\n ...reactVersion,\n 'react-native': facebookReactNativeVersion,\n };\n}\n\n/** Get the known versions for a given SDK, combines all sources. */\nexport async function getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache,\n}: {\n projectRoot: string;\n sdkVersion?: string;\n skipCache?: boolean;\n}) {\n const bundledNativeModules = sdkVersion\n ? await getVersionedNativeModulesAsync(projectRoot, sdkVersion)\n : {};\n const versionsForSdk = await getRemoteVersionsForSdkAsync({ sdkVersion, skipCache });\n return {\n ...versionsForSdk,\n ...bundledNativeModules,\n };\n}\n\n/** @returns a key/value list of known dependencies and their version (including range). */\nexport async function getRemoteVersionsForSdkAsync({\n sdkVersion,\n skipCache,\n}: { sdkVersion?: string; skipCache?: boolean } = {}): Promise<DependencyList> {\n const { sdkVersions } = await getVersionsAsync({ skipCache });\n\n // We only want versioned dependencies so skip if they cannot be found.\n if (!sdkVersion || !(sdkVersion in sdkVersions)) {\n debug(\n `Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(\n sdkVersions\n ).join(', ')})`\n );\n return {};\n }\n\n const version = sdkVersions[sdkVersion as keyof typeof sdkVersions] as unknown as SDKVersion;\n\n return normalizeSdkVersionObject(version);\n}\n\n/**\n * Versions a list of `packages` against a given `sdkVersion` based on local and remote versioning resources.\n *\n * @param projectRoot\n * @param param1\n * @returns\n */\nexport async function getVersionedPackagesAsync(\n projectRoot: string,\n {\n packages,\n sdkVersion,\n }: {\n /** List of npm packages to process. */\n packages: string[];\n /** Target SDK Version number to version the `packages` for. */\n sdkVersion: string;\n }\n): Promise<{
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/getVersionedPackages.ts"],"sourcesContent":["import { PackageJSONConfig } from '@expo/config';\nimport npmPackageArg from 'npm-package-arg';\n\nimport { getVersionsAsync, SDKVersion } from '../../../api/getVersions';\nimport { getVersionedNativeModulesAsync } from './bundledNativeModules';\n\nconst debug = require('debug')(\n 'expo:doctor:dependencies:getVersionedPackages'\n) as typeof console.log;\n\nexport type DependencyList = Record<string, string>;\n\n/** Adds `react-dom`, `react`, and `react-native` to the list of known package versions (`relatedPackages`) */\nfunction normalizeSdkVersionObject(version?: SDKVersion): Record<string, string> {\n if (!version) {\n return {};\n }\n const { relatedPackages, facebookReactVersion, facebookReactNativeVersion } = version;\n\n const reactVersion = facebookReactVersion\n ? {\n react: facebookReactVersion,\n 'react-dom': facebookReactVersion,\n }\n : undefined;\n\n return {\n ...relatedPackages,\n ...reactVersion,\n 'react-native': facebookReactNativeVersion,\n };\n}\n\n/** Get the known versions for a given SDK, combines all sources. */\nexport async function getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache,\n}: {\n projectRoot: string;\n sdkVersion?: string;\n skipCache?: boolean;\n}) {\n const bundledNativeModules = sdkVersion\n ? await getVersionedNativeModulesAsync(projectRoot, sdkVersion)\n : {};\n const versionsForSdk = await getRemoteVersionsForSdkAsync({ sdkVersion, skipCache });\n return {\n ...versionsForSdk,\n ...bundledNativeModules,\n };\n}\n\n/** @returns a key/value list of known dependencies and their version (including range). */\nexport async function getRemoteVersionsForSdkAsync({\n sdkVersion,\n skipCache,\n}: { sdkVersion?: string; skipCache?: boolean } = {}): Promise<DependencyList> {\n const { sdkVersions } = await getVersionsAsync({ skipCache });\n\n // We only want versioned dependencies so skip if they cannot be found.\n if (!sdkVersion || !(sdkVersion in sdkVersions)) {\n debug(\n `Skipping versioned dependencies because the SDK version is not found. (sdkVersion: ${sdkVersion}, available: ${Object.keys(\n sdkVersions\n ).join(', ')})`\n );\n return {};\n }\n\n const version = sdkVersions[sdkVersion as keyof typeof sdkVersions] as unknown as SDKVersion;\n\n return normalizeSdkVersionObject(version);\n}\n\n/**\n * Versions a list of `packages` against a given `sdkVersion` based on local and remote versioning resources.\n *\n * @param projectRoot\n * @param param1\n * @returns\n */\nexport async function getVersionedPackagesAsync(\n projectRoot: string,\n {\n packages,\n sdkVersion,\n pkg,\n }: {\n /** List of npm packages to process. */\n packages: string[];\n /** Target SDK Version number to version the `packages` for. */\n sdkVersion: string;\n pkg: PackageJSONConfig;\n }\n): Promise<{\n packages: string[];\n messages: string[];\n excludedNativeModules: { name: string; bundledNativeVersion: string }[];\n}> {\n const versionsForSdk = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion,\n skipCache: true,\n });\n\n let nativeModulesCount = 0;\n let othersCount = 0;\n const excludedNativeModules: { name: string; bundledNativeVersion: string }[] = [];\n\n const versionedPackages = packages.map((arg) => {\n const { name, type, raw } = npmPackageArg(arg);\n\n if (['tag', 'version', 'range'].includes(type) && name && versionsForSdk[name]) {\n // Unimodule packages from npm registry are modified to use the bundled version.\n // Some packages have the recommended version listed in https://exp.host/--/api/v2/versions.\n if (pkg?.expo?.install?.exclude?.includes(name)) {\n othersCount++;\n excludedNativeModules.push({ name, bundledNativeVersion: versionsForSdk[name] });\n return raw;\n }\n nativeModulesCount++;\n return `${name}@${versionsForSdk[name]}`;\n } else {\n // Other packages are passed through unmodified.\n othersCount++;\n return raw;\n }\n });\n\n const messages = getOperationLog({\n othersCount,\n nativeModulesCount,\n sdkVersion,\n });\n\n return {\n packages: versionedPackages,\n messages,\n excludedNativeModules,\n };\n}\n\n/** Craft a set of messages regarding the install operations. */\nexport function getOperationLog({\n nativeModulesCount,\n sdkVersion,\n othersCount,\n}: {\n nativeModulesCount: number;\n othersCount: number;\n sdkVersion: string;\n}): string[] {\n return [\n nativeModulesCount > 0 &&\n `${nativeModulesCount} SDK ${sdkVersion} compatible native ${\n nativeModulesCount === 1 ? 'module' : 'modules'\n }`,\n othersCount > 0 && `${othersCount} other ${othersCount === 1 ? 'package' : 'packages'}`,\n ].filter(Boolean) as string[];\n}\n"],"names":["getCombinedKnownVersionsAsync","getRemoteVersionsForSdkAsync","getVersionedPackagesAsync","getOperationLog","debug","require","normalizeSdkVersionObject","version","relatedPackages","facebookReactVersion","facebookReactNativeVersion","reactVersion","react","undefined","projectRoot","sdkVersion","skipCache","bundledNativeModules","getVersionedNativeModulesAsync","versionsForSdk","sdkVersions","getVersionsAsync","Object","keys","join","packages","pkg","nativeModulesCount","othersCount","excludedNativeModules","versionedPackages","map","arg","name","type","raw","npmPackageArg","includes","expo","install","exclude","push","bundledNativeVersion","messages","filter","Boolean"],"mappings":"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"}
|
|
@@ -64,6 +64,7 @@ function logIncorrectDependencies(incorrectDeps) {
|
|
|
64
64
|
return false;
|
|
65
65
|
}
|
|
66
66
|
async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck) {
|
|
67
|
+
var ref, ref1;
|
|
67
68
|
// This should never happen under normal circumstances since
|
|
68
69
|
// the CLI is versioned in the `expo` package.
|
|
69
70
|
(0, _assert).default(exp.sdkVersion, "SDK Version is missing");
|
|
@@ -89,8 +90,17 @@ async function getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCh
|
|
|
89
90
|
const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);
|
|
90
91
|
debug(`Package versions: %O`, packageVersions);
|
|
91
92
|
// find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges
|
|
92
|
-
|
|
93
|
+
let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);
|
|
93
94
|
debug(`Incorrect dependencies: %O`, incorrectDeps);
|
|
95
|
+
if (pkg == null ? void 0 : (ref = pkg.expo) == null ? void 0 : (ref1 = ref.install) == null ? void 0 : ref1.exclude) {
|
|
96
|
+
const packagesToExclude = pkg.expo.install.exclude;
|
|
97
|
+
const incorrectAndExcludedDeps = incorrectDeps.filter((dep)=>packagesToExclude.includes(dep.packageName)
|
|
98
|
+
);
|
|
99
|
+
debug(`Incorrect dependency warnings filtered out by expo.install.exclude: %O`, incorrectAndExcludedDeps.map((dep)=>dep.packageName
|
|
100
|
+
));
|
|
101
|
+
incorrectDeps = incorrectDeps.filter((dep)=>!packagesToExclude.includes(dep.packageName)
|
|
102
|
+
);
|
|
103
|
+
}
|
|
94
104
|
return incorrectDeps;
|
|
95
105
|
}
|
|
96
106
|
function getFilteredObject(keys, object) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (APISettings.isOffline) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Fix with: {bold npx expo install --fix}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n const incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce((acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n }, {} as Record<string, string>);\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","APISettings","isOffline","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","map","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects","packageType","findDependencyType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/validateDependenciesVersions.ts"],"sourcesContent":["import { ExpoConfig, PackageJSONConfig } from '@expo/config';\nimport JsonFile from '@expo/json-file';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport { APISettings } from '../../../api/settings';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { BundledNativeModules } from './bundledNativeModules';\nimport { getCombinedKnownVersionsAsync } from './getVersionedPackages';\n\nconst debug = require('debug')('expo:doctor:dependencies:validate') as typeof console.log;\n\ninterface IncorrectDependency {\n packageName: string;\n packageType: 'dependencies' | 'devDependencies';\n expectedVersionOrRange: string;\n actualVersion: string;\n}\n\n/**\n * Print a list of incorrect dependency versions.\n * This only checks dependencies when not running in offline mode.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns `true` if there are no incorrect dependencies.\n */\nexport async function validateDependenciesVersionsAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<boolean | null> {\n if (APISettings.isOffline) {\n Log.warn('Skipping dependency validation in offline mode');\n return null;\n }\n\n const incorrectDeps = await getVersionedDependenciesAsync(projectRoot, exp, pkg, packagesToCheck);\n return logIncorrectDependencies(incorrectDeps);\n}\n\nfunction logInvalidDependency({\n packageName,\n expectedVersionOrRange,\n actualVersion,\n}: IncorrectDependency) {\n Log.warn(\n // chalk` - {underline ${packageName}} - expected version: {underline ${expectedVersionOrRange}} - actual version installed: {underline ${actualVersion}}`\n chalk` {bold ${packageName}}{cyan @}{red ${actualVersion}} - expected version: {green ${expectedVersionOrRange}}`\n );\n}\n\nexport function logIncorrectDependencies(incorrectDeps: IncorrectDependency[]) {\n if (!incorrectDeps.length) {\n return true;\n }\n\n Log.warn(chalk`Some dependencies are incompatible with the installed {bold expo} version:`);\n incorrectDeps.forEach((dep) => logInvalidDependency(dep));\n\n Log.warn(\n 'Your project may not work correctly until you install the correct versions of the packages.\\n' +\n chalk`Fix with: {bold npx expo install --fix}`\n );\n return false;\n}\n\n/**\n * Return a list of versioned dependencies for the project SDK version.\n *\n * @param projectRoot Expo project root.\n * @param exp Expo project config.\n * @param pkg Project's `package.json`.\n * @param packagesToCheck A list of packages to check, if undefined or empty, all will be checked.\n * @returns A list of incorrect dependencies.\n */\nexport async function getVersionedDependenciesAsync(\n projectRoot: string,\n exp: Pick<ExpoConfig, 'sdkVersion'>,\n pkg: PackageJSONConfig,\n packagesToCheck?: string[]\n): Promise<IncorrectDependency[]> {\n // This should never happen under normal circumstances since\n // the CLI is versioned in the `expo` package.\n assert(exp.sdkVersion, 'SDK Version is missing');\n\n // Get from both endpoints and combine the known package versions.\n const combinedKnownPackages = await getCombinedKnownVersionsAsync({\n projectRoot,\n sdkVersion: exp.sdkVersion,\n });\n // debug(`Known dependencies: %O`, combinedKnownPackages);\n\n const resolvedDependencies = packagesToCheck?.length\n ? // Diff the provided packages to ensure we only check against installed packages.\n getFilteredObject(packagesToCheck, { ...pkg.dependencies, ...pkg.devDependencies })\n : // If no packages are provided, check against the `package.json` `dependencies` + `devDependencies` object.\n { ...pkg.dependencies, ...pkg.devDependencies };\n debug(`Checking dependencies for ${exp.sdkVersion}: %O`, resolvedDependencies);\n\n // intersection of packages from package.json and bundled native modules\n const { known: resolvedPackagesToCheck, unknown } = getPackagesToCheck(\n resolvedDependencies,\n combinedKnownPackages\n );\n debug(`Comparing known versions: %O`, resolvedPackagesToCheck);\n debug(`Skipping packages that cannot be versioned automatically: %O`, unknown);\n // read package versions from the file system (node_modules)\n const packageVersions = await resolvePackageVersionsAsync(projectRoot, resolvedPackagesToCheck);\n debug(`Package versions: %O`, packageVersions);\n // find incorrect dependencies by comparing the actual package versions with the bundled native module version ranges\n let incorrectDeps = findIncorrectDependencies(pkg, packageVersions, combinedKnownPackages);\n debug(`Incorrect dependencies: %O`, incorrectDeps);\n\n if (pkg?.expo?.install?.exclude) {\n const packagesToExclude = pkg.expo.install.exclude;\n const incorrectAndExcludedDeps = incorrectDeps.filter((dep) =>\n packagesToExclude.includes(dep.packageName)\n );\n debug(\n `Incorrect dependency warnings filtered out by expo.install.exclude: %O`,\n incorrectAndExcludedDeps.map((dep) => dep.packageName)\n );\n incorrectDeps = incorrectDeps.filter((dep) => !packagesToExclude.includes(dep.packageName));\n }\n\n return incorrectDeps;\n}\n\nfunction getFilteredObject(keys: string[], object: Record<string, string>) {\n return keys.reduce<Record<string, string>>((acc, key) => {\n acc[key] = object[key];\n return acc;\n }, {});\n}\n\nfunction getPackagesToCheck(\n dependencies: Record<string, string> | null | undefined,\n bundledNativeModules: BundledNativeModules\n): { known: string[]; unknown: string[] } {\n const dependencyNames = Object.keys(dependencies ?? {});\n const known: string[] = [];\n const unknown: string[] = [];\n for (const dependencyName of dependencyNames) {\n if (dependencyName in bundledNativeModules) {\n known.push(dependencyName);\n } else {\n unknown.push(dependencyName);\n }\n }\n return { known, unknown };\n}\n\nasync function resolvePackageVersionsAsync(\n projectRoot: string,\n packages: string[]\n): Promise<Record<string, string>> {\n const packageVersionsFromPackageJSON = await Promise.all(\n packages.map((packageName) => getPackageVersionAsync(projectRoot, packageName))\n );\n return packages.reduce((acc, packageName, idx) => {\n acc[packageName] = packageVersionsFromPackageJSON[idx];\n return acc;\n }, {} as Record<string, string>);\n}\n\nasync function getPackageVersionAsync(projectRoot: string, packageName: string): Promise<string> {\n let packageJsonPath: string | undefined;\n try {\n packageJsonPath = resolveFrom(projectRoot, `${packageName}/package.json`);\n } catch (error: any) {\n // This is a workaround for packages using `exports`. If this doesn't\n // include `package.json`, we have to use the error message to get the location.\n if (error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') {\n packageJsonPath = error.message.match(/(\"exports\"|defined) in (.*)$/i)?.[2];\n }\n }\n if (!packageJsonPath) {\n throw new CommandError(\n `\"${packageName}\" is added as a dependency in your project's package.json but it doesn't seem to be installed. Please run \"yarn\" or \"npm install\" to fix this issue.`\n );\n }\n const packageJson = await JsonFile.readAsync<BundledNativeModules>(packageJsonPath);\n return packageJson.version;\n}\n\nfunction findIncorrectDependencies(\n pkg: PackageJSONConfig,\n packageVersions: Record<string, string>,\n bundledNativeModules: BundledNativeModules\n): IncorrectDependency[] {\n const packages = Object.keys(packageVersions);\n const incorrectDeps: IncorrectDependency[] = [];\n for (const packageName of packages) {\n const expectedVersionOrRange = bundledNativeModules[packageName];\n const actualVersion = packageVersions[packageName];\n if (\n typeof expectedVersionOrRange === 'string' &&\n !semver.intersects(expectedVersionOrRange, actualVersion)\n ) {\n incorrectDeps.push({\n packageName,\n packageType: findDependencyType(pkg, packageName),\n expectedVersionOrRange,\n actualVersion,\n });\n }\n }\n return incorrectDeps;\n}\n\nfunction findDependencyType(\n pkg: PackageJSONConfig,\n packageName: string\n): IncorrectDependency['packageType'] {\n if (pkg.devDependencies && packageName in pkg.devDependencies) {\n return 'devDependencies';\n }\n\n return 'dependencies';\n}\n"],"names":["validateDependenciesVersionsAsync","logIncorrectDependencies","getVersionedDependenciesAsync","Log","debug","require","projectRoot","exp","pkg","packagesToCheck","APISettings","isOffline","warn","incorrectDeps","logInvalidDependency","packageName","expectedVersionOrRange","actualVersion","chalk","length","forEach","dep","assert","sdkVersion","combinedKnownPackages","getCombinedKnownVersionsAsync","resolvedDependencies","getFilteredObject","dependencies","devDependencies","known","resolvedPackagesToCheck","unknown","getPackagesToCheck","packageVersions","resolvePackageVersionsAsync","findIncorrectDependencies","expo","install","exclude","packagesToExclude","incorrectAndExcludedDeps","filter","includes","map","keys","object","reduce","acc","key","bundledNativeModules","dependencyNames","Object","dependencyName","push","packages","packageVersionsFromPackageJSON","Promise","all","getPackageVersionAsync","idx","packageJsonPath","resolveFrom","error","code","message","match","CommandError","packageJson","JsonFile","readAsync","version","semver","intersects","packageType","findDependencyType"],"mappings":"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"}
|
|
@@ -92,9 +92,9 @@ class ExternalModule {
|
|
|
92
92
|
const packageManager = shouldGloballyInstall ? new PackageManager.NpmPackageManager({
|
|
93
93
|
cwd: this.projectRoot,
|
|
94
94
|
log: Log.log,
|
|
95
|
-
silent: !_env.env.EXPO_DEBUG
|
|
95
|
+
silent: !(_env.env.EXPO_DEBUG || _env.env.CI)
|
|
96
96
|
}) : PackageManager.createForProject(this.projectRoot, {
|
|
97
|
-
silent: !_env.env.EXPO_DEBUG
|
|
97
|
+
silent: !(_env.env.EXPO_DEBUG || _env.env.CI)
|
|
98
98
|
});
|
|
99
99
|
try {
|
|
100
100
|
if (shouldGloballyInstall) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/ngrok/ExternalModule.ts"],"sourcesContent":["import * as PackageManager from '@expo/package-manager';\nimport requireGlobal from 'requireg';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { delayAsync } from '../../../utils/delay';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { confirmAsync } from '../../../utils/prompts';\n\nconst debug = require('debug')('expo:doctor:externalModule') as typeof console.log;\n\n/** An error that is thrown when a package is installed but doesn't meet the version criteria. */\nexport class ExternalModuleVersionError extends CommandError {\n constructor(message: string, public readonly shouldGloballyInstall: boolean) {\n super('EXTERNAL_MODULE_VERSION', message);\n }\n}\n\ninterface PromptOptions {\n /** Should prompt the user to install, when false the module will just assert on missing packages, default `true`. Ignored when `autoInstall` is true. */\n shouldPrompt?: boolean;\n /** Should automatically install the package without prompting, default `false` */\n autoInstall?: boolean;\n}\n\nexport interface InstallPromptOptions extends PromptOptions {\n /** Should install the package globally, default `false` */\n shouldGloballyInstall?: boolean;\n}\n\nexport interface ResolvePromptOptions extends PromptOptions {\n /**\n * Prefer to install the package globally, this can be overridden if the function\n * detects that a locally installed package simply needs an upgrade, default `false`\n */\n prefersGlobalInstall?: boolean;\n}\n\n/** Resolves a local or globally installed package, prompts to install if missing. */\nexport class ExternalModule<TModule> {\n private instance: TModule | null = null;\n\n constructor(\n /** Project root for checking if the package is installed locally. */\n private projectRoot: string,\n /** Info on the external package. */\n private pkg: {\n /** NPM package name. */\n name: string;\n /** Required semver range, ex: `^1.0.0`. */\n versionRange: string;\n },\n /** A function used to create the installation prompt message. */\n private promptMessage: (pkgName: string) => string\n ) {}\n\n /** Resolve the globally or locally installed instance, or prompt to install. */\n async resolveAsync({\n prefersGlobalInstall,\n ...options\n }: ResolvePromptOptions = {}): Promise<TModule> {\n try {\n return (\n this.getVersioned() ??\n this.installAsync({\n ...options,\n shouldGloballyInstall: prefersGlobalInstall,\n })\n );\n } catch (error: any) {\n if (error instanceof ExternalModuleVersionError) {\n // If the module version in not compliant with the version range,\n // we should prompt the user to install the package where it already exists.\n return this.installAsync({\n ...options,\n shouldGloballyInstall: error.shouldGloballyInstall ?? prefersGlobalInstall,\n });\n }\n throw error;\n }\n }\n\n /** Prompt the user to install the package and try again. */\n async installAsync({\n shouldPrompt = true,\n autoInstall,\n shouldGloballyInstall,\n }: InstallPromptOptions = {}): Promise<TModule> {\n const packageName = [this.pkg.name, this.pkg.versionRange].join('@');\n if (!autoInstall) {\n // Delay the prompt so it doesn't conflict with other dev tool logs\n await delayAsync(100);\n }\n const answer =\n autoInstall ||\n (shouldPrompt &&\n (await confirmAsync({\n message: this.promptMessage(packageName),\n initial: true,\n })));\n if (answer) {\n Log.log(`Installing ${packageName}...`);\n\n // Always use npm for global installs\n const packageManager = shouldGloballyInstall\n ? new PackageManager.NpmPackageManager({\n cwd: this.projectRoot,\n log: Log.log,\n silent: !env.EXPO_DEBUG,\n })\n : PackageManager.createForProject(this.projectRoot, {\n silent: !env.EXPO_DEBUG,\n });\n\n try {\n if (shouldGloballyInstall) {\n await packageManager.addGlobalAsync([packageName]);\n } else {\n await packageManager.addDevAsync([packageName]);\n }\n Log.log(`Installed ${packageName}`);\n } catch (error: any) {\n error.message = `Failed to install ${packageName} ${\n shouldGloballyInstall ? 'globally' : 'locally'\n }: ${error.message}`;\n throw error;\n }\n return await this.resolveAsync({ shouldPrompt: false });\n }\n\n throw new CommandError(\n 'EXTERNAL_MODULE_AVAILABILITY',\n `Please install ${packageName} and try again`\n );\n }\n\n /** Get the module. */\n get(): TModule | null {\n try {\n return this.getVersioned();\n } catch {\n return null;\n }\n }\n\n /** Get the module, throws if the module is not versioned correctly. */\n getVersioned(): TModule | null {\n this.instance ??= this._resolveModule(true) ?? this._resolveModule(false);\n return this.instance;\n }\n\n /** Exposed for testing. */\n _require(moduleId: string): any {\n return require(moduleId);\n }\n\n /** Resolve a copy that's installed in the project. Exposed for testing. */\n _resolveLocal(moduleId: string): string {\n return resolveFrom(this.projectRoot, moduleId);\n }\n\n /** Resolve a copy that's installed globally. Exposed for testing. */\n _resolveGlobal(moduleId: string): string {\n return requireGlobal.resolve(moduleId);\n }\n\n /** Resolve the module and verify the version. Exposed for testing. */\n _resolveModule(isLocal: boolean): TModule | null {\n const resolver = isLocal ? this._resolveLocal.bind(this) : this._resolveGlobal.bind(this);\n try {\n const packageJsonPath = resolver(`${this.pkg.name}/package.json`);\n const packageJson = this._require(packageJsonPath);\n if (packageJson) {\n if (semver.satisfies(packageJson.version, this.pkg.versionRange)) {\n const modulePath = resolver(this.pkg.name);\n const requiredModule = this._require(modulePath);\n if (requiredModule == null) {\n throw new CommandError(\n 'EXTERNAL_MODULE_EXPORT',\n `${this.pkg.name} exports a nullish value, which is not allowed.`\n );\n }\n return requiredModule;\n }\n throw new ExternalModuleVersionError(\n `Required module '${this.pkg.name}@${packageJson.version}' does not satisfy ${this.pkg.versionRange}. Installed at: ${packageJsonPath}`,\n !isLocal\n );\n }\n } catch (error: any) {\n if (error instanceof CommandError) {\n throw error;\n } else if (error.code !== 'MODULE_NOT_FOUND') {\n debug('Failed to resolve module', error.message);\n }\n }\n return null;\n }\n}\n"],"names":["PackageManager","Log","debug","require","ExternalModuleVersionError","CommandError","constructor","message","shouldGloballyInstall","ExternalModule","projectRoot","pkg","promptMessage","instance","resolveAsync","prefersGlobalInstall","options","getVersioned","installAsync","error","shouldPrompt","autoInstall","packageName","name","versionRange","join","delayAsync","answer","confirmAsync","initial","log","packageManager","NpmPackageManager","cwd","silent","env","EXPO_DEBUG","createForProject","addGlobalAsync","addDevAsync","get","_resolveModule","_require","moduleId","_resolveLocal","resolveFrom","_resolveGlobal","requireGlobal","resolve","isLocal","resolver","bind","packageJsonPath","packageJson","semver","satisfies","version","modulePath","requiredModule","code"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/ngrok/ExternalModule.ts"],"sourcesContent":["import * as PackageManager from '@expo/package-manager';\nimport requireGlobal from 'requireg';\nimport resolveFrom from 'resolve-from';\nimport semver from 'semver';\n\nimport * as Log from '../../../log';\nimport { delayAsync } from '../../../utils/delay';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { confirmAsync } from '../../../utils/prompts';\n\nconst debug = require('debug')('expo:doctor:externalModule') as typeof console.log;\n\n/** An error that is thrown when a package is installed but doesn't meet the version criteria. */\nexport class ExternalModuleVersionError extends CommandError {\n constructor(message: string, public readonly shouldGloballyInstall: boolean) {\n super('EXTERNAL_MODULE_VERSION', message);\n }\n}\n\ninterface PromptOptions {\n /** Should prompt the user to install, when false the module will just assert on missing packages, default `true`. Ignored when `autoInstall` is true. */\n shouldPrompt?: boolean;\n /** Should automatically install the package without prompting, default `false` */\n autoInstall?: boolean;\n}\n\nexport interface InstallPromptOptions extends PromptOptions {\n /** Should install the package globally, default `false` */\n shouldGloballyInstall?: boolean;\n}\n\nexport interface ResolvePromptOptions extends PromptOptions {\n /**\n * Prefer to install the package globally, this can be overridden if the function\n * detects that a locally installed package simply needs an upgrade, default `false`\n */\n prefersGlobalInstall?: boolean;\n}\n\n/** Resolves a local or globally installed package, prompts to install if missing. */\nexport class ExternalModule<TModule> {\n private instance: TModule | null = null;\n\n constructor(\n /** Project root for checking if the package is installed locally. */\n private projectRoot: string,\n /** Info on the external package. */\n private pkg: {\n /** NPM package name. */\n name: string;\n /** Required semver range, ex: `^1.0.0`. */\n versionRange: string;\n },\n /** A function used to create the installation prompt message. */\n private promptMessage: (pkgName: string) => string\n ) {}\n\n /** Resolve the globally or locally installed instance, or prompt to install. */\n async resolveAsync({\n prefersGlobalInstall,\n ...options\n }: ResolvePromptOptions = {}): Promise<TModule> {\n try {\n return (\n this.getVersioned() ??\n this.installAsync({\n ...options,\n shouldGloballyInstall: prefersGlobalInstall,\n })\n );\n } catch (error: any) {\n if (error instanceof ExternalModuleVersionError) {\n // If the module version in not compliant with the version range,\n // we should prompt the user to install the package where it already exists.\n return this.installAsync({\n ...options,\n shouldGloballyInstall: error.shouldGloballyInstall ?? prefersGlobalInstall,\n });\n }\n throw error;\n }\n }\n\n /** Prompt the user to install the package and try again. */\n async installAsync({\n shouldPrompt = true,\n autoInstall,\n shouldGloballyInstall,\n }: InstallPromptOptions = {}): Promise<TModule> {\n const packageName = [this.pkg.name, this.pkg.versionRange].join('@');\n if (!autoInstall) {\n // Delay the prompt so it doesn't conflict with other dev tool logs\n await delayAsync(100);\n }\n const answer =\n autoInstall ||\n (shouldPrompt &&\n (await confirmAsync({\n message: this.promptMessage(packageName),\n initial: true,\n })));\n if (answer) {\n Log.log(`Installing ${packageName}...`);\n\n // Always use npm for global installs\n const packageManager = shouldGloballyInstall\n ? new PackageManager.NpmPackageManager({\n cwd: this.projectRoot,\n log: Log.log,\n silent: !(env.EXPO_DEBUG || env.CI),\n })\n : PackageManager.createForProject(this.projectRoot, {\n silent: !(env.EXPO_DEBUG || env.CI),\n });\n\n try {\n if (shouldGloballyInstall) {\n await packageManager.addGlobalAsync([packageName]);\n } else {\n await packageManager.addDevAsync([packageName]);\n }\n Log.log(`Installed ${packageName}`);\n } catch (error: any) {\n error.message = `Failed to install ${packageName} ${\n shouldGloballyInstall ? 'globally' : 'locally'\n }: ${error.message}`;\n throw error;\n }\n return await this.resolveAsync({ shouldPrompt: false });\n }\n\n throw new CommandError(\n 'EXTERNAL_MODULE_AVAILABILITY',\n `Please install ${packageName} and try again`\n );\n }\n\n /** Get the module. */\n get(): TModule | null {\n try {\n return this.getVersioned();\n } catch {\n return null;\n }\n }\n\n /** Get the module, throws if the module is not versioned correctly. */\n getVersioned(): TModule | null {\n this.instance ??= this._resolveModule(true) ?? this._resolveModule(false);\n return this.instance;\n }\n\n /** Exposed for testing. */\n _require(moduleId: string): any {\n return require(moduleId);\n }\n\n /** Resolve a copy that's installed in the project. Exposed for testing. */\n _resolveLocal(moduleId: string): string {\n return resolveFrom(this.projectRoot, moduleId);\n }\n\n /** Resolve a copy that's installed globally. Exposed for testing. */\n _resolveGlobal(moduleId: string): string {\n return requireGlobal.resolve(moduleId);\n }\n\n /** Resolve the module and verify the version. Exposed for testing. */\n _resolveModule(isLocal: boolean): TModule | null {\n const resolver = isLocal ? this._resolveLocal.bind(this) : this._resolveGlobal.bind(this);\n try {\n const packageJsonPath = resolver(`${this.pkg.name}/package.json`);\n const packageJson = this._require(packageJsonPath);\n if (packageJson) {\n if (semver.satisfies(packageJson.version, this.pkg.versionRange)) {\n const modulePath = resolver(this.pkg.name);\n const requiredModule = this._require(modulePath);\n if (requiredModule == null) {\n throw new CommandError(\n 'EXTERNAL_MODULE_EXPORT',\n `${this.pkg.name} exports a nullish value, which is not allowed.`\n );\n }\n return requiredModule;\n }\n throw new ExternalModuleVersionError(\n `Required module '${this.pkg.name}@${packageJson.version}' does not satisfy ${this.pkg.versionRange}. Installed at: ${packageJsonPath}`,\n !isLocal\n );\n }\n } catch (error: any) {\n if (error instanceof CommandError) {\n throw error;\n } else if (error.code !== 'MODULE_NOT_FOUND') {\n debug('Failed to resolve module', error.message);\n }\n }\n return null;\n }\n}\n"],"names":["PackageManager","Log","debug","require","ExternalModuleVersionError","CommandError","constructor","message","shouldGloballyInstall","ExternalModule","projectRoot","pkg","promptMessage","instance","resolveAsync","prefersGlobalInstall","options","getVersioned","installAsync","error","shouldPrompt","autoInstall","packageName","name","versionRange","join","delayAsync","answer","confirmAsync","initial","log","packageManager","NpmPackageManager","cwd","silent","env","EXPO_DEBUG","CI","createForProject","addGlobalAsync","addDevAsync","get","_resolveModule","_require","moduleId","_resolveLocal","resolveFrom","_resolveGlobal","requireGlobal","resolve","isLocal","resolver","bind","packageJsonPath","packageJson","semver","satisfies","version","modulePath","requiredModule","code"],"mappings":"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"}
|
package/build/src/start/index.js
CHANGED
|
@@ -62,7 +62,9 @@ const expoStart = async (argv)=>{
|
|
|
62
62
|
"-a": "--android",
|
|
63
63
|
"-i": "--ios",
|
|
64
64
|
"-w": "--web",
|
|
65
|
-
"-m": "--host"
|
|
65
|
+
"-m": "--host",
|
|
66
|
+
// Alias for adding interop with the Metro docs and RedBox errors.
|
|
67
|
+
"--reset-cache": "--clear"
|
|
66
68
|
}, argv);
|
|
67
69
|
if (args["--help"]) {
|
|
68
70
|
(0, _args).printHelp(`Start a local dev server for the app`, _chalk.default`npx expo start {dim <dir>}`, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/start/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport chalk from 'chalk';\n\nimport { Command } from '../../bin/cli';\nimport { assertArgs, getProjectRoot, printHelp } from '../utils/args';\nimport { logCmdError } from '../utils/errors';\n\nexport const expoStart: Command = async (argv) => {\n const args = assertArgs(\n {\n // Types\n '--help': Boolean,\n '--clear': Boolean,\n '--max-workers': Number,\n '--no-dev': Boolean,\n '--minify': Boolean,\n '--https': Boolean,\n '--force-manifest-type': String,\n '--private-key-path': String,\n '--port': Number,\n '--dev-client': Boolean,\n '--scheme': String,\n '--android': Boolean,\n '--ios': Boolean,\n '--web': Boolean,\n '--host': String,\n '--tunnel': Boolean,\n '--lan': Boolean,\n '--localhost': Boolean,\n '--offline': Boolean,\n // Aliases\n '-h': '--help',\n '-c': '--clear',\n '-p': '--port',\n '-a': '--android',\n '-i': '--ios',\n '-w': '--web',\n '-m': '--host',\n },\n argv\n );\n\n if (args['--help']) {\n printHelp(\n `Start a local dev server for the app`,\n chalk`npx expo start {dim <dir>}`,\n [\n chalk`<dir> Directory of the Expo project. {dim Default: Current working directory}`,\n `-a, --android Opens your app in Expo Go on a connected Android device`,\n `-i, --ios Opens your app in Expo Go in a currently running iOS simulator on your computer`,\n `-w, --web Opens your app in a web browser`,\n ``,\n `-c, --clear Clear the bundler cache`,\n `--max-workers <num> Maximum number of tasks to allow Metro to spawn`,\n `--no-dev Bundle in production mode`,\n `--minify Minify JavaScript`,\n ``,\n chalk`-m, --host <mode> Dev server hosting type. {dim Default: lan}`,\n chalk` {bold lan}: Use the local network`,\n chalk` {bold tunnel}: Use any network by tunnel through ngrok`,\n chalk` {bold localhost}: Connect to the dev server over localhost`,\n `--tunnel Same as --host tunnel`,\n `--lan Same as --host lan`,\n `--localhost Same as --host localhost`,\n ``,\n `--offline Skip network requests and use anonymous manifest signatures`,\n `--https Start the dev server with https protocol`,\n `--scheme <scheme> Custom URI protocol to use when launching an app`,\n chalk`-p, --port <port> Port to start the dev server on (does not apply to web or tunnel). {dim Default: 19000}`,\n ``,\n chalk`--dev-client {yellow Experimental:} Starts the bundler for use with the expo-development-client`,\n `--force-manifest-type <manifest-type> Override auto detection of manifest type`,\n `--private-key-path <path> Path to private key for code signing. Default: \"private-key.pem\" in the same directory as the certificate specified by the expo-updates configuration in app.json.`,\n `-h, --help Usage info`,\n ].join('\\n')\n );\n }\n\n const projectRoot = getProjectRoot(args);\n const { resolveOptionsAsync } = await import('./resolveOptions');\n const options = await resolveOptionsAsync(projectRoot, args).catch(logCmdError);\n\n const { APISettings } = await import('../api/settings');\n APISettings.isOffline = options.offline;\n\n const { startAsync } = await import('./startAsync');\n return startAsync(projectRoot, options, { webOnly: false }).catch(logCmdError);\n};\n"],"names":["expoStart","argv","args","assertArgs","Boolean","Number","String","printHelp","chalk","join","projectRoot","getProjectRoot","resolveOptionsAsync","options","catch","logCmdError","APISettings","isOffline","offline","startAsync","webOnly"],"mappings":"AAAA;;;;;;AACkB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAG6B,IAAA,KAAe,WAAf,eAAe,CAAA;AACzC,IAAA,OAAiB,WAAjB,iBAAiB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEtC,MAAMA,SAAS,GAAY,OAAOC,IAAI,GAAK;IAChD,MAAMC,IAAI,GAAGC,CAAAA,GAAAA,KAAU,
|
|
1
|
+
{"version":3,"sources":["../../../src/start/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport chalk from 'chalk';\n\nimport { Command } from '../../bin/cli';\nimport { assertArgs, getProjectRoot, printHelp } from '../utils/args';\nimport { logCmdError } from '../utils/errors';\n\nexport const expoStart: Command = async (argv) => {\n const args = assertArgs(\n {\n // Types\n '--help': Boolean,\n '--clear': Boolean,\n '--max-workers': Number,\n '--no-dev': Boolean,\n '--minify': Boolean,\n '--https': Boolean,\n '--force-manifest-type': String,\n '--private-key-path': String,\n '--port': Number,\n '--dev-client': Boolean,\n '--scheme': String,\n '--android': Boolean,\n '--ios': Boolean,\n '--web': Boolean,\n '--host': String,\n '--tunnel': Boolean,\n '--lan': Boolean,\n '--localhost': Boolean,\n '--offline': Boolean,\n // Aliases\n '-h': '--help',\n '-c': '--clear',\n '-p': '--port',\n '-a': '--android',\n '-i': '--ios',\n '-w': '--web',\n '-m': '--host',\n // Alias for adding interop with the Metro docs and RedBox errors.\n '--reset-cache': '--clear',\n },\n argv\n );\n\n if (args['--help']) {\n printHelp(\n `Start a local dev server for the app`,\n chalk`npx expo start {dim <dir>}`,\n [\n chalk`<dir> Directory of the Expo project. {dim Default: Current working directory}`,\n `-a, --android Opens your app in Expo Go on a connected Android device`,\n `-i, --ios Opens your app in Expo Go in a currently running iOS simulator on your computer`,\n `-w, --web Opens your app in a web browser`,\n ``,\n `-c, --clear Clear the bundler cache`,\n `--max-workers <num> Maximum number of tasks to allow Metro to spawn`,\n `--no-dev Bundle in production mode`,\n `--minify Minify JavaScript`,\n ``,\n chalk`-m, --host <mode> Dev server hosting type. {dim Default: lan}`,\n chalk` {bold lan}: Use the local network`,\n chalk` {bold tunnel}: Use any network by tunnel through ngrok`,\n chalk` {bold localhost}: Connect to the dev server over localhost`,\n `--tunnel Same as --host tunnel`,\n `--lan Same as --host lan`,\n `--localhost Same as --host localhost`,\n ``,\n `--offline Skip network requests and use anonymous manifest signatures`,\n `--https Start the dev server with https protocol`,\n `--scheme <scheme> Custom URI protocol to use when launching an app`,\n chalk`-p, --port <port> Port to start the dev server on (does not apply to web or tunnel). {dim Default: 19000}`,\n ``,\n chalk`--dev-client {yellow Experimental:} Starts the bundler for use with the expo-development-client`,\n `--force-manifest-type <manifest-type> Override auto detection of manifest type`,\n `--private-key-path <path> Path to private key for code signing. Default: \"private-key.pem\" in the same directory as the certificate specified by the expo-updates configuration in app.json.`,\n `-h, --help Usage info`,\n ].join('\\n')\n );\n }\n\n const projectRoot = getProjectRoot(args);\n const { resolveOptionsAsync } = await import('./resolveOptions');\n const options = await resolveOptionsAsync(projectRoot, args).catch(logCmdError);\n\n const { APISettings } = await import('../api/settings');\n APISettings.isOffline = options.offline;\n\n const { startAsync } = await import('./startAsync');\n return startAsync(projectRoot, options, { webOnly: false }).catch(logCmdError);\n};\n"],"names":["expoStart","argv","args","assertArgs","Boolean","Number","String","printHelp","chalk","join","projectRoot","getProjectRoot","resolveOptionsAsync","options","catch","logCmdError","APISettings","isOffline","offline","startAsync","webOnly"],"mappings":"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"}
|
|
@@ -28,7 +28,8 @@ const debug = require("debug")("expo:start:server:node-renderer");
|
|
|
28
28
|
function wrapBundle(str) {
|
|
29
29
|
// Skip the metro runtime so debugging is a bit easier.
|
|
30
30
|
// Replace the __r() call with an export statement.
|
|
31
|
-
|
|
31
|
+
// Use gm to apply to the last require line. This is needed when the bundle has side-effects.
|
|
32
|
+
return str.replace(/^(__r\(.*\);)$/gm, "module.exports = $1");
|
|
32
33
|
}
|
|
33
34
|
function stripProcess(str) {
|
|
34
35
|
// TODO: Remove from the metro prelude
|