@expo/cli 55.0.4 → 55.0.5
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 +1 -1
- package/build/src/api/graphql/client.js +133 -68
- package/build/src/api/graphql/client.js.map +1 -1
- package/build/src/api/graphql/queries/AppQuery.js +21 -25
- package/build/src/api/graphql/queries/AppQuery.js.map +1 -1
- package/build/src/api/graphql/queries/UserQuery.js +45 -38
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
- package/build/src/api/rest/cache/FileSystemResponseCache.js.map +1 -1
- package/build/src/api/rest/cache/ResponseCache.js.map +1 -1
- package/build/src/api/rest/cache/wrapFetchWithCache.js +7 -7
- package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -1
- package/build/src/api/rest/client.js +3 -7
- package/build/src/api/rest/client.js.map +1 -1
- package/build/src/api/rest/wrapFetchWithProgress.js +1 -8
- package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
- package/build/src/api/user/user.js +6 -36
- package/build/src/api/user/user.js.map +1 -1
- package/build/src/prebuild/renameTemplateAppName.js +2 -6
- package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
- package/build/src/prebuild/resolveLocalTemplate.js +2 -4
- package/build/src/prebuild/resolveLocalTemplate.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +13 -17
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +4 -6
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/start/doctor/ngrok/ExternalModule.js +2 -8
- package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
- package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js +1 -9
- package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +9 -4
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js +2 -12
- package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
- package/build/src/start/server/metro/createServerRouteMiddleware.js +17 -0
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +1 -3
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +47 -34
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +27 -4
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +2 -59
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/utils/codesigning.js +3 -17
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/createFileTransform.js +3 -38
- package/build/src/utils/createFileTransform.js.map +1 -1
- package/build/src/utils/downloadAppAsync.js +1 -12
- package/build/src/utils/downloadAppAsync.js.map +1 -1
- package/build/src/utils/fetch.js +23 -4
- package/build/src/utils/fetch.js.map +1 -1
- package/build/src/utils/getOrPromptApplicationId.js +2 -15
- package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
- package/build/src/utils/npm.js +60 -65
- package/build/src/utils/npm.js.map +1 -1
- package/build/src/utils/resolveGlobal.js +195 -0
- package/build/src/utils/resolveGlobal.js.map +1 -0
- package/build/src/utils/tar.js +138 -69
- package/build/src/utils/tar.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +12 -24
- package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/package.json +18 -28
- package/build/src/api/graphql/types/App.js +0 -29
- package/build/src/api/graphql/types/App.js.map +0 -1
- package/build/src/api/rest/wrapFetchWithProxy.js +0 -31
- package/build/src/api/rest/wrapFetchWithProxy.js.map +0 -1
- package/build/src/graphql/generated.js +0 -1196
- package/build/src/graphql/generated.js.map +0 -1
- package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js +0 -85
- package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js.map +0 -1
- package/build/src/utils/multipartMixed.js +0 -56
- package/build/src/utils/multipartMixed.js.map +0 -1
package/build/src/utils/npm.js
CHANGED
|
@@ -34,6 +34,13 @@ _export(exports, {
|
|
|
34
34
|
return sanitizeNpmPackageName;
|
|
35
35
|
}
|
|
36
36
|
});
|
|
37
|
+
function _configplugins() {
|
|
38
|
+
const data = require("@expo/config-plugins");
|
|
39
|
+
_configplugins = function() {
|
|
40
|
+
return data;
|
|
41
|
+
};
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
37
44
|
function _spawnasync() {
|
|
38
45
|
const data = /*#__PURE__*/ _interop_require_default(require("@expo/spawn-async"));
|
|
39
46
|
_spawnasync = function() {
|
|
@@ -41,30 +48,30 @@ function _spawnasync() {
|
|
|
41
48
|
};
|
|
42
49
|
return data;
|
|
43
50
|
}
|
|
44
|
-
function
|
|
45
|
-
const data =
|
|
46
|
-
|
|
51
|
+
function _multitars() {
|
|
52
|
+
const data = require("multitars");
|
|
53
|
+
_multitars = function() {
|
|
47
54
|
return data;
|
|
48
55
|
};
|
|
49
56
|
return data;
|
|
50
57
|
}
|
|
51
|
-
function
|
|
52
|
-
const data = /*#__PURE__*/ _interop_require_default(require("
|
|
53
|
-
|
|
58
|
+
function _nodeassert() {
|
|
59
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:assert"));
|
|
60
|
+
_nodeassert = function() {
|
|
54
61
|
return data;
|
|
55
62
|
};
|
|
56
63
|
return data;
|
|
57
64
|
}
|
|
58
|
-
function
|
|
59
|
-
const data = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
60
|
-
|
|
65
|
+
function _nodefs() {
|
|
66
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:fs"));
|
|
67
|
+
_nodefs = function() {
|
|
61
68
|
return data;
|
|
62
69
|
};
|
|
63
70
|
return data;
|
|
64
71
|
}
|
|
65
|
-
function
|
|
66
|
-
const data = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
67
|
-
|
|
72
|
+
function _nodepath() {
|
|
73
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
74
|
+
_nodepath = function() {
|
|
68
75
|
return data;
|
|
69
76
|
};
|
|
70
77
|
return data;
|
|
@@ -83,33 +90,14 @@ function _stream() {
|
|
|
83
90
|
};
|
|
84
91
|
return data;
|
|
85
92
|
}
|
|
86
|
-
function _tar() {
|
|
87
|
-
const data = require("tar");
|
|
88
|
-
_tar = function() {
|
|
89
|
-
return data;
|
|
90
|
-
};
|
|
91
|
-
return data;
|
|
92
|
-
}
|
|
93
|
-
function _util() {
|
|
94
|
-
const data = require("util");
|
|
95
|
-
_util = function() {
|
|
96
|
-
return data;
|
|
97
|
-
};
|
|
98
|
-
return data;
|
|
99
|
-
}
|
|
100
|
-
const _createFileTransform = require("./createFileTransform");
|
|
101
|
-
const _dir = require("./dir");
|
|
102
93
|
const _errors = require("./errors");
|
|
103
|
-
const
|
|
94
|
+
const _tar = require("./tar");
|
|
104
95
|
function _interop_require_default(obj) {
|
|
105
96
|
return obj && obj.__esModule ? obj : {
|
|
106
97
|
default: obj
|
|
107
98
|
};
|
|
108
99
|
}
|
|
109
100
|
const debug = require('debug')('expo:utils:npm');
|
|
110
|
-
const cachedFetch = (0, _client.createCachedFetch)({
|
|
111
|
-
cacheDirectory: 'template-cache'
|
|
112
|
-
});
|
|
113
101
|
function sanitizeNpmPackageName(name) {
|
|
114
102
|
// https://github.com/npm/validate-npm-package-name/#naming-rules
|
|
115
103
|
return applyKnownNpmPackageNameRules(name) || applyKnownNpmPackageNameRules((0, _slugify().default)(name)) || // If nothing is left use 'app' like we do in Xcode projects.
|
|
@@ -147,7 +135,7 @@ async function npmViewAsync(...props) {
|
|
|
147
135
|
}
|
|
148
136
|
async function getNpmUrlAsync(packageName) {
|
|
149
137
|
const results = await npmViewAsync(packageName, 'dist');
|
|
150
|
-
(0,
|
|
138
|
+
(0, _nodeassert().default)(results, `Could not get npm url for package "${packageName}"`);
|
|
151
139
|
// Fully qualified url returns an object.
|
|
152
140
|
// Example:
|
|
153
141
|
// 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json
|
|
@@ -165,42 +153,49 @@ async function getNpmUrlAsync(packageName) {
|
|
|
165
153
|
}
|
|
166
154
|
throw new _errors.CommandError('Expected results of `npm view ...` to be an array or string. Instead found: ' + results);
|
|
167
155
|
}
|
|
168
|
-
|
|
169
|
-
const
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
156
|
+
function renameNpmTarballEntries(expName) {
|
|
157
|
+
const renameConfigs = (input, typeflag)=>{
|
|
158
|
+
if (typeflag === _multitars().TarTypeFlag.FILE && _nodepath().default.basename(input) === 'gitignore') {
|
|
159
|
+
// Rename `gitignore` because npm ignores files named `.gitignore` when publishing.
|
|
160
|
+
// See: https://github.com/npm/npm/issues/1862
|
|
161
|
+
return input.replace(/gitignore$/, '.gitignore');
|
|
162
|
+
} else {
|
|
163
|
+
return input;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
if (expName) {
|
|
167
|
+
const androidName = _configplugins().IOSConfig.XcodeUtils.sanitizedName(expName.toLowerCase());
|
|
168
|
+
const iosName = _configplugins().IOSConfig.XcodeUtils.sanitizedName(expName);
|
|
169
|
+
const lowerCaseName = iosName.toLowerCase();
|
|
170
|
+
return (input, typeflag)=>{
|
|
171
|
+
input = input.replace(/HelloWorld/g, input.includes('android') ? androidName : iosName).replace(/helloworld/g, lowerCaseName);
|
|
172
|
+
return renameConfigs(input, typeflag);
|
|
173
|
+
};
|
|
174
|
+
} else {
|
|
175
|
+
return renameConfigs;
|
|
176
|
+
}
|
|
174
177
|
}
|
|
175
|
-
async function
|
|
176
|
-
|
|
177
|
-
|
|
178
|
+
async function extractNpmTarballAsync(stream, output, props) {
|
|
179
|
+
return await (0, _tar.extractStream)(stream, output, {
|
|
180
|
+
filter: props.filter,
|
|
181
|
+
rename: renameNpmTarballEntries(props.expName),
|
|
182
|
+
strip: props.strip ?? 1
|
|
183
|
+
});
|
|
178
184
|
}
|
|
179
|
-
async function
|
|
180
|
-
const response = await
|
|
185
|
+
async function extractNpmTarballFromUrlAsync(url, output, props) {
|
|
186
|
+
const response = await fetch(url);
|
|
181
187
|
if (!response.ok || !response.body) {
|
|
182
188
|
throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);
|
|
183
189
|
}
|
|
184
|
-
return
|
|
185
|
-
}
|
|
186
|
-
async function
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
const transformStream = new (_stream()).PassThrough();
|
|
194
|
-
transformStream.on('data', (chunk)=>{
|
|
195
|
-
hash.update(chunk);
|
|
196
|
-
});
|
|
197
|
-
await pipeline(stream, transformStream, (0, _tar().extract)({
|
|
198
|
-
cwd,
|
|
199
|
-
filter,
|
|
200
|
-
onentry: (0, _createFileTransform.createEntryResolver)(name),
|
|
201
|
-
strip: strip ?? 1
|
|
202
|
-
}, fileList));
|
|
203
|
-
return hash.digest('hex');
|
|
190
|
+
return await extractNpmTarballAsync(response.body, output, props);
|
|
191
|
+
}
|
|
192
|
+
async function downloadAndExtractNpmModuleAsync(npmName, output, props) {
|
|
193
|
+
const url = await getNpmUrlAsync(npmName);
|
|
194
|
+
debug('Fetch from URL:', url);
|
|
195
|
+
return await extractNpmTarballFromUrlAsync(url, output, props);
|
|
196
|
+
}
|
|
197
|
+
async function extractLocalNpmTarballAsync(tarFilePath, output, props) {
|
|
198
|
+
return await extractNpmTarballAsync(_stream().Readable.toWeb(_nodefs().default.createReadStream(tarFilePath)), output, props);
|
|
204
199
|
}
|
|
205
200
|
async function packNpmTarballAsync(packageDir) {
|
|
206
201
|
var _stdout;
|
|
@@ -217,7 +212,7 @@ async function packNpmTarballAsync(packageDir) {
|
|
|
217
212
|
})).stdout) == null ? void 0 : _stdout.trim();
|
|
218
213
|
try {
|
|
219
214
|
const [json] = JSON.parse(results);
|
|
220
|
-
return
|
|
215
|
+
return _nodepath().default.resolve(packageDir, json.filename);
|
|
221
216
|
} catch (error) {
|
|
222
217
|
const cmdString = `npm ${cmdArgs.join(' ')}`;
|
|
223
218
|
throw new Error(`Could not parse JSON returned from "${cmdString}".\n\n${results}\n\nError: ${error.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/npm.ts"],"sourcesContent":["import { JSONValue } from '@expo/json-file';\nimport spawnAsync from '@expo/spawn-async';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport fs from 'fs';\nimport path from 'path';\nimport slugify from 'slugify';\nimport { PassThrough, Readable, Stream } from 'stream';\nimport { extract as tarExtract, TarOptionsWithAliases } from 'tar';\nimport { promisify } from 'util';\n\nimport { createEntryResolver } from './createFileTransform';\nimport { ensureDirectoryAsync } from './dir';\nimport { CommandError } from './errors';\nimport { createCachedFetch } from '../api/rest/client';\n\nconst debug = require('debug')('expo:utils:npm') as typeof console.log;\n\nconst cachedFetch = createCachedFetch({\n cacheDirectory: 'template-cache',\n // Time to live. How long (in ms) responses remain cached before being automatically ejected. If undefined, responses are never automatically ejected from the cache.\n // ttl: 1000,\n});\n\nexport function sanitizeNpmPackageName(name: string): string {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n return (\n applyKnownNpmPackageNameRules(name) ||\n applyKnownNpmPackageNameRules(slugify(name)) ||\n // If nothing is left use 'app' like we do in Xcode projects.\n 'app'\n );\n}\n\nfunction applyKnownNpmPackageNameRules(name: string): string | null {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n\n // package name cannot start with '.' or '_'.\n while (/^(\\.|_)/.test(name)) {\n name = name.substring(1);\n }\n\n name = name.toLowerCase().replace(/[^a-zA-Z._\\-/@]/g, '');\n\n return (\n name\n // .replace(/![a-z0-9-._~]+/g, '')\n // Remove special characters\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') || null\n );\n}\n\nexport async function npmViewAsync(...props: string[]): Promise<JSONValue> {\n const cmd = ['view', ...props, '--json'];\n const results = (await spawnAsync('npm', cmd)).stdout?.trim();\n const cmdString = `npm ${cmd.join(' ')}`;\n debug('Run:', cmdString);\n if (!results) {\n return null;\n }\n try {\n return JSON.parse(results);\n } catch (error: any) {\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n\n/** Given a package name like `expo` or `expo@beta`, return the registry URL if it exists. */\nexport async function getNpmUrlAsync(packageName: string): Promise<string> {\n const results = await npmViewAsync(packageName, 'dist');\n\n assert(results, `Could not get npm url for package \"${packageName}\"`);\n\n // Fully qualified url returns an object.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json\n if (typeof results === 'object' && !Array.isArray(results)) {\n return results.tarball as string;\n }\n\n // When the tag is arbitrary, the tarball is an array, return the last value as it's the most recent.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@33 dist --json\n if (Array.isArray(results)) {\n const lastResult = results[results.length - 1];\n\n if (lastResult && typeof lastResult === 'object' && !Array.isArray(lastResult)) {\n return lastResult.tarball as string;\n }\n }\n\n throw new CommandError(\n 'Expected results of `npm view ...` to be an array or string. Instead found: ' + results\n );\n}\n\n// @ts-ignore\nconst pipeline = promisify(Stream.pipeline);\n\nexport async function downloadAndExtractNpmModuleAsync(\n npmName: string,\n props: ExtractProps\n): Promise<string> {\n const url = await getNpmUrlAsync(npmName);\n\n debug('Fetch from URL:', url);\n return await extractNpmTarballFromUrlAsync(url, props);\n}\n\nexport async function extractLocalNpmTarballAsync(\n tarFilePath: string,\n props: ExtractProps\n): Promise<string> {\n const readStream = fs.createReadStream(tarFilePath);\n return await extractNpmTarballAsync(readStream, props);\n}\n\nexport type ExtractProps = {\n name: string;\n cwd: string;\n strip?: number;\n fileList?: string[];\n /** The checksum algorithm to use when verifying the tarball. */\n checksumAlgorithm?: string;\n /** An optional filter to selectively extract specific paths */\n filter?: TarOptionsWithAliases['filter'];\n};\n\nasync function createUrlStreamAsync(url: string) {\n const response = await cachedFetch(url);\n if (!response.ok || !response.body) {\n throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);\n }\n\n return Readable.fromWeb(response.body);\n}\n\nexport async function extractNpmTarballFromUrlAsync(\n url: string,\n props: ExtractProps\n): Promise<string> {\n return await extractNpmTarballAsync(await createUrlStreamAsync(url), props);\n}\n\n/**\n * Extracts a tarball stream to a directory and returns the checksum of the tarball.\n */\nexport async function extractNpmTarballAsync(\n stream: NodeJS.ReadableStream,\n props: ExtractProps\n): Promise<string> {\n const { cwd, strip, name, fileList = [], filter } = props;\n\n await ensureDirectoryAsync(cwd);\n\n const hash = crypto.createHash(props.checksumAlgorithm ?? 'md5');\n const transformStream = new PassThrough();\n transformStream.on('data', (chunk) => {\n hash.update(chunk);\n });\n\n await pipeline(\n stream,\n transformStream,\n tarExtract(\n {\n cwd,\n filter,\n onentry: createEntryResolver(name),\n strip: strip ?? 1,\n },\n fileList\n )\n );\n\n return hash.digest('hex');\n}\n\nexport async function packNpmTarballAsync(packageDir: string): Promise<string> {\n const cmdArgs = ['pack', '--json', '--foreground-scripts=false'];\n const results = (\n await spawnAsync('npm', cmdArgs, {\n env: { ...process.env },\n cwd: packageDir,\n })\n ).stdout?.trim();\n try {\n const [json] = JSON.parse(results) as { filename: string }[];\n return path.resolve(packageDir, json.filename);\n } catch (error: any) {\n const cmdString = `npm ${cmdArgs.join(' ')}`;\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n"],"names":["downloadAndExtractNpmModuleAsync","extractLocalNpmTarballAsync","extractNpmTarballAsync","extractNpmTarballFromUrlAsync","getNpmUrlAsync","npmViewAsync","packNpmTarballAsync","sanitizeNpmPackageName","debug","require","cachedFetch","createCachedFetch","cacheDirectory","name","applyKnownNpmPackageNameRules","slugify","test","substring","toLowerCase","replace","normalize","props","cmd","results","spawnAsync","stdout","trim","cmdString","join","JSON","parse","error","Error","message","packageName","assert","Array","isArray","tarball","lastResult","length","CommandError","pipeline","promisify","Stream","npmName","url","tarFilePath","readStream","fs","createReadStream","createUrlStreamAsync","response","ok","body","statusText","Readable","fromWeb","stream","cwd","strip","fileList","filter","ensureDirectoryAsync","hash","crypto","createHash","checksumAlgorithm","transformStream","PassThrough","on","chunk","update","tarExtract","onentry","createEntryResolver","digest","packageDir","cmdArgs","env","process","json","path","resolve","filename"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/npm.ts"],"sourcesContent":["import { IOSConfig } from '@expo/config-plugins';\nimport { JSONValue } from '@expo/json-file';\nimport spawnAsync from '@expo/spawn-async';\nimport { TarTypeFlag } from 'multitars';\nimport assert from 'node:assert';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport slugify from 'slugify';\nimport { Readable } from 'stream';\n\nimport { CommandError } from './errors';\nimport { extractStream } from './tar';\n\nconst debug = require('debug')('expo:utils:npm') as typeof console.log;\n\nexport function sanitizeNpmPackageName(name: string): string {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n return (\n applyKnownNpmPackageNameRules(name) ||\n applyKnownNpmPackageNameRules(slugify(name)) ||\n // If nothing is left use 'app' like we do in Xcode projects.\n 'app'\n );\n}\n\nfunction applyKnownNpmPackageNameRules(name: string): string | null {\n // https://github.com/npm/validate-npm-package-name/#naming-rules\n\n // package name cannot start with '.' or '_'.\n while (/^(\\.|_)/.test(name)) {\n name = name.substring(1);\n }\n\n name = name.toLowerCase().replace(/[^a-zA-Z._\\-/@]/g, '');\n\n return (\n name\n // .replace(/![a-z0-9-._~]+/g, '')\n // Remove special characters\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '') || null\n );\n}\n\nexport async function npmViewAsync(...props: string[]): Promise<JSONValue> {\n const cmd = ['view', ...props, '--json'];\n const results = (await spawnAsync('npm', cmd)).stdout?.trim();\n const cmdString = `npm ${cmd.join(' ')}`;\n debug('Run:', cmdString);\n if (!results) {\n return null;\n }\n try {\n return JSON.parse(results);\n } catch (error: any) {\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n\n/** Given a package name like `expo` or `expo@beta`, return the registry URL if it exists. */\nexport async function getNpmUrlAsync(packageName: string): Promise<string> {\n const results = await npmViewAsync(packageName, 'dist');\n\n assert(results, `Could not get npm url for package \"${packageName}\"`);\n\n // Fully qualified url returns an object.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@sdk-33 dist --json\n if (typeof results === 'object' && !Array.isArray(results)) {\n return results.tarball as string;\n }\n\n // When the tag is arbitrary, the tarball is an array, return the last value as it's the most recent.\n // Example:\n // 𝝠 npm view expo-template-bare-minimum@33 dist --json\n if (Array.isArray(results)) {\n const lastResult = results[results.length - 1];\n\n if (lastResult && typeof lastResult === 'object' && !Array.isArray(lastResult)) {\n return lastResult.tarball as string;\n }\n }\n\n throw new CommandError(\n 'Expected results of `npm view ...` to be an array or string. Instead found: ' + results\n );\n}\n\nexport interface ExtractProps {\n expName?: string;\n filter?(path: string): boolean | undefined | null;\n strip?: number;\n}\n\nfunction renameNpmTarballEntries(expName: string | undefined) {\n const renameConfigs = (input: string, typeflag: TarTypeFlag): string | null => {\n if (typeflag === TarTypeFlag.FILE && path.basename(input) === 'gitignore') {\n // Rename `gitignore` because npm ignores files named `.gitignore` when publishing.\n // See: https://github.com/npm/npm/issues/1862\n return input.replace(/gitignore$/, '.gitignore');\n } else {\n return input;\n }\n };\n if (expName) {\n const androidName = IOSConfig.XcodeUtils.sanitizedName(expName.toLowerCase());\n const iosName = IOSConfig.XcodeUtils.sanitizedName(expName);\n const lowerCaseName = iosName.toLowerCase();\n return (input: string, typeflag: TarTypeFlag) => {\n input = input\n .replace(/HelloWorld/g, input.includes('android') ? androidName : iosName)\n .replace(/helloworld/g, lowerCaseName);\n return renameConfigs(input, typeflag);\n };\n } else {\n return renameConfigs;\n }\n}\n\n/**\n * Extracts a tarball stream to a directory and returns the checksum of the tarball.\n */\nexport async function extractNpmTarballAsync(\n stream: ReadableStream,\n output: string,\n props: ExtractProps\n): Promise<string> {\n return await extractStream(stream, output, {\n filter: props.filter,\n rename: renameNpmTarballEntries(props.expName),\n strip: props.strip ?? 1,\n });\n}\n\nexport async function extractNpmTarballFromUrlAsync(\n url: string,\n output: string,\n props: ExtractProps\n): Promise<string> {\n const response = await fetch(url);\n if (!response.ok || !response.body) {\n throw new Error(`Unexpected response: ${response.statusText}. From url: ${url}`);\n }\n return await extractNpmTarballAsync(response.body, output, props);\n}\n\nexport async function downloadAndExtractNpmModuleAsync(\n npmName: string,\n output: string,\n props: ExtractProps\n): Promise<string> {\n const url = await getNpmUrlAsync(npmName);\n debug('Fetch from URL:', url);\n return await extractNpmTarballFromUrlAsync(url, output, props);\n}\n\nexport async function extractLocalNpmTarballAsync(\n tarFilePath: string,\n output: string,\n props: ExtractProps\n): Promise<string> {\n return await extractNpmTarballAsync(\n Readable.toWeb(fs.createReadStream(tarFilePath)) as ReadableStream,\n output,\n props\n );\n}\n\nexport async function packNpmTarballAsync(packageDir: string): Promise<string> {\n const cmdArgs = ['pack', '--json', '--foreground-scripts=false'];\n const results = (\n await spawnAsync('npm', cmdArgs, {\n env: { ...process.env },\n cwd: packageDir,\n })\n ).stdout?.trim();\n try {\n const [json] = JSON.parse(results) as { filename: string }[];\n return path.resolve(packageDir, json.filename);\n } catch (error: any) {\n const cmdString = `npm ${cmdArgs.join(' ')}`;\n throw new Error(\n `Could not parse JSON returned from \"${cmdString}\".\\n\\n${results}\\n\\nError: ${error.message}`\n );\n }\n}\n"],"names":["downloadAndExtractNpmModuleAsync","extractLocalNpmTarballAsync","extractNpmTarballAsync","extractNpmTarballFromUrlAsync","getNpmUrlAsync","npmViewAsync","packNpmTarballAsync","sanitizeNpmPackageName","debug","require","name","applyKnownNpmPackageNameRules","slugify","test","substring","toLowerCase","replace","normalize","props","cmd","results","spawnAsync","stdout","trim","cmdString","join","JSON","parse","error","Error","message","packageName","assert","Array","isArray","tarball","lastResult","length","CommandError","renameNpmTarballEntries","expName","renameConfigs","input","typeflag","TarTypeFlag","FILE","path","basename","androidName","IOSConfig","XcodeUtils","sanitizedName","iosName","lowerCaseName","includes","stream","output","extractStream","filter","rename","strip","url","response","fetch","ok","body","statusText","npmName","tarFilePath","Readable","toWeb","fs","createReadStream","packageDir","cmdArgs","env","process","cwd","json","resolve","filename"],"mappings":"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"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// NOTE: This file is replicated to multiple packages! Keep these files in-sync:
|
|
2
|
+
// - packages/@expo/cli/src/utils/resolveGlobal.ts
|
|
3
|
+
// - packages/@expo/image-utils/src/resolveGlobal.ts
|
|
4
|
+
"use strict";
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
Object.defineProperty(exports, "resolveGlobal", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function() {
|
|
11
|
+
return resolveGlobal;
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
function _child_process() {
|
|
15
|
+
const data = require("child_process");
|
|
16
|
+
_child_process = function() {
|
|
17
|
+
return data;
|
|
18
|
+
};
|
|
19
|
+
return data;
|
|
20
|
+
}
|
|
21
|
+
function _fs() {
|
|
22
|
+
const data = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
23
|
+
_fs = function() {
|
|
24
|
+
return data;
|
|
25
|
+
};
|
|
26
|
+
return data;
|
|
27
|
+
}
|
|
28
|
+
function _module() {
|
|
29
|
+
const data = /*#__PURE__*/ _interop_require_default(require("module"));
|
|
30
|
+
_module = function() {
|
|
31
|
+
return data;
|
|
32
|
+
};
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
function _os() {
|
|
36
|
+
const data = /*#__PURE__*/ _interop_require_default(require("os"));
|
|
37
|
+
_os = function() {
|
|
38
|
+
return data;
|
|
39
|
+
};
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
function _path() {
|
|
43
|
+
const data = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
44
|
+
_path = function() {
|
|
45
|
+
return data;
|
|
46
|
+
};
|
|
47
|
+
return data;
|
|
48
|
+
}
|
|
49
|
+
function _interop_require_default(obj) {
|
|
50
|
+
return obj && obj.__esModule ? obj : {
|
|
51
|
+
default: obj
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const memoize = (fn)=>{
|
|
55
|
+
let result;
|
|
56
|
+
return (...args)=>{
|
|
57
|
+
if (result === undefined) {
|
|
58
|
+
result = {
|
|
59
|
+
value: fn(...args)
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return result.value;
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
const isWindows = process.platform === 'win32';
|
|
66
|
+
const getDelimitedPaths = (delimited)=>delimited.split(_path().default.delimiter).map((target)=>{
|
|
67
|
+
try {
|
|
68
|
+
const normalized = _path().default.normalize(target.trim());
|
|
69
|
+
if (!normalized) {
|
|
70
|
+
return null;
|
|
71
|
+
} else if (!_path().default.isAbsolute(normalized)) {
|
|
72
|
+
return _path().default.resolve(process.cwd(), normalized);
|
|
73
|
+
} else {
|
|
74
|
+
return normalized;
|
|
75
|
+
}
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}).filter((target)=>!!target);
|
|
80
|
+
const execGetPaths = (cmd, args)=>{
|
|
81
|
+
const result = (0, _child_process().spawnSync)(cmd, args, {
|
|
82
|
+
encoding: 'utf8'
|
|
83
|
+
});
|
|
84
|
+
if (!result.error && result.status === 0 && result.stdout) {
|
|
85
|
+
const paths = getDelimitedPaths(result.stdout.replace(/[\r\n]+/g, _path().default.delimiter));
|
|
86
|
+
return paths.filter((target)=>_fs().default.existsSync(target));
|
|
87
|
+
}
|
|
88
|
+
return [];
|
|
89
|
+
};
|
|
90
|
+
const getNativeNodePaths = ()=>{
|
|
91
|
+
if (Array.isArray(_module().default.globalPaths)) {
|
|
92
|
+
return _module().default.globalPaths;
|
|
93
|
+
} else {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const getHomePath = memoize(()=>{
|
|
98
|
+
try {
|
|
99
|
+
return _os().default.homedir();
|
|
100
|
+
} catch {
|
|
101
|
+
return isWindows ? process.env.UserProfile ?? process.env.USERPROFILE : process.env.HOME;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
const getNpmDefaultPaths = ()=>{
|
|
105
|
+
const prefix = [];
|
|
106
|
+
const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;
|
|
107
|
+
if (isWindows && localAppData) {
|
|
108
|
+
prefix.push(_path().default.resolve(localAppData, 'npm'));
|
|
109
|
+
} else if (!isWindows) {
|
|
110
|
+
prefix.push('/usr/local/lib/node_modules');
|
|
111
|
+
}
|
|
112
|
+
return prefix.filter((target)=>_fs().default.existsSync(target));
|
|
113
|
+
};
|
|
114
|
+
const getNpmPrefixPaths = memoize(()=>{
|
|
115
|
+
const npmPrefix = execGetPaths(isWindows ? 'npm.cmd' : 'npm', [
|
|
116
|
+
'config',
|
|
117
|
+
'-g',
|
|
118
|
+
'get',
|
|
119
|
+
'prefix'
|
|
120
|
+
]);
|
|
121
|
+
return npmPrefix.map((prefix)=>_path().default.resolve(prefix, 'lib'));
|
|
122
|
+
});
|
|
123
|
+
const getYarnDefaultPaths = ()=>{
|
|
124
|
+
const prefix = [];
|
|
125
|
+
const homePath = getHomePath();
|
|
126
|
+
const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;
|
|
127
|
+
const dataHomePath = process.env.XDG_DATA_HOME || homePath && _path().default.join(homePath, '.local', 'share');
|
|
128
|
+
if (isWindows && localAppData) {
|
|
129
|
+
prefix.push(_path().default.resolve(localAppData, 'Yarn', 'global'));
|
|
130
|
+
}
|
|
131
|
+
if (dataHomePath) {
|
|
132
|
+
prefix.push(_path().default.resolve(dataHomePath, 'yarn', 'global'));
|
|
133
|
+
}
|
|
134
|
+
if (homePath) {
|
|
135
|
+
prefix.push(_path().default.resolve(homePath, '.yarn', 'global'));
|
|
136
|
+
}
|
|
137
|
+
return prefix.filter((target)=>_fs().default.existsSync(target));
|
|
138
|
+
};
|
|
139
|
+
const getYarnPrefixPaths = memoize(()=>{
|
|
140
|
+
return execGetPaths(isWindows ? 'yarn.cmd' : 'yarn', [
|
|
141
|
+
'global',
|
|
142
|
+
'dir'
|
|
143
|
+
]);
|
|
144
|
+
});
|
|
145
|
+
const getPnpmPrefixPaths = memoize(()=>{
|
|
146
|
+
return execGetPaths(isWindows ? 'pnpm.cmd' : 'pnpm', [
|
|
147
|
+
'root',
|
|
148
|
+
'-g'
|
|
149
|
+
]);
|
|
150
|
+
});
|
|
151
|
+
const getBunPrefixPaths = memoize(()=>{
|
|
152
|
+
const prefix = [];
|
|
153
|
+
const bunPath = execGetPaths(isWindows ? 'bun.cmd' : 'bun', [
|
|
154
|
+
'pm',
|
|
155
|
+
'bin',
|
|
156
|
+
'-g'
|
|
157
|
+
])[0];
|
|
158
|
+
if (!bunPath) {
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
prefix.push(_path().default.resolve(bunPath, 'global'));
|
|
162
|
+
const moduleEntry = _fs().default.readdirSync(bunPath, {
|
|
163
|
+
withFileTypes: true
|
|
164
|
+
}).find((entry)=>{
|
|
165
|
+
return entry.isSymbolicLink() && entry.name !== 'global';
|
|
166
|
+
});
|
|
167
|
+
if (moduleEntry) {
|
|
168
|
+
try {
|
|
169
|
+
const moduleTarget = _fs().default.realpathSync(_path().default.resolve(bunPath, moduleEntry.name));
|
|
170
|
+
const splitIdx = moduleTarget.indexOf(_path().default.sep + 'node_modules' + _path().default.sep);
|
|
171
|
+
if (splitIdx > -1) {
|
|
172
|
+
const modulePath = moduleTarget.slice(0, splitIdx);
|
|
173
|
+
prefix.push(modulePath);
|
|
174
|
+
}
|
|
175
|
+
} catch {}
|
|
176
|
+
}
|
|
177
|
+
return prefix.filter((target)=>_fs().default.existsSync(target));
|
|
178
|
+
});
|
|
179
|
+
const getPaths = ()=>[
|
|
180
|
+
...getNpmDefaultPaths(),
|
|
181
|
+
...getNpmPrefixPaths(),
|
|
182
|
+
...getYarnDefaultPaths(),
|
|
183
|
+
...getYarnPrefixPaths(),
|
|
184
|
+
...getPnpmPrefixPaths(),
|
|
185
|
+
...getBunPrefixPaths(),
|
|
186
|
+
...getNativeNodePaths(),
|
|
187
|
+
process.cwd()
|
|
188
|
+
];
|
|
189
|
+
const resolveGlobal = (id)=>{
|
|
190
|
+
return require.resolve(id, {
|
|
191
|
+
paths: getPaths()
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
//# sourceMappingURL=resolveGlobal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/resolveGlobal.ts"],"sourcesContent":["// NOTE: This file is replicated to multiple packages! Keep these files in-sync:\n// - packages/@expo/cli/src/utils/resolveGlobal.ts\n// - packages/@expo/image-utils/src/resolveGlobal.ts\n\nimport { spawnSync } from 'child_process';\nimport fs from 'fs';\nimport Module from 'module';\nimport os from 'os';\nimport path from 'path';\n\ndeclare module 'module' {\n namespace Module {\n const globalPaths: readonly string[] | void;\n }\n}\n\nconst memoize = <Args extends any[], T>(fn: (...args: Args) => T): ((...args: Args) => T) => {\n let result: { value: T } | undefined;\n return (...args: Args): T => {\n if (result === undefined) {\n result = { value: fn(...args) };\n }\n return result.value;\n };\n};\n\nconst isWindows = process.platform === 'win32';\n\nconst getDelimitedPaths = (delimited: string): string[] =>\n delimited\n .split(path.delimiter)\n .map((target) => {\n try {\n const normalized = path.normalize(target.trim());\n if (!normalized) {\n return null;\n } else if (!path.isAbsolute(normalized)) {\n return path.resolve(process.cwd(), normalized);\n } else {\n return normalized;\n }\n } catch {\n return null;\n }\n })\n .filter((target): target is string => !!target);\n\nconst execGetPaths = (cmd: string, args: string[]): string[] => {\n const result = spawnSync(cmd, args, { encoding: 'utf8' });\n if (!result.error && result.status === 0 && result.stdout) {\n const paths = getDelimitedPaths(result.stdout.replace(/[\\r\\n]+/g, path.delimiter));\n return paths.filter((target) => fs.existsSync(target));\n }\n return [];\n};\n\nconst getNativeNodePaths = () => {\n if (Array.isArray(Module.globalPaths)) {\n return Module.globalPaths;\n } else {\n return [];\n }\n};\n\nconst getHomePath = memoize(() => {\n try {\n return os.homedir();\n } catch {\n return isWindows ? (process.env.UserProfile ?? process.env.USERPROFILE) : process.env.HOME;\n }\n});\n\nconst getNpmDefaultPaths = () => {\n const prefix = [];\n const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;\n if (isWindows && localAppData) {\n prefix.push(path.resolve(localAppData, 'npm'));\n } else if (!isWindows) {\n prefix.push('/usr/local/lib/node_modules');\n }\n return prefix.filter((target) => fs.existsSync(target));\n};\n\nconst getNpmPrefixPaths = memoize(() => {\n const npmPrefix = execGetPaths(isWindows ? 'npm.cmd' : 'npm', ['config', '-g', 'get', 'prefix']);\n return npmPrefix.map((prefix) => path.resolve(prefix, 'lib'));\n});\n\nconst getYarnDefaultPaths = () => {\n const prefix = [];\n const homePath = getHomePath();\n const localAppData = process.env.LocalAppData || process.env.LOCALAPPDATA;\n const dataHomePath =\n process.env.XDG_DATA_HOME || (homePath && path.join(homePath, '.local', 'share'));\n if (isWindows && localAppData) {\n prefix.push(path.resolve(localAppData, 'Yarn', 'global'));\n }\n if (dataHomePath) {\n prefix.push(path.resolve(dataHomePath, 'yarn', 'global'));\n }\n if (homePath) {\n prefix.push(path.resolve(homePath, '.yarn', 'global'));\n }\n return prefix.filter((target) => fs.existsSync(target));\n};\n\nconst getYarnPrefixPaths = memoize(() => {\n return execGetPaths(isWindows ? 'yarn.cmd' : 'yarn', ['global', 'dir']);\n});\n\nconst getPnpmPrefixPaths = memoize(() => {\n return execGetPaths(isWindows ? 'pnpm.cmd' : 'pnpm', ['root', '-g']);\n});\n\nconst getBunPrefixPaths = memoize(() => {\n const prefix = [];\n const bunPath = execGetPaths(isWindows ? 'bun.cmd' : 'bun', ['pm', 'bin', '-g'])[0];\n if (!bunPath) {\n return [];\n }\n prefix.push(path.resolve(bunPath, 'global'));\n const moduleEntry = fs.readdirSync(bunPath, { withFileTypes: true }).find((entry) => {\n return entry.isSymbolicLink() && entry.name !== 'global';\n });\n if (moduleEntry) {\n try {\n const moduleTarget = fs.realpathSync(path.resolve(bunPath, moduleEntry.name));\n const splitIdx = moduleTarget.indexOf(path.sep + 'node_modules' + path.sep);\n if (splitIdx > -1) {\n const modulePath = moduleTarget.slice(0, splitIdx);\n prefix.push(modulePath);\n }\n } catch {}\n }\n return prefix.filter((target) => fs.existsSync(target));\n});\n\nconst getPaths = () => [\n ...getNpmDefaultPaths(),\n ...getNpmPrefixPaths(),\n ...getYarnDefaultPaths(),\n ...getYarnPrefixPaths(),\n ...getPnpmPrefixPaths(),\n ...getBunPrefixPaths(),\n ...getNativeNodePaths(),\n process.cwd(),\n];\n\n/** Resolve a globally installed module before a locally installed one */\nexport const resolveGlobal = (id: string): string => {\n return require.resolve(id, { paths: getPaths() });\n};\n"],"names":["resolveGlobal","memoize","fn","result","args","undefined","value","isWindows","process","platform","getDelimitedPaths","delimited","split","path","delimiter","map","target","normalized","normalize","trim","isAbsolute","resolve","cwd","filter","execGetPaths","cmd","spawnSync","encoding","error","status","stdout","paths","replace","fs","existsSync","getNativeNodePaths","Array","isArray","Module","globalPaths","getHomePath","os","homedir","env","UserProfile","USERPROFILE","HOME","getNpmDefaultPaths","prefix","localAppData","LocalAppData","LOCALAPPDATA","push","getNpmPrefixPaths","npmPrefix","getYarnDefaultPaths","homePath","dataHomePath","XDG_DATA_HOME","join","getYarnPrefixPaths","getPnpmPrefixPaths","getBunPrefixPaths","bunPath","moduleEntry","readdirSync","withFileTypes","find","entry","isSymbolicLink","name","moduleTarget","realpathSync","splitIdx","indexOf","sep","modulePath","slice","getPaths","id","require"],"mappings":"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"}
|