expo-modules-autolinking 55.0.17 → 55.0.19

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 (32) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/build/dependencies/CachedDependenciesLinker.d.ts +2 -1
  3. package/build/dependencies/CachedDependenciesLinker.js +10 -5
  4. package/build/dependencies/CachedDependenciesLinker.js.map +1 -1
  5. package/build/dependencies/index.d.ts +1 -1
  6. package/build/dependencies/index.js +2 -1
  7. package/build/dependencies/index.js.map +1 -1
  8. package/build/dependencies/scanning.d.ts +3 -1
  9. package/build/dependencies/scanning.js +15 -0
  10. package/build/dependencies/scanning.js.map +1 -1
  11. package/build/exports.d.ts +1 -0
  12. package/build/exports.js +1 -0
  13. package/build/exports.js.map +1 -1
  14. package/build/reactNativeConfig/reactNativeConfig.js +21 -4
  15. package/build/reactNativeConfig/reactNativeConfig.js.map +1 -1
  16. package/build/utilities/index.d.ts +1 -0
  17. package/build/utilities/index.js +7 -0
  18. package/build/utilities/index.js.map +1 -0
  19. package/build/utilities/isNativeModule.d.ts +2 -0
  20. package/build/utilities/isNativeModule.js +13 -0
  21. package/build/utilities/isNativeModule.js.map +1 -0
  22. package/external-configs/ios/README.md +8 -0
  23. package/package.json +2 -2
  24. package/scripts/ios/autolinking_manager.rb +1 -0
  25. package/scripts/ios/precompiled_modules.rb +385 -79
  26. package/src/dependencies/CachedDependenciesLinker.ts +21 -11
  27. package/src/dependencies/index.ts +1 -1
  28. package/src/dependencies/scanning.ts +15 -0
  29. package/src/exports.ts +2 -0
  30. package/src/reactNativeConfig/reactNativeConfig.ts +25 -5
  31. package/src/utilities/index.ts +3 -0
  32. package/src/utilities/isNativeModule.ts +16 -0
package/CHANGELOG.md CHANGED
@@ -10,6 +10,25 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 55.0.19 — 2026-04-28
14
+
15
+ ### 🐛 Bug fixes
16
+
17
+ - [iOS] Resolve npm-bundled precompiled XCFrameworks for nested Expo packages like `expo-modules-core` during `pod install`. ([#45166](https://github.com/expo/expo/pull/45166) by [@chrfalch](https://github.com/chrfalch))
18
+ - [iOS] Build precompiled Expo modules from source when a required upstream Expo dependency is unavailable as prebuilt. ([#45160](https://github.com/expo/expo/pull/45160) by [@chrfalch](https://github.com/chrfalch))
19
+ - [iOS] Add support for optionally downloading external precompiled XCFramework tarballs from during `pod install`. ([#45067](https://github.com/expo/expo/pull/45067) by [@chrfalch](https://github.com/chrfalch))
20
+ - [iOS] Resolve 3rd-party prebuilt xcframework packages via `@react-native-community/cli` autolinking output instead of guessing `node_modules/<pkg>`, fixing pnpm non-hoisted layouts, transitive native deps, yarn resolutions/PnP, and aliased specifiers ([#45004](https://github.com/expo/expo/pull/45004) by [@chrfalch](https://github.com/chrfalch))
21
+
22
+ ## 55.0.18 — 2026-04-21
23
+
24
+ ### 🐛 Bug fixes
25
+
26
+ - Fix missing deep object merging that should allow a project config to override a dependency's per-platform config options selectively ([#44668](https://github.com/expo/expo/pull/44668) by [@kitten](https://github.com/kitten))
27
+
28
+ ### 💡 Others
29
+
30
+ - Expose `isNativeModuleAsync` utility in internal exports ([#44458](https://github.com/expo/expo/pull/44458) by [@kitten](https://github.com/kitten))
31
+
13
32
  ## 55.0.17 — 2026-04-10
14
33
 
15
34
  _This version does not introduce any user-facing changes._
@@ -215,6 +234,7 @@ _This version does not introduce any user-facing changes._
215
234
 
216
235
  ### 💡 Others
217
236
 
237
+ - [iOS] Added modular headers for companion pods ([#44805](https://github.com/expo/expo/pull/44805) by [@chrfalch](https://github.com/chrfalch))
218
238
  - [iOS] Added support for pre-install step when USE_FRAMEWORKS is set in Podfile ([#39479](https://github.com/expo/expo/pull/39479) by [@chrfalch](https://github.com/chrfalch))
219
239
  - Remove dependency on `find-up` ([#39470](https://github.com/expo/expo/pull/39470) by [@kitten](https://github.com/kitten))
220
240
  - [iOS] Force codegen for `FBReactNativeSpec` when generated files are missing in React Native source ([#39512](https://github.com/expo/expo/pull/39512) by [@kitten](https://github.com/kitten))
@@ -1,5 +1,5 @@
1
1
  import { PackageRevision, SupportedPlatform } from '../types';
2
- import { type ResolutionResult } from './types';
2
+ import { type ResolutionResult, DependencyResolution } from './types';
3
3
  import { type Memoizer } from '../memoize';
4
4
  import { RNConfigReactNativeProjectConfig } from '../reactNativeConfig';
5
5
  export interface CachedDependenciesSearchOptions {
@@ -18,5 +18,6 @@ export interface CachedDependenciesLinker {
18
18
  export declare function makeCachedDependenciesLinker(params: {
19
19
  projectRoot: string;
20
20
  }): CachedDependenciesLinker;
21
+ export declare function isNativeModuleAsync(resolution: DependencyResolution, reactNativeProjectConfig: RNConfigReactNativeProjectConfig | null, platform: SupportedPlatform, excludeNames: Set<string>): Promise<boolean>;
21
22
  export declare function scanDependencyResolutionsForPlatform(linker: CachedDependenciesLinker, platform: SupportedPlatform, extraInclude?: string[]): Promise<ResolutionResult>;
22
23
  export declare function scanExpoModuleResolutionsForPlatform(linker: CachedDependenciesLinker, platform: SupportedPlatform, extraInclude?: string[]): Promise<Record<string, PackageRevision>>;
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.makeCachedDependenciesLinker = makeCachedDependenciesLinker;
7
+ exports.isNativeModuleAsync = isNativeModuleAsync;
7
8
  exports.scanDependencyResolutionsForPlatform = scanDependencyResolutionsForPlatform;
8
9
  exports.scanExpoModuleResolutionsForPlatform = scanExpoModuleResolutionsForPlatform;
9
10
  const fs_1 = __importDefault(require("fs"));
@@ -64,6 +65,13 @@ function makeCachedDependenciesLinker(params) {
64
65
  },
65
66
  };
66
67
  }
68
+ async function isNativeModuleAsync(resolution, reactNativeProjectConfig, platform, excludeNames) {
69
+ const [reactNativeModule, expoModule] = await Promise.all([
70
+ (0, reactNativeConfig_1.resolveReactNativeModule)(resolution, reactNativeProjectConfig, platform, excludeNames),
71
+ (0, findModules_1.resolveExpoModule)(resolution, platform, excludeNames),
72
+ ]);
73
+ return !!reactNativeModule || !!expoModule;
74
+ }
67
75
  async function scanDependencyResolutionsForPlatform(linker, platform, extraInclude) {
68
76
  const opts = await linker.getOptionsForPlatform(platform, extraInclude);
69
77
  const reactNativeProjectConfig = await linker.loadReactNativeProjectConfig();
@@ -91,11 +99,8 @@ async function scanDependencyResolutionsForPlatform(linker, platform, extraInclu
91
99
  }
92
100
  }
93
101
  else {
94
- const [reactNativeModule, expoModule] = await Promise.all([
95
- (0, reactNativeConfig_1.resolveReactNativeModule)(resolution, reactNativeProjectConfig, platform, opts.excludeNames),
96
- (0, findModules_1.resolveExpoModule)(resolution, platform, opts.excludeNames),
97
- ]);
98
- if (!reactNativeModule && !expoModule) {
102
+ const isNativeModule = await isNativeModuleAsync(resolution, reactNativeProjectConfig, platform, opts.excludeNames);
103
+ if (!isNativeModule) {
99
104
  return null;
100
105
  }
101
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CachedDependenciesLinker.js","sourceRoot":"","sources":["../../src/dependencies/CachedDependenciesLinker.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\n\nimport { PackageRevision, SupportedPlatform } from '../types';\nimport { scanDependenciesRecursively } from './resolution';\nimport { scanDependenciesFromRNProjectConfig } from './rncliLocal';\nimport { scanDependenciesInSearchPath } from './scanning';\nimport { type ResolutionResult, DependencyResolutionSource } from './types';\nimport { filterMapResolutionResult, mergeResolutionResults } from './utils';\nimport { resolveExpoModule } from '../autolinking/findModules';\nimport { AutolinkingOptions, createAutolinkingOptionsLoader } from '../commands/autolinkingOptions';\nimport { createMemoizer, type Memoizer } from '../memoize';\nimport { resolveReactNativeModule, RNConfigReactNativeProjectConfig } from '../reactNativeConfig';\nimport { loadConfigAsync } from '../reactNativeConfig/config';\n\nexport interface CachedDependenciesSearchOptions {\n includeNames: Set<string>;\n excludeNames: Set<string>;\n searchPaths: string[];\n}\n\nexport interface CachedDependenciesLinker {\n memoizer: Memoizer;\n getOptionsForPlatform(\n platform: SupportedPlatform,\n extraInclude?: string[]\n ): Promise<CachedDependenciesSearchOptions>;\n loadReactNativeProjectConfig(): Promise<RNConfigReactNativeProjectConfig | null>;\n scanDependenciesFromRNProjectConfig(): Promise<ResolutionResult>;\n scanDependenciesRecursively(): Promise<ResolutionResult>;\n scanDependenciesInSearchPath(searchPath: string): Promise<ResolutionResult>;\n}\n\nexport function makeCachedDependenciesLinker(params: {\n projectRoot: string;\n}): CachedDependenciesLinker {\n const memoizer = createMemoizer();\n\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader({\n projectRoot: params.projectRoot,\n });\n\n let appRoot: Promise<string> | undefined;\n const getAppRoot = () => appRoot || (appRoot = autolinkingOptionsLoader.getAppRoot());\n\n const dependenciesResultBySearchPath = new Map<string, Promise<ResolutionResult>>();\n let reactNativeProjectConfig: Promise<RNConfigReactNativeProjectConfig | null> | undefined;\n let reactNativeProjectConfigDependencies: Promise<ResolutionResult> | undefined;\n let recursiveDependencies: Promise<ResolutionResult> | undefined;\n\n return {\n memoizer,\n async getOptionsForPlatform(platform, extraInclude) {\n const options = await autolinkingOptionsLoader.getPlatformOptions(platform);\n return makeCachedDependenciesSearchOptions(options, extraInclude);\n },\n async loadReactNativeProjectConfig() {\n if (reactNativeProjectConfig === undefined) {\n reactNativeProjectConfig = memoizer.call(\n loadConfigAsync,\n await getAppRoot()\n ) as Promise<RNConfigReactNativeProjectConfig | null>;\n }\n return reactNativeProjectConfig;\n },\n async scanDependenciesFromRNProjectConfig() {\n if (reactNativeProjectConfigDependencies === undefined) {\n reactNativeProjectConfigDependencies = memoizer.withMemoizer(async () => {\n return await scanDependenciesFromRNProjectConfig(\n await getAppRoot(),\n await this.loadReactNativeProjectConfig()\n );\n });\n }\n return reactNativeProjectConfigDependencies;\n },\n async scanDependenciesRecursively() {\n if (recursiveDependencies === undefined) {\n recursiveDependencies = memoizer.withMemoizer(async () => {\n return scanDependenciesRecursively(await getAppRoot());\n });\n }\n return recursiveDependencies;\n },\n async scanDependenciesInSearchPath(searchPath: string) {\n let result = dependenciesResultBySearchPath.get(searchPath);\n if (!result) {\n dependenciesResultBySearchPath.set(\n searchPath,\n (result = memoizer.withMemoizer(scanDependenciesInSearchPath, searchPath))\n );\n }\n return result;\n },\n };\n}\n\nexport async function scanDependencyResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform,\n extraInclude?: string[]\n): Promise<ResolutionResult> {\n const opts = await linker.getOptionsForPlatform(platform, extraInclude);\n const reactNativeProjectConfig = await linker.loadReactNativeProjectConfig();\n\n const resolutions = mergeResolutionResults(\n await Promise.all([\n linker.scanDependenciesFromRNProjectConfig(),\n ...opts.searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n linker.scanDependenciesRecursively(),\n ])\n );\n\n return await linker.memoizer.withMemoizer(async () => {\n const dependencies = await filterMapResolutionResult(resolutions, async (resolution) => {\n if (opts.excludeNames.has(resolution.name)) {\n return null;\n } else if (opts.includeNames.has(resolution.name)) {\n return resolution;\n } else if (resolution.source === DependencyResolutionSource.RN_CLI_LOCAL) {\n // If the dependency was resolved frpom the React Native project config, we'll only\n // attempt to resolve it as a React Native module\n const reactNativeModuleDesc = await resolveReactNativeModule(\n resolution,\n reactNativeProjectConfig,\n platform,\n opts.excludeNames\n );\n if (!reactNativeModuleDesc) {\n return null;\n }\n } else {\n const [reactNativeModule, expoModule] = await Promise.all([\n resolveReactNativeModule(\n resolution,\n reactNativeProjectConfig,\n platform,\n opts.excludeNames\n ),\n resolveExpoModule(resolution, platform, opts.excludeNames),\n ]);\n if (!reactNativeModule && !expoModule) {\n return null;\n }\n }\n return resolution;\n });\n\n return dependencies;\n });\n}\n\nexport async function scanExpoModuleResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform,\n extraInclude?: string[]\n): Promise<Record<string, PackageRevision>> {\n const { excludeNames, searchPaths } = await linker.getOptionsForPlatform(platform, extraInclude);\n const resolutions = mergeResolutionResults(\n await Promise.all(\n [\n ...searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n linker.scanDependenciesRecursively(),\n ].filter((x) => x != null)\n )\n );\n return await linker.memoizer.withMemoizer(async () => {\n return await filterMapResolutionResult(resolutions, async (resolution) => {\n return !excludeNames.has(resolution.name)\n ? await resolveExpoModule(resolution, platform, excludeNames)\n : null;\n });\n });\n}\n\nconst makeCachedDependenciesSearchOptions = (\n options: AutolinkingOptions,\n extraInclude?: string[]\n) => ({\n excludeNames: new Set(options.exclude),\n includeNames: new Set(extraInclude ? [...options.include, ...extraInclude] : options.include),\n searchPaths:\n options.nativeModulesDir && fs.existsSync(options.nativeModulesDir)\n ? [options.nativeModulesDir, ...(options.searchPaths ?? [])]\n : (options.searchPaths ?? []),\n});\n"]}
1
+ {"version":3,"file":"CachedDependenciesLinker.js","sourceRoot":"","sources":["../../src/dependencies/CachedDependenciesLinker.ts"],"names":[],"mappings":";;;;;AAgCA,oEA8DC;AAED,kDAWC;AAED,oFAoDC;AAED,oFAuBC;AA1LD,4CAAoB;AAGpB,6CAA2D;AAC3D,6CAAmE;AACnE,yCAA0D;AAE1D,mCAA4E;AAC5E,4DAA+D;AAC/D,uEAAoG;AACpG,wCAA2D;AAC3D,4DAAkG;AAClG,wDAA8D;AAoB9D,SAAgB,4BAA4B,CAAC,MAE5C;IACC,MAAM,QAAQ,GAAG,IAAA,wBAAc,GAAE,CAAC;IAElC,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC;QAC9D,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,IAAI,OAAoC,CAAC;IACzC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,OAAO,IAAI,CAAC,OAAO,GAAG,wBAAwB,CAAC,UAAU,EAAE,CAAC,CAAC;IAEtF,MAAM,8BAA8B,GAAG,IAAI,GAAG,EAAqC,CAAC;IACpF,IAAI,wBAAsF,CAAC;IAC3F,IAAI,oCAA2E,CAAC;IAChF,IAAI,qBAA4D,CAAC;IAEjE,OAAO;QACL,QAAQ;QACR,KAAK,CAAC,qBAAqB,CAAC,QAAQ,EAAE,YAAY;YAChD,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;YAC5E,OAAO,mCAAmC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,4BAA4B;YAChC,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;gBAC3C,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CACtC,wBAAe,EACf,MAAM,UAAU,EAAE,CACiC,CAAC;YACxD,CAAC;YACD,OAAO,wBAAwB,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,mCAAmC;YACvC,IAAI,oCAAoC,KAAK,SAAS,EAAE,CAAC;gBACvD,oCAAoC,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;oBACtE,OAAO,MAAM,IAAA,gDAAmC,EAC9C,MAAM,UAAU,EAAE,EAClB,MAAM,IAAI,CAAC,4BAA4B,EAAE,CAC1C,CAAC;gBACJ,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,oCAAoC,CAAC;QAC9C,CAAC;QACD,KAAK,CAAC,2BAA2B;YAC/B,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBACxC,qBAAqB,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;oBACvD,OAAO,IAAA,wCAA2B,EAAC,MAAM,UAAU,EAAE,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,qBAAqB,CAAC;QAC/B,CAAC;QACD,KAAK,CAAC,4BAA4B,CAAC,UAAkB;YACnD,IAAI,MAAM,GAAG,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,8BAA8B,CAAC,GAAG,CAChC,UAAU,EACV,CAAC,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,uCAA4B,EAAE,UAAU,CAAC,CAAC,CAC3E,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,mBAAmB,CACvC,UAAgC,EAChC,wBAAiE,EACjE,QAA2B,EAC3B,YAAyB;IAEzB,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxD,IAAA,4CAAwB,EAAC,UAAU,EAAE,wBAAwB,EAAE,QAAQ,EAAE,YAAY,CAAC;QACtF,IAAA,+BAAiB,EAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC;KACtD,CAAC,CAAC;IACH,OAAO,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,UAAU,CAAC;AAC7C,CAAC;AAEM,KAAK,UAAU,oCAAoC,CACxD,MAAgC,EAChC,QAA2B,EAC3B,YAAuB;IAEvB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACxE,MAAM,wBAAwB,GAAG,MAAM,MAAM,CAAC,4BAA4B,EAAE,CAAC;IAE7E,MAAM,WAAW,GAAG,IAAA,8BAAsB,EACxC,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,mCAAmC,EAAE;QAC5C,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YACrC,OAAO,MAAM,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,MAAM,CAAC,2BAA2B,EAAE;KACrC,CAAC,CACH,CAAC;IAEF,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;QACnD,MAAM,YAAY,GAAG,MAAM,IAAA,iCAAyB,EAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACrF,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,OAAO,IAAI,CAAC;YACd,CAAC;iBAAM,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClD,OAAO,UAAU,CAAC;YACpB,CAAC;iBAAM,IAAI,UAAU,CAAC,MAAM,oDAA4C,EAAE,CAAC;gBACzE,mFAAmF;gBACnF,iDAAiD;gBACjD,MAAM,qBAAqB,GAAG,MAAM,IAAA,4CAAwB,EAC1D,UAAU,EACV,wBAAwB,EACxB,QAAQ,EACR,IAAI,CAAC,YAAY,CAClB,CAAC;gBACF,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAC9C,UAAU,EACV,wBAAwB,EACxB,QAAQ,EACR,IAAI,CAAC,YAAY,CAClB,CAAC;gBACF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,OAAO,YAAY,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,oCAAoC,CACxD,MAAgC,EAChC,QAA2B,EAC3B,YAAuB;IAEvB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,IAAA,8BAAsB,EACxC,MAAM,OAAO,CAAC,GAAG,CACf;QACE,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;YAChC,OAAO,MAAM,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,MAAM,CAAC,2BAA2B,EAAE;KACrC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAC3B,CACF,CAAC;IACF,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;QACnD,OAAO,MAAM,IAAA,iCAAyB,EAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;YACvE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBACvC,CAAC,CAAC,MAAM,IAAA,+BAAiB,EAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC;gBAC7D,CAAC,CAAC,IAAI,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,mCAAmC,GAAG,CAC1C,OAA2B,EAC3B,YAAuB,EACvB,EAAE,CAAC,CAAC;IACJ,YAAY,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,YAAY,EAAE,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;IAC7F,WAAW,EACT,OAAO,CAAC,gBAAgB,IAAI,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACjE,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;CAClC,CAAC,CAAC","sourcesContent":["import fs from 'fs';\n\nimport { PackageRevision, SupportedPlatform } from '../types';\nimport { scanDependenciesRecursively } from './resolution';\nimport { scanDependenciesFromRNProjectConfig } from './rncliLocal';\nimport { scanDependenciesInSearchPath } from './scanning';\nimport { type ResolutionResult, DependencyResolution, DependencyResolutionSource } from './types';\nimport { filterMapResolutionResult, mergeResolutionResults } from './utils';\nimport { resolveExpoModule } from '../autolinking/findModules';\nimport { AutolinkingOptions, createAutolinkingOptionsLoader } from '../commands/autolinkingOptions';\nimport { createMemoizer, type Memoizer } from '../memoize';\nimport { resolveReactNativeModule, RNConfigReactNativeProjectConfig } from '../reactNativeConfig';\nimport { loadConfigAsync } from '../reactNativeConfig/config';\n\nexport interface CachedDependenciesSearchOptions {\n includeNames: Set<string>;\n excludeNames: Set<string>;\n searchPaths: string[];\n}\n\nexport interface CachedDependenciesLinker {\n memoizer: Memoizer;\n getOptionsForPlatform(\n platform: SupportedPlatform,\n extraInclude?: string[]\n ): Promise<CachedDependenciesSearchOptions>;\n loadReactNativeProjectConfig(): Promise<RNConfigReactNativeProjectConfig | null>;\n scanDependenciesFromRNProjectConfig(): Promise<ResolutionResult>;\n scanDependenciesRecursively(): Promise<ResolutionResult>;\n scanDependenciesInSearchPath(searchPath: string): Promise<ResolutionResult>;\n}\n\nexport function makeCachedDependenciesLinker(params: {\n projectRoot: string;\n}): CachedDependenciesLinker {\n const memoizer = createMemoizer();\n\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader({\n projectRoot: params.projectRoot,\n });\n\n let appRoot: Promise<string> | undefined;\n const getAppRoot = () => appRoot || (appRoot = autolinkingOptionsLoader.getAppRoot());\n\n const dependenciesResultBySearchPath = new Map<string, Promise<ResolutionResult>>();\n let reactNativeProjectConfig: Promise<RNConfigReactNativeProjectConfig | null> | undefined;\n let reactNativeProjectConfigDependencies: Promise<ResolutionResult> | undefined;\n let recursiveDependencies: Promise<ResolutionResult> | undefined;\n\n return {\n memoizer,\n async getOptionsForPlatform(platform, extraInclude) {\n const options = await autolinkingOptionsLoader.getPlatformOptions(platform);\n return makeCachedDependenciesSearchOptions(options, extraInclude);\n },\n async loadReactNativeProjectConfig() {\n if (reactNativeProjectConfig === undefined) {\n reactNativeProjectConfig = memoizer.call(\n loadConfigAsync,\n await getAppRoot()\n ) as Promise<RNConfigReactNativeProjectConfig | null>;\n }\n return reactNativeProjectConfig;\n },\n async scanDependenciesFromRNProjectConfig() {\n if (reactNativeProjectConfigDependencies === undefined) {\n reactNativeProjectConfigDependencies = memoizer.withMemoizer(async () => {\n return await scanDependenciesFromRNProjectConfig(\n await getAppRoot(),\n await this.loadReactNativeProjectConfig()\n );\n });\n }\n return reactNativeProjectConfigDependencies;\n },\n async scanDependenciesRecursively() {\n if (recursiveDependencies === undefined) {\n recursiveDependencies = memoizer.withMemoizer(async () => {\n return scanDependenciesRecursively(await getAppRoot());\n });\n }\n return recursiveDependencies;\n },\n async scanDependenciesInSearchPath(searchPath: string) {\n let result = dependenciesResultBySearchPath.get(searchPath);\n if (!result) {\n dependenciesResultBySearchPath.set(\n searchPath,\n (result = memoizer.withMemoizer(scanDependenciesInSearchPath, searchPath))\n );\n }\n return result;\n },\n };\n}\n\nexport async function isNativeModuleAsync(\n resolution: DependencyResolution,\n reactNativeProjectConfig: RNConfigReactNativeProjectConfig | null,\n platform: SupportedPlatform,\n excludeNames: Set<string>\n) {\n const [reactNativeModule, expoModule] = await Promise.all([\n resolveReactNativeModule(resolution, reactNativeProjectConfig, platform, excludeNames),\n resolveExpoModule(resolution, platform, excludeNames),\n ]);\n return !!reactNativeModule || !!expoModule;\n}\n\nexport async function scanDependencyResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform,\n extraInclude?: string[]\n): Promise<ResolutionResult> {\n const opts = await linker.getOptionsForPlatform(platform, extraInclude);\n const reactNativeProjectConfig = await linker.loadReactNativeProjectConfig();\n\n const resolutions = mergeResolutionResults(\n await Promise.all([\n linker.scanDependenciesFromRNProjectConfig(),\n ...opts.searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n linker.scanDependenciesRecursively(),\n ])\n );\n\n return await linker.memoizer.withMemoizer(async () => {\n const dependencies = await filterMapResolutionResult(resolutions, async (resolution) => {\n if (opts.excludeNames.has(resolution.name)) {\n return null;\n } else if (opts.includeNames.has(resolution.name)) {\n return resolution;\n } else if (resolution.source === DependencyResolutionSource.RN_CLI_LOCAL) {\n // If the dependency was resolved frpom the React Native project config, we'll only\n // attempt to resolve it as a React Native module\n const reactNativeModuleDesc = await resolveReactNativeModule(\n resolution,\n reactNativeProjectConfig,\n platform,\n opts.excludeNames\n );\n if (!reactNativeModuleDesc) {\n return null;\n }\n } else {\n const isNativeModule = await isNativeModuleAsync(\n resolution,\n reactNativeProjectConfig,\n platform,\n opts.excludeNames\n );\n if (!isNativeModule) {\n return null;\n }\n }\n return resolution;\n });\n\n return dependencies;\n });\n}\n\nexport async function scanExpoModuleResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform,\n extraInclude?: string[]\n): Promise<Record<string, PackageRevision>> {\n const { excludeNames, searchPaths } = await linker.getOptionsForPlatform(platform, extraInclude);\n const resolutions = mergeResolutionResults(\n await Promise.all(\n [\n ...searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n linker.scanDependenciesRecursively(),\n ].filter((x) => x != null)\n )\n );\n return await linker.memoizer.withMemoizer(async () => {\n return await filterMapResolutionResult(resolutions, async (resolution) => {\n return !excludeNames.has(resolution.name)\n ? await resolveExpoModule(resolution, platform, excludeNames)\n : null;\n });\n });\n}\n\nconst makeCachedDependenciesSearchOptions = (\n options: AutolinkingOptions,\n extraInclude?: string[]\n) => ({\n excludeNames: new Set(options.exclude),\n includeNames: new Set(extraInclude ? [...options.include, ...extraInclude] : options.include),\n searchPaths:\n options.nativeModulesDir && fs.existsSync(options.nativeModulesDir)\n ? [options.nativeModulesDir, ...(options.searchPaths ?? [])]\n : (options.searchPaths ?? []),\n});\n"]}
@@ -1,5 +1,5 @@
1
1
  export { scanDependenciesRecursively } from './resolution';
2
- export { scanDependenciesInSearchPath } from './scanning';
2
+ export { scanDependenciesInSearchPath, mockDependencyAtPath } from './scanning';
3
3
  export { scanDependenciesFromRNProjectConfig } from './rncliLocal';
4
4
  export { filterMapResolutionResult, mergeResolutionResults } from './utils';
5
5
  export * from './CachedDependenciesLinker';
@@ -14,11 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.mergeResolutionResults = exports.filterMapResolutionResult = exports.scanDependenciesFromRNProjectConfig = exports.scanDependenciesInSearchPath = exports.scanDependenciesRecursively = void 0;
17
+ exports.mergeResolutionResults = exports.filterMapResolutionResult = exports.scanDependenciesFromRNProjectConfig = exports.mockDependencyAtPath = exports.scanDependenciesInSearchPath = exports.scanDependenciesRecursively = void 0;
18
18
  var resolution_1 = require("./resolution");
19
19
  Object.defineProperty(exports, "scanDependenciesRecursively", { enumerable: true, get: function () { return resolution_1.scanDependenciesRecursively; } });
20
20
  var scanning_1 = require("./scanning");
21
21
  Object.defineProperty(exports, "scanDependenciesInSearchPath", { enumerable: true, get: function () { return scanning_1.scanDependenciesInSearchPath; } });
22
+ Object.defineProperty(exports, "mockDependencyAtPath", { enumerable: true, get: function () { return scanning_1.mockDependencyAtPath; } });
22
23
  var rncliLocal_1 = require("./rncliLocal");
23
24
  Object.defineProperty(exports, "scanDependenciesFromRNProjectConfig", { enumerable: true, get: function () { return rncliLocal_1.scanDependenciesFromRNProjectConfig; } });
24
25
  var utils_1 = require("./utils");
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dependencies/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAA2D;AAAlD,yHAAA,2BAA2B,OAAA;AACpC,uCAA0D;AAAjD,wHAAA,4BAA4B,OAAA;AACrC,2CAAmE;AAA1D,iIAAA,mCAAmC,OAAA;AAC5C,iCAA4E;AAAnE,kHAAA,yBAAyB,OAAA;AAAE,+GAAA,sBAAsB,OAAA;AAC1D,6DAA2C;AAC3C,0CAAwB","sourcesContent":["export { scanDependenciesRecursively } from './resolution';\nexport { scanDependenciesInSearchPath } from './scanning';\nexport { scanDependenciesFromRNProjectConfig } from './rncliLocal';\nexport { filterMapResolutionResult, mergeResolutionResults } from './utils';\nexport * from './CachedDependenciesLinker';\nexport * from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dependencies/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,2CAA2D;AAAlD,yHAAA,2BAA2B,OAAA;AACpC,uCAAgF;AAAvE,wHAAA,4BAA4B,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAC3D,2CAAmE;AAA1D,iIAAA,mCAAmC,OAAA;AAC5C,iCAA4E;AAAnE,kHAAA,yBAAyB,OAAA;AAAE,+GAAA,sBAAsB,OAAA;AAC1D,6DAA2C;AAC3C,0CAAwB","sourcesContent":["export { scanDependenciesRecursively } from './resolution';\nexport { scanDependenciesInSearchPath, mockDependencyAtPath } from './scanning';\nexport { scanDependenciesFromRNProjectConfig } from './rncliLocal';\nexport { filterMapResolutionResult, mergeResolutionResults } from './utils';\nexport * from './CachedDependenciesLinker';\nexport * from './types';\n"]}
@@ -1,4 +1,6 @@
1
- import { type ResolutionResult } from './types';
1
+ import { type ResolutionResult, type DependencyResolution } from './types';
2
+ /** Create a mock resolution for a local search path dependency at the given path */
3
+ export declare function mockDependencyAtPath(originPath: string): Promise<DependencyResolution>;
2
4
  interface ResolutionOptions {
3
5
  shouldIncludeDependency?(name: string): boolean;
4
6
  }
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.mockDependencyAtPath = mockDependencyAtPath;
6
7
  exports.scanDependenciesInSearchPath = scanDependenciesInSearchPath;
7
8
  const fs_1 = __importDefault(require("fs"));
8
9
  const concurrency_1 = require("../concurrency");
@@ -41,6 +42,20 @@ async function resolveDependency(basePath, dependencyName, shouldIncludeDependen
41
42
  return null;
42
43
  }
43
44
  }
45
+ /** Create a mock resolution for a local search path dependency at the given path */
46
+ async function mockDependencyAtPath(originPath) {
47
+ const realPath = await (0, utils_2.maybeRealpath)(originPath);
48
+ const packageJson = await (0, utils_2.loadPackageJson)((0, utils_2.fastJoin)(realPath || originPath, 'package.json'));
49
+ return {
50
+ source: 1 /* DependencyResolutionSource.SEARCH_PATH */,
51
+ name: packageJson?.name || 'local-module', // NOTE: Mock name
52
+ version: packageJson?.version ?? '',
53
+ path: realPath ?? originPath,
54
+ originPath,
55
+ duplicates: null,
56
+ depth: 0,
57
+ };
58
+ }
44
59
  async function scanDependenciesInSearchPath(rawPath, { shouldIncludeDependency = utils_1.defaultShouldIncludeDependency } = {}) {
45
60
  const rootPath = await (0, utils_2.maybeRealpath)(rawPath);
46
61
  const searchResults = Object.create(null);
@@ -1 +1 @@
1
- {"version":3,"file":"scanning.js","sourceRoot":"","sources":["../../src/dependencies/scanning.ts"],"names":[],"mappings":";;;;;AAmDA,oEAuEC;AA1HD,4CAAoB;AAOpB,gDAAyC;AACzC,mCAAyD;AACzD,oCAAoE;AAEpE,KAAK,UAAU,iBAAiB,CAC9B,QAAgB,EAChB,cAA6B,EAC7B,uBAA4D;IAE5D,IAAI,cAAc,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,IAAA,gBAAQ,EAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAClF,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,UAAU,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,MAAM,IAAA,uBAAe,EAAC,IAAA,gBAAQ,EAAC,QAAQ,IAAI,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAC5F,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO;YACL,MAAM,gDAAwC;YAC9C,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE;YAC5B,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,EAAE;YAClC,IAAI,EAAE,QAAQ,IAAI,UAAU;YAC5B,UAAU;YACV,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,CAAC;SACT,CAAC;IACJ,CAAC;SAAM,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;QACtC,OAAO;YACL,MAAM,gDAAwC;YAC9C,IAAI,EAAE,cAAc,CAAC,WAAW,EAAE;YAClC,OAAO,EAAE,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU;YACV,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,CAAC;SACT,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAMM,KAAK,UAAU,4BAA4B,CAChD,OAAe,EACf,EAAE,uBAAuB,GAAG,sCAA8B,KAAwB,EAAE;IAEpF,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,OAAO,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAqB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,MAAM,oBAAoB,GAA2B,EAAE,CAAC;IAExD,MAAM,iBAAiB,GAAG,MAAM,IAAA,qBAAa,EAAC,IAAA,gBAAQ,EAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IAClF,IAAI,iBAAiB,EAAE,CAAC;QACtB,gGAAgG;QAChG,wGAAwG;QACxG,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;QACpF,IAAI,UAAU;YAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,IAAA,qBAAO,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;gBAC3B,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;gBAC1F,IAAI,UAAU;oBAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;oBAClC,oCAAoC;gBACtC,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC1B,wBAAwB;gBAC1B,CAAC;qBAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACjC,uDAAuD;oBACvD,MAAM,SAAS,GAAG,IAAA,gBAAQ,EAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;oBACjD,MAAM,YAAY,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;oBACnF,MAAM,OAAO,CAAC,GAAG,CACf,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;wBAC/B,MAAM,cAAc,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACrD,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;4BAClD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACxC,QAAQ,EACR,cAAc,EACd,uBAAuB,CACxB,CAAC;4BACF,IAAI,UAAU;gCAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC,CAAC,CACH,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;oBAC1F,IAAI,UAAU;wBAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3D,MAAM,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC5D,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACzD,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,UAAU,EAAE,UAAU,CAAC,UAAU;aAClC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YAC7B,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC","sourcesContent":["import fs from 'fs';\n\nimport {\n type ResolutionResult,\n type DependencyResolution,\n DependencyResolutionSource,\n} from './types';\nimport { taskAll } from '../concurrency';\nimport { defaultShouldIncludeDependency } from './utils';\nimport { loadPackageJson, maybeRealpath, fastJoin } from '../utils';\n\nasync function resolveDependency(\n basePath: string,\n dependencyName: string | null,\n shouldIncludeDependency: (dependencyName: string) => boolean\n): Promise<DependencyResolution | null> {\n if (dependencyName && !shouldIncludeDependency(dependencyName)) {\n return null;\n }\n const originPath = dependencyName ? fastJoin(basePath, dependencyName) : basePath;\n const realPath = await maybeRealpath(originPath);\n const packageJson = await loadPackageJson(fastJoin(realPath || originPath, 'package.json'));\n if (packageJson) {\n return {\n source: DependencyResolutionSource.SEARCH_PATH,\n name: packageJson.name || '',\n version: packageJson.version || '',\n path: realPath || originPath,\n originPath,\n duplicates: null,\n depth: 0,\n };\n } else if (dependencyName && realPath) {\n return {\n source: DependencyResolutionSource.SEARCH_PATH,\n name: dependencyName.toLowerCase(),\n version: '',\n path: realPath,\n originPath,\n duplicates: null,\n depth: 0,\n };\n } else {\n return null;\n }\n}\n\ninterface ResolutionOptions {\n shouldIncludeDependency?(name: string): boolean;\n}\n\nexport async function scanDependenciesInSearchPath(\n rawPath: string,\n { shouldIncludeDependency = defaultShouldIncludeDependency }: ResolutionOptions = {}\n): Promise<ResolutionResult> {\n const rootPath = await maybeRealpath(rawPath);\n const searchResults: ResolutionResult = Object.create(null);\n if (!rootPath) {\n return searchResults;\n }\n\n const resolvedDependencies: DependencyResolution[] = [];\n\n const localModuleTarget = await maybeRealpath(fastJoin(rootPath, 'package.json'));\n if (localModuleTarget) {\n // If we have a `package.json` file in the search path, we're already dealing with a node module\n // and can skip the rest. This is a special case created by create-expo-module's `nativeModulesDir: ../`\n const resolution = await resolveDependency(rootPath, null, shouldIncludeDependency);\n if (resolution) resolvedDependencies.push(resolution);\n } else {\n const dirents = await fs.promises.readdir(rootPath!, { withFileTypes: true });\n await taskAll(dirents, async (entry) => {\n if (entry.isSymbolicLink()) {\n const resolution = await resolveDependency(rootPath, entry.name, shouldIncludeDependency);\n if (resolution) resolvedDependencies.push(resolution);\n } else if (entry.isDirectory()) {\n if (entry.name === 'node_modules') {\n // Ignore nested node_modules folder\n }\n if (entry.name[0] === '.') {\n // Ignore hidden folders\n } else if (entry.name[0] === '@') {\n // NOTE: We don't expect @-scope folders to be symlinks\n const entryPath = fastJoin(rootPath, entry.name);\n const childEntries = await fs.promises.readdir(entryPath, { withFileTypes: true });\n await Promise.all(\n childEntries.map(async (child) => {\n const dependencyName = `${entry.name}/${child.name}`;\n if (child.isDirectory() || child.isSymbolicLink()) {\n const resolution = await resolveDependency(\n rootPath,\n dependencyName,\n shouldIncludeDependency\n );\n if (resolution) resolvedDependencies.push(resolution);\n }\n })\n );\n } else {\n const resolution = await resolveDependency(rootPath, entry.name, shouldIncludeDependency);\n if (resolution) resolvedDependencies.push(resolution);\n }\n }\n });\n }\n\n for (let idx = 0; idx < resolvedDependencies.length; idx++) {\n const resolution = resolvedDependencies[idx];\n const prevEntry = searchResults[resolution.name];\n if (prevEntry != null && resolution.path !== prevEntry.path) {\n (prevEntry.duplicates ?? (prevEntry.duplicates = [])).push({\n name: resolution.name,\n version: resolution.version,\n path: resolution.path,\n originPath: resolution.originPath,\n });\n } else if (prevEntry == null) {\n searchResults[resolution.name] = resolution;\n }\n }\n\n return searchResults;\n}\n"]}
1
+ {"version":3,"file":"scanning.js","sourceRoot":"","sources":["../../src/dependencies/scanning.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\n\nimport {\n type ResolutionResult,\n type DependencyResolution,\n DependencyResolutionSource,\n} from './types';\nimport { taskAll } from '../concurrency';\nimport { defaultShouldIncludeDependency } from './utils';\nimport { loadPackageJson, maybeRealpath, fastJoin } from '../utils';\n\nasync function resolveDependency(\n basePath: string,\n dependencyName: string | null,\n shouldIncludeDependency: (dependencyName: string) => boolean\n): Promise<DependencyResolution | null> {\n if (dependencyName && !shouldIncludeDependency(dependencyName)) {\n return null;\n }\n const originPath = dependencyName ? fastJoin(basePath, dependencyName) : basePath;\n const realPath = await maybeRealpath(originPath);\n const packageJson = await loadPackageJson(fastJoin(realPath || originPath, 'package.json'));\n if (packageJson) {\n return {\n source: DependencyResolutionSource.SEARCH_PATH,\n name: packageJson.name || '',\n version: packageJson.version || '',\n path: realPath || originPath,\n originPath,\n duplicates: null,\n depth: 0,\n };\n } else if (dependencyName && realPath) {\n return {\n source: DependencyResolutionSource.SEARCH_PATH,\n name: dependencyName.toLowerCase(),\n version: '',\n path: realPath,\n originPath,\n duplicates: null,\n depth: 0,\n };\n } else {\n return null;\n }\n}\n\n/** Create a mock resolution for a local search path dependency at the given path */\nexport async function mockDependencyAtPath(originPath: string): Promise<DependencyResolution> {\n const realPath = await maybeRealpath(originPath);\n const packageJson = await loadPackageJson(fastJoin(realPath || originPath, 'package.json'));\n return {\n source: DependencyResolutionSource.SEARCH_PATH,\n name: packageJson?.name || 'local-module', // NOTE: Mock name\n version: packageJson?.version ?? '',\n path: realPath ?? originPath,\n originPath,\n duplicates: null,\n depth: 0,\n };\n}\n\ninterface ResolutionOptions {\n shouldIncludeDependency?(name: string): boolean;\n}\n\nexport async function scanDependenciesInSearchPath(\n rawPath: string,\n { shouldIncludeDependency = defaultShouldIncludeDependency }: ResolutionOptions = {}\n): Promise<ResolutionResult> {\n const rootPath = await maybeRealpath(rawPath);\n const searchResults: ResolutionResult = Object.create(null);\n if (!rootPath) {\n return searchResults;\n }\n\n const resolvedDependencies: DependencyResolution[] = [];\n\n const localModuleTarget = await maybeRealpath(fastJoin(rootPath, 'package.json'));\n if (localModuleTarget) {\n // If we have a `package.json` file in the search path, we're already dealing with a node module\n // and can skip the rest. This is a special case created by create-expo-module's `nativeModulesDir: ../`\n const resolution = await resolveDependency(rootPath, null, shouldIncludeDependency);\n if (resolution) resolvedDependencies.push(resolution);\n } else {\n const dirents = await fs.promises.readdir(rootPath!, { withFileTypes: true });\n await taskAll(dirents, async (entry) => {\n if (entry.isSymbolicLink()) {\n const resolution = await resolveDependency(rootPath, entry.name, shouldIncludeDependency);\n if (resolution) resolvedDependencies.push(resolution);\n } else if (entry.isDirectory()) {\n if (entry.name === 'node_modules') {\n // Ignore nested node_modules folder\n }\n if (entry.name[0] === '.') {\n // Ignore hidden folders\n } else if (entry.name[0] === '@') {\n // NOTE: We don't expect @-scope folders to be symlinks\n const entryPath = fastJoin(rootPath, entry.name);\n const childEntries = await fs.promises.readdir(entryPath, { withFileTypes: true });\n await Promise.all(\n childEntries.map(async (child) => {\n const dependencyName = `${entry.name}/${child.name}`;\n if (child.isDirectory() || child.isSymbolicLink()) {\n const resolution = await resolveDependency(\n rootPath,\n dependencyName,\n shouldIncludeDependency\n );\n if (resolution) resolvedDependencies.push(resolution);\n }\n })\n );\n } else {\n const resolution = await resolveDependency(rootPath, entry.name, shouldIncludeDependency);\n if (resolution) resolvedDependencies.push(resolution);\n }\n }\n });\n }\n\n for (let idx = 0; idx < resolvedDependencies.length; idx++) {\n const resolution = resolvedDependencies[idx];\n const prevEntry = searchResults[resolution.name];\n if (prevEntry != null && resolution.path !== prevEntry.path) {\n (prevEntry.duplicates ?? (prevEntry.duplicates = [])).push({\n name: resolution.name,\n version: resolution.version,\n path: resolution.path,\n originPath: resolution.originPath,\n });\n } else if (prevEntry == null) {\n searchResults[resolution.name] = resolution;\n }\n }\n\n return searchResults;\n}\n"]}
@@ -4,6 +4,7 @@ export * from './types';
4
4
  export * from './autolinking';
5
5
  export * from './platforms';
6
6
  export { ResolutionResult, BaseDependencyResolution, DependencyResolution, DependencyResolutionSource, CachedDependenciesLinker, CachedDependenciesSearchOptions, makeCachedDependenciesLinker, scanDependencyResolutionsForPlatform, scanExpoModuleResolutionsForPlatform, } from './dependencies';
7
+ export * from './utilities';
7
8
  /** @deprecated */
8
9
  export declare function mergeLinkingOptionsAsync<Options extends Partial<AutolinkingCommonArguments>>(argumentsOptions: Options): Promise<Options & AutolinkingOptions>;
9
10
  interface QueryAutolinkingModulesFromProjectParams extends Partial<AutolinkingCommonArguments> {
package/build/exports.js CHANGED
@@ -34,6 +34,7 @@ var dependencies_1 = require("./dependencies");
34
34
  Object.defineProperty(exports, "makeCachedDependenciesLinker", { enumerable: true, get: function () { return dependencies_1.makeCachedDependenciesLinker; } });
35
35
  Object.defineProperty(exports, "scanDependencyResolutionsForPlatform", { enumerable: true, get: function () { return dependencies_1.scanDependencyResolutionsForPlatform; } });
36
36
  Object.defineProperty(exports, "scanExpoModuleResolutionsForPlatform", { enumerable: true, get: function () { return dependencies_1.scanExpoModuleResolutionsForPlatform; } });
37
+ __exportStar(require("./utilities"), exports);
37
38
  /** @deprecated */
38
39
  async function mergeLinkingOptionsAsync(argumentsOptions) {
39
40
  const autolinkingOptionsLoader = (0, autolinkingOptions_1.createAutolinkingOptionsLoader)(argumentsOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"exports.js","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AA8BA,4DASC;AAQD,0FAaC;AAGD,kDAQC;AAGD,0DAKC;AA/ED,4CAAoB;AACpB,gDAAwB;AAExB,2DAA6D;AAC7D,iEAAmE;AACnE,sEAKuC;AAGvC,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAE5B,+CAUwB;AAHtB,4HAAA,4BAA4B,OAAA;AAC5B,oIAAA,oCAAoC,OAAA;AACpC,oIAAA,oCAAoC,OAAA;AAGtC,kBAAkB;AACX,KAAK,UAAU,wBAAwB,CAC5C,gBAAyB;IAEzB,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC,gBAAgB,CAAC,CAAC;IAClF,OAAO;QACL,GAAG,gBAAgB;QACnB,GAAG,CAAC,MAAM,wBAAwB,CAAC,kBAAkB,EAAE,CAAC;QACxD,WAAW,EAAE,wBAAwB,CAAC,UAAU,EAAE;KACnD,CAAC;AACJ,CAAC;AAOD,kBAAkB;AACX,KAAK,UAAU,uCAAuC,CAC3D,WAAmB,EACnB,OAAiD;IAEjD,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC;QAC9D,GAAG,OAAO;QACV,iDAAiD;QACjD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,WAAW;KAChD,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,CAAC;IAC5D,MAAM,kBAAkB,GAAG,MAAM,wBAAwB,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/F,MAAM,aAAa,GAAG,MAAM,IAAA,8BAAgB,EAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,IAAA,oCAAmB,EAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AACtE,CAAC;AAED,kBAAkB;AAClB,SAAgB,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7D,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,kBAAkB;AACX,KAAK,UAAU,uBAAuB,CAC3C,WAA4B,EAC5B,GAAW;IAEX,OAAO,IAAA,yCAAoB,EAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { findModulesAsync } from './autolinking/findModules';\nimport { resolveModulesAsync } from './autolinking/resolveModules';\nimport {\n AutolinkingCommonArguments,\n AutolinkingOptions,\n createAutolinkingOptionsLoader,\n filterMapSearchPaths,\n} from './commands/autolinkingOptions';\nimport { ModuleDescriptor, SupportedPlatform } from './types';\n\nexport * from './types';\nexport * from './autolinking';\nexport * from './platforms';\n\nexport {\n ResolutionResult,\n BaseDependencyResolution,\n DependencyResolution,\n DependencyResolutionSource,\n CachedDependenciesLinker,\n CachedDependenciesSearchOptions,\n makeCachedDependenciesLinker,\n scanDependencyResolutionsForPlatform,\n scanExpoModuleResolutionsForPlatform,\n} from './dependencies';\n\n/** @deprecated */\nexport async function mergeLinkingOptionsAsync<Options extends Partial<AutolinkingCommonArguments>>(\n argumentsOptions: Options\n): Promise<Options & AutolinkingOptions> {\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader(argumentsOptions);\n return {\n ...argumentsOptions,\n ...(await autolinkingOptionsLoader.getPlatformOptions()),\n projectRoot: autolinkingOptionsLoader.getAppRoot(),\n };\n}\n\ninterface QueryAutolinkingModulesFromProjectParams extends Partial<AutolinkingCommonArguments> {\n platform: SupportedPlatform;\n [extra: string]: unknown;\n}\n\n/** @deprecated */\nexport async function queryAutolinkingModulesFromProjectAsync(\n projectRoot: string,\n options: QueryAutolinkingModulesFromProjectParams\n): Promise<ModuleDescriptor[]> {\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader({\n ...options,\n // NOTE(@kitten): This has always been duplicated\n projectRoot: options.projectRoot ?? projectRoot,\n });\n const appRoot = await autolinkingOptionsLoader.getAppRoot();\n const autolinkingOptions = await autolinkingOptionsLoader.getPlatformOptions(options.platform);\n const searchResults = await findModulesAsync({ appRoot, autolinkingOptions });\n return await resolveModulesAsync(searchResults, autolinkingOptions);\n}\n\n/** @deprecated */\nexport function findProjectRootSync(cwd: string = process.cwd()): string {\n for (let dir = cwd; path.dirname(dir) !== dir; dir = path.dirname(dir)) {\n const file = path.resolve(dir, 'package.json');\n if (fs.existsSync(file)) {\n return file;\n }\n }\n throw new Error(`Couldn't find \"package.json\" up from path \"${cwd}\"`);\n}\n\n/** @deprecated */\nexport async function resolveSearchPathsAsync(\n searchPaths: string[] | null,\n cwd: string\n): Promise<string[]> {\n return filterMapSearchPaths(searchPaths, cwd) ?? [];\n}\n"]}
1
+ {"version":3,"file":"exports.js","sourceRoot":"","sources":["../src/exports.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAgCA,4DASC;AAQD,0FAaC;AAGD,kDAQC;AAGD,0DAKC;AAjFD,4CAAoB;AACpB,gDAAwB;AAExB,2DAA6D;AAC7D,iEAAmE;AACnE,sEAKuC;AAGvC,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAE5B,+CAUwB;AAHtB,4HAAA,4BAA4B,OAAA;AAC5B,oIAAA,oCAAoC,OAAA;AACpC,oIAAA,oCAAoC,OAAA;AAGtC,8CAA4B;AAE5B,kBAAkB;AACX,KAAK,UAAU,wBAAwB,CAC5C,gBAAyB;IAEzB,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC,gBAAgB,CAAC,CAAC;IAClF,OAAO;QACL,GAAG,gBAAgB;QACnB,GAAG,CAAC,MAAM,wBAAwB,CAAC,kBAAkB,EAAE,CAAC;QACxD,WAAW,EAAE,wBAAwB,CAAC,UAAU,EAAE;KACnD,CAAC;AACJ,CAAC;AAOD,kBAAkB;AACX,KAAK,UAAU,uCAAuC,CAC3D,WAAmB,EACnB,OAAiD;IAEjD,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC;QAC9D,GAAG,OAAO;QACV,iDAAiD;QACjD,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,WAAW;KAChD,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,wBAAwB,CAAC,UAAU,EAAE,CAAC;IAC5D,MAAM,kBAAkB,GAAG,MAAM,wBAAwB,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/F,MAAM,aAAa,GAAG,MAAM,IAAA,8BAAgB,EAAC,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9E,OAAO,MAAM,IAAA,oCAAmB,EAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AACtE,CAAC;AAED,kBAAkB;AAClB,SAAgB,mBAAmB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAC7D,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,GAAG,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8CAA8C,GAAG,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,kBAAkB;AACX,KAAK,UAAU,uBAAuB,CAC3C,WAA4B,EAC5B,GAAW;IAEX,OAAO,IAAA,yCAAoB,EAAC,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { findModulesAsync } from './autolinking/findModules';\nimport { resolveModulesAsync } from './autolinking/resolveModules';\nimport {\n AutolinkingCommonArguments,\n AutolinkingOptions,\n createAutolinkingOptionsLoader,\n filterMapSearchPaths,\n} from './commands/autolinkingOptions';\nimport { ModuleDescriptor, SupportedPlatform } from './types';\n\nexport * from './types';\nexport * from './autolinking';\nexport * from './platforms';\n\nexport {\n ResolutionResult,\n BaseDependencyResolution,\n DependencyResolution,\n DependencyResolutionSource,\n CachedDependenciesLinker,\n CachedDependenciesSearchOptions,\n makeCachedDependenciesLinker,\n scanDependencyResolutionsForPlatform,\n scanExpoModuleResolutionsForPlatform,\n} from './dependencies';\n\nexport * from './utilities';\n\n/** @deprecated */\nexport async function mergeLinkingOptionsAsync<Options extends Partial<AutolinkingCommonArguments>>(\n argumentsOptions: Options\n): Promise<Options & AutolinkingOptions> {\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader(argumentsOptions);\n return {\n ...argumentsOptions,\n ...(await autolinkingOptionsLoader.getPlatformOptions()),\n projectRoot: autolinkingOptionsLoader.getAppRoot(),\n };\n}\n\ninterface QueryAutolinkingModulesFromProjectParams extends Partial<AutolinkingCommonArguments> {\n platform: SupportedPlatform;\n [extra: string]: unknown;\n}\n\n/** @deprecated */\nexport async function queryAutolinkingModulesFromProjectAsync(\n projectRoot: string,\n options: QueryAutolinkingModulesFromProjectParams\n): Promise<ModuleDescriptor[]> {\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader({\n ...options,\n // NOTE(@kitten): This has always been duplicated\n projectRoot: options.projectRoot ?? projectRoot,\n });\n const appRoot = await autolinkingOptionsLoader.getAppRoot();\n const autolinkingOptions = await autolinkingOptionsLoader.getPlatformOptions(options.platform);\n const searchResults = await findModulesAsync({ appRoot, autolinkingOptions });\n return await resolveModulesAsync(searchResults, autolinkingOptions);\n}\n\n/** @deprecated */\nexport function findProjectRootSync(cwd: string = process.cwd()): string {\n for (let dir = cwd; path.dirname(dir) !== dir; dir = path.dirname(dir)) {\n const file = path.resolve(dir, 'package.json');\n if (fs.existsSync(file)) {\n return file;\n }\n }\n throw new Error(`Couldn't find \"package.json\" up from path \"${cwd}\"`);\n}\n\n/** @deprecated */\nexport async function resolveSearchPathsAsync(\n searchPaths: string[] | null,\n cwd: string\n): Promise<string[]> {\n return filterMapSearchPaths(searchPaths, cwd) ?? [];\n}\n"]}
@@ -14,6 +14,22 @@ const iosResolver_1 = require("./iosResolver");
14
14
  const ExpoModuleConfig_1 = require("../ExpoModuleConfig");
15
15
  const dependencies_1 = require("../dependencies");
16
16
  const webResolver_1 = require("./webResolver");
17
+ const deepObjectMerge = (target, source) => {
18
+ if (source !== undefined &&
19
+ typeof target === 'object' &&
20
+ target != null &&
21
+ !Array.isArray(target) &&
22
+ (!target.constructor || target.constructor === Object) &&
23
+ typeof source === 'object' &&
24
+ !Array.isArray(source)) {
25
+ target = { ...target };
26
+ for (const key in source) {
27
+ target[key] = deepObjectMerge(target[key], source[key]);
28
+ }
29
+ return target;
30
+ }
31
+ return source !== undefined ? source : target;
32
+ };
17
33
  const isMissingFBReactNativeSpecCodegenOutput = async (reactNativePath) => {
18
34
  const generatedDir = path_1.default.resolve(reactNativePath, 'React/FBReactNativeSpec');
19
35
  try {
@@ -42,15 +58,16 @@ async function resolveReactNativeModule(resolution, projectConfig, platform, exc
42
58
  const shouldUseOriginPath = platform === 'android' && resolution.path.includes('=') && resolution.path.includes('.pnpm');
43
59
  const modulePath = shouldUseOriginPath ? resolution.originPath : resolution.path;
44
60
  const libraryConfig = (await (0, config_1.loadConfigAsync)(modulePath));
45
- const reactNativeConfig = {
46
- ...libraryConfig?.dependency,
47
- ...projectConfig?.dependencies?.[resolution.name],
48
- };
49
61
  if (Object.keys(libraryConfig?.platforms ?? {}).length > 0) {
50
62
  // Package defines platforms would be a platform host package.
51
63
  // The rnc-cli will skip this package.
52
64
  return null;
53
65
  }
66
+ let reactNativeConfig = libraryConfig?.dependency ?? {};
67
+ const projectDependencyOverride = projectConfig?.dependencies?.[resolution.name];
68
+ if (projectDependencyOverride != null) {
69
+ reactNativeConfig = deepObjectMerge(reactNativeConfig, projectDependencyOverride);
70
+ }
54
71
  let maybeExpoModuleConfig;
55
72
  if (!libraryConfig) {
56
73
  // NOTE(@kitten): If we don't have an explicit react-native.config.{js,ts} file,
@@ -1 +1 @@
1
- {"version":3,"file":"reactNativeConfig.js","sourceRoot":"","sources":["../../src/reactNativeConfig/reactNativeConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport type { SupportedPlatform } from '../types';\nimport {\n findGradleAndManifestAsync,\n parsePackageNameAsync,\n resolveDependencyConfigImplAndroidAsync,\n} from './androidResolver';\nimport { loadConfigAsync } from './config';\nimport { resolveDependencyConfigImplIosAsync } from './iosResolver';\nimport type {\n RNConfigDependency,\n RNConfigDependencyAndroid,\n RNConfigDependencyIos,\n RNConfigDependencyWeb,\n RNConfigReactNativeAppProjectConfig,\n RNConfigReactNativeLibraryConfig,\n RNConfigReactNativeProjectConfig,\n RNConfigResult,\n} from './reactNativeConfig.types';\nimport { discoverExpoModuleConfigAsync, ExpoModuleConfig } from '../ExpoModuleConfig';\nimport { AutolinkingOptions } from '../commands/autolinkingOptions';\nimport {\n DependencyResolution,\n filterMapResolutionResult,\n mergeResolutionResults,\n scanDependenciesFromRNProjectConfig,\n scanDependenciesInSearchPath,\n scanDependenciesRecursively,\n} from '../dependencies';\nimport { checkDependencyWebAsync } from './webResolver';\n\nconst isMissingFBReactNativeSpecCodegenOutput = async (reactNativePath: string) => {\n const generatedDir = path.resolve(reactNativePath, 'React/FBReactNativeSpec');\n try {\n const stat = await fs.promises.lstat(generatedDir);\n return !stat.isDirectory();\n } catch {\n return true;\n }\n};\n\nexport async function resolveReactNativeModule(\n resolution: DependencyResolution,\n projectConfig: RNConfigReactNativeProjectConfig | null,\n platform: SupportedPlatform,\n excludeNames: Set<string>\n): Promise<RNConfigDependency | null> {\n if (excludeNames.has(resolution.name)) {\n return null;\n } else if (resolution.name === 'react-native' || resolution.name === 'react-native-macos') {\n // Starting from version 0.76, the `react-native` package only defines platforms\n // when @react-native-community/cli-platform-android/ios is installed.\n // Therefore, we need to manually filter it out.\n // NOTE(@kitten): `loadConfigAsync` is skipped too, because react-native's config is too slow\n return null;\n }\n\n // Workaround for Android Gradle/Prefab issue with special characters in paths.\n // pnpm creates virtual store paths with '=' characters (e.g., _patch_hash=abc123),\n // which cause build failures on Android due to Prefab not properly escaping them.\n // See: https://github.com/google/prefab/issues/187\n const shouldUseOriginPath =\n platform === 'android' && resolution.path.includes('=') && resolution.path.includes('.pnpm');\n const modulePath = shouldUseOriginPath ? resolution.originPath : resolution.path;\n\n const libraryConfig = (await loadConfigAsync(modulePath)) as RNConfigReactNativeLibraryConfig;\n const reactNativeConfig = {\n ...libraryConfig?.dependency,\n ...projectConfig?.dependencies?.[resolution.name],\n };\n\n if (Object.keys(libraryConfig?.platforms ?? {}).length > 0) {\n // Package defines platforms would be a platform host package.\n // The rnc-cli will skip this package.\n return null;\n }\n\n let maybeExpoModuleConfig: ExpoModuleConfig | null | undefined;\n if (!libraryConfig) {\n // NOTE(@kitten): If we don't have an explicit react-native.config.{js,ts} file,\n // we should pass the Expo Module config (if it exists) to the resolvers below,\n // which can then decide if the React Native inferred config and Expo Module\n // configs conflict\n try {\n maybeExpoModuleConfig = await discoverExpoModuleConfigAsync(resolution.path);\n } catch {\n // We ignore invalid Expo Modules for the purpose of auto-linking and\n // pretend the config doesn't exist, if it isn't valid JSON\n }\n }\n\n let platformData:\n | RNConfigDependencyAndroid\n | RNConfigDependencyIos\n | RNConfigDependencyWeb\n | null = null;\n if (platform === 'android') {\n platformData = await resolveDependencyConfigImplAndroidAsync(\n modulePath,\n reactNativeConfig.platforms?.android,\n maybeExpoModuleConfig\n );\n } else if (platform === 'ios') {\n platformData = await resolveDependencyConfigImplIosAsync(\n resolution,\n reactNativeConfig.platforms?.ios,\n maybeExpoModuleConfig\n );\n } else if (platform === 'web') {\n platformData = await checkDependencyWebAsync(\n resolution,\n reactNativeConfig,\n maybeExpoModuleConfig\n );\n }\n return (\n platformData && {\n root: modulePath,\n name: resolution.name,\n platforms: {\n [platform]: platformData,\n },\n }\n );\n}\n\ninterface CreateRNConfigParams {\n appRoot: string;\n sourceDir: string | undefined;\n autolinkingOptions: AutolinkingOptions & { platform: SupportedPlatform };\n}\n\n/**\n * Create config for react-native core autolinking.\n */\nexport async function createReactNativeConfigAsync({\n appRoot,\n sourceDir,\n autolinkingOptions,\n}: CreateRNConfigParams): Promise<RNConfigResult> {\n const excludeNames = new Set(autolinkingOptions.exclude);\n const projectConfig = (await loadConfigAsync(appRoot)) as RNConfigReactNativeProjectConfig;\n\n // custom native modules should be resolved first so that they can override other modules\n const searchPaths = autolinkingOptions.nativeModulesDir\n ? [autolinkingOptions.nativeModulesDir, ...autolinkingOptions.searchPaths]\n : autolinkingOptions.searchPaths;\n\n const limitDepth = autolinkingOptions.legacy_shallowReactNativeLinking ? 1 : undefined;\n\n const resolutions = mergeResolutionResults(\n await Promise.all([\n scanDependenciesFromRNProjectConfig(appRoot, projectConfig),\n ...searchPaths.map((searchPath) => scanDependenciesInSearchPath(searchPath)),\n scanDependenciesRecursively(appRoot, { limitDepth }),\n ])\n );\n\n const dependencies = await filterMapResolutionResult(resolutions, (resolution) =>\n resolveReactNativeModule(resolution, projectConfig, autolinkingOptions.platform, excludeNames)\n );\n\n // See: https://github.com/facebook/react-native/pull/53690\n // When we're building react-native from source without these generated files, we need to force them to be generated\n // Every published react-native version (or out-of-tree version) should have these files, but building from the raw repo won't (e.g. Expo Go)\n const reactNativeResolution = resolutions['react-native'];\n if (\n reactNativeResolution &&\n autolinkingOptions.platform === 'ios' &&\n (await isMissingFBReactNativeSpecCodegenOutput(reactNativeResolution.path))\n ) {\n dependencies['react-native'] = {\n root: reactNativeResolution.path,\n name: 'react-native',\n platforms: {\n ios: {\n // This will trigger a warning in list_native_modules but will trigger the artifacts\n // codegen codepath as expected\n podspecPath: '',\n version: reactNativeResolution.version,\n configurations: [],\n scriptPhases: [],\n },\n },\n };\n }\n\n return {\n root: appRoot,\n reactNativePath: resolutions['react-native']?.path!,\n dependencies,\n project: await resolveAppProjectConfigAsync(appRoot, autolinkingOptions.platform, sourceDir),\n };\n}\n\nexport async function resolveAppProjectConfigAsync(\n projectRoot: string,\n platform: SupportedPlatform,\n sourceDir?: string\n): Promise<RNConfigReactNativeAppProjectConfig> {\n // TODO(@kitten): use the commandRoot here to find these files in non <projectRoot>/<platform> folders\n if (platform === 'android') {\n const androidDir = sourceDir ?? path.join(projectRoot, 'android');\n const { gradle, manifest } = await findGradleAndManifestAsync({ androidDir, isLibrary: false });\n if (gradle == null || manifest == null) {\n return {};\n }\n const packageName = await parsePackageNameAsync(manifest, gradle);\n\n return {\n android: {\n packageName: packageName ?? '',\n sourceDir: sourceDir ?? path.join(projectRoot, 'android'),\n },\n };\n }\n\n if (platform === 'ios') {\n return {\n ios: {\n sourceDir: sourceDir ?? path.join(projectRoot, 'ios'),\n },\n };\n }\n\n return {};\n}\n"]}
1
+ {"version":3,"file":"reactNativeConfig.js","sourceRoot":"","sources":["../../src/reactNativeConfig/reactNativeConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport type { SupportedPlatform } from '../types';\nimport {\n findGradleAndManifestAsync,\n parsePackageNameAsync,\n resolveDependencyConfigImplAndroidAsync,\n} from './androidResolver';\nimport { loadConfigAsync } from './config';\nimport { resolveDependencyConfigImplIosAsync } from './iosResolver';\nimport type {\n RNConfigDependency,\n RNConfigDependencyAndroid,\n RNConfigDependencyIos,\n RNConfigDependencyWeb,\n RNConfigReactNativeAppProjectConfig,\n RNConfigReactNativeLibraryConfig,\n RNConfigReactNativeProjectConfig,\n RNConfigResult,\n} from './reactNativeConfig.types';\nimport { discoverExpoModuleConfigAsync, ExpoModuleConfig } from '../ExpoModuleConfig';\nimport { AutolinkingOptions } from '../commands/autolinkingOptions';\nimport {\n DependencyResolution,\n filterMapResolutionResult,\n mergeResolutionResults,\n scanDependenciesFromRNProjectConfig,\n scanDependenciesInSearchPath,\n scanDependenciesRecursively,\n} from '../dependencies';\nimport { checkDependencyWebAsync } from './webResolver';\n\nconst deepObjectMerge = (target: any, source: any): any => {\n if (\n source !== undefined &&\n typeof target === 'object' &&\n target != null &&\n !Array.isArray(target) &&\n (!target.constructor || target.constructor === Object) &&\n typeof source === 'object' &&\n !Array.isArray(source)\n ) {\n target = { ...target };\n for (const key in source) {\n target[key] = deepObjectMerge(target[key], source[key]);\n }\n return target;\n }\n return source !== undefined ? source : target;\n};\n\nconst isMissingFBReactNativeSpecCodegenOutput = async (reactNativePath: string) => {\n const generatedDir = path.resolve(reactNativePath, 'React/FBReactNativeSpec');\n try {\n const stat = await fs.promises.lstat(generatedDir);\n return !stat.isDirectory();\n } catch {\n return true;\n }\n};\n\nexport async function resolveReactNativeModule(\n resolution: DependencyResolution,\n projectConfig: RNConfigReactNativeProjectConfig | null,\n platform: SupportedPlatform,\n excludeNames: Set<string>\n): Promise<RNConfigDependency | null> {\n if (excludeNames.has(resolution.name)) {\n return null;\n } else if (resolution.name === 'react-native' || resolution.name === 'react-native-macos') {\n // Starting from version 0.76, the `react-native` package only defines platforms\n // when @react-native-community/cli-platform-android/ios is installed.\n // Therefore, we need to manually filter it out.\n // NOTE(@kitten): `loadConfigAsync` is skipped too, because react-native's config is too slow\n return null;\n }\n\n // Workaround for Android Gradle/Prefab issue with special characters in paths.\n // pnpm creates virtual store paths with '=' characters (e.g., _patch_hash=abc123),\n // which cause build failures on Android due to Prefab not properly escaping them.\n // See: https://github.com/google/prefab/issues/187\n const shouldUseOriginPath =\n platform === 'android' && resolution.path.includes('=') && resolution.path.includes('.pnpm');\n const modulePath = shouldUseOriginPath ? resolution.originPath : resolution.path;\n\n const libraryConfig = (await loadConfigAsync(modulePath)) as RNConfigReactNativeLibraryConfig;\n if (Object.keys(libraryConfig?.platforms ?? {}).length > 0) {\n // Package defines platforms would be a platform host package.\n // The rnc-cli will skip this package.\n return null;\n }\n\n let reactNativeConfig = libraryConfig?.dependency ?? {};\n const projectDependencyOverride = projectConfig?.dependencies?.[resolution.name];\n if (projectDependencyOverride != null) {\n reactNativeConfig = deepObjectMerge(reactNativeConfig, projectDependencyOverride);\n }\n\n let maybeExpoModuleConfig: ExpoModuleConfig | null | undefined;\n if (!libraryConfig) {\n // NOTE(@kitten): If we don't have an explicit react-native.config.{js,ts} file,\n // we should pass the Expo Module config (if it exists) to the resolvers below,\n // which can then decide if the React Native inferred config and Expo Module\n // configs conflict\n try {\n maybeExpoModuleConfig = await discoverExpoModuleConfigAsync(resolution.path);\n } catch {\n // We ignore invalid Expo Modules for the purpose of auto-linking and\n // pretend the config doesn't exist, if it isn't valid JSON\n }\n }\n\n let platformData:\n | RNConfigDependencyAndroid\n | RNConfigDependencyIos\n | RNConfigDependencyWeb\n | null = null;\n if (platform === 'android') {\n platformData = await resolveDependencyConfigImplAndroidAsync(\n modulePath,\n reactNativeConfig.platforms?.android,\n maybeExpoModuleConfig\n );\n } else if (platform === 'ios') {\n platformData = await resolveDependencyConfigImplIosAsync(\n resolution,\n reactNativeConfig.platforms?.ios,\n maybeExpoModuleConfig\n );\n } else if (platform === 'web') {\n platformData = await checkDependencyWebAsync(\n resolution,\n reactNativeConfig,\n maybeExpoModuleConfig\n );\n }\n return (\n platformData && {\n root: modulePath,\n name: resolution.name,\n platforms: {\n [platform]: platformData,\n },\n }\n );\n}\n\ninterface CreateRNConfigParams {\n appRoot: string;\n sourceDir: string | undefined;\n autolinkingOptions: AutolinkingOptions & { platform: SupportedPlatform };\n}\n\n/**\n * Create config for react-native core autolinking.\n */\nexport async function createReactNativeConfigAsync({\n appRoot,\n sourceDir,\n autolinkingOptions,\n}: CreateRNConfigParams): Promise<RNConfigResult> {\n const excludeNames = new Set(autolinkingOptions.exclude);\n const projectConfig = (await loadConfigAsync(appRoot)) as RNConfigReactNativeProjectConfig;\n\n // custom native modules should be resolved first so that they can override other modules\n const searchPaths = autolinkingOptions.nativeModulesDir\n ? [autolinkingOptions.nativeModulesDir, ...autolinkingOptions.searchPaths]\n : autolinkingOptions.searchPaths;\n\n const limitDepth = autolinkingOptions.legacy_shallowReactNativeLinking ? 1 : undefined;\n\n const resolutions = mergeResolutionResults(\n await Promise.all([\n scanDependenciesFromRNProjectConfig(appRoot, projectConfig),\n ...searchPaths.map((searchPath) => scanDependenciesInSearchPath(searchPath)),\n scanDependenciesRecursively(appRoot, { limitDepth }),\n ])\n );\n\n const dependencies = await filterMapResolutionResult(resolutions, (resolution) =>\n resolveReactNativeModule(resolution, projectConfig, autolinkingOptions.platform, excludeNames)\n );\n\n // See: https://github.com/facebook/react-native/pull/53690\n // When we're building react-native from source without these generated files, we need to force them to be generated\n // Every published react-native version (or out-of-tree version) should have these files, but building from the raw repo won't (e.g. Expo Go)\n const reactNativeResolution = resolutions['react-native'];\n if (\n reactNativeResolution &&\n autolinkingOptions.platform === 'ios' &&\n (await isMissingFBReactNativeSpecCodegenOutput(reactNativeResolution.path))\n ) {\n dependencies['react-native'] = {\n root: reactNativeResolution.path,\n name: 'react-native',\n platforms: {\n ios: {\n // This will trigger a warning in list_native_modules but will trigger the artifacts\n // codegen codepath as expected\n podspecPath: '',\n version: reactNativeResolution.version,\n configurations: [],\n scriptPhases: [],\n },\n },\n };\n }\n\n return {\n root: appRoot,\n reactNativePath: resolutions['react-native']?.path!,\n dependencies,\n project: await resolveAppProjectConfigAsync(appRoot, autolinkingOptions.platform, sourceDir),\n };\n}\n\nexport async function resolveAppProjectConfigAsync(\n projectRoot: string,\n platform: SupportedPlatform,\n sourceDir?: string\n): Promise<RNConfigReactNativeAppProjectConfig> {\n // TODO(@kitten): use the commandRoot here to find these files in non <projectRoot>/<platform> folders\n if (platform === 'android') {\n const androidDir = sourceDir ?? path.join(projectRoot, 'android');\n const { gradle, manifest } = await findGradleAndManifestAsync({ androidDir, isLibrary: false });\n if (gradle == null || manifest == null) {\n return {};\n }\n const packageName = await parsePackageNameAsync(manifest, gradle);\n\n return {\n android: {\n packageName: packageName ?? '',\n sourceDir: sourceDir ?? path.join(projectRoot, 'android'),\n },\n };\n }\n\n if (platform === 'ios') {\n return {\n ios: {\n sourceDir: sourceDir ?? path.join(projectRoot, 'ios'),\n },\n };\n }\n\n return {};\n}\n"]}
@@ -0,0 +1 @@
1
+ export { isNativeModuleAsync } from './isNativeModule';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ // NOTE: `./utilities` is meant as stable API utilities exposed from `expo-modules-autolinking/exports`
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.isNativeModuleAsync = void 0;
5
+ var isNativeModule_1 = require("./isNativeModule");
6
+ Object.defineProperty(exports, "isNativeModuleAsync", { enumerable: true, get: function () { return isNativeModule_1.isNativeModuleAsync; } });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utilities/index.ts"],"names":[],"mappings":";AAAA,uGAAuG;;;AAEvG,mDAAuD;AAA9C,qHAAA,mBAAmB,OAAA","sourcesContent":["// NOTE: `./utilities` is meant as stable API utilities exposed from `expo-modules-autolinking/exports`\n\nexport { isNativeModuleAsync } from './isNativeModule';\n"]}
@@ -0,0 +1,2 @@
1
+ /** Check if a path is potentially a native module */
2
+ export declare function isNativeModuleAsync(maybeModulePath: string): Promise<boolean>;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNativeModuleAsync = isNativeModuleAsync;
4
+ const concurrency_1 = require("../concurrency");
5
+ const dependencies_1 = require("../dependencies");
6
+ /** Check if a path is potentially a native module */
7
+ async function isNativeModuleAsync(maybeModulePath) {
8
+ const resolution = await (0, dependencies_1.mockDependencyAtPath)(maybeModulePath);
9
+ const excludeNames = new Set();
10
+ const isNativeModules = await (0, concurrency_1.taskAll)(['android', 'apple'], (platform) => (0, dependencies_1.isNativeModuleAsync)(resolution, null, platform, excludeNames));
11
+ return isNativeModules.some((x) => !!x);
12
+ }
13
+ //# sourceMappingURL=isNativeModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isNativeModule.js","sourceRoot":"","sources":["../../src/utilities/isNativeModule.ts"],"names":[],"mappings":";;AAQA,kDAOC;AAfD,gDAAyC;AACzC,kDAGyB;AAGzB,qDAAqD;AAC9C,KAAK,UAAU,mBAAmB,CAAC,eAAuB;IAC/D,MAAM,UAAU,GAAG,MAAM,IAAA,mCAAoB,EAAC,eAAe,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,eAAe,GAAG,MAAM,IAAA,qBAAO,EAAC,CAAC,SAAS,EAAE,OAAO,CAAwB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC9F,IAAA,kCAA6B,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CACxE,CAAC;IACF,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC","sourcesContent":["import { taskAll } from '../concurrency';\nimport {\n mockDependencyAtPath,\n isNativeModuleAsync as isDependencyNativeModuleAsync,\n} from '../dependencies';\nimport { SupportedPlatform } from '../types';\n\n/** Check if a path is potentially a native module */\nexport async function isNativeModuleAsync(maybeModulePath: string) {\n const resolution = await mockDependencyAtPath(maybeModulePath);\n const excludeNames = new Set<string>();\n const isNativeModules = await taskAll(['android', 'apple'] as SupportedPlatform[], (platform) =>\n isDependencyNativeModuleAsync(resolution, null, platform, excludeNames)\n );\n return isNativeModules.some((x) => !!x);\n}\n"]}
@@ -36,6 +36,14 @@ Configs live in `packages/expo-modules-autolinking/external-configs/ios/<package
36
36
  - **Config location**: `packages/expo-modules-autolinking/external-configs/ios/<package-name>/spm.config.json`
37
37
  - **Source location**: `node_modules/<package-name>/` (resolved at build time)
38
38
  - **Output location**: `packages/precompile/.build/<package-name>/output/<flavor>/xcframeworks/`
39
+ - **Remote fallback**: external package prebuilds can download missing tarballs from a remote host when `EXPO_PRECOMPILED_MODULES_BASE_URL` is set.
40
+
41
+ ### Remote Artifact Downloads
42
+
43
+ Remote downloads are opt-in via `EXPO_PRECOMPILED_MODULES_BASE_URL`.
44
+
45
+ - Supports `http://` and `https://` URLs.
46
+ - Final download path: `<baseUrl>/<npm-package>/output/<packageVersion>/<reactNativeVersion>/<hermesVersion>/<flavor>/xcframeworks/<Product>.tar.gz` when versions are known, otherwise `<baseUrl>/<npm-package>/output/<flavor>/xcframeworks/<Product>.tar.gz`
39
47
 
40
48
  ### The SPMPackageSource Interface
41
49
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-modules-autolinking",
3
- "version": "55.0.17",
3
+ "version": "55.0.19",
4
4
  "description": "Scripts that autolink Expo modules.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -43,5 +43,5 @@
43
43
  "chalk": "^4.1.0",
44
44
  "commander": "^7.2.0"
45
45
  },
46
- "gitHead": "ba4ff190e5abefff1a7758006bf822d14e223218"
46
+ "gitHead": "be06cb45cb9eb8076b6910daa98813a6a3b03287"
47
47
  }
@@ -129,6 +129,7 @@ module Expo
129
129
  }
130
130
 
131
131
  Expo::PrecompiledModules.register_external_pods(@podfile, @target_definition, project_directory)
132
+ Expo::PrecompiledModules.register_companion_pods(@podfile, @target_definition, project_directory, tests_only: tests_only)
132
133
 
133
134
  self
134
135
  end