expo-modules-autolinking 2.1.9 → 2.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,19 @@
10
10
 
11
11
  ### 💡 Others
12
12
 
13
+ ## 2.1.11 — 2025-06-08
14
+
15
+ ### 💡 Others
16
+
17
+ - Remove "Please" from warnings and errors ([#36862](https://github.com/expo/expo/pull/36862) by [@brentvatne](https://github.com/brentvatne))
18
+ - Added `--transitive-linking-dependencies` option to support react-native-edge-to-edge autolinking in CNG projects. ([#37194](https://github.com/expo/expo/pull/37194) by [@kudo](https://github.com/kudo))
19
+
20
+ ## 2.1.10 — 2025-05-06
21
+
22
+ ### 🐛 Bug fixes
23
+
24
+ - [Android] Fixed project properties were not being resolved correctly. ([#36666](https://github.com/expo/expo/pull/36666) by [@lukmccall](https://github.com/lukmccall))
25
+
13
26
  ## 2.1.9 — 2025-04-30
14
27
 
15
28
  _This version does not introduce any user-facing changes._
@@ -14,7 +14,7 @@ import kotlin.jvm.optionals.getOrNull
14
14
  class ExpoRootProjectPlugin : Plugin<Project> {
15
15
  override fun apply(rootProject: Project) {
16
16
  val versionCatalogs = rootProject.extensions.getByType(VersionCatalogsExtension::class.java)
17
- val libs = versionCatalogs.find("libs")
17
+ val libs = versionCatalogs.find("expoLibs")
18
18
 
19
19
  with(rootProject) {
20
20
  defineDefaultProperties(libs)
@@ -15,7 +15,7 @@ function verifySearchResults(searchResults, options) {
15
15
  for (const moduleName in searchResults) {
16
16
  const revision = searchResults[moduleName];
17
17
  if (revision.duplicates?.length) {
18
- console.warn(`⚠️ Found multiple revisions of ${chalk_1.default.green(moduleName)}`);
18
+ console.warn(`⚠️ Found multiple versions of ${chalk_1.default.green(moduleName)}`);
19
19
  console.log(` - ${chalk_1.default.magenta(relativePath(revision))} (${chalk_1.default.cyan(revision.version)})`);
20
20
  for (const duplicate of revision.duplicates) {
21
21
  console.log(` - ${chalk_1.default.gray(relativePath(duplicate))} (${chalk_1.default.gray(duplicate.version)})`);
@@ -24,7 +24,7 @@ function verifySearchResults(searchResults, options) {
24
24
  }
25
25
  }
26
26
  if (counter > 0) {
27
- console.warn('⚠️ Please get rid of multiple revisions as it may introduce some side effects or compatibility issues');
27
+ console.warn('⚠️ Multiple versions of the same module may introduce some side effects or compatibility issues. Remove the duplicate versions.');
28
28
  }
29
29
  return counter;
30
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"verifySearchResults.js","sourceRoot":"","sources":["../../src/autolinking/verifySearchResults.ts"],"names":[],"mappings":";;;;;AAQA,kDAwBC;AAhCD,kDAA0B;AAC1B,gDAAwB;AAIxB;;GAEG;AACH,SAAgB,mBAAmB,CAAC,aAA4B,EAAE,OAAsB;IACtF,MAAM,YAAY,GAAqC,CAAC,GAAG,EAAE,EAAE,CAC7D,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,mCAAmC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,MAAM,eAAK,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAE7F,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CACV,wGAAwG,CACzG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import chalk from 'chalk';\nimport path from 'path';\n\nimport { PackageRevision, SearchOptions, SearchResults } from '../types';\n\n/**\n * Verifies the search results by checking whether there are no duplicates.\n */\nexport function verifySearchResults(searchResults: SearchResults, options: SearchOptions): number {\n const relativePath: (pkg: PackageRevision) => string = (pkg) =>\n path.relative(options.projectRoot, pkg.path);\n let counter = 0;\n\n for (const moduleName in searchResults) {\n const revision = searchResults[moduleName];\n\n if (revision.duplicates?.length) {\n console.warn(`⚠️ Found multiple revisions of ${chalk.green(moduleName)}`);\n console.log(` - ${chalk.magenta(relativePath(revision))} (${chalk.cyan(revision.version)})`);\n\n for (const duplicate of revision.duplicates) {\n console.log(` - ${chalk.gray(relativePath(duplicate))} (${chalk.gray(duplicate.version)})`);\n }\n counter++;\n }\n }\n if (counter > 0) {\n console.warn(\n '⚠️ Please get rid of multiple revisions as it may introduce some side effects or compatibility issues'\n );\n }\n return counter;\n}\n"]}
1
+ {"version":3,"file":"verifySearchResults.js","sourceRoot":"","sources":["../../src/autolinking/verifySearchResults.ts"],"names":[],"mappings":";;;;;AAQA,kDAwBC;AAhCD,kDAA0B;AAC1B,gDAAwB;AAIxB;;GAEG;AACH,SAAgB,mBAAmB,CAAC,aAA4B,EAAE,OAAsB;IACtF,MAAM,YAAY,GAAqC,CAAC,GAAG,EAAE,EAAE,CAC7D,cAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,kCAAkC,eAAK,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,MAAM,eAAK,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAE7F,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,MAAM,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9F,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CACV,kIAAkI,CACnI,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import chalk from 'chalk';\nimport path from 'path';\n\nimport { PackageRevision, SearchOptions, SearchResults } from '../types';\n\n/**\n * Verifies the search results by checking whether there are no duplicates.\n */\nexport function verifySearchResults(searchResults: SearchResults, options: SearchOptions): number {\n const relativePath: (pkg: PackageRevision) => string = (pkg) =>\n path.relative(options.projectRoot, pkg.path);\n let counter = 0;\n\n for (const moduleName in searchResults) {\n const revision = searchResults[moduleName];\n\n if (revision.duplicates?.length) {\n console.warn(`⚠️ Found multiple versions of ${chalk.green(moduleName)}`);\n console.log(` - ${chalk.magenta(relativePath(revision))} (${chalk.cyan(revision.version)})`);\n\n for (const duplicate of revision.duplicates) {\n console.log(` - ${chalk.gray(relativePath(duplicate))} (${chalk.gray(duplicate.version)})`);\n }\n counter++;\n }\n }\n if (counter > 0) {\n console.warn(\n '⚠️ Multiple versions of the same module may introduce some side effects or compatibility issues. Remove the duplicate versions.'\n );\n }\n return counter;\n}\n"]}
package/build/index.js CHANGED
@@ -47,6 +47,7 @@ function registerReactNativeConfigCommand() {
47
47
  return commander_1.default
48
48
  .command('react-native-config [paths...]')
49
49
  .option('-p, --platform [platform]', 'The platform that the resulting modules must support. Available options: "android", "ios"', 'ios')
50
+ .option('--transitive-linking-dependencies <transitiveLinkingDependencies...>', 'The transitive dependencies to include in autolinking. Internally used by fingerprint and only supported react-native-edge-to-edge.')
50
51
  .addOption(new commander_1.default.Option('--project-root <projectRoot>', 'The path to the root of the project').default(process.cwd(), 'process.cwd()'))
51
52
  .option('-j, --json', 'Output results in the plain JSON format.', () => true, false)
52
53
  .action(async (searchPaths, providedOptions) => {
@@ -64,10 +65,12 @@ function registerReactNativeConfigCommand() {
64
65
  ...providedOptions,
65
66
  projectRoot,
66
67
  });
68
+ const transitiveLinkingDependencies = providedOptions.transitiveLinkingDependencies ?? [];
67
69
  const options = {
68
70
  platform: linkingOptions.platform,
69
71
  projectRoot,
70
72
  searchPaths: linkingOptions.searchPaths,
73
+ transitiveLinkingDependencies,
71
74
  };
72
75
  const results = await (0, reactNativeConfig_1.createReactNativeConfigAsync)(options);
73
76
  if (providedOptions.json) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import commander from 'commander';\nimport path from 'path';\n\nimport {\n findModulesAsync,\n generateModulesProviderAsync,\n generatePackageListAsync,\n getConfiguration,\n getProjectPackageJsonPathAsync,\n mergeLinkingOptionsAsync,\n resolveExtraBuildDependenciesAsync,\n resolveModulesAsync,\n verifySearchResults,\n} from './autolinking';\nimport { type RNConfigCommandOptions, createReactNativeConfigAsync } from './reactNativeConfig';\nimport type {\n ModuleDescriptor,\n CommonNativeModuleDescriptor,\n GenerateModulesProviderOptions,\n GenerateOptions,\n ResolveOptions,\n SearchOptions,\n SearchResults,\n ModuleDescriptorAndroid,\n ModuleDescriptorIos,\n} from './types';\n\nfunction hasCoreFeatures(\n module: ModuleDescriptor\n): module is ModuleDescriptorAndroid | ModuleDescriptorIos {\n return (module as CommonNativeModuleDescriptor).coreFeatures !== undefined;\n}\n\n/**\n * Registers a command that only searches for available expo modules.\n */\nfunction registerSearchCommand<OptionsType extends SearchOptions>(\n commandName: string,\n fn: (search: SearchResults, options: OptionsType) => any\n) {\n return commander\n .command(`${commandName} [paths...]`)\n .option<string[] | null>(\n '-i, --ignore-paths <ignorePaths...>',\n 'Paths to ignore when looking up for modules.',\n (value, previous) => (previous ?? []).concat(value)\n )\n .option<string[] | null>(\n '-e, --exclude <exclude...>',\n 'Package names to exclude when looking up for modules.',\n (value, previous) => (previous ?? []).concat(value)\n )\n .option(\n '-p, --platform [platform]',\n 'The platform that the resulting modules must support. Available options: \"apple\", \"android\"',\n 'apple'\n )\n .option('--silent', 'Silence resolution warnings')\n .addOption(\n new commander.Option(\n '--project-root <projectRoot>',\n 'The path to the root of the project'\n ).default(process.cwd(), 'process.cwd()')\n )\n .option(\n '--only-project-deps',\n 'For a monorepo, include only modules that are the project dependencies.',\n true\n )\n .option('--no-only-project-deps', 'Opposite of --only-project-deps', false)\n .action(async (searchPaths, providedOptions) => {\n const options = await mergeLinkingOptionsAsync<OptionsType>(\n searchPaths.length > 0\n ? {\n ...providedOptions,\n searchPaths,\n }\n : providedOptions\n );\n const searchResults = await findModulesAsync(options);\n return await fn(searchResults, options);\n });\n}\n\n/**\n * Registers a command that searches for modules and then resolves them for specific platform.\n */\nfunction registerResolveCommand<OptionsType extends ResolveOptions>(\n commandName: string,\n fn: (search: SearchResults, options: OptionsType) => any\n) {\n return registerSearchCommand<OptionsType>(commandName, fn);\n}\n\n/**\n * Registry the `react-native-config` command.\n */\nfunction registerReactNativeConfigCommand() {\n return commander\n .command('react-native-config [paths...]')\n .option(\n '-p, --platform [platform]',\n 'The platform that the resulting modules must support. Available options: \"android\", \"ios\"',\n 'ios'\n )\n .addOption(\n new commander.Option(\n '--project-root <projectRoot>',\n 'The path to the root of the project'\n ).default(process.cwd(), 'process.cwd()')\n )\n .option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false)\n .action(async (searchPaths, providedOptions) => {\n if (!['android', 'ios'].includes(providedOptions.platform)) {\n throw new Error(`Unsupported platform: ${providedOptions.platform}`);\n }\n const projectRoot = path.dirname(\n await getProjectPackageJsonPathAsync(providedOptions.projectRoot)\n );\n const linkingOptions = await mergeLinkingOptionsAsync<SearchOptions>(\n searchPaths.length > 0\n ? {\n ...providedOptions,\n projectRoot,\n searchPaths,\n }\n : {\n ...providedOptions,\n projectRoot,\n }\n );\n const options: RNConfigCommandOptions = {\n platform: linkingOptions.platform,\n projectRoot,\n searchPaths: linkingOptions.searchPaths,\n };\n const results = await createReactNativeConfigAsync(options);\n if (providedOptions.json) {\n console.log(JSON.stringify(results));\n } else {\n console.log(require('util').inspect(results, false, null, true));\n }\n });\n}\n\nmodule.exports = async function (args: string[]) {\n // Searches for available expo modules.\n registerSearchCommand<SearchOptions & { json?: boolean }>('search', async (results, options) => {\n if (options.json) {\n console.log(JSON.stringify(results));\n } else {\n console.log(require('util').inspect(results, false, null, true));\n }\n }).option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false);\n\n // Checks whether there are no resolving issues in the current setup.\n registerSearchCommand('verify', (results, options) => {\n const numberOfDuplicates = verifySearchResults(results, options);\n if (!numberOfDuplicates) {\n console.log('✅ Everything is fine!');\n }\n });\n\n // Searches for available expo modules and resolves the results for given platform.\n registerResolveCommand('resolve', async (results, options) => {\n const modules = await resolveModulesAsync(results, options);\n const extraDependencies = await resolveExtraBuildDependenciesAsync(options);\n const configuration = getConfiguration(options);\n\n const coreFeatures = [\n ...modules.reduce<Set<string>>((acc, module) => {\n if (hasCoreFeatures(module)) {\n const features = module.coreFeatures ?? [];\n for (const feature of features) {\n acc.add(feature);\n }\n return acc;\n }\n\n return acc;\n }, new Set()),\n ];\n if (options.json) {\n console.log(\n JSON.stringify({\n extraDependencies,\n coreFeatures,\n modules,\n ...(configuration ? { configuration } : {}),\n })\n );\n } else {\n console.log(\n require('util').inspect(\n {\n extraDependencies,\n coreFeatures,\n modules,\n ...(configuration ? { configuration } : {}),\n },\n false,\n null,\n true\n )\n );\n }\n }).option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false);\n\n // Generates a source file listing all packages to link.\n // It's deprecated for apple platforms, use `generate-modules-provider` instead.\n registerResolveCommand<GenerateOptions>('generate-package-list', async (results, options) => {\n const modules = options.empty ? [] : await resolveModulesAsync(results, options);\n generatePackageListAsync(modules, options);\n })\n .option(\n '-t, --target <path>',\n 'Path to the target file, where the package list should be written to.'\n )\n .option(\n '-n, --namespace <namespace>',\n 'Java package name under which the package list should be placed.'\n )\n .option(\n '--empty',\n 'Whether to only generate an empty list. Might be used when the user opts-out of autolinking.',\n false\n );\n\n // Generates a source file listing all packages to link in the runtime.\n registerResolveCommand<GenerateModulesProviderOptions>(\n 'generate-modules-provider',\n async (results, options) => {\n const packages = options.packages ?? [];\n const modules = await resolveModulesAsync(results, options);\n const filteredModules = modules.filter((module) => packages.includes(module.packageName));\n\n generateModulesProviderAsync(filteredModules, options);\n }\n )\n .option(\n '-t, --target <path>',\n 'Path to the target file, where the package list should be written to.'\n )\n .option('--entitlement <path>', 'Path to the Apple code signing entitlements file.')\n .option(\n '-p, --packages <packages...>',\n 'Names of the packages to include in the generated modules provider.'\n );\n\n registerReactNativeConfigCommand();\n\n await commander\n .version(require('expo-modules-autolinking/package.json').version)\n .description('CLI command that searches for Expo modules to autolink them.')\n .parseAsync(args, { from: 'user' });\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import commander from 'commander';\nimport path from 'path';\n\nimport {\n findModulesAsync,\n generateModulesProviderAsync,\n generatePackageListAsync,\n getConfiguration,\n getProjectPackageJsonPathAsync,\n mergeLinkingOptionsAsync,\n resolveExtraBuildDependenciesAsync,\n resolveModulesAsync,\n verifySearchResults,\n} from './autolinking';\nimport { type RNConfigCommandOptions, createReactNativeConfigAsync } from './reactNativeConfig';\nimport type {\n ModuleDescriptor,\n CommonNativeModuleDescriptor,\n GenerateModulesProviderOptions,\n GenerateOptions,\n ResolveOptions,\n SearchOptions,\n SearchResults,\n ModuleDescriptorAndroid,\n ModuleDescriptorIos,\n} from './types';\n\nfunction hasCoreFeatures(\n module: ModuleDescriptor\n): module is ModuleDescriptorAndroid | ModuleDescriptorIos {\n return (module as CommonNativeModuleDescriptor).coreFeatures !== undefined;\n}\n\n/**\n * Registers a command that only searches for available expo modules.\n */\nfunction registerSearchCommand<OptionsType extends SearchOptions>(\n commandName: string,\n fn: (search: SearchResults, options: OptionsType) => any\n) {\n return commander\n .command(`${commandName} [paths...]`)\n .option<string[] | null>(\n '-i, --ignore-paths <ignorePaths...>',\n 'Paths to ignore when looking up for modules.',\n (value, previous) => (previous ?? []).concat(value)\n )\n .option<string[] | null>(\n '-e, --exclude <exclude...>',\n 'Package names to exclude when looking up for modules.',\n (value, previous) => (previous ?? []).concat(value)\n )\n .option(\n '-p, --platform [platform]',\n 'The platform that the resulting modules must support. Available options: \"apple\", \"android\"',\n 'apple'\n )\n .option('--silent', 'Silence resolution warnings')\n .addOption(\n new commander.Option(\n '--project-root <projectRoot>',\n 'The path to the root of the project'\n ).default(process.cwd(), 'process.cwd()')\n )\n .option(\n '--only-project-deps',\n 'For a monorepo, include only modules that are the project dependencies.',\n true\n )\n .option('--no-only-project-deps', 'Opposite of --only-project-deps', false)\n .action(async (searchPaths, providedOptions) => {\n const options = await mergeLinkingOptionsAsync<OptionsType>(\n searchPaths.length > 0\n ? {\n ...providedOptions,\n searchPaths,\n }\n : providedOptions\n );\n const searchResults = await findModulesAsync(options);\n return await fn(searchResults, options);\n });\n}\n\n/**\n * Registers a command that searches for modules and then resolves them for specific platform.\n */\nfunction registerResolveCommand<OptionsType extends ResolveOptions>(\n commandName: string,\n fn: (search: SearchResults, options: OptionsType) => any\n) {\n return registerSearchCommand<OptionsType>(commandName, fn);\n}\n\n/**\n * Registry the `react-native-config` command.\n */\nfunction registerReactNativeConfigCommand() {\n return commander\n .command('react-native-config [paths...]')\n .option(\n '-p, --platform [platform]',\n 'The platform that the resulting modules must support. Available options: \"android\", \"ios\"',\n 'ios'\n )\n .option(\n '--transitive-linking-dependencies <transitiveLinkingDependencies...>',\n 'The transitive dependencies to include in autolinking. Internally used by fingerprint and only supported react-native-edge-to-edge.'\n )\n .addOption(\n new commander.Option(\n '--project-root <projectRoot>',\n 'The path to the root of the project'\n ).default(process.cwd(), 'process.cwd()')\n )\n .option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false)\n .action(async (searchPaths, providedOptions) => {\n if (!['android', 'ios'].includes(providedOptions.platform)) {\n throw new Error(`Unsupported platform: ${providedOptions.platform}`);\n }\n const projectRoot = path.dirname(\n await getProjectPackageJsonPathAsync(providedOptions.projectRoot)\n );\n const linkingOptions = await mergeLinkingOptionsAsync<SearchOptions>(\n searchPaths.length > 0\n ? {\n ...providedOptions,\n projectRoot,\n searchPaths,\n }\n : {\n ...providedOptions,\n projectRoot,\n }\n );\n const transitiveLinkingDependencies = providedOptions.transitiveLinkingDependencies ?? [];\n const options: RNConfigCommandOptions = {\n platform: linkingOptions.platform,\n projectRoot,\n searchPaths: linkingOptions.searchPaths,\n transitiveLinkingDependencies,\n };\n const results = await createReactNativeConfigAsync(options);\n if (providedOptions.json) {\n console.log(JSON.stringify(results));\n } else {\n console.log(require('util').inspect(results, false, null, true));\n }\n });\n}\n\nmodule.exports = async function (args: string[]) {\n // Searches for available expo modules.\n registerSearchCommand<SearchOptions & { json?: boolean }>('search', async (results, options) => {\n if (options.json) {\n console.log(JSON.stringify(results));\n } else {\n console.log(require('util').inspect(results, false, null, true));\n }\n }).option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false);\n\n // Checks whether there are no resolving issues in the current setup.\n registerSearchCommand('verify', (results, options) => {\n const numberOfDuplicates = verifySearchResults(results, options);\n if (!numberOfDuplicates) {\n console.log('✅ Everything is fine!');\n }\n });\n\n // Searches for available expo modules and resolves the results for given platform.\n registerResolveCommand('resolve', async (results, options) => {\n const modules = await resolveModulesAsync(results, options);\n const extraDependencies = await resolveExtraBuildDependenciesAsync(options);\n const configuration = getConfiguration(options);\n\n const coreFeatures = [\n ...modules.reduce<Set<string>>((acc, module) => {\n if (hasCoreFeatures(module)) {\n const features = module.coreFeatures ?? [];\n for (const feature of features) {\n acc.add(feature);\n }\n return acc;\n }\n\n return acc;\n }, new Set()),\n ];\n if (options.json) {\n console.log(\n JSON.stringify({\n extraDependencies,\n coreFeatures,\n modules,\n ...(configuration ? { configuration } : {}),\n })\n );\n } else {\n console.log(\n require('util').inspect(\n {\n extraDependencies,\n coreFeatures,\n modules,\n ...(configuration ? { configuration } : {}),\n },\n false,\n null,\n true\n )\n );\n }\n }).option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false);\n\n // Generates a source file listing all packages to link.\n // It's deprecated for apple platforms, use `generate-modules-provider` instead.\n registerResolveCommand<GenerateOptions>('generate-package-list', async (results, options) => {\n const modules = options.empty ? [] : await resolveModulesAsync(results, options);\n generatePackageListAsync(modules, options);\n })\n .option(\n '-t, --target <path>',\n 'Path to the target file, where the package list should be written to.'\n )\n .option(\n '-n, --namespace <namespace>',\n 'Java package name under which the package list should be placed.'\n )\n .option(\n '--empty',\n 'Whether to only generate an empty list. Might be used when the user opts-out of autolinking.',\n false\n );\n\n // Generates a source file listing all packages to link in the runtime.\n registerResolveCommand<GenerateModulesProviderOptions>(\n 'generate-modules-provider',\n async (results, options) => {\n const packages = options.packages ?? [];\n const modules = await resolveModulesAsync(results, options);\n const filteredModules = modules.filter((module) => packages.includes(module.packageName));\n\n generateModulesProviderAsync(filteredModules, options);\n }\n )\n .option(\n '-t, --target <path>',\n 'Path to the target file, where the package list should be written to.'\n )\n .option('--entitlement <path>', 'Path to the Apple code signing entitlements file.')\n .option(\n '-p, --packages <packages...>',\n 'Names of the packages to include in the generated modules provider.'\n );\n\n registerReactNativeConfigCommand();\n\n await commander\n .version(require('expo-modules-autolinking/package.json').version)\n .description('CLI command that searches for Expo modules to autolink them.')\n .parseAsync(args, { from: 'user' });\n};\n"]}
@@ -3,7 +3,7 @@ import type { RNConfigCommandOptions, RNConfigDependency, RNConfigReactNativeApp
3
3
  /**
4
4
  * Create config for react-native core autolinking.
5
5
  */
6
- export declare function createReactNativeConfigAsync({ platform, projectRoot, searchPaths, }: RNConfigCommandOptions): Promise<RNConfigResult>;
6
+ export declare function createReactNativeConfigAsync({ platform, projectRoot, searchPaths, transitiveLinkingDependencies, }: RNConfigCommandOptions): Promise<RNConfigResult>;
7
7
  /**
8
8
  * Find all dependencies and their directories from the project.
9
9
  */
@@ -21,7 +21,7 @@ const EDGE_TO_EDGE_ENABLED_GRADLE_PROPERTY_KEY = 'expo.edgeToEdgeEnabled';
21
21
  /**
22
22
  * Create config for react-native core autolinking.
23
23
  */
24
- async function createReactNativeConfigAsync({ platform, projectRoot, searchPaths, }) {
24
+ async function createReactNativeConfigAsync({ platform, projectRoot, searchPaths, transitiveLinkingDependencies, }) {
25
25
  const projectConfig = await (0, config_1.loadConfigAsync)(projectRoot);
26
26
  const dependencyRoots = {
27
27
  ...(await findDependencyRootsAsync(projectRoot, searchPaths)),
@@ -33,8 +33,9 @@ async function createReactNativeConfigAsync({ platform, projectRoot, searchPaths
33
33
  // 1. `react-native-is-edge-to-edge` tries to check if the `edge-to-edge` turbomodule is present to determine whether edge-to-edge is enabled.
34
34
  // 2. `react-native-edge-to-edge` applies edge-to-edge in `onHostResume` and has no property to disable this behavior.
35
35
  const shouldAutolinkEdgeToEdge = platform === 'android' &&
36
- (await resolveGradleEdgeToEdgeEnabled(projectRoot)) &&
37
- !('react-native-edge-to-edge' in dependencyRoots);
36
+ !('react-native-edge-to-edge' in dependencyRoots) &&
37
+ ((await resolveGradleEdgeToEdgeEnabled(projectRoot)) ||
38
+ transitiveLinkingDependencies.includes('react-native-edge-to-edge'));
38
39
  if (shouldAutolinkEdgeToEdge) {
39
40
  const edgeToEdgeRoot = resolveEdgeToEdgeDependencyRoot(projectRoot);
40
41
  if (edgeToEdgeRoot) {
@@ -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/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { getIsolatedModulesPath } from '../autolinking/utils';\nimport { fileExistsAsync } from '../fileUtils';\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 RNConfigCommandOptions,\n RNConfigDependency,\n RNConfigReactNativeAppProjectConfig,\n RNConfigReactNativeLibraryConfig,\n RNConfigReactNativeProjectConfig,\n RNConfigResult,\n} from './reactNativeConfig.types';\nimport { resolveGradlePropertyAsync } from '../platforms/android';\n\nconst EDGE_TO_EDGE_ENABLED_GRADLE_PROPERTY_KEY = 'expo.edgeToEdgeEnabled';\n\n/**\n * Create config for react-native core autolinking.\n */\nexport async function createReactNativeConfigAsync({\n platform,\n projectRoot,\n searchPaths,\n}: RNConfigCommandOptions): Promise<RNConfigResult> {\n const projectConfig = await loadConfigAsync<RNConfigReactNativeProjectConfig>(projectRoot);\n const dependencyRoots = {\n ...(await findDependencyRootsAsync(projectRoot, searchPaths)),\n ...findProjectLocalDependencyRoots(projectConfig),\n };\n\n // For Expo SDK 53 onwards, `react-native-edge-to-edge` is a transitive dependency of every expo project. Unless the user\n // has also included it as a project dependency, we have to autolink it manually (transitive non-expo module dependencies are not autolinked).\n // There are two reasons why we don't want to autolink `edge-to-edge` when `edgeToEdge` property is set to `false`:\n // 1. `react-native-is-edge-to-edge` tries to check if the `edge-to-edge` turbomodule is present to determine whether edge-to-edge is enabled.\n // 2. `react-native-edge-to-edge` applies edge-to-edge in `onHostResume` and has no property to disable this behavior.\n const shouldAutolinkEdgeToEdge =\n platform === 'android' &&\n (await resolveGradleEdgeToEdgeEnabled(projectRoot)) &&\n !('react-native-edge-to-edge' in dependencyRoots);\n\n if (shouldAutolinkEdgeToEdge) {\n const edgeToEdgeRoot = resolveEdgeToEdgeDependencyRoot(projectRoot);\n if (edgeToEdgeRoot) {\n dependencyRoots['react-native-edge-to-edge'] = edgeToEdgeRoot;\n }\n }\n\n // NOTE(@kitten): If this isn't resolved to be the realpath and is a symlink,\n // the Cocoapods resolution will detect path mismatches and generate nonsensical\n // relative paths that won't resolve\n let reactNativePath: string;\n try {\n reactNativePath = await fs.realpath(dependencyRoots['react-native']);\n } catch {\n reactNativePath = dependencyRoots['react-native'];\n }\n\n const dependencyConfigs = await Promise.all(\n Object.entries(dependencyRoots).map(async ([name, packageRoot]) => {\n const config = await resolveDependencyConfigAsync(platform, name, packageRoot, projectConfig);\n return [name, config];\n })\n );\n const dependencyResults = Object.fromEntries<RNConfigDependency>(\n dependencyConfigs.filter(([, config]) => config != null) as Iterable<\n [string, RNConfigDependency]\n >\n );\n const projectData = await resolveAppProjectConfigAsync(projectRoot, platform);\n return {\n root: projectRoot,\n reactNativePath,\n dependencies: dependencyResults,\n project: projectData,\n };\n}\n\n/**\n * Find all dependencies and their directories from the project.\n */\nexport async function findDependencyRootsAsync(\n projectRoot: string,\n searchPaths: string[]\n): Promise<Record<string, string>> {\n const packageJson = JSON.parse(await fs.readFile(path.join(projectRoot, 'package.json'), 'utf8'));\n const dependencies = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ];\n\n const results: Record<string, string> = {};\n // `searchPathSet` can be mutated to discover all \"isolated modules groups\", when using isolated modules\n const searchPathSet = new Set(searchPaths);\n\n for (const name of dependencies) {\n for (const searchPath of searchPathSet) {\n const packageConfigPath = path.resolve(searchPath, name, 'package.json');\n if (await fileExistsAsync(packageConfigPath)) {\n const packageRoot = path.dirname(packageConfigPath);\n results[name] = packageRoot;\n\n const maybeIsolatedModulesPath = getIsolatedModulesPath(packageRoot, name);\n if (maybeIsolatedModulesPath) {\n searchPathSet.add(maybeIsolatedModulesPath);\n }\n break;\n }\n }\n }\n\n return results;\n}\n\n/**\n * Find local dependencies that specified in the `react-native.config.js` file.\n */\nfunction findProjectLocalDependencyRoots(\n projectConfig: RNConfigReactNativeProjectConfig | null\n): Record<string, string> {\n if (!projectConfig?.dependencies) {\n return {};\n }\n const results: Record<string, string> = {};\n for (const [name, config] of Object.entries(projectConfig.dependencies)) {\n if (typeof config.root === 'string') {\n results[name] = config.root;\n }\n }\n return results;\n}\n\nexport async function resolveDependencyConfigAsync(\n platform: SupportedPlatform,\n name: string,\n packageRoot: string,\n projectConfig: RNConfigReactNativeProjectConfig | null\n): Promise<RNConfigDependency | null> {\n const libraryConfig = await loadConfigAsync<RNConfigReactNativeLibraryConfig>(packageRoot);\n const reactNativeConfig = {\n ...libraryConfig?.dependency,\n ...projectConfig?.dependencies?.[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 if (name === 'react-native' || 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 return null;\n }\n\n let platformData = null;\n if (platform === 'android') {\n platformData = await resolveDependencyConfigImplAndroidAsync(\n packageRoot,\n reactNativeConfig.platforms?.android\n );\n } else if (platform === 'ios') {\n platformData = await resolveDependencyConfigImplIosAsync(\n packageRoot,\n reactNativeConfig.platforms?.ios\n );\n }\n if (!platformData) {\n return null;\n }\n return {\n root: packageRoot,\n name,\n platforms: {\n [platform]: platformData,\n },\n };\n}\n\nexport function resolveEdgeToEdgeDependencyRoot(projectRoot: string): string | null {\n const expoPackageRoot = resolveFrom.silent(projectRoot, 'expo/package.json');\n const edgeToEdgePath = resolveFrom.silent(\n expoPackageRoot ?? projectRoot,\n 'react-native-edge-to-edge/package.json'\n );\n if (edgeToEdgePath) {\n return path.dirname(edgeToEdgePath);\n }\n return null;\n}\n\nexport async function resolveAppProjectConfigAsync(\n projectRoot: string,\n platform: SupportedPlatform\n): Promise<RNConfigReactNativeAppProjectConfig> {\n if (platform === 'android') {\n const androidDir = 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(androidDir, manifest, gradle);\n\n return {\n android: {\n packageName: packageName ?? '',\n sourceDir: path.join(projectRoot, 'android'),\n },\n };\n }\n\n if (platform === 'ios') {\n return {\n ios: {\n sourceDir: path.join(projectRoot, 'ios'),\n },\n };\n }\n\n return {};\n}\n\n/**\n * Resolve the `expo.edgeToEdgeEnabled` property from the `gradle.properties` file.\n */\nasync function resolveGradleEdgeToEdgeEnabled(projectRoot: string): Promise<boolean> {\n return (\n (await resolveGradlePropertyAsync(\n path.join(projectRoot, 'android'),\n EDGE_TO_EDGE_ENABLED_GRADLE_PROPERTY_KEY\n )) === 'true'\n );\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/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { getIsolatedModulesPath } from '../autolinking/utils';\nimport { fileExistsAsync } from '../fileUtils';\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 RNConfigCommandOptions,\n RNConfigDependency,\n RNConfigReactNativeAppProjectConfig,\n RNConfigReactNativeLibraryConfig,\n RNConfigReactNativeProjectConfig,\n RNConfigResult,\n} from './reactNativeConfig.types';\nimport { resolveGradlePropertyAsync } from '../platforms/android';\n\nconst EDGE_TO_EDGE_ENABLED_GRADLE_PROPERTY_KEY = 'expo.edgeToEdgeEnabled';\n\n/**\n * Create config for react-native core autolinking.\n */\nexport async function createReactNativeConfigAsync({\n platform,\n projectRoot,\n searchPaths,\n transitiveLinkingDependencies,\n}: RNConfigCommandOptions): Promise<RNConfigResult> {\n const projectConfig = await loadConfigAsync<RNConfigReactNativeProjectConfig>(projectRoot);\n const dependencyRoots = {\n ...(await findDependencyRootsAsync(projectRoot, searchPaths)),\n ...findProjectLocalDependencyRoots(projectConfig),\n };\n\n // For Expo SDK 53 onwards, `react-native-edge-to-edge` is a transitive dependency of every expo project. Unless the user\n // has also included it as a project dependency, we have to autolink it manually (transitive non-expo module dependencies are not autolinked).\n // There are two reasons why we don't want to autolink `edge-to-edge` when `edgeToEdge` property is set to `false`:\n // 1. `react-native-is-edge-to-edge` tries to check if the `edge-to-edge` turbomodule is present to determine whether edge-to-edge is enabled.\n // 2. `react-native-edge-to-edge` applies edge-to-edge in `onHostResume` and has no property to disable this behavior.\n const shouldAutolinkEdgeToEdge =\n platform === 'android' &&\n !('react-native-edge-to-edge' in dependencyRoots) &&\n ((await resolveGradleEdgeToEdgeEnabled(projectRoot)) ||\n transitiveLinkingDependencies.includes('react-native-edge-to-edge'));\n\n if (shouldAutolinkEdgeToEdge) {\n const edgeToEdgeRoot = resolveEdgeToEdgeDependencyRoot(projectRoot);\n if (edgeToEdgeRoot) {\n dependencyRoots['react-native-edge-to-edge'] = edgeToEdgeRoot;\n }\n }\n\n // NOTE(@kitten): If this isn't resolved to be the realpath and is a symlink,\n // the Cocoapods resolution will detect path mismatches and generate nonsensical\n // relative paths that won't resolve\n let reactNativePath: string;\n try {\n reactNativePath = await fs.realpath(dependencyRoots['react-native']);\n } catch {\n reactNativePath = dependencyRoots['react-native'];\n }\n\n const dependencyConfigs = await Promise.all(\n Object.entries(dependencyRoots).map(async ([name, packageRoot]) => {\n const config = await resolveDependencyConfigAsync(platform, name, packageRoot, projectConfig);\n return [name, config];\n })\n );\n const dependencyResults = Object.fromEntries<RNConfigDependency>(\n dependencyConfigs.filter(([, config]) => config != null) as Iterable<\n [string, RNConfigDependency]\n >\n );\n const projectData = await resolveAppProjectConfigAsync(projectRoot, platform);\n return {\n root: projectRoot,\n reactNativePath,\n dependencies: dependencyResults,\n project: projectData,\n };\n}\n\n/**\n * Find all dependencies and their directories from the project.\n */\nexport async function findDependencyRootsAsync(\n projectRoot: string,\n searchPaths: string[]\n): Promise<Record<string, string>> {\n const packageJson = JSON.parse(await fs.readFile(path.join(projectRoot, 'package.json'), 'utf8'));\n const dependencies = [\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ];\n\n const results: Record<string, string> = {};\n // `searchPathSet` can be mutated to discover all \"isolated modules groups\", when using isolated modules\n const searchPathSet = new Set(searchPaths);\n\n for (const name of dependencies) {\n for (const searchPath of searchPathSet) {\n const packageConfigPath = path.resolve(searchPath, name, 'package.json');\n if (await fileExistsAsync(packageConfigPath)) {\n const packageRoot = path.dirname(packageConfigPath);\n results[name] = packageRoot;\n\n const maybeIsolatedModulesPath = getIsolatedModulesPath(packageRoot, name);\n if (maybeIsolatedModulesPath) {\n searchPathSet.add(maybeIsolatedModulesPath);\n }\n break;\n }\n }\n }\n\n return results;\n}\n\n/**\n * Find local dependencies that specified in the `react-native.config.js` file.\n */\nfunction findProjectLocalDependencyRoots(\n projectConfig: RNConfigReactNativeProjectConfig | null\n): Record<string, string> {\n if (!projectConfig?.dependencies) {\n return {};\n }\n const results: Record<string, string> = {};\n for (const [name, config] of Object.entries(projectConfig.dependencies)) {\n if (typeof config.root === 'string') {\n results[name] = config.root;\n }\n }\n return results;\n}\n\nexport async function resolveDependencyConfigAsync(\n platform: SupportedPlatform,\n name: string,\n packageRoot: string,\n projectConfig: RNConfigReactNativeProjectConfig | null\n): Promise<RNConfigDependency | null> {\n const libraryConfig = await loadConfigAsync<RNConfigReactNativeLibraryConfig>(packageRoot);\n const reactNativeConfig = {\n ...libraryConfig?.dependency,\n ...projectConfig?.dependencies?.[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 if (name === 'react-native' || 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 return null;\n }\n\n let platformData = null;\n if (platform === 'android') {\n platformData = await resolveDependencyConfigImplAndroidAsync(\n packageRoot,\n reactNativeConfig.platforms?.android\n );\n } else if (platform === 'ios') {\n platformData = await resolveDependencyConfigImplIosAsync(\n packageRoot,\n reactNativeConfig.platforms?.ios\n );\n }\n if (!platformData) {\n return null;\n }\n return {\n root: packageRoot,\n name,\n platforms: {\n [platform]: platformData,\n },\n };\n}\n\nexport function resolveEdgeToEdgeDependencyRoot(projectRoot: string): string | null {\n const expoPackageRoot = resolveFrom.silent(projectRoot, 'expo/package.json');\n const edgeToEdgePath = resolveFrom.silent(\n expoPackageRoot ?? projectRoot,\n 'react-native-edge-to-edge/package.json'\n );\n if (edgeToEdgePath) {\n return path.dirname(edgeToEdgePath);\n }\n return null;\n}\n\nexport async function resolveAppProjectConfigAsync(\n projectRoot: string,\n platform: SupportedPlatform\n): Promise<RNConfigReactNativeAppProjectConfig> {\n if (platform === 'android') {\n const androidDir = 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(androidDir, manifest, gradle);\n\n return {\n android: {\n packageName: packageName ?? '',\n sourceDir: path.join(projectRoot, 'android'),\n },\n };\n }\n\n if (platform === 'ios') {\n return {\n ios: {\n sourceDir: path.join(projectRoot, 'ios'),\n },\n };\n }\n\n return {};\n}\n\n/**\n * Resolve the `expo.edgeToEdgeEnabled` property from the `gradle.properties` file.\n */\nasync function resolveGradleEdgeToEdgeEnabled(projectRoot: string): Promise<boolean> {\n return (\n (await resolveGradlePropertyAsync(\n path.join(projectRoot, 'android'),\n EDGE_TO_EDGE_ENABLED_GRADLE_PROPERTY_KEY\n )) === 'true'\n );\n}\n"]}
@@ -6,6 +6,7 @@ export interface RNConfigCommandOptions {
6
6
  platform: SupportedPlatform;
7
7
  projectRoot: string;
8
8
  searchPaths: string[];
9
+ transitiveLinkingDependencies: string[];
9
10
  }
10
11
  /**
11
12
  * Dependency configuration for Android platform.
@@ -1 +1 @@
1
- {"version":3,"file":"reactNativeConfig.types.js","sourceRoot":"","sources":["../../src/reactNativeConfig/reactNativeConfig.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SupportedPlatform } from '../types';\n\n/**\n * Options for 'react-native-config' command.\n */\nexport interface RNConfigCommandOptions {\n platform: SupportedPlatform;\n projectRoot: string;\n searchPaths: string[];\n}\n\n/**\n * Dependency configuration for Android platform.\n */\nexport interface RNConfigDependencyAndroid {\n sourceDir: string;\n packageImportPath: string;\n packageInstance: string;\n dependencyConfiguration?: string;\n buildTypes: string[];\n libraryName?: string | null;\n componentDescriptors?: string[] | null;\n cmakeListsPath?: string | null;\n cxxModuleCMakeListsModuleName?: string | null;\n cxxModuleCMakeListsPath?: string | null;\n cxxModuleHeaderName?: string | null;\n}\n\n/**\n * Dependency configuration for iOS platform.\n */\nexport interface RNConfigDependencyIos {\n podspecPath: string;\n version: string;\n configurations: string[];\n scriptPhases: any[];\n}\n\n/**\n * Dependency configuration.\n */\nexport interface RNConfigDependency {\n root: string;\n name: string;\n platforms: {\n android?: RNConfigDependencyAndroid;\n ios?: RNConfigDependencyIos;\n };\n}\n\n/**\n * Result of 'react-native-config' command.\n */\nexport interface RNConfigResult {\n root: string;\n reactNativePath: string;\n dependencies: Record<string, RNConfigDependency>;\n project: {\n ios?: {\n sourceDir: string;\n };\n };\n}\n\nexport type RNConfigReactNativePlatformsConfigAndroid = any;\nexport type RNConfigReactNativePlatformsConfigIos = any;\n\ninterface RNConfigReactNativePlatformsConfig {\n root?: string;\n platforms?: {\n android?: RNConfigReactNativePlatformsConfigAndroid;\n ios?: RNConfigReactNativePlatformsConfigIos;\n };\n}\n\n/**\n * The `react-native.config.js` config from projectRoot.\n */\nexport interface RNConfigReactNativeProjectConfig {\n dependencies?: Record<string, RNConfigReactNativePlatformsConfig>;\n}\n\n/**\n * The `react-native.config.js` config from library packageRoot.\n */\nexport interface RNConfigReactNativeLibraryConfig {\n dependency?: RNConfigReactNativePlatformsConfig;\n platforms?: any;\n}\n\nexport type RNConfigReactNativeConfig =\n | RNConfigReactNativeProjectConfig\n | RNConfigReactNativeLibraryConfig;\n\n/**\n * The `project` config represents the app project configuration.\n */\nexport interface RNConfigReactNativeAppProjectConfig {\n android?: {\n sourceDir: string;\n packageName: string;\n };\n ios?: {\n sourceDir: string;\n };\n}\n"]}
1
+ {"version":3,"file":"reactNativeConfig.types.js","sourceRoot":"","sources":["../../src/reactNativeConfig/reactNativeConfig.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { SupportedPlatform } from '../types';\n\n/**\n * Options for 'react-native-config' command.\n */\nexport interface RNConfigCommandOptions {\n platform: SupportedPlatform;\n projectRoot: string;\n searchPaths: string[];\n transitiveLinkingDependencies: string[];\n}\n\n/**\n * Dependency configuration for Android platform.\n */\nexport interface RNConfigDependencyAndroid {\n sourceDir: string;\n packageImportPath: string;\n packageInstance: string;\n dependencyConfiguration?: string;\n buildTypes: string[];\n libraryName?: string | null;\n componentDescriptors?: string[] | null;\n cmakeListsPath?: string | null;\n cxxModuleCMakeListsModuleName?: string | null;\n cxxModuleCMakeListsPath?: string | null;\n cxxModuleHeaderName?: string | null;\n}\n\n/**\n * Dependency configuration for iOS platform.\n */\nexport interface RNConfigDependencyIos {\n podspecPath: string;\n version: string;\n configurations: string[];\n scriptPhases: any[];\n}\n\n/**\n * Dependency configuration.\n */\nexport interface RNConfigDependency {\n root: string;\n name: string;\n platforms: {\n android?: RNConfigDependencyAndroid;\n ios?: RNConfigDependencyIos;\n };\n}\n\n/**\n * Result of 'react-native-config' command.\n */\nexport interface RNConfigResult {\n root: string;\n reactNativePath: string;\n dependencies: Record<string, RNConfigDependency>;\n project: {\n ios?: {\n sourceDir: string;\n };\n };\n}\n\nexport type RNConfigReactNativePlatformsConfigAndroid = any;\nexport type RNConfigReactNativePlatformsConfigIos = any;\n\ninterface RNConfigReactNativePlatformsConfig {\n root?: string;\n platforms?: {\n android?: RNConfigReactNativePlatformsConfigAndroid;\n ios?: RNConfigReactNativePlatformsConfigIos;\n };\n}\n\n/**\n * The `react-native.config.js` config from projectRoot.\n */\nexport interface RNConfigReactNativeProjectConfig {\n dependencies?: Record<string, RNConfigReactNativePlatformsConfig>;\n}\n\n/**\n * The `react-native.config.js` config from library packageRoot.\n */\nexport interface RNConfigReactNativeLibraryConfig {\n dependency?: RNConfigReactNativePlatformsConfig;\n platforms?: any;\n}\n\nexport type RNConfigReactNativeConfig =\n | RNConfigReactNativeProjectConfig\n | RNConfigReactNativeLibraryConfig;\n\n/**\n * The `project` config represents the app project configuration.\n */\nexport interface RNConfigReactNativeAppProjectConfig {\n android?: {\n sourceDir: string;\n packageName: string;\n };\n ios?: {\n sourceDir: string;\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-modules-autolinking",
3
- "version": "2.1.9",
3
+ "version": "2.1.11",
4
4
  "description": "Scripts that autolink Expo modules.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -34,7 +34,7 @@
34
34
  "license": "MIT",
35
35
  "homepage": "https://github.com/expo/expo/tree/main/packages/expo-modules-autolinking#readme",
36
36
  "devDependencies": {
37
- "expo-module-scripts": "~4.1.6",
37
+ "expo-module-scripts": "~4.1.7",
38
38
  "minimatch": "^9.0.0"
39
39
  },
40
40
  "dependencies": {
@@ -46,5 +46,5 @@
46
46
  "require-from-string": "^2.0.2",
47
47
  "resolve-from": "^5.0.0"
48
48
  },
49
- "gitHead": "84355076bc31a356aa3d23257f387f221885f53d"
49
+ "gitHead": "38da2aaf6aa32f64f9063419054a6ad71dceddea"
50
50
  }
@@ -15,7 +15,7 @@ export function verifySearchResults(searchResults: SearchResults, options: Searc
15
15
  const revision = searchResults[moduleName];
16
16
 
17
17
  if (revision.duplicates?.length) {
18
- console.warn(`⚠️ Found multiple revisions of ${chalk.green(moduleName)}`);
18
+ console.warn(`⚠️ Found multiple versions of ${chalk.green(moduleName)}`);
19
19
  console.log(` - ${chalk.magenta(relativePath(revision))} (${chalk.cyan(revision.version)})`);
20
20
 
21
21
  for (const duplicate of revision.duplicates) {
@@ -26,7 +26,7 @@ export function verifySearchResults(searchResults: SearchResults, options: Searc
26
26
  }
27
27
  if (counter > 0) {
28
28
  console.warn(
29
- '⚠️ Please get rid of multiple revisions as it may introduce some side effects or compatibility issues'
29
+ '⚠️ Multiple versions of the same module may introduce some side effects or compatibility issues. Remove the duplicate versions.'
30
30
  );
31
31
  }
32
32
  return counter;
package/src/index.ts CHANGED
@@ -103,6 +103,10 @@ function registerReactNativeConfigCommand() {
103
103
  'The platform that the resulting modules must support. Available options: "android", "ios"',
104
104
  'ios'
105
105
  )
106
+ .option(
107
+ '--transitive-linking-dependencies <transitiveLinkingDependencies...>',
108
+ 'The transitive dependencies to include in autolinking. Internally used by fingerprint and only supported react-native-edge-to-edge.'
109
+ )
106
110
  .addOption(
107
111
  new commander.Option(
108
112
  '--project-root <projectRoot>',
@@ -129,10 +133,12 @@ function registerReactNativeConfigCommand() {
129
133
  projectRoot,
130
134
  }
131
135
  );
136
+ const transitiveLinkingDependencies = providedOptions.transitiveLinkingDependencies ?? [];
132
137
  const options: RNConfigCommandOptions = {
133
138
  platform: linkingOptions.platform,
134
139
  projectRoot,
135
140
  searchPaths: linkingOptions.searchPaths,
141
+ transitiveLinkingDependencies,
136
142
  };
137
143
  const results = await createReactNativeConfigAsync(options);
138
144
  if (providedOptions.json) {
@@ -31,6 +31,7 @@ export async function createReactNativeConfigAsync({
31
31
  platform,
32
32
  projectRoot,
33
33
  searchPaths,
34
+ transitiveLinkingDependencies,
34
35
  }: RNConfigCommandOptions): Promise<RNConfigResult> {
35
36
  const projectConfig = await loadConfigAsync<RNConfigReactNativeProjectConfig>(projectRoot);
36
37
  const dependencyRoots = {
@@ -45,8 +46,9 @@ export async function createReactNativeConfigAsync({
45
46
  // 2. `react-native-edge-to-edge` applies edge-to-edge in `onHostResume` and has no property to disable this behavior.
46
47
  const shouldAutolinkEdgeToEdge =
47
48
  platform === 'android' &&
48
- (await resolveGradleEdgeToEdgeEnabled(projectRoot)) &&
49
- !('react-native-edge-to-edge' in dependencyRoots);
49
+ !('react-native-edge-to-edge' in dependencyRoots) &&
50
+ ((await resolveGradleEdgeToEdgeEnabled(projectRoot)) ||
51
+ transitiveLinkingDependencies.includes('react-native-edge-to-edge'));
50
52
 
51
53
  if (shouldAutolinkEdgeToEdge) {
52
54
  const edgeToEdgeRoot = resolveEdgeToEdgeDependencyRoot(projectRoot);
@@ -7,6 +7,7 @@ export interface RNConfigCommandOptions {
7
7
  platform: SupportedPlatform;
8
8
  projectRoot: string;
9
9
  searchPaths: string[];
10
+ transitiveLinkingDependencies: string[];
10
11
  }
11
12
 
12
13
  /**