@expo/cli 55.0.4 → 55.0.6

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.
Files changed (77) hide show
  1. package/build/bin/cli +1 -1
  2. package/build/src/api/graphql/client.js +133 -68
  3. package/build/src/api/graphql/client.js.map +1 -1
  4. package/build/src/api/graphql/queries/AppQuery.js +21 -25
  5. package/build/src/api/graphql/queries/AppQuery.js.map +1 -1
  6. package/build/src/api/graphql/queries/UserQuery.js +45 -38
  7. package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
  8. package/build/src/api/rest/cache/FileSystemResponseCache.js.map +1 -1
  9. package/build/src/api/rest/cache/ResponseCache.js.map +1 -1
  10. package/build/src/api/rest/cache/wrapFetchWithCache.js +7 -7
  11. package/build/src/api/rest/cache/wrapFetchWithCache.js.map +1 -1
  12. package/build/src/api/rest/client.js +3 -7
  13. package/build/src/api/rest/client.js.map +1 -1
  14. package/build/src/api/rest/wrapFetchWithProgress.js +1 -8
  15. package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
  16. package/build/src/api/user/user.js +6 -36
  17. package/build/src/api/user/user.js.map +1 -1
  18. package/build/src/prebuild/renameTemplateAppName.js +2 -6
  19. package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
  20. package/build/src/prebuild/resolveLocalTemplate.js +2 -4
  21. package/build/src/prebuild/resolveLocalTemplate.js.map +1 -1
  22. package/build/src/prebuild/resolveTemplate.js +13 -17
  23. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  24. package/build/src/prebuild/updateFromTemplate.js +4 -6
  25. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  26. package/build/src/start/doctor/ngrok/ExternalModule.js +2 -8
  27. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  28. package/build/src/start/platforms/android/AndroidSdk.js +15 -6
  29. package/build/src/start/platforms/android/AndroidSdk.js.map +1 -1
  30. package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js +1 -9
  31. package/build/src/start/server/metro/DevToolsPluginWebsocketEndpoint.js.map +1 -1
  32. package/build/src/start/server/metro/MetroBundlerDevServer.js +10 -4
  33. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  34. package/build/src/start/server/metro/createServerComponentsMiddleware.js +2 -12
  35. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  36. package/build/src/start/server/metro/createServerRouteMiddleware.js +17 -0
  37. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  38. package/build/src/start/server/metro/instantiateMetro.js +2 -3
  39. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  40. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +47 -34
  41. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  42. package/build/src/start/server/middleware/ManifestMiddleware.js +27 -4
  43. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  44. package/build/src/start/server/type-generation/routes.js +2 -59
  45. package/build/src/start/server/type-generation/routes.js.map +1 -1
  46. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +2 -1
  47. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  48. package/build/src/utils/codesigning.js +3 -17
  49. package/build/src/utils/codesigning.js.map +1 -1
  50. package/build/src/utils/createFileTransform.js +3 -38
  51. package/build/src/utils/createFileTransform.js.map +1 -1
  52. package/build/src/utils/downloadAppAsync.js +1 -12
  53. package/build/src/utils/downloadAppAsync.js.map +1 -1
  54. package/build/src/utils/fetch.js +23 -4
  55. package/build/src/utils/fetch.js.map +1 -1
  56. package/build/src/utils/getOrPromptApplicationId.js +2 -15
  57. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  58. package/build/src/utils/npm.js +60 -65
  59. package/build/src/utils/npm.js.map +1 -1
  60. package/build/src/utils/resolveGlobal.js +195 -0
  61. package/build/src/utils/resolveGlobal.js.map +1 -0
  62. package/build/src/utils/tar.js +138 -69
  63. package/build/src/utils/tar.js.map +1 -1
  64. package/build/src/utils/telemetry/clients/FetchClient.js +12 -24
  65. package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
  66. package/build/src/utils/telemetry/utils/context.js +1 -1
  67. package/package.json +16 -26
  68. package/build/src/api/graphql/types/App.js +0 -29
  69. package/build/src/api/graphql/types/App.js.map +0 -1
  70. package/build/src/api/rest/wrapFetchWithProxy.js +0 -31
  71. package/build/src/api/rest/wrapFetchWithProxy.js.map +0 -1
  72. package/build/src/graphql/generated.js +0 -1196
  73. package/build/src/graphql/generated.js.map +0 -1
  74. package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js +0 -85
  75. package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js.map +0 -1
  76. package/build/src/utils/multipartMixed.js +0 -56
  77. package/build/src/utils/multipartMixed.js.map +0 -1
@@ -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 _assert() {
45
- const data = /*#__PURE__*/ _interop_require_default(require("assert"));
46
- _assert = function() {
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 _crypto() {
52
- const data = /*#__PURE__*/ _interop_require_default(require("crypto"));
53
- _crypto = function() {
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 _fs() {
59
- const data = /*#__PURE__*/ _interop_require_default(require("fs"));
60
- _fs = function() {
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 _path() {
66
- const data = /*#__PURE__*/ _interop_require_default(require("path"));
67
- _path = function() {
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 _client = require("../api/rest/client");
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, _assert().default)(results, `Could not get npm url for package "${packageName}"`);
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
- // @ts-ignore
169
- const pipeline = (0, _util().promisify)(_stream().Stream.pipeline);
170
- async function downloadAndExtractNpmModuleAsync(npmName, props) {
171
- const url = await getNpmUrlAsync(npmName);
172
- debug('Fetch from URL:', url);
173
- return await extractNpmTarballFromUrlAsync(url, props);
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 extractLocalNpmTarballAsync(tarFilePath, props) {
176
- const readStream = _fs().default.createReadStream(tarFilePath);
177
- return await extractNpmTarballAsync(readStream, props);
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 createUrlStreamAsync(url) {
180
- const response = await cachedFetch(url);
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 _stream().Readable.fromWeb(response.body);
185
- }
186
- async function extractNpmTarballFromUrlAsync(url, props) {
187
- return await extractNpmTarballAsync(await createUrlStreamAsync(url), props);
188
- }
189
- async function extractNpmTarballAsync(stream, props) {
190
- const { cwd, strip, name, fileList = [], filter } = props;
191
- await (0, _dir.ensureDirectoryAsync)(cwd);
192
- const hash = _crypto().default.createHash(props.checksumAlgorithm ?? 'md5');
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 _path().default.resolve(packageDir, json.filename);
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":";;;;;;;;;;;IAsGsBA,gCAAgC;eAAhCA;;IAUAC,2BAA2B;eAA3BA;;IAsCAC,sBAAsB;eAAtBA;;IAVAC,6BAA6B;eAA7BA;;IArEAC,cAAc;eAAdA;;IAlBAC,YAAY;eAAZA;;IAgIAC,mBAAmB;eAAnBA;;IA7JNC,sBAAsB;eAAtBA;;;;gEAvBO;;;;;;;gEACJ;;;;;;;gEACA;;;;;;;gEACJ;;;;;;;gEACE;;;;;;;gEACG;;;;;;;yBAC0B;;;;;;;yBACe;;;;;;;yBACnC;;;;;;qCAEU;qBACC;wBACR;wBACK;;;;;;AAElC,MAAMC,QAAQC,QAAQ,SAAS;AAE/B,MAAMC,cAAcC,IAAAA,yBAAiB,EAAC;IACpCC,gBAAgB;AAGlB;AAEO,SAASL,uBAAuBM,IAAY;IACjD,iEAAiE;IACjE,OACEC,8BAA8BD,SAC9BC,8BAA8BC,IAAAA,kBAAO,EAACF,UACtC,6DAA6D;IAC7D;AAEJ;AAEA,SAASC,8BAA8BD,IAAY;IACjD,iEAAiE;IAEjE,6CAA6C;IAC7C,MAAO,UAAUG,IAAI,CAACH,MAAO;QAC3BA,OAAOA,KAAKI,SAAS,CAAC;IACxB;IAEAJ,OAAOA,KAAKK,WAAW,GAAGC,OAAO,CAAC,oBAAoB;IAEtD,OACEN,IACE,kCAAkC;IAClC,4BAA4B;KAC3BO,SAAS,CAAC,OACVD,OAAO,CAAC,oBAAoB,OAAO;AAE1C;AAEO,eAAed,aAAa,GAAGgB,KAAe;QAEnC;IADhB,MAAMC,MAAM;QAAC;WAAWD;QAAO;KAAS;IACxC,MAAME,WAAU,UAAA,AAAC,CAAA,MAAMC,IAAAA,qBAAU,EAAC,OAAOF,IAAG,EAAGG,MAAM,qBAArC,QAAuCC,IAAI;IAC3D,MAAMC,YAAY,CAAC,IAAI,EAAEL,IAAIM,IAAI,CAAC,MAAM;IACxCpB,MAAM,QAAQmB;IACd,IAAI,CAACJ,SAAS;QACZ,OAAO;IACT;IACA,IAAI;QACF,OAAOM,KAAKC,KAAK,CAACP;IACpB,EAAE,OAAOQ,OAAY;QACnB,MAAM,IAAIC,MACR,CAAC,oCAAoC,EAAEL,UAAU,MAAM,EAAEJ,QAAQ,WAAW,EAAEQ,MAAME,OAAO,EAAE;IAEjG;AACF;AAGO,eAAe7B,eAAe8B,WAAmB;IACtD,MAAMX,UAAU,MAAMlB,aAAa6B,aAAa;IAEhDC,IAAAA,iBAAM,EAACZ,SAAS,CAAC,mCAAmC,EAAEW,YAAY,CAAC,CAAC;IAEpE,yCAAyC;IACzC,WAAW;IACX,4DAA4D;IAC5D,IAAI,OAAOX,YAAY,YAAY,CAACa,MAAMC,OAAO,CAACd,UAAU;QAC1D,OAAOA,QAAQe,OAAO;IACxB;IAEA,qGAAqG;IACrG,WAAW;IACX,wDAAwD;IACxD,IAAIF,MAAMC,OAAO,CAACd,UAAU;QAC1B,MAAMgB,aAAahB,OAAO,CAACA,QAAQiB,MAAM,GAAG,EAAE;QAE9C,IAAID,cAAc,OAAOA,eAAe,YAAY,CAACH,MAAMC,OAAO,CAACE,aAAa;YAC9E,OAAOA,WAAWD,OAAO;QAC3B;IACF;IAEA,MAAM,IAAIG,oBAAY,CACpB,iFAAiFlB;AAErF;AAEA,aAAa;AACb,MAAMmB,WAAWC,IAAAA,iBAAS,EAACC,gBAAM,CAACF,QAAQ;AAEnC,eAAe1C,iCACpB6C,OAAe,EACfxB,KAAmB;IAEnB,MAAMyB,MAAM,MAAM1C,eAAeyC;IAEjCrC,MAAM,mBAAmBsC;IACzB,OAAO,MAAM3C,8BAA8B2C,KAAKzB;AAClD;AAEO,eAAepB,4BACpB8C,WAAmB,EACnB1B,KAAmB;IAEnB,MAAM2B,aAAaC,aAAE,CAACC,gBAAgB,CAACH;IACvC,OAAO,MAAM7C,uBAAuB8C,YAAY3B;AAClD;AAaA,eAAe8B,qBAAqBL,GAAW;IAC7C,MAAMM,WAAW,MAAM1C,YAAYoC;IACnC,IAAI,CAACM,SAASC,EAAE,IAAI,CAACD,SAASE,IAAI,EAAE;QAClC,MAAM,IAAItB,MAAM,CAAC,qBAAqB,EAAEoB,SAASG,UAAU,CAAC,YAAY,EAAET,KAAK;IACjF;IAEA,OAAOU,kBAAQ,CAACC,OAAO,CAACL,SAASE,IAAI;AACvC;AAEO,eAAenD,8BACpB2C,GAAW,EACXzB,KAAmB;IAEnB,OAAO,MAAMnB,uBAAuB,MAAMiD,qBAAqBL,MAAMzB;AACvE;AAKO,eAAenB,uBACpBwD,MAA6B,EAC7BrC,KAAmB;IAEnB,MAAM,EAAEsC,GAAG,EAAEC,KAAK,EAAE/C,IAAI,EAAEgD,WAAW,EAAE,EAAEC,MAAM,EAAE,GAAGzC;IAEpD,MAAM0C,IAAAA,yBAAoB,EAACJ;IAE3B,MAAMK,OAAOC,iBAAM,CAACC,UAAU,CAAC7C,MAAM8C,iBAAiB,IAAI;IAC1D,MAAMC,kBAAkB,IAAIC,CAAAA,SAAU,aAAC;IACvCD,gBAAgBE,EAAE,CAAC,QAAQ,CAACC;QAC1BP,KAAKQ,MAAM,CAACD;IACd;IAEA,MAAM7B,SACJgB,QACAU,iBACAK,IAAAA,cAAU,EACR;QACEd;QACAG;QACAY,SAASC,IAAAA,wCAAmB,EAAC9D;QAC7B+C,OAAOA,SAAS;IAClB,GACAC;IAIJ,OAAOG,KAAKY,MAAM,CAAC;AACrB;AAEO,eAAetE,oBAAoBuE,UAAkB;QAE1C;IADhB,MAAMC,UAAU;QAAC;QAAQ;QAAU;KAA6B;IAChE,MAAMvD,WAAU,UAAA,AACd,CAAA,MAAMC,IAAAA,qBAAU,EAAC,OAAOsD,SAAS;QAC/BC,KAAK;YAAE,GAAGC,QAAQD,GAAG;QAAC;QACtBpB,KAAKkB;IACP,EAAC,EACDpD,MAAM,qBALQ,QAKNC,IAAI;IACd,IAAI;QACF,MAAM,CAACuD,KAAK,GAAGpD,KAAKC,KAAK,CAACP;QAC1B,OAAO2D,eAAI,CAACC,OAAO,CAACN,YAAYI,KAAKG,QAAQ;IAC/C,EAAE,OAAOrD,OAAY;QACnB,MAAMJ,YAAY,CAAC,IAAI,EAAEmD,QAAQlD,IAAI,CAAC,MAAM;QAC5C,MAAM,IAAII,MACR,CAAC,oCAAoC,EAAEL,UAAU,MAAM,EAAEJ,QAAQ,WAAW,EAAEQ,MAAME,OAAO,EAAE;IAEjG;AACF"}
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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"}