expo-modules-autolinking 1.4.0 → 1.5.1

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
+ ## 1.5.1 — 2023-08-22
14
+
15
+ ### 🐛 Bug fixes
16
+
17
+ - Fixed `expo_patch_react_imports!` missing some lines with spaces before or after the imports. ([#23923](https://github.com/expo/expo/pull/23923) by [@liamjones](https://github.com/liamjones))
18
+
19
+ ## 1.5.0 — 2023-06-21
20
+
21
+ ### 🎉 New features
22
+
23
+ - Added support for React Native 0.72. ([#22588](https://github.com/expo/expo/pull/22588) by [@kudo](https://github.com/kudo))
24
+ - Added extra CocoaPods dependencies and Maven repositories from `expo-build-properties`. ([#22785](https://github.com/expo/expo/pull/22785) by [@kudo](https://github.com/kudo))
25
+
13
26
  ## 1.4.0 — 2023-06-13
14
27
 
15
28
  ### 🎉 New features
@@ -34,7 +34,7 @@ async function generateReactHeaderSetAsync(reactHeaderDir) {
34
34
  async function patchFileAsync(headerSet, file, dryRun) {
35
35
  let changed = false;
36
36
  const content = await fs_extra_1.default.readFile(file, 'utf-8');
37
- let transformContent = content.replace(/^#import\s+"(.+)"$/gm, (match, headerName) => {
37
+ let transformContent = content.replace(/(?<=^\s*)#import\s+"(.+)"(?=\s*$)/gm, (match, headerName) => {
38
38
  // `#import "RCTBridge.h"` -> `#import <React/RCTBridge.h>`
39
39
  if (headerSet.has(headerName)) {
40
40
  changed = true;
@@ -51,7 +51,7 @@ async function patchFileAsync(headerSet, file, dryRun) {
51
51
  // Otherwise, return original import
52
52
  return match;
53
53
  });
54
- transformContent = transformContent.replace(/^#(if|elif)\s+__has_include\("(.+)"\)$/gm, (match, ifPrefix, headerName) => {
54
+ transformContent = transformContent.replace(/(?<=^\s*)#(if|elif)\s+__has_include\("(.+)"\)(?=\s*$)/gm, (match, ifPrefix, headerName) => {
55
55
  // `#if __has_include("RCTBridge.h")` -> `#if __has_include(<React/RCTBridge.h>)`
56
56
  if (headerSet.has(headerName)) {
57
57
  changed = true;
@@ -1 +1 @@
1
- {"version":3,"file":"ReactImportsPatcher.js","sourceRoot":"","sources":["../src/ReactImportsPatcher.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2018-present 650 Industries. All rights reserved.\n\nimport glob from 'fast-glob';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nimport { PatchReactImportsOptions } from './types';\n\n/**\n * Remove all double-quoted react header imports\n * @param dirs target directories to patch\n * @param options PatchReactImportsOptions\n */\nexport async function patchReactImportsAsync(dirs: string[], options: PatchReactImportsOptions) {\n const headerSet = await generateReactHeaderSetAsync(\n path.join(options.podsRoot, 'Headers', 'Public', 'React-Core', 'React')\n );\n await Promise.all(dirs.map((dir) => patchDirAsync(headerSet, dir, options.dryRun)));\n}\n\n/**\n * Generate `React-Core` public header names as a set, will transform necessary headers based on this set.\n */\nasync function generateReactHeaderSetAsync(reactHeaderDir: string): Promise<Set<string>> {\n const files = await glob('*.h', { cwd: reactHeaderDir });\n return new Set(files);\n}\n\n/**\n * Patch imports from a file\n * @param headerSet prebuilt React-Core header set\n * @param file target patch file\n * @param dryRun true if not writing changes to file\n */\nexport async function patchFileAsync(headerSet: Set<string>, file: string, dryRun: boolean) {\n let changed = false;\n const content = await fs.readFile(file, 'utf-8');\n let transformContent = content.replace(\n /^#import\\s+\"(.+)\"$/gm,\n (match: string, headerName: string): string => {\n // `#import \"RCTBridge.h\"` -> `#import <React/RCTBridge.h>`\n if (headerSet.has(headerName)) {\n changed = true;\n return `#import <React/${headerName}>`;\n }\n\n // `#import \"React/RCTBridge.h\"` -> `#import <React/RCTBridge.h>`\n if (headerName.startsWith('React/')) {\n const name = headerName.substring(6);\n if (headerSet.has(name)) {\n changed = true;\n return `#import <React/${name}>`;\n }\n }\n\n // Otherwise, return original import\n return match;\n }\n );\n\n transformContent = transformContent.replace(\n /^#(if|elif)\\s+__has_include\\(\"(.+)\"\\)$/gm,\n (match: string, ifPrefix: string, headerName: string): string => {\n // `#if __has_include(\"RCTBridge.h\")` -> `#if __has_include(<React/RCTBridge.h>)`\n if (headerSet.has(headerName)) {\n changed = true;\n return `#${ifPrefix} __has_include(<React/${headerName}>)`;\n }\n\n // `#if __has_include(\"React/RCTBridge.h\")` -> `#if __has_include(<React/RCTBridge.h>)`\n if (headerName.startsWith('React/')) {\n const name = headerName.substring(6);\n if (headerSet.has(name)) {\n changed = true;\n return `#${ifPrefix} __has_include(<React/${name}>)`;\n }\n }\n\n // Otherwise, return original import\n return match;\n }\n );\n\n if (changed) {\n console.log(`Patching imports for file: ${file}`);\n if (!dryRun) {\n await fs.writeFile(file, transformContent);\n }\n }\n}\n\n/**\n * Patch imports from a directory\n * @param headerSet prebuilt React-Core header set\n * @param file target patch file\n * @param dryRun true if not writing changes to file\n */\nasync function patchDirAsync(headerSet: Set<string>, dir: string, dryRun: boolean) {\n const files = await glob('**/*.{h,m,mm}', { cwd: dir, absolute: true });\n return Promise.all(files.map((file) => patchFileAsync(headerSet, file, dryRun)));\n}\n"]}
1
+ {"version":3,"file":"ReactImportsPatcher.js","sourceRoot":"","sources":["../src/ReactImportsPatcher.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2018-present 650 Industries. All rights reserved.\n\nimport glob from 'fast-glob';\nimport fs from 'fs-extra';\nimport path from 'path';\n\nimport { PatchReactImportsOptions } from './types';\n\n/**\n * Remove all double-quoted react header imports\n * @param dirs target directories to patch\n * @param options PatchReactImportsOptions\n */\nexport async function patchReactImportsAsync(dirs: string[], options: PatchReactImportsOptions) {\n const headerSet = await generateReactHeaderSetAsync(\n path.join(options.podsRoot, 'Headers', 'Public', 'React-Core', 'React')\n );\n await Promise.all(dirs.map((dir) => patchDirAsync(headerSet, dir, options.dryRun)));\n}\n\n/**\n * Generate `React-Core` public header names as a set, will transform necessary headers based on this set.\n */\nasync function generateReactHeaderSetAsync(reactHeaderDir: string): Promise<Set<string>> {\n const files = await glob('*.h', { cwd: reactHeaderDir });\n return new Set(files);\n}\n\n/**\n * Patch imports from a file\n * @param headerSet prebuilt React-Core header set\n * @param file target patch file\n * @param dryRun true if not writing changes to file\n */\nexport async function patchFileAsync(headerSet: Set<string>, file: string, dryRun: boolean) {\n let changed = false;\n const content = await fs.readFile(file, 'utf-8');\n let transformContent = content.replace(\n /(?<=^\\s*)#import\\s+\"(.+)\"(?=\\s*$)/gm,\n (match: string, headerName: string): string => {\n // `#import \"RCTBridge.h\"` -> `#import <React/RCTBridge.h>`\n if (headerSet.has(headerName)) {\n changed = true;\n return `#import <React/${headerName}>`;\n }\n\n // `#import \"React/RCTBridge.h\"` -> `#import <React/RCTBridge.h>`\n if (headerName.startsWith('React/')) {\n const name = headerName.substring(6);\n if (headerSet.has(name)) {\n changed = true;\n return `#import <React/${name}>`;\n }\n }\n\n // Otherwise, return original import\n return match;\n }\n );\n\n transformContent = transformContent.replace(\n /(?<=^\\s*)#(if|elif)\\s+__has_include\\(\"(.+)\"\\)(?=\\s*$)/gm,\n (match: string, ifPrefix: string, headerName: string): string => {\n // `#if __has_include(\"RCTBridge.h\")` -> `#if __has_include(<React/RCTBridge.h>)`\n if (headerSet.has(headerName)) {\n changed = true;\n return `#${ifPrefix} __has_include(<React/${headerName}>)`;\n }\n\n // `#if __has_include(\"React/RCTBridge.h\")` -> `#if __has_include(<React/RCTBridge.h>)`\n if (headerName.startsWith('React/')) {\n const name = headerName.substring(6);\n if (headerSet.has(name)) {\n changed = true;\n return `#${ifPrefix} __has_include(<React/${name}>)`;\n }\n }\n\n // Otherwise, return original import\n return match;\n }\n );\n\n if (changed) {\n console.log(`Patching imports for file: ${file}`);\n if (!dryRun) {\n await fs.writeFile(file, transformContent);\n }\n }\n}\n\n/**\n * Patch imports from a directory\n * @param headerSet prebuilt React-Core header set\n * @param file target patch file\n * @param dryRun true if not writing changes to file\n */\nasync function patchDirAsync(headerSet: Set<string>, dir: string, dryRun: boolean) {\n const files = await glob('**/*.{h,m,mm}', { cwd: dir, absolute: true });\n return Promise.all(files.map((file) => patchFileAsync(headerSet, file, dryRun)));\n}\n"]}
@@ -0,0 +1,30 @@
1
+ interface AndroidMavenRepository {
2
+ url: string;
3
+ }
4
+ interface IosPod {
5
+ name: string;
6
+ version?: string;
7
+ configurations?: string[];
8
+ modular_headers?: boolean;
9
+ source?: string;
10
+ path?: string;
11
+ podspec?: string;
12
+ testspecs?: string[];
13
+ git?: string;
14
+ branch?: string;
15
+ tag?: string;
16
+ commit?: string;
17
+ }
18
+ interface ExtraDependencies {
19
+ androidMavenRepos: AndroidMavenRepository[];
20
+ iosPods?: IosPod[];
21
+ }
22
+ /**
23
+ * Gets the `expo-build-properties` settings from the app config.
24
+ */
25
+ export declare function getBuildPropertiesAsync(): Promise<Record<string, any>>;
26
+ /**
27
+ * Resolves the extra dependencies from `expo-build-properties` settings.
28
+ */
29
+ export declare function resolveExtraDependenciesAsync(): Promise<Partial<ExtraDependencies>>;
30
+ export {};
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resolveExtraDependenciesAsync = exports.getBuildPropertiesAsync = void 0;
7
+ const config_1 = require("@expo/config");
8
+ const path_1 = __importDefault(require("path"));
9
+ const mergeLinkingOptions_1 = require("./mergeLinkingOptions");
10
+ /**
11
+ * Gets the `expo-build-properties` settings from the app config.
12
+ */
13
+ async function getBuildPropertiesAsync() {
14
+ const projectRoot = path_1.default.dirname(mergeLinkingOptions_1.projectPackageJsonPath);
15
+ const { exp: config } = await (0, config_1.getConfig)(projectRoot, { skipSDKVersionRequirement: true });
16
+ const buildPropertiesPlugin = config.plugins?.find((item) => item[0] === 'expo-build-properties')?.[1];
17
+ return buildPropertiesPlugin ?? {};
18
+ }
19
+ exports.getBuildPropertiesAsync = getBuildPropertiesAsync;
20
+ /**
21
+ * Resolves the extra dependencies from `expo-build-properties` settings.
22
+ */
23
+ async function resolveExtraDependenciesAsync() {
24
+ const buildProps = await getBuildPropertiesAsync();
25
+ return {
26
+ androidMavenRepos: buildProps.android?.extraMavenRepos ?? [],
27
+ iosPods: buildProps.ios?.extraPods ?? {},
28
+ };
29
+ }
30
+ exports.resolveExtraDependenciesAsync = resolveExtraDependenciesAsync;
31
+ //# sourceMappingURL=extraDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extraDependencies.js","sourceRoot":"","sources":["../../src/autolinking/extraDependencies.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAyC;AACzC,gDAAwB;AAExB,+DAA+D;AA0B/D;;GAEG;AACI,KAAK,UAAU,uBAAuB;IAC3C,MAAM,WAAW,GAAG,cAAI,CAAC,OAAO,CAAC,4CAAsB,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,kBAAS,EAAC,WAAW,EAAE,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,MAAM,qBAAqB,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAChD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,uBAAuB,CAC9C,EAAE,CAAC,CAAC,CAAC,CAAC;IACP,OAAO,qBAAqB,IAAI,EAAE,CAAC;AACrC,CAAC;AAPD,0DAOC;AAED;;GAEG;AACI,KAAK,UAAU,6BAA6B;IACjD,MAAM,UAAU,GAAG,MAAM,uBAAuB,EAAE,CAAC;IACnD,OAAO;QACL,iBAAiB,EAAE,UAAU,CAAC,OAAO,EAAE,eAAe,IAAI,EAAE;QAC5D,OAAO,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,IAAI,EAAE;KACzC,CAAC;AACJ,CAAC;AAND,sEAMC","sourcesContent":["import { getConfig } from '@expo/config';\nimport path from 'path';\n\nimport { projectPackageJsonPath } from './mergeLinkingOptions';\n\ninterface AndroidMavenRepository {\n url: string;\n}\n\ninterface IosPod {\n name: string;\n version?: string;\n configurations?: string[];\n modular_headers?: boolean;\n source?: string;\n path?: string;\n podspec?: string;\n testspecs?: string[];\n git?: string;\n branch?: string;\n tag?: string;\n commit?: string;\n}\n\ninterface ExtraDependencies {\n androidMavenRepos: AndroidMavenRepository[];\n iosPods?: IosPod[];\n}\n\n/**\n * Gets the `expo-build-properties` settings from the app config.\n */\nexport async function getBuildPropertiesAsync(): Promise<Record<string, any>> {\n const projectRoot = path.dirname(projectPackageJsonPath);\n const { exp: config } = await getConfig(projectRoot, { skipSDKVersionRequirement: true });\n const buildPropertiesPlugin = config.plugins?.find(\n (item) => item[0] === 'expo-build-properties'\n )?.[1];\n return buildPropertiesPlugin ?? {};\n}\n\n/**\n * Resolves the extra dependencies from `expo-build-properties` settings.\n */\nexport async function resolveExtraDependenciesAsync(): Promise<Partial<ExtraDependencies>> {\n const buildProps = await getBuildPropertiesAsync();\n return {\n androidMavenRepos: buildProps.android?.extraMavenRepos ?? [],\n iosPods: buildProps.ios?.extraPods ?? {},\n };\n}\n"]}
package/build/index.js CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const commander_1 = __importDefault(require("commander"));
7
7
  const ReactImportsPatcher_1 = require("./ReactImportsPatcher");
8
8
  const autolinking_1 = require("./autolinking");
9
+ const extraDependencies_1 = require("./autolinking/extraDependencies");
9
10
  /**
10
11
  * Registers a command that only searches for available expo modules.
11
12
  */
@@ -59,11 +60,12 @@ module.exports = async function (args) {
59
60
  // Searches for available expo modules and resolves the results for given platform.
60
61
  registerResolveCommand('resolve', async (results, options) => {
61
62
  const modules = await (0, autolinking_1.resolveModulesAsync)(results, options);
63
+ const extraDependencies = await (0, extraDependencies_1.resolveExtraDependenciesAsync)();
62
64
  if (options.json) {
63
- console.log(JSON.stringify({ modules }));
65
+ console.log(JSON.stringify({ extraDependencies, modules }));
64
66
  }
65
67
  else {
66
- console.log(require('util').inspect({ modules }, false, null, true));
68
+ console.log(require('util').inspect({ extraDependencies, modules }, false, null, true));
67
69
  }
68
70
  }).option('-j, --json', 'Output results in the plain JSON format.', () => true, false);
69
71
  // Generates a source file listing all packages to link.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import commander from 'commander';\n\nimport { patchReactImportsAsync } from './ReactImportsPatcher';\nimport {\n findModulesAsync,\n resolveModulesAsync,\n verifySearchResults,\n generatePackageListAsync,\n mergeLinkingOptionsAsync,\n} from './autolinking';\nimport { GenerateOptions, ResolveOptions, SearchOptions, SearchResults } from './types';\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: \"ios\", \"android\"',\n 'ios'\n )\n .option('--silent', 'Silence resolution warnings')\n .action(async (searchPaths, providedOptions) => {\n const options = await mergeLinkingOptionsAsync<OptionsType>({\n ...providedOptions,\n searchPaths,\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// Register for `patch-react-imports` command\nfunction registerPatchReactImportsCommand() {\n return commander\n .command('patch-react-imports [paths...]')\n .requiredOption('--pods-root <podsRoot>', 'The path to `Pods` directory')\n .option('--dry-run', 'Only list files without writing changes to the file system')\n .action(patchReactImportsAsync);\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) => {\n const numberOfDuplicates = verifySearchResults(results);\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\n if (options.json) {\n console.log(JSON.stringify({ modules }));\n } else {\n console.log(require('util').inspect({ modules }, false, null, true));\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 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 registerPatchReactImportsCommand();\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';\n\nimport { patchReactImportsAsync } from './ReactImportsPatcher';\nimport {\n findModulesAsync,\n resolveModulesAsync,\n verifySearchResults,\n generatePackageListAsync,\n mergeLinkingOptionsAsync,\n} from './autolinking';\nimport { resolveExtraDependenciesAsync } from './autolinking/extraDependencies';\nimport { GenerateOptions, ResolveOptions, SearchOptions, SearchResults } from './types';\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: \"ios\", \"android\"',\n 'ios'\n )\n .option('--silent', 'Silence resolution warnings')\n .action(async (searchPaths, providedOptions) => {\n const options = await mergeLinkingOptionsAsync<OptionsType>({\n ...providedOptions,\n searchPaths,\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// Register for `patch-react-imports` command\nfunction registerPatchReactImportsCommand() {\n return commander\n .command('patch-react-imports [paths...]')\n .requiredOption('--pods-root <podsRoot>', 'The path to `Pods` directory')\n .option('--dry-run', 'Only list files without writing changes to the file system')\n .action(patchReactImportsAsync);\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) => {\n const numberOfDuplicates = verifySearchResults(results);\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 resolveExtraDependenciesAsync();\n\n if (options.json) {\n console.log(JSON.stringify({ extraDependencies, modules }));\n } else {\n console.log(require('util').inspect({ extraDependencies, modules }, false, null, true));\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 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 registerPatchReactImportsCommand();\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-modules-autolinking",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "Scripts that autolink Expo modules.",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -42,11 +42,12 @@
42
42
  "tempy": "^0.7.1"
43
43
  },
44
44
  "dependencies": {
45
+ "@expo/config": "~8.1.0",
45
46
  "chalk": "^4.1.0",
46
47
  "commander": "^7.2.0",
47
48
  "fast-glob": "^3.2.5",
48
49
  "find-up": "^5.0.0",
49
50
  "fs-extra": "^9.1.0"
50
51
  },
51
- "gitHead": "3ccd2edee9cbfed217557675cb50f0ba5e55a9e4"
52
+ "gitHead": "ca6e2711477ff273a7a91a81947f933dba2935b0"
52
53
  }
@@ -56,6 +56,15 @@ class ExpoModule {
56
56
  }
57
57
  }
58
58
 
59
+ // Object representing a maven repository.
60
+ class MavenRepo {
61
+ String url
62
+
63
+ MavenRepo(Object data) {
64
+ this.url = data
65
+ }
66
+ }
67
+
59
68
  class ExpoAutolinkingManager {
60
69
  private File projectDir
61
70
  private Map options
@@ -93,6 +102,11 @@ class ExpoAutolinkingManager {
93
102
  return json.modules.collect { new ExpoModule(it) }
94
103
  }
95
104
 
105
+ MavenRepo[] getExtraMavenRepos() {
106
+ Object json = resolve()
107
+ return json.extraDependencies.androidMavenRepos.collect { new MavenRepo(it) }
108
+ }
109
+
96
110
  static void generatePackageList(Project project, Map options) {
97
111
  String[] args = convertOptionsToCommandArgs('generate-package-list', options)
98
112
 
@@ -186,6 +200,7 @@ if (rootProject instanceof ProjectDescriptor) {
186
200
  ext.useExpoModules = { Map options = [:] ->
187
201
  ExpoAutolinkingManager manager = new ExpoAutolinkingManager(rootProject.projectDir, options)
188
202
  ExpoModule[] modules = manager.getModules()
203
+ MavenRepo[] extraMavenRepos = manager.getExtraMavenRepos()
189
204
 
190
205
  for (module in modules) {
191
206
  for (moduleProject in module.projects) {
@@ -197,12 +212,27 @@ if (rootProject instanceof ProjectDescriptor) {
197
212
  }
198
213
  }
199
214
 
200
- // Add plugin classpath to the root project
201
215
  gradle.beforeProject { project ->
202
- if (project === project.rootProject) {
203
- for (module in modules) {
204
- for (modulePlugin in module.plugins) {
205
- project.buildscript.dependencies.add('classpath', "${modulePlugin.group}:${modulePlugin.id}")
216
+ if (project !== project.rootProject) {
217
+ return
218
+ }
219
+ def rootProject = project
220
+
221
+ // Add plugin classpath to the root project
222
+ for (module in modules) {
223
+ for (modulePlugin in module.plugins) {
224
+ rootProject.buildscript.dependencies.add('classpath', "${modulePlugin.group}:${modulePlugin.id}")
225
+ }
226
+ }
227
+
228
+ // Add extra maven repositories to allprojects
229
+ for (mavenRepo in extraMavenRepos) {
230
+ println "Adding extra maven repository - '${mavenRepo.url}'"
231
+ }
232
+ rootProject.allprojects { eachProject ->
233
+ eachProject.repositories {
234
+ for (mavenRepo in extraMavenRepos) {
235
+ maven { url = mavenRepo.url }
206
236
  }
207
237
  }
208
238
  }
@@ -17,7 +17,9 @@ module Expo
17
17
  @podfile = podfile
18
18
  @target_definition = target_definition
19
19
  @options = options
20
- @packages = resolve()['modules'].map { |json_package| Package.new(json_package) }
20
+ resolve_result = resolve()
21
+ @packages = resolve_result['modules'].map { |json_package| Package.new(json_package) }
22
+ @extraPods = resolve_result['extraDependencies']['iosPods']
21
23
  end
22
24
 
23
25
  public def use_expo_modules!
@@ -80,6 +82,25 @@ module Expo
80
82
  }
81
83
  }
82
84
  end
85
+
86
+ @extraPods.each { |pod|
87
+ UI.info "Adding extra pod - #{pod['name']} (#{pod['version'] || '*'})"
88
+ requirements = Array.new
89
+ requirements << pod['version'] if pod['version']
90
+ options = Hash.new
91
+ options[:configurations] = pod['configurations'] if pod['configurations']
92
+ options[:modular_headers] = pod['modular_headers'] if pod['modular_headers']
93
+ options[:source] = pod['source'] if pod['source']
94
+ options[:path] = pod['path'] if pod['path']
95
+ options[:podspec] = pod['podspec'] if pod['podspec']
96
+ options[:testspecs] = pod['testspecs'] if pod['testspecs']
97
+ options[:git] = pod['git'] if pod['git']
98
+ options[:branch] = pod['branch'] if pod['branch']
99
+ options[:tag] = pod['tag'] if pod['tag']
100
+ options[:commit] = pod['commit'] if pod['commit']
101
+ requirements << options
102
+ @podfile.pod(pod['name'], *requirements)
103
+ }
83
104
  self
84
105
  end
85
106
 
@@ -36,7 +36,7 @@ export async function patchFileAsync(headerSet: Set<string>, file: string, dryRu
36
36
  let changed = false;
37
37
  const content = await fs.readFile(file, 'utf-8');
38
38
  let transformContent = content.replace(
39
- /^#import\s+"(.+)"$/gm,
39
+ /(?<=^\s*)#import\s+"(.+)"(?=\s*$)/gm,
40
40
  (match: string, headerName: string): string => {
41
41
  // `#import "RCTBridge.h"` -> `#import <React/RCTBridge.h>`
42
42
  if (headerSet.has(headerName)) {
@@ -59,7 +59,7 @@ export async function patchFileAsync(headerSet: Set<string>, file: string, dryRu
59
59
  );
60
60
 
61
61
  transformContent = transformContent.replace(
62
- /^#(if|elif)\s+__has_include\("(.+)"\)$/gm,
62
+ /(?<=^\s*)#(if|elif)\s+__has_include\("(.+)"\)(?=\s*$)/gm,
63
63
  (match: string, ifPrefix: string, headerName: string): string => {
64
64
  // `#if __has_include("RCTBridge.h")` -> `#if __has_include(<React/RCTBridge.h>)`
65
65
  if (headerSet.has(headerName)) {
@@ -0,0 +1,51 @@
1
+ import { getConfig } from '@expo/config';
2
+ import path from 'path';
3
+
4
+ import { projectPackageJsonPath } from './mergeLinkingOptions';
5
+
6
+ interface AndroidMavenRepository {
7
+ url: string;
8
+ }
9
+
10
+ interface IosPod {
11
+ name: string;
12
+ version?: string;
13
+ configurations?: string[];
14
+ modular_headers?: boolean;
15
+ source?: string;
16
+ path?: string;
17
+ podspec?: string;
18
+ testspecs?: string[];
19
+ git?: string;
20
+ branch?: string;
21
+ tag?: string;
22
+ commit?: string;
23
+ }
24
+
25
+ interface ExtraDependencies {
26
+ androidMavenRepos: AndroidMavenRepository[];
27
+ iosPods?: IosPod[];
28
+ }
29
+
30
+ /**
31
+ * Gets the `expo-build-properties` settings from the app config.
32
+ */
33
+ export async function getBuildPropertiesAsync(): Promise<Record<string, any>> {
34
+ const projectRoot = path.dirname(projectPackageJsonPath);
35
+ const { exp: config } = await getConfig(projectRoot, { skipSDKVersionRequirement: true });
36
+ const buildPropertiesPlugin = config.plugins?.find(
37
+ (item) => item[0] === 'expo-build-properties'
38
+ )?.[1];
39
+ return buildPropertiesPlugin ?? {};
40
+ }
41
+
42
+ /**
43
+ * Resolves the extra dependencies from `expo-build-properties` settings.
44
+ */
45
+ export async function resolveExtraDependenciesAsync(): Promise<Partial<ExtraDependencies>> {
46
+ const buildProps = await getBuildPropertiesAsync();
47
+ return {
48
+ androidMavenRepos: buildProps.android?.extraMavenRepos ?? [],
49
+ iosPods: buildProps.ios?.extraPods ?? {},
50
+ };
51
+ }
package/src/index.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  generatePackageListAsync,
9
9
  mergeLinkingOptionsAsync,
10
10
  } from './autolinking';
11
+ import { resolveExtraDependenciesAsync } from './autolinking/extraDependencies';
11
12
  import { GenerateOptions, ResolveOptions, SearchOptions, SearchResults } from './types';
12
13
 
13
14
  /**
@@ -85,11 +86,12 @@ module.exports = async function (args: string[]) {
85
86
  // Searches for available expo modules and resolves the results for given platform.
86
87
  registerResolveCommand('resolve', async (results, options) => {
87
88
  const modules = await resolveModulesAsync(results, options);
89
+ const extraDependencies = await resolveExtraDependenciesAsync();
88
90
 
89
91
  if (options.json) {
90
- console.log(JSON.stringify({ modules }));
92
+ console.log(JSON.stringify({ extraDependencies, modules }));
91
93
  } else {
92
- console.log(require('util').inspect({ modules }, false, null, true));
94
+ console.log(require('util').inspect({ extraDependencies, modules }, false, null, true));
93
95
  }
94
96
  }).option<boolean>('-j, --json', 'Output results in the plain JSON format.', () => true, false);
95
97