expo-modules-autolinking 3.0.13 → 3.0.15
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 +17 -0
- package/android/expo-gradle-plugin/expo-autolinking-plugin/src/main/kotlin/expo/modules/plugin/ExpoAutolinkingPlugin.kt +79 -0
- package/build/ExpoModuleConfig.d.ts +1 -1
- package/build/ExpoModuleConfig.js +4 -4
- package/build/ExpoModuleConfig.js.map +1 -1
- package/build/commands/verifyCommand.js +7 -4
- package/build/commands/verifyCommand.js.map +1 -1
- package/build/dependencies/CachedDependenciesLinker.d.ts +0 -1
- package/build/dependencies/CachedDependenciesLinker.js +0 -5
- package/build/dependencies/CachedDependenciesLinker.js.map +1 -1
- package/build/dependencies/resolution.d.ts +0 -1
- package/build/dependencies/resolution.js +8 -40
- package/build/dependencies/resolution.js.map +1 -1
- package/build/dependencies/utils.d.ts +1 -1
- package/build/dependencies/utils.js +4 -4
- package/build/dependencies/utils.js.map +1 -1
- package/build/reactNativeConfig/config.d.ts +1 -2
- package/build/reactNativeConfig/config.js +4 -3
- package/build/reactNativeConfig/config.js.map +1 -1
- package/build/reactNativeConfig/reactNativeConfig.js +9 -8
- package/build/reactNativeConfig/reactNativeConfig.js.map +1 -1
- package/build/utils.d.ts +1 -0
- package/build/utils.js +21 -0
- package/build/utils.js.map +1 -0
- package/jest.setup.ts +4 -0
- package/package.json +2 -2
- package/scripts/ios/cocoapods/installer.rb +81 -0
- package/src/ExpoModuleConfig.ts +3 -2
- package/src/commands/verifyCommand.ts +12 -4
- package/src/dependencies/CachedDependenciesLinker.ts +3 -11
- package/src/dependencies/resolution.ts +11 -46
- package/src/dependencies/utils.ts +5 -2
- package/src/reactNativeConfig/config.ts +5 -4
- package/src/reactNativeConfig/reactNativeConfig.ts +10 -7
- package/src/utils.ts +17 -0
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,23 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 3.0.15 — 2025-10-09
|
|
14
|
+
|
|
15
|
+
### 🐛 Bug fixes
|
|
16
|
+
|
|
17
|
+
- [iOS] Added build phase script for a workaround to autolinking-generated react-native-config output not being used in ReactCodegen script phase due to temp output directory. ([#40219](https://github.com/expo/expo/pull/40219) by [@chrfalch](https://github.com/chrfalch))
|
|
18
|
+
|
|
19
|
+
### 💡 Others
|
|
20
|
+
|
|
21
|
+
- Check `react-native` and `react-native-tvos` for duplicates in the verify command explicitly ([#40180](https://github.com/expo/expo/pull/40180) by [@kitten](https://github.com/kitten))
|
|
22
|
+
- [Android] Sync flavor dimensions and product flavors from app to expo module ([#40238](https://github.com/expo/expo/pull/40238) by [@kosmydel](https://github.com/kosmydel))
|
|
23
|
+
|
|
24
|
+
## 3.0.14 - 2025-10-01
|
|
25
|
+
|
|
26
|
+
### 💡 Others
|
|
27
|
+
|
|
28
|
+
- Always include autolinking for top-level `devDependencies` and memoize intermediate config loading. ([#39955](https://github.com/expo/expo/pull/39955) by [@kitten](https://github.com/kitten))
|
|
29
|
+
|
|
13
30
|
## 3.0.13 — 2025-09-22
|
|
14
31
|
|
|
15
32
|
### 🎉 New features
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
package expo.modules.plugin
|
|
2
2
|
|
|
3
3
|
import com.android.build.api.variant.AndroidComponentsExtension
|
|
4
|
+
import com.android.build.gradle.BaseExtension
|
|
4
5
|
import com.android.build.gradle.internal.tasks.factory.dependsOn
|
|
5
6
|
import expo.modules.plugin.text.Colors
|
|
6
7
|
import expo.modules.plugin.text.withColor
|
|
@@ -27,6 +28,9 @@ open class ExpoAutolinkingPlugin : Plugin<Project> {
|
|
|
27
28
|
project.logger.quiet("")
|
|
28
29
|
project.logger.quiet("Using expo modules")
|
|
29
30
|
|
|
31
|
+
val appProject = findAppProject(project.rootProject)
|
|
32
|
+
appProject?.let { copyAppDimensionsAndFlavorsToProject(project, it) }
|
|
33
|
+
|
|
30
34
|
val (prebuiltProjects, projects) = config.allProjects.partition { project ->
|
|
31
35
|
project.usePublication
|
|
32
36
|
}
|
|
@@ -91,4 +95,79 @@ open class ExpoAutolinkingPlugin : Plugin<Project> {
|
|
|
91
95
|
it.options.set(options.toJson())
|
|
92
96
|
}
|
|
93
97
|
}
|
|
98
|
+
|
|
99
|
+
private fun findAppProject(root: Project): Project? {
|
|
100
|
+
return root.allprojects.firstOrNull { it.plugins.hasPlugin("com.android.application") }
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
private fun copyAppDimensionsAndFlavorsToProject(
|
|
104
|
+
project: Project,
|
|
105
|
+
appProject: Project
|
|
106
|
+
) {
|
|
107
|
+
val appAndroid = appProject.extensions.findByName("android") as? BaseExtension ?: run {
|
|
108
|
+
return
|
|
109
|
+
}
|
|
110
|
+
val consumerAndroid = project.extensions.findByName("android") as? BaseExtension ?: run {
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
val appDimensions = syncFlavorDimensions(project, consumerAndroid, appAndroid)
|
|
115
|
+
copyMissingProductFlavors(project, consumerAndroid, appAndroid, appDimensions)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private fun syncFlavorDimensions(
|
|
119
|
+
project: Project,
|
|
120
|
+
consumerAndroid: BaseExtension,
|
|
121
|
+
appAndroid: BaseExtension
|
|
122
|
+
): List<String> {
|
|
123
|
+
val appDimensions = appAndroid
|
|
124
|
+
.flavorDimensionList
|
|
125
|
+
.takeIf { it.isNotEmpty() }
|
|
126
|
+
?: return emptyList()
|
|
127
|
+
|
|
128
|
+
val consumerDimensions = (consumerAndroid.flavorDimensionList).toMutableList()
|
|
129
|
+
val dimensionsAdded = appDimensions.any { dimension ->
|
|
130
|
+
if (dimension !in consumerDimensions) {
|
|
131
|
+
consumerDimensions.add(dimension)
|
|
132
|
+
true
|
|
133
|
+
} else {
|
|
134
|
+
false
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (dimensionsAdded) {
|
|
139
|
+
consumerAndroid.flavorDimensions(*consumerDimensions.toTypedArray())
|
|
140
|
+
project.logger.quiet(" -> Copied/merged flavorDimensions: ${consumerDimensions.joinToString()}")
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return appDimensions
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private fun copyMissingProductFlavors(
|
|
147
|
+
project: Project,
|
|
148
|
+
consumerAndroid: BaseExtension,
|
|
149
|
+
appAndroid: BaseExtension,
|
|
150
|
+
appDimensions: List<String>
|
|
151
|
+
) {
|
|
152
|
+
val appFlavors = appAndroid.productFlavors
|
|
153
|
+
val consumerFlavors = consumerAndroid.productFlavors
|
|
154
|
+
val existingFlavorNames = consumerFlavors.map { it.name }.toSet()
|
|
155
|
+
|
|
156
|
+
appFlavors.forEach { appFlavor ->
|
|
157
|
+
if (appFlavor.name !in existingFlavorNames) {
|
|
158
|
+
val dimension = appFlavor.dimension ?: appDimensions.singleOrNull()
|
|
159
|
+
|
|
160
|
+
consumerFlavors.create(appFlavor.name).apply {
|
|
161
|
+
this.dimension = dimension
|
|
162
|
+
appFlavor.applicationIdSuffix?.let { this.applicationIdSuffix = it }
|
|
163
|
+
appFlavor.versionNameSuffix?.let { this.versionNameSuffix = it }
|
|
164
|
+
if (appFlavor.manifestPlaceholders.isNotEmpty()) {
|
|
165
|
+
this.manifestPlaceholders.putAll(appFlavor.manifestPlaceholders)
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
project.logger.quiet(" -> Created flavor '${appFlavor.name}' (dimension='$dimension') in :${project.path}")
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
94
173
|
}
|
|
@@ -79,4 +79,4 @@ export declare class ExpoModuleConfig {
|
|
|
79
79
|
*/
|
|
80
80
|
toJSON(): RawExpoModuleConfig;
|
|
81
81
|
}
|
|
82
|
-
export declare
|
|
82
|
+
export declare const discoverExpoModuleConfigAsync: (input: string, ...args: any[]) => Promise<any>;
|
|
@@ -3,10 +3,10 @@ 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.ExpoModuleConfig = exports.ExpoAndroidProjectConfig = void 0;
|
|
7
|
-
exports.discoverExpoModuleConfigAsync = discoverExpoModuleConfigAsync;
|
|
6
|
+
exports.discoverExpoModuleConfigAsync = exports.ExpoModuleConfig = exports.ExpoAndroidProjectConfig = void 0;
|
|
8
7
|
const fs_1 = __importDefault(require("fs"));
|
|
9
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
10
|
function arrayize(value) {
|
|
11
11
|
if (Array.isArray(value)) {
|
|
12
12
|
return value;
|
|
@@ -159,7 +159,7 @@ class ExpoModuleConfig {
|
|
|
159
159
|
exports.ExpoModuleConfig = ExpoModuleConfig;
|
|
160
160
|
/** Names of Expo Module config files (highest to lowest priority) */
|
|
161
161
|
const EXPO_MODULE_CONFIG_FILENAMES = ['expo-module.config.json', 'unimodule.json'];
|
|
162
|
-
async function discoverExpoModuleConfigAsync(directoryPath) {
|
|
162
|
+
exports.discoverExpoModuleConfigAsync = (0, utils_1.memoize)(async function discoverExpoModuleConfigAsync(directoryPath) {
|
|
163
163
|
for (let idx = 0; idx < EXPO_MODULE_CONFIG_FILENAMES.length; idx++) {
|
|
164
164
|
// TODO: Validate the raw config against a schema.
|
|
165
165
|
// TODO: Support for `*.js` files, not only static `*.json`.
|
|
@@ -175,5 +175,5 @@ async function discoverExpoModuleConfigAsync(directoryPath) {
|
|
|
175
175
|
return new ExpoModuleConfig(JSON.parse(text));
|
|
176
176
|
}
|
|
177
177
|
return null;
|
|
178
|
-
}
|
|
178
|
+
});
|
|
179
179
|
//# sourceMappingURL=ExpoModuleConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpoModuleConfig.js","sourceRoot":"","sources":["../src/ExpoModuleConfig.ts"],"names":[],"mappings":";;;;;;AA8LA,sEAiBC;AA/MD,4CAAoB;AACpB,gDAAwB;AAWxB,SAAS,QAAQ,CAAI,KAA0B;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC;AAED,MAAa,wBAAwB;IAE1B;IACA;IACA;IACA;IACA;IACA;IAIA;IAVT,YACS,IAAY,EACZ,IAAY,EACZ,OAAkB,EAClB,WAAgC,EAChC,iBAAuD,EACvD,8BAAuC;IAC9C;;OAEG;IACI,YAAqB,KAAK;QAT1B,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAW;QAClB,gBAAW,GAAX,WAAW,CAAqB;QAChC,sBAAiB,GAAjB,iBAAiB,CAAsC;QACvD,mCAA8B,GAA9B,8BAA8B,CAAS;QAIvC,cAAS,GAAT,SAAS,CAAiB;IAChC,CAAC;CACL;AAbD,4DAaC;AAED;;GAEG;AACH,MAAa,gBAAgB;IACN;IAArB,YAAqB,SAA8B;QAA9B,cAAS,GAAT,SAAS,CAAqB;IAAG,CAAC;IAEvD;;OAEG;IACH,gBAAgB,CAAC,QAA2B;QAC1C,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC;QAE1D,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;YACvB,8FAA8F;YAC9F,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,4EAA4E;YAC5E,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,iBAAiB,EAAE,EAAE;gBACnD,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC;QACL,CAAC;QACD,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,KAAK,CAAC;YACX,KAAK,OAAO,CAAC;YACb,KAAK,MAAM;gBACT,yFAAyF;gBACzF,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACvF;gBACE,OAAO,kBAAkB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,YAAY;QACV,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO,WAAW,EAAE,OAAO,IAAI,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,2BAA2B;QACzB,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,sBAAsB,IAAI,EAAE,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,0BAA0B;QACxB,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,qBAAqB,IAAI,EAAE,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,qBAAqB;QACnB,OAAO,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,eAAe,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,IAAI,KAAK,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,kBAA0B;QACxC,MAAM,eAAe,GAA+B,EAAE,CAAC;QAEvD,8DAA8D;QAC9D,eAAe,CAAC,IAAI,CAClB,IAAI,wBAAwB,CAC1B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,kBAAkB,EAClD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,EACzC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,EAC/B,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,EACnC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,iBAAiB,EACzC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,8BAA8B,EACtD,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,mDAAmD;SAClF,CACF,CAAC;QAEF,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACpD,eAAe,CAAC,IAAI,CAClB,IAAI,wBAAwB,CAC1B,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,iBAAiB,EACzB,OAAO,CAAC,8BAA8B,CACvC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,wBAAwB;QACtB,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,iBAAiB,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AApJD,4CAoJC;AAED,qEAAqE;AACrE,MAAM,4BAA4B,GAAG,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,CAAC;AAE5E,KAAK,UAAU,6BAA6B,CACjD,aAAqB;IAErB,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,4BAA4B,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QACnE,kDAAkD;QAClD,4DAA4D;QAC5D,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,4BAA4B,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/E,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;YACpB,SAAS;QACX,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAwB,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport {\n AndroidGradleAarProjectDescriptor,\n AndroidGradlePluginDescriptor,\n AndroidPublication,\n RawExpoModuleConfig,\n RawModuleConfigApple,\n SupportedPlatform,\n} from './types';\n\nfunction arrayize<T>(value: T[] | T | undefined): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n return value != null ? [value] : [];\n}\n\nexport class ExpoAndroidProjectConfig {\n constructor(\n public name: string,\n public path: string,\n public modules?: string[],\n public publication?: AndroidPublication,\n public gradleAarProjects?: AndroidGradleAarProjectDescriptor[],\n public shouldUsePublicationScriptPath?: string,\n /**\n * Whether this project is the root one.\n */\n public isDefault: boolean = false\n ) {}\n}\n\n/**\n * A class that wraps the raw config (`expo-module.json` or `unimodule.json`).\n */\nexport class ExpoModuleConfig {\n constructor(readonly rawConfig: RawExpoModuleConfig) {}\n\n /**\n * Whether the module supports given platform.\n */\n supportsPlatform(platform: SupportedPlatform): boolean {\n const supportedPlatforms = this.rawConfig.platforms ?? [];\n\n if (platform === 'web') {\n // Web platform is implicitly supported for autolinking resolution but has no special behavior\n return true;\n } else if (platform === 'apple') {\n // Apple platform is supported when any of iOS, macOS and tvOS is supported.\n return supportedPlatforms.some((supportedPlatform) => {\n return ['apple', 'ios', 'macos', 'tvos'].includes(supportedPlatform);\n });\n }\n switch (platform) {\n case 'ios':\n case 'macos':\n case 'tvos':\n // ios|macos|tvos are supported when the module supports \"apple\" as a platform in general\n return supportedPlatforms.includes(platform) || supportedPlatforms.includes('apple');\n default:\n return supportedPlatforms.includes(platform);\n }\n }\n\n /**\n * Returns the generic config for all Apple platforms with a fallback to the legacy iOS config.\n */\n getAppleConfig(): RawModuleConfigApple | null {\n return this.rawConfig.apple ?? this.rawConfig.ios ?? null;\n }\n\n /**\n * Returns a list of names of Swift native modules classes to put to the generated modules provider file.\n */\n appleModules() {\n const appleConfig = this.getAppleConfig();\n return appleConfig?.modules ?? [];\n }\n\n /**\n * Returns a list of names of Swift classes that receives AppDelegate life-cycle events.\n */\n appleAppDelegateSubscribers(): string[] {\n return this.getAppleConfig()?.appDelegateSubscribers ?? [];\n }\n\n /**\n * Returns a list of names of Swift classes that implement `ExpoReactDelegateHandler`.\n */\n appleReactDelegateHandlers(): string[] {\n return this.getAppleConfig()?.reactDelegateHandlers ?? [];\n }\n\n /**\n * Returns podspec paths defined by the module author.\n */\n applePodspecPaths(): string[] {\n return arrayize(this.getAppleConfig()?.podspecPath);\n }\n\n /**\n * Returns the product module names, if defined by the module author.\n */\n appleSwiftModuleNames(): string[] {\n return arrayize(this.getAppleConfig()?.swiftModuleName);\n }\n\n /**\n * Returns whether this module will be added only to the debug configuration\n */\n appleDebugOnly(): boolean {\n return this.getAppleConfig()?.debugOnly ?? false;\n }\n\n /**\n * Returns information about Android projects defined by the module author.\n */\n androidProjects(defaultProjectName: string): ExpoAndroidProjectConfig[] {\n const androidProjects: ExpoAndroidProjectConfig[] = [];\n\n // Adding the \"root\" Android project - it might not be valide.\n androidProjects.push(\n new ExpoAndroidProjectConfig(\n this.rawConfig.android?.name ?? defaultProjectName,\n this.rawConfig.android?.path ?? 'android',\n this.rawConfig.android?.modules,\n this.rawConfig.android?.publication,\n this.rawConfig.android?.gradleAarProjects,\n this.rawConfig.android?.shouldUsePublicationScriptPath,\n !this.rawConfig.android?.path // it's default project because path is not defined\n )\n );\n\n this.rawConfig.android?.projects?.forEach((project) => {\n androidProjects.push(\n new ExpoAndroidProjectConfig(\n project.name,\n project.path,\n project.modules,\n project.publication,\n project.gradleAarProjects,\n project.shouldUsePublicationScriptPath\n )\n );\n });\n\n return androidProjects;\n }\n\n /**\n * Returns gradle plugins descriptors defined by the module author.\n */\n androidGradlePlugins(): AndroidGradlePluginDescriptor[] {\n return arrayize(this.rawConfig.android?.gradlePlugins ?? []);\n }\n\n /**\n * Returns gradle projects containing AAR files defined by the module author.\n */\n androidGradleAarProjects(): AndroidGradleAarProjectDescriptor[] {\n return arrayize(this.rawConfig.android?.gradleAarProjects ?? []);\n }\n\n /**\n * Returns the publication config for Android.\n */\n androidPublication(): AndroidPublication | undefined {\n return this.rawConfig.android?.publication;\n }\n\n /**\n * Returns core features required by the module author.\n */\n coreFeatures(): string[] {\n return arrayize(this.rawConfig.coreFeatures ?? []);\n }\n\n /**\n * Returns serializable raw config.\n */\n toJSON(): RawExpoModuleConfig {\n return this.rawConfig;\n }\n}\n\n/** Names of Expo Module config files (highest to lowest priority) */\nconst EXPO_MODULE_CONFIG_FILENAMES = ['expo-module.config.json', 'unimodule.json'];\n\nexport async function discoverExpoModuleConfigAsync(\n directoryPath: string\n): Promise<ExpoModuleConfig | null> {\n for (let idx = 0; idx < EXPO_MODULE_CONFIG_FILENAMES.length; idx++) {\n // TODO: Validate the raw config against a schema.\n // TODO: Support for `*.js` files, not only static `*.json`.\n const targetPath = path.join(directoryPath, EXPO_MODULE_CONFIG_FILENAMES[idx]);\n let text: string;\n try {\n text = await fs.promises.readFile(targetPath, 'utf8');\n } catch {\n // try the next file\n continue;\n }\n return new ExpoModuleConfig(JSON.parse(text) as RawExpoModuleConfig);\n }\n return null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ExpoModuleConfig.js","sourceRoot":"","sources":["../src/ExpoModuleConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport {\n AndroidGradleAarProjectDescriptor,\n AndroidGradlePluginDescriptor,\n AndroidPublication,\n RawExpoModuleConfig,\n RawModuleConfigApple,\n SupportedPlatform,\n} from './types';\nimport { memoize } from './utils';\n\nfunction arrayize<T>(value: T[] | T | undefined): T[] {\n if (Array.isArray(value)) {\n return value;\n }\n return value != null ? [value] : [];\n}\n\nexport class ExpoAndroidProjectConfig {\n constructor(\n public name: string,\n public path: string,\n public modules?: string[],\n public publication?: AndroidPublication,\n public gradleAarProjects?: AndroidGradleAarProjectDescriptor[],\n public shouldUsePublicationScriptPath?: string,\n /**\n * Whether this project is the root one.\n */\n public isDefault: boolean = false\n ) {}\n}\n\n/**\n * A class that wraps the raw config (`expo-module.json` or `unimodule.json`).\n */\nexport class ExpoModuleConfig {\n constructor(readonly rawConfig: RawExpoModuleConfig) {}\n\n /**\n * Whether the module supports given platform.\n */\n supportsPlatform(platform: SupportedPlatform): boolean {\n const supportedPlatforms = this.rawConfig.platforms ?? [];\n\n if (platform === 'web') {\n // Web platform is implicitly supported for autolinking resolution but has no special behavior\n return true;\n } else if (platform === 'apple') {\n // Apple platform is supported when any of iOS, macOS and tvOS is supported.\n return supportedPlatforms.some((supportedPlatform) => {\n return ['apple', 'ios', 'macos', 'tvos'].includes(supportedPlatform);\n });\n }\n switch (platform) {\n case 'ios':\n case 'macos':\n case 'tvos':\n // ios|macos|tvos are supported when the module supports \"apple\" as a platform in general\n return supportedPlatforms.includes(platform) || supportedPlatforms.includes('apple');\n default:\n return supportedPlatforms.includes(platform);\n }\n }\n\n /**\n * Returns the generic config for all Apple platforms with a fallback to the legacy iOS config.\n */\n getAppleConfig(): RawModuleConfigApple | null {\n return this.rawConfig.apple ?? this.rawConfig.ios ?? null;\n }\n\n /**\n * Returns a list of names of Swift native modules classes to put to the generated modules provider file.\n */\n appleModules() {\n const appleConfig = this.getAppleConfig();\n return appleConfig?.modules ?? [];\n }\n\n /**\n * Returns a list of names of Swift classes that receives AppDelegate life-cycle events.\n */\n appleAppDelegateSubscribers(): string[] {\n return this.getAppleConfig()?.appDelegateSubscribers ?? [];\n }\n\n /**\n * Returns a list of names of Swift classes that implement `ExpoReactDelegateHandler`.\n */\n appleReactDelegateHandlers(): string[] {\n return this.getAppleConfig()?.reactDelegateHandlers ?? [];\n }\n\n /**\n * Returns podspec paths defined by the module author.\n */\n applePodspecPaths(): string[] {\n return arrayize(this.getAppleConfig()?.podspecPath);\n }\n\n /**\n * Returns the product module names, if defined by the module author.\n */\n appleSwiftModuleNames(): string[] {\n return arrayize(this.getAppleConfig()?.swiftModuleName);\n }\n\n /**\n * Returns whether this module will be added only to the debug configuration\n */\n appleDebugOnly(): boolean {\n return this.getAppleConfig()?.debugOnly ?? false;\n }\n\n /**\n * Returns information about Android projects defined by the module author.\n */\n androidProjects(defaultProjectName: string): ExpoAndroidProjectConfig[] {\n const androidProjects: ExpoAndroidProjectConfig[] = [];\n\n // Adding the \"root\" Android project - it might not be valide.\n androidProjects.push(\n new ExpoAndroidProjectConfig(\n this.rawConfig.android?.name ?? defaultProjectName,\n this.rawConfig.android?.path ?? 'android',\n this.rawConfig.android?.modules,\n this.rawConfig.android?.publication,\n this.rawConfig.android?.gradleAarProjects,\n this.rawConfig.android?.shouldUsePublicationScriptPath,\n !this.rawConfig.android?.path // it's default project because path is not defined\n )\n );\n\n this.rawConfig.android?.projects?.forEach((project) => {\n androidProjects.push(\n new ExpoAndroidProjectConfig(\n project.name,\n project.path,\n project.modules,\n project.publication,\n project.gradleAarProjects,\n project.shouldUsePublicationScriptPath\n )\n );\n });\n\n return androidProjects;\n }\n\n /**\n * Returns gradle plugins descriptors defined by the module author.\n */\n androidGradlePlugins(): AndroidGradlePluginDescriptor[] {\n return arrayize(this.rawConfig.android?.gradlePlugins ?? []);\n }\n\n /**\n * Returns gradle projects containing AAR files defined by the module author.\n */\n androidGradleAarProjects(): AndroidGradleAarProjectDescriptor[] {\n return arrayize(this.rawConfig.android?.gradleAarProjects ?? []);\n }\n\n /**\n * Returns the publication config for Android.\n */\n androidPublication(): AndroidPublication | undefined {\n return this.rawConfig.android?.publication;\n }\n\n /**\n * Returns core features required by the module author.\n */\n coreFeatures(): string[] {\n return arrayize(this.rawConfig.coreFeatures ?? []);\n }\n\n /**\n * Returns serializable raw config.\n */\n toJSON(): RawExpoModuleConfig {\n return this.rawConfig;\n }\n}\n\n/** Names of Expo Module config files (highest to lowest priority) */\nconst EXPO_MODULE_CONFIG_FILENAMES = ['expo-module.config.json', 'unimodule.json'];\n\nexport const discoverExpoModuleConfigAsync = memoize(async function discoverExpoModuleConfigAsync(\n directoryPath: string\n): Promise<ExpoModuleConfig | null> {\n for (let idx = 0; idx < EXPO_MODULE_CONFIG_FILENAMES.length; idx++) {\n // TODO: Validate the raw config against a schema.\n // TODO: Support for `*.js` files, not only static `*.json`.\n const targetPath = path.join(directoryPath, EXPO_MODULE_CONFIG_FILENAMES[idx]);\n let text: string;\n try {\n text = await fs.promises.readFile(targetPath, 'utf8');\n } catch {\n // try the next file\n continue;\n }\n return new ExpoModuleConfig(JSON.parse(text) as RawExpoModuleConfig);\n }\n return null;\n});\n"]}
|
|
@@ -10,6 +10,8 @@ const fs_1 = __importDefault(require("fs"));
|
|
|
10
10
|
const path_1 = __importDefault(require("path"));
|
|
11
11
|
const autolinkingOptions_1 = require("./autolinkingOptions");
|
|
12
12
|
const dependencies_1 = require("../dependencies");
|
|
13
|
+
// NOTE(@kitten): These are excluded explicitly, but we want to include them for the verify command explicitly
|
|
14
|
+
const INCLUDE_PACKAGES = ['react-native', 'react-native-tvos'];
|
|
13
15
|
function verifyCommand(cli) {
|
|
14
16
|
return (0, autolinkingOptions_1.registerAutolinkingArguments)(cli.command('verify'))
|
|
15
17
|
.option('-v, --verbose', 'Output all results instead of just warnings.', () => true, false)
|
|
@@ -20,7 +22,7 @@ function verifyCommand(cli) {
|
|
|
20
22
|
const autolinkingOptionsLoader = (0, autolinkingOptions_1.createAutolinkingOptionsLoader)(commandArguments);
|
|
21
23
|
const appRoot = await autolinkingOptionsLoader.getAppRoot();
|
|
22
24
|
const linker = (0, dependencies_1.makeCachedDependenciesLinker)({ projectRoot: appRoot });
|
|
23
|
-
const results = (0, dependencies_1.mergeResolutionResults)(await Promise.all(platforms.map((platform) => (0, dependencies_1.scanDependencyResolutionsForPlatform)(linker, platform))));
|
|
25
|
+
const results = (0, dependencies_1.mergeResolutionResults)(await Promise.all(platforms.map((platform) => (0, dependencies_1.scanDependencyResolutionsForPlatform)(linker, platform, INCLUDE_PACKAGES))));
|
|
24
26
|
await verifySearchResults(results, {
|
|
25
27
|
appRoot,
|
|
26
28
|
verbose: !!commandArguments.verbose,
|
|
@@ -85,20 +87,21 @@ async function verifySearchResults(results, options) {
|
|
|
85
87
|
return;
|
|
86
88
|
}
|
|
87
89
|
if (options.verbose) {
|
|
90
|
+
const sortResolutions = (resolutions) => [...resolutions].sort((a, b) => a.name.localeCompare(b.name));
|
|
88
91
|
if (groups.reactNativeProjectConfig.length) {
|
|
89
92
|
console.log(`🔎 Found ${groups.reactNativeProjectConfig.length} modules from React Native project config`);
|
|
90
|
-
for (const revision of groups.reactNativeProjectConfig) {
|
|
93
|
+
for (const revision of sortResolutions(groups.reactNativeProjectConfig)) {
|
|
91
94
|
console.log(` - ${await getHumanReadableDependency(revision)}`);
|
|
92
95
|
}
|
|
93
96
|
}
|
|
94
97
|
if (groups.searchPaths.length) {
|
|
95
98
|
console.log(`🔎 Found ${groups.searchPaths.length} modules in search paths`);
|
|
96
|
-
for (const revision of groups.searchPaths) {
|
|
99
|
+
for (const revision of sortResolutions(groups.searchPaths)) {
|
|
97
100
|
console.log(` - ${await getHumanReadableDependency(revision)}`);
|
|
98
101
|
}
|
|
99
102
|
}
|
|
100
103
|
console.log(`🔎 Found ${groups.dependencies.length} modules in dependencies`);
|
|
101
|
-
for (const revision of groups.dependencies) {
|
|
104
|
+
for (const revision of sortResolutions(groups.dependencies)) {
|
|
102
105
|
console.log(` - ${await getHumanReadableDependency(revision)}`);
|
|
103
106
|
}
|
|
104
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verifyCommand.js","sourceRoot":"","sources":["../../src/commands/verifyCommand.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport commander from 'commander';\nimport fs from 'fs';\nimport path from 'path';\n\nimport {\n AutolinkingCommonArguments,\n createAutolinkingOptionsLoader,\n registerAutolinkingArguments,\n} from './autolinkingOptions';\nimport {\n type BaseDependencyResolution,\n type DependencyResolution,\n type ResolutionResult,\n DependencyResolutionSource,\n makeCachedDependenciesLinker,\n mergeResolutionResults,\n scanDependencyResolutionsForPlatform,\n} from '../dependencies';\n\ninterface VerifyArguments extends AutolinkingCommonArguments {\n verbose?: boolean | null;\n json?: boolean | null;\n}\n\nexport function verifyCommand(cli: commander.CommanderStatic) {\n return registerAutolinkingArguments(cli.command('verify'))\n .option('-v, --verbose', 'Output all results instead of just warnings.', () => true, false)\n .option('-j, --json', 'Output results in the plain JSON format.', () => true, false)\n .option(\n '-p, --platform [platform]',\n 'The platform to validate native modules for. Available options: \"android\", \"ios\", \"both\"',\n 'both'\n )\n .action(async (commandArguments: VerifyArguments) => {\n const platforms =\n commandArguments.platform === 'both' ? ['android', 'ios'] : [commandArguments.platform!];\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader(commandArguments);\n const appRoot = await autolinkingOptionsLoader.getAppRoot();\n const linker = makeCachedDependenciesLinker({ projectRoot: appRoot });\n const results = mergeResolutionResults(\n await Promise.all(\n platforms.map((platform) => scanDependencyResolutionsForPlatform(linker, platform))\n )\n );\n await verifySearchResults(results, {\n appRoot,\n verbose: !!commandArguments.verbose,\n json: !!commandArguments.json,\n });\n });\n}\n\ninterface VerifyOptions {\n appRoot: string;\n verbose?: boolean;\n json?: boolean;\n}\n\ninterface VerifyGroups {\n reactNativeProjectConfig: DependencyResolution[];\n searchPaths: DependencyResolution[];\n dependencies: DependencyResolution[];\n duplicates: DependencyResolution[];\n}\n\n/**\n * Verifies the search results by checking whether there are no duplicates.\n */\nexport async function verifySearchResults(\n results: ResolutionResult,\n options: VerifyOptions\n): Promise<void> {\n const { appRoot } = options;\n\n async function getHumanReadableDependency(dependency: BaseDependencyResolution): Promise<string> {\n let version = dependency.version || null;\n if (!version) {\n try {\n const pkgContents = await fs.promises.readFile(\n path.join(dependency.path, 'package.json'),\n 'utf8'\n );\n const pkg: unknown = JSON.parse(pkgContents);\n if (pkg && typeof pkg === 'object' && 'version' in pkg && typeof pkg.version === 'string') {\n version = pkg.version;\n }\n } catch (error) {\n version = null;\n }\n }\n const relative = path.relative(appRoot, dependency.originPath);\n return version\n ? `${dependency.name}@${version} (at: ${relative})`\n : `${dependency.name} at: ${relative}`;\n }\n\n const groups: VerifyGroups = {\n reactNativeProjectConfig: [],\n searchPaths: [],\n dependencies: [],\n duplicates: [],\n };\n\n for (const moduleName in results) {\n const revision = results[moduleName];\n if (!revision) {\n continue;\n } else if (revision.duplicates?.length) {\n groups.duplicates.push(revision);\n } else {\n switch (revision.source) {\n case DependencyResolutionSource.RN_CLI_LOCAL:\n groups.reactNativeProjectConfig.push(revision);\n break;\n case DependencyResolutionSource.SEARCH_PATH:\n groups.searchPaths.push(revision);\n break;\n case DependencyResolutionSource.RECURSIVE_RESOLUTION:\n groups.dependencies.push(revision);\n break;\n }\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify(groups));\n return;\n }\n\n if (options.verbose) {\n if (groups.reactNativeProjectConfig.length) {\n console.log(\n `🔎 Found ${groups.reactNativeProjectConfig.length} modules from React Native project config`\n );\n for (const revision of groups.reactNativeProjectConfig) {\n console.log(` - ${await getHumanReadableDependency(revision)}`);\n }\n }\n\n if (groups.searchPaths.length) {\n console.log(`🔎 Found ${groups.searchPaths.length} modules in search paths`);\n for (const revision of groups.searchPaths) {\n console.log(` - ${await getHumanReadableDependency(revision)}`);\n }\n }\n\n console.log(`🔎 Found ${groups.dependencies.length} modules in dependencies`);\n for (const revision of groups.dependencies) {\n console.log(` - ${await getHumanReadableDependency(revision)}`);\n }\n }\n\n if (groups.duplicates.length) {\n for (const revision of groups.duplicates) {\n console.warn(`⚠️ Found duplicate installations for ${chalk.green(revision.name)}`);\n const revisions = [revision, ...(revision.duplicates ?? [])];\n for (let idx = 0; idx < revisions.length; idx++) {\n const prefix = idx !== revisions.length - 1 ? '├─' : '└─';\n const duplicate = revisions[idx];\n console.log(` ${prefix} ${await getHumanReadableDependency(duplicate)}`);\n }\n }\n\n console.warn(\n '⚠️ Multiple versions of the same module may introduce some side effects or compatibility issues.\\n' +\n `Resolve your dependency issues and deduplicate your dependencies. Learn more: https://expo.fyi/resolving-dependency-issues`\n );\n } else {\n console.log('✅ Everything is fine!');\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"verifyCommand.js","sourceRoot":"","sources":["../../src/commands/verifyCommand.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport commander from 'commander';\nimport fs from 'fs';\nimport path from 'path';\n\nimport {\n AutolinkingCommonArguments,\n createAutolinkingOptionsLoader,\n registerAutolinkingArguments,\n} from './autolinkingOptions';\nimport {\n type BaseDependencyResolution,\n type DependencyResolution,\n type ResolutionResult,\n DependencyResolutionSource,\n makeCachedDependenciesLinker,\n mergeResolutionResults,\n scanDependencyResolutionsForPlatform,\n} from '../dependencies';\n\n// NOTE(@kitten): These are excluded explicitly, but we want to include them for the verify command explicitly\nconst INCLUDE_PACKAGES = ['react-native', 'react-native-tvos'];\n\ninterface VerifyArguments extends AutolinkingCommonArguments {\n verbose?: boolean | null;\n json?: boolean | null;\n}\n\nexport function verifyCommand(cli: commander.CommanderStatic) {\n return registerAutolinkingArguments(cli.command('verify'))\n .option('-v, --verbose', 'Output all results instead of just warnings.', () => true, false)\n .option('-j, --json', 'Output results in the plain JSON format.', () => true, false)\n .option(\n '-p, --platform [platform]',\n 'The platform to validate native modules for. Available options: \"android\", \"ios\", \"both\"',\n 'both'\n )\n .action(async (commandArguments: VerifyArguments) => {\n const platforms =\n commandArguments.platform === 'both' ? ['android', 'ios'] : [commandArguments.platform!];\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader(commandArguments);\n const appRoot = await autolinkingOptionsLoader.getAppRoot();\n const linker = makeCachedDependenciesLinker({ projectRoot: appRoot });\n const results = mergeResolutionResults(\n await Promise.all(\n platforms.map((platform) =>\n scanDependencyResolutionsForPlatform(linker, platform, INCLUDE_PACKAGES)\n )\n )\n );\n await verifySearchResults(results, {\n appRoot,\n verbose: !!commandArguments.verbose,\n json: !!commandArguments.json,\n });\n });\n}\n\ninterface VerifyOptions {\n appRoot: string;\n verbose?: boolean;\n json?: boolean;\n}\n\ninterface VerifyGroups {\n reactNativeProjectConfig: DependencyResolution[];\n searchPaths: DependencyResolution[];\n dependencies: DependencyResolution[];\n duplicates: DependencyResolution[];\n}\n\n/**\n * Verifies the search results by checking whether there are no duplicates.\n */\nexport async function verifySearchResults(\n results: ResolutionResult,\n options: VerifyOptions\n): Promise<void> {\n const { appRoot } = options;\n\n async function getHumanReadableDependency(dependency: BaseDependencyResolution): Promise<string> {\n let version = dependency.version || null;\n if (!version) {\n try {\n const pkgContents = await fs.promises.readFile(\n path.join(dependency.path, 'package.json'),\n 'utf8'\n );\n const pkg: unknown = JSON.parse(pkgContents);\n if (pkg && typeof pkg === 'object' && 'version' in pkg && typeof pkg.version === 'string') {\n version = pkg.version;\n }\n } catch (error) {\n version = null;\n }\n }\n const relative = path.relative(appRoot, dependency.originPath);\n return version\n ? `${dependency.name}@${version} (at: ${relative})`\n : `${dependency.name} at: ${relative}`;\n }\n\n const groups: VerifyGroups = {\n reactNativeProjectConfig: [],\n searchPaths: [],\n dependencies: [],\n duplicates: [],\n };\n\n for (const moduleName in results) {\n const revision = results[moduleName];\n if (!revision) {\n continue;\n } else if (revision.duplicates?.length) {\n groups.duplicates.push(revision);\n } else {\n switch (revision.source) {\n case DependencyResolutionSource.RN_CLI_LOCAL:\n groups.reactNativeProjectConfig.push(revision);\n break;\n case DependencyResolutionSource.SEARCH_PATH:\n groups.searchPaths.push(revision);\n break;\n case DependencyResolutionSource.RECURSIVE_RESOLUTION:\n groups.dependencies.push(revision);\n break;\n }\n }\n }\n\n if (options.json) {\n console.log(JSON.stringify(groups));\n return;\n }\n\n if (options.verbose) {\n const sortResolutions = (resolutions: DependencyResolution[]) =>\n [...resolutions].sort((a, b) => a.name.localeCompare(b.name));\n\n if (groups.reactNativeProjectConfig.length) {\n console.log(\n `🔎 Found ${groups.reactNativeProjectConfig.length} modules from React Native project config`\n );\n for (const revision of sortResolutions(groups.reactNativeProjectConfig)) {\n console.log(` - ${await getHumanReadableDependency(revision)}`);\n }\n }\n\n if (groups.searchPaths.length) {\n console.log(`🔎 Found ${groups.searchPaths.length} modules in search paths`);\n for (const revision of sortResolutions(groups.searchPaths)) {\n console.log(` - ${await getHumanReadableDependency(revision)}`);\n }\n }\n\n console.log(`🔎 Found ${groups.dependencies.length} modules in dependencies`);\n for (const revision of sortResolutions(groups.dependencies)) {\n console.log(` - ${await getHumanReadableDependency(revision)}`);\n }\n }\n\n if (groups.duplicates.length) {\n for (const revision of groups.duplicates) {\n console.warn(`⚠️ Found duplicate installations for ${chalk.green(revision.name)}`);\n const revisions = [revision, ...(revision.duplicates ?? [])];\n for (let idx = 0; idx < revisions.length; idx++) {\n const prefix = idx !== revisions.length - 1 ? '├─' : '└─';\n const duplicate = revisions[idx];\n console.log(` ${prefix} ${await getHumanReadableDependency(duplicate)}`);\n }\n }\n\n console.warn(\n '⚠️ Multiple versions of the same module may introduce some side effects or compatibility issues.\\n' +\n `Resolve your dependency issues and deduplicate your dependencies. Learn more: https://expo.fyi/resolving-dependency-issues`\n );\n } else {\n console.log('✅ Everything is fine!');\n }\n}\n"]}
|
|
@@ -10,7 +10,6 @@ export interface CachedDependenciesLinker {
|
|
|
10
10
|
loadReactNativeProjectConfig(): Promise<RNConfigReactNativeProjectConfig | null>;
|
|
11
11
|
scanDependenciesFromRNProjectConfig(): Promise<ResolutionResult>;
|
|
12
12
|
scanDependenciesRecursively(): Promise<ResolutionResult>;
|
|
13
|
-
scanDevDependenciesShallowly(): Promise<ResolutionResult>;
|
|
14
13
|
scanDependenciesInSearchPath(searchPath: string): Promise<ResolutionResult>;
|
|
15
14
|
}
|
|
16
15
|
export declare function makeCachedDependenciesLinker(params: {
|
|
@@ -25,7 +25,6 @@ function makeCachedDependenciesLinker(params) {
|
|
|
25
25
|
let reactNativeProjectConfig;
|
|
26
26
|
let reactNativeProjectConfigDependencies;
|
|
27
27
|
let recursiveDependencies;
|
|
28
|
-
let devDependencies;
|
|
29
28
|
return {
|
|
30
29
|
async getOptionsForPlatform(platform) {
|
|
31
30
|
const options = await autolinkingOptionsLoader.getPlatformOptions(platform);
|
|
@@ -46,9 +45,6 @@ function makeCachedDependenciesLinker(params) {
|
|
|
46
45
|
return (recursiveDependencies ||
|
|
47
46
|
(recursiveDependencies = (0, resolution_1.scanDependenciesRecursively)(await getAppRoot())));
|
|
48
47
|
},
|
|
49
|
-
async scanDevDependenciesShallowly() {
|
|
50
|
-
return (devDependencies || (devDependencies = (0, resolution_1.scanDevDependenciesShallowly)(await getAppRoot())));
|
|
51
|
-
},
|
|
52
48
|
async scanDependenciesInSearchPath(searchPath) {
|
|
53
49
|
let result = dependenciesResultBySearchPath.get(searchPath);
|
|
54
50
|
if (!result) {
|
|
@@ -103,7 +99,6 @@ async function scanExpoModuleResolutionsForPlatform(linker, platform) {
|
|
|
103
99
|
...searchPaths.map((searchPath) => {
|
|
104
100
|
return linker.scanDependenciesInSearchPath(searchPath);
|
|
105
101
|
}),
|
|
106
|
-
platform === 'devtools' ? linker.scanDevDependenciesShallowly() : null,
|
|
107
102
|
linker.scanDependenciesRecursively(),
|
|
108
103
|
].filter((x) => x != null)));
|
|
109
104
|
return await (0, utils_1.filterMapResolutionResult)(resolutions, async (resolution) => {
|
|
@@ -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, scanDevDependenciesShallowly } 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 { resolveReactNativeModule, RNConfigReactNativeProjectConfig } from '../reactNativeConfig';\nimport { loadConfigAsync } from '../reactNativeConfig/config';\n\nexport interface CachedDependenciesSearchOptions {\n excludeNames: Set<string>;\n searchPaths: string[];\n}\n\nexport interface CachedDependenciesLinker {\n getOptionsForPlatform(platform: SupportedPlatform): Promise<CachedDependenciesSearchOptions>;\n loadReactNativeProjectConfig(): Promise<RNConfigReactNativeProjectConfig | null>;\n scanDependenciesFromRNProjectConfig(): Promise<ResolutionResult>;\n scanDependenciesRecursively(): Promise<ResolutionResult>;\n scanDevDependenciesShallowly(): Promise<ResolutionResult>;\n scanDependenciesInSearchPath(searchPath: string): Promise<ResolutionResult>;\n}\n\nexport function makeCachedDependenciesLinker(params: {\n projectRoot: string;\n}): CachedDependenciesLinker {\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 let devDependencies: Promise<ResolutionResult> | undefined;\n\n return {\n async getOptionsForPlatform(platform) {\n const options = await autolinkingOptionsLoader.getPlatformOptions(platform);\n return makeCachedDependenciesSearchOptions(options);\n },\n async loadReactNativeProjectConfig() {\n if (reactNativeProjectConfig === undefined) {\n reactNativeProjectConfig = loadConfigAsync<RNConfigReactNativeProjectConfig>(\n await getAppRoot()\n );\n }\n return reactNativeProjectConfig;\n },\n async scanDependenciesFromRNProjectConfig() {\n const reactNativeProjectConfig = await this.loadReactNativeProjectConfig();\n return (\n reactNativeProjectConfigDependencies ||\n (reactNativeProjectConfigDependencies = scanDependenciesFromRNProjectConfig(\n await getAppRoot(),\n reactNativeProjectConfig\n ))\n );\n },\n async scanDependenciesRecursively() {\n return (\n recursiveDependencies ||\n (recursiveDependencies = scanDependenciesRecursively(await getAppRoot()))\n );\n },\n async scanDevDependenciesShallowly() {\n return (\n devDependencies || (devDependencies = scanDevDependenciesShallowly(await getAppRoot()))\n );\n },\n async scanDependenciesInSearchPath(searchPath: string) {\n let result = dependenciesResultBySearchPath.get(searchPath);\n if (!result) {\n dependenciesResultBySearchPath.set(\n searchPath,\n (result = scanDependenciesInSearchPath(searchPath))\n );\n }\n return result;\n },\n };\n}\n\nexport async function scanDependencyResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform,\n include?: string[]\n): Promise<ResolutionResult> {\n const { excludeNames, searchPaths } = await linker.getOptionsForPlatform(platform);\n const includeNames = new Set(include);\n const reactNativeProjectConfig = await linker.loadReactNativeProjectConfig();\n\n const resolutions = mergeResolutionResults(\n await Promise.all([\n linker.scanDependenciesFromRNProjectConfig(),\n ...searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n linker.scanDependenciesRecursively(),\n ])\n );\n\n const dependencies = await filterMapResolutionResult(resolutions, async (resolution) => {\n if (excludeNames.has(resolution.name)) {\n return null;\n } else if (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 excludeNames\n );\n if (!reactNativeModuleDesc) {\n return null;\n }\n } else {\n const [reactNativeModule, expoModule] = await Promise.all([\n resolveReactNativeModule(resolution, reactNativeProjectConfig, platform, excludeNames),\n resolveExpoModule(resolution, platform, excludeNames),\n ]);\n if (!reactNativeModule && !expoModule) {\n return null;\n }\n }\n return resolution;\n });\n\n return dependencies;\n}\n\nexport async function scanExpoModuleResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform\n): Promise<Record<string, PackageRevision>> {\n const { excludeNames, searchPaths } = await linker.getOptionsForPlatform(platform);\n const resolutions = mergeResolutionResults(\n await Promise.all(\n [\n ...searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n platform === 'devtools' ? linker.scanDevDependenciesShallowly() : null,\n linker.scanDependenciesRecursively(),\n ].filter((x) => x != null)\n )\n );\n return await filterMapResolutionResult(resolutions, async (resolution) => {\n return !excludeNames.has(resolution.name)\n ? await resolveExpoModule(resolution, platform, excludeNames)\n : null;\n });\n}\n\nconst makeCachedDependenciesSearchOptions = (options: AutolinkingOptions) => ({\n excludeNames: new Set(options.exclude),\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":"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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 { resolveReactNativeModule, RNConfigReactNativeProjectConfig } from '../reactNativeConfig';\nimport { loadConfigAsync } from '../reactNativeConfig/config';\n\nexport interface CachedDependenciesSearchOptions {\n excludeNames: Set<string>;\n searchPaths: string[];\n}\n\nexport interface CachedDependenciesLinker {\n getOptionsForPlatform(platform: SupportedPlatform): 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 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 async getOptionsForPlatform(platform) {\n const options = await autolinkingOptionsLoader.getPlatformOptions(platform);\n return makeCachedDependenciesSearchOptions(options);\n },\n async loadReactNativeProjectConfig() {\n if (reactNativeProjectConfig === undefined) {\n reactNativeProjectConfig = loadConfigAsync(\n await getAppRoot()\n ) as Promise<RNConfigReactNativeProjectConfig>;\n }\n return reactNativeProjectConfig;\n },\n async scanDependenciesFromRNProjectConfig() {\n const reactNativeProjectConfig = await this.loadReactNativeProjectConfig();\n return (\n reactNativeProjectConfigDependencies ||\n (reactNativeProjectConfigDependencies = scanDependenciesFromRNProjectConfig(\n await getAppRoot(),\n reactNativeProjectConfig\n ))\n );\n },\n async scanDependenciesRecursively() {\n return (\n recursiveDependencies ||\n (recursiveDependencies = scanDependenciesRecursively(await getAppRoot()))\n );\n },\n async scanDependenciesInSearchPath(searchPath: string) {\n let result = dependenciesResultBySearchPath.get(searchPath);\n if (!result) {\n dependenciesResultBySearchPath.set(\n searchPath,\n (result = scanDependenciesInSearchPath(searchPath))\n );\n }\n return result;\n },\n };\n}\n\nexport async function scanDependencyResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform,\n include?: string[]\n): Promise<ResolutionResult> {\n const { excludeNames, searchPaths } = await linker.getOptionsForPlatform(platform);\n const includeNames = new Set(include);\n const reactNativeProjectConfig = await linker.loadReactNativeProjectConfig();\n\n const resolutions = mergeResolutionResults(\n await Promise.all([\n linker.scanDependenciesFromRNProjectConfig(),\n ...searchPaths.map((searchPath) => {\n return linker.scanDependenciesInSearchPath(searchPath);\n }),\n linker.scanDependenciesRecursively(),\n ])\n );\n\n const dependencies = await filterMapResolutionResult(resolutions, async (resolution) => {\n if (excludeNames.has(resolution.name)) {\n return null;\n } else if (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 excludeNames\n );\n if (!reactNativeModuleDesc) {\n return null;\n }\n } else {\n const [reactNativeModule, expoModule] = await Promise.all([\n resolveReactNativeModule(resolution, reactNativeProjectConfig, platform, excludeNames),\n resolveExpoModule(resolution, platform, excludeNames),\n ]);\n if (!reactNativeModule && !expoModule) {\n return null;\n }\n }\n return resolution;\n });\n\n return dependencies;\n}\n\nexport async function scanExpoModuleResolutionsForPlatform(\n linker: CachedDependenciesLinker,\n platform: SupportedPlatform\n): Promise<Record<string, PackageRevision>> {\n const { excludeNames, searchPaths } = await linker.getOptionsForPlatform(platform);\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 filterMapResolutionResult(resolutions, async (resolution) => {\n return !excludeNames.has(resolution.name)\n ? await resolveExpoModule(resolution, platform, excludeNames)\n : null;\n });\n}\n\nconst makeCachedDependenciesSearchOptions = (options: AutolinkingOptions) => ({\n excludeNames: new Set(options.exclude),\n searchPaths:\n options.nativeModulesDir && fs.existsSync(options.nativeModulesDir)\n ? [options.nativeModulesDir, ...(options.searchPaths ?? [])]\n : (options.searchPaths ?? []),\n});\n"]}
|
|
@@ -7,5 +7,4 @@ interface ResolutionOptions {
|
|
|
7
7
|
limitDepth?: number;
|
|
8
8
|
}
|
|
9
9
|
export declare function scanDependenciesRecursively(rawPath: string, { shouldIncludeDependency, limitDepth }?: ResolutionOptions): Promise<ResolutionResult>;
|
|
10
|
-
export declare function scanDevDependenciesShallowly(rawPath: string, { shouldIncludeDependency }?: ResolutionOptions): Promise<ResolutionResult>;
|
|
11
10
|
export {};
|
|
@@ -4,7 +4,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.scanDependenciesRecursively = scanDependenciesRecursively;
|
|
7
|
-
exports.scanDevDependenciesShallowly = scanDevDependenciesShallowly;
|
|
8
7
|
const node_module_1 = __importDefault(require("node:module"));
|
|
9
8
|
const utils_1 = require("./utils");
|
|
10
9
|
// NOTE(@kitten): There's no need to search very deep for modules
|
|
@@ -33,9 +32,16 @@ const createNodeModulePathsCreator = () => {
|
|
|
33
32
|
};
|
|
34
33
|
async function resolveDependencies(packageJson, nodeModulePaths, depth, shouldIncludeDependency) {
|
|
35
34
|
const modules = [];
|
|
36
|
-
|
|
35
|
+
let dependencies = packageJson.dependencies != null && typeof packageJson.dependencies === 'object'
|
|
37
36
|
? packageJson.dependencies
|
|
38
37
|
: {};
|
|
38
|
+
// NOTE(@kitten): Also traverse devDependencies for top-level package.json
|
|
39
|
+
const devDependencies = packageJson.devDependencies != null && typeof packageJson.devDependencies === 'object'
|
|
40
|
+
? packageJson.devDependencies
|
|
41
|
+
: null;
|
|
42
|
+
if (depth === 0 && devDependencies) {
|
|
43
|
+
dependencies = { ...dependencies, ...devDependencies };
|
|
44
|
+
}
|
|
39
45
|
for (const dependencyName in dependencies) {
|
|
40
46
|
if (!shouldIncludeDependency(dependencyName)) {
|
|
41
47
|
continue;
|
|
@@ -153,42 +159,4 @@ const isOptionalPeerDependencyMeta = (peerDependenciesMeta, packageName) => {
|
|
|
153
159
|
'optional' in peerDependenciesMeta[packageName] &&
|
|
154
160
|
!!peerDependenciesMeta[packageName].optional);
|
|
155
161
|
};
|
|
156
|
-
async function scanDevDependenciesShallowly(rawPath, { shouldIncludeDependency = utils_1.defaultShouldIncludeDependency } = {}) {
|
|
157
|
-
const rootPath = await (0, utils_1.maybeRealpath)(rawPath);
|
|
158
|
-
if (!rootPath) {
|
|
159
|
-
return {};
|
|
160
|
-
}
|
|
161
|
-
const getNodeModulePaths = createNodeModulePathsCreator();
|
|
162
|
-
const searchResults = Object.create(null);
|
|
163
|
-
const nodeModulePaths = await getNodeModulePaths(rootPath);
|
|
164
|
-
const packageJson = await (0, utils_1.loadPackageJson)((0, utils_1.fastJoin)(rootPath, 'package.json'));
|
|
165
|
-
if (!packageJson) {
|
|
166
|
-
return searchResults;
|
|
167
|
-
}
|
|
168
|
-
const devDependencies = packageJson.devDependencies != null && typeof packageJson.devDependencies === 'object'
|
|
169
|
-
? packageJson.devDependencies
|
|
170
|
-
: {};
|
|
171
|
-
for (const dependencyName in devDependencies) {
|
|
172
|
-
if (!shouldIncludeDependency(dependencyName)) {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
for (let idx = 0; idx < nodeModulePaths.length; idx++) {
|
|
176
|
-
const originPath = (0, utils_1.fastJoin)(nodeModulePaths[idx], dependencyName);
|
|
177
|
-
const nodeModulePath = await (0, utils_1.maybeRealpath)(originPath);
|
|
178
|
-
if (nodeModulePath != null) {
|
|
179
|
-
searchResults[dependencyName] = {
|
|
180
|
-
source: 0 /* DependencyResolutionSource.RECURSIVE_RESOLUTION */,
|
|
181
|
-
name: dependencyName,
|
|
182
|
-
version: '',
|
|
183
|
-
path: nodeModulePath,
|
|
184
|
-
originPath,
|
|
185
|
-
duplicates: null,
|
|
186
|
-
depth: 0,
|
|
187
|
-
};
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return searchResults;
|
|
193
|
-
}
|
|
194
162
|
//# sourceMappingURL=resolution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolution.js","sourceRoot":"","sources":["../../src/dependencies/resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import Module from 'node:module';\n\nimport {\n type ResolutionResult,\n type DependencyResolution,\n DependencyResolutionSource,\n} from './types';\nimport {\n type PackageJson,\n defaultShouldIncludeDependency,\n mergeWithDuplicate,\n loadPackageJson,\n maybeRealpath,\n fastJoin,\n} from './utils';\n\ndeclare module 'node:module' {\n export function _nodeModulePaths(base: string): readonly string[];\n}\n\n// NOTE(@kitten): There's no need to search very deep for modules\n// We don't expect native modules to be excessively nested in the dependency tree\nconst MAX_DEPTH = 8;\n\nconst createNodeModulePathsCreator = () => {\n const _nodeModulePathCache = new Map<string, string | null>();\n return async function getNodeModulePaths(packagePath: string) {\n const outputPaths: string[] = [];\n const nodeModulePaths = Module._nodeModulePaths(packagePath);\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const nodeModulePath = nodeModulePaths[idx];\n let target = _nodeModulePathCache.get(nodeModulePath);\n if (target === undefined) {\n target = await maybeRealpath(nodeModulePath);\n if (idx !== 0) {\n _nodeModulePathCache.set(nodeModulePath, target);\n }\n }\n if (target != null) {\n outputPaths.push(target);\n }\n }\n return outputPaths;\n };\n};\n\nasync function resolveDependencies(\n packageJson: PackageJson,\n nodeModulePaths: readonly string[],\n depth: number,\n shouldIncludeDependency: (dependencyName: string) => boolean\n): Promise<DependencyResolution[]> {\n const modules: DependencyResolution[] = [];\n const dependencies =\n packageJson.dependencies != null && typeof packageJson.dependencies === 'object'\n ? packageJson.dependencies\n : {};\n for (const dependencyName in dependencies) {\n if (!shouldIncludeDependency(dependencyName)) {\n continue;\n }\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const originPath = fastJoin(nodeModulePaths[idx], dependencyName);\n const nodeModulePath = await maybeRealpath(originPath);\n if (nodeModulePath != null) {\n modules.push({\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: dependencyName,\n version: '',\n path: nodeModulePath,\n originPath,\n duplicates: null,\n depth,\n });\n break;\n }\n }\n }\n\n if (packageJson.peerDependencies != null && typeof packageJson.peerDependencies === 'object') {\n const peerDependenciesMeta =\n packageJson.peerDependenciesMeta != null &&\n typeof packageJson.peerDependenciesMeta === 'object'\n ? (packageJson.peerDependenciesMeta as Record<string, unknown>)\n : undefined;\n for (const dependencyName in packageJson.peerDependencies) {\n if (dependencyName in dependencies || !shouldIncludeDependency(dependencyName)) {\n continue;\n } else if (isOptionalPeerDependencyMeta(peerDependenciesMeta, dependencyName)) {\n // NOTE(@kitten): We only check peer dependencies because some package managers auto-install them\n // which would mean they'd have no reference in any dependencies. However, optional peer dependencies\n // don't auto-install and we can skip them\n continue;\n }\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const originPath = fastJoin(nodeModulePaths[idx], dependencyName);\n const nodeModulePath = await maybeRealpath(originPath);\n if (nodeModulePath != null) {\n modules.push({\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: dependencyName,\n version: '',\n path: nodeModulePath,\n originPath,\n duplicates: null,\n depth,\n });\n break;\n }\n }\n }\n }\n\n return modules;\n}\n\ninterface ResolutionOptions {\n shouldIncludeDependency?(name: string): boolean;\n limitDepth?: number;\n}\n\nexport async function scanDependenciesRecursively(\n rawPath: string,\n { shouldIncludeDependency = defaultShouldIncludeDependency, limitDepth }: ResolutionOptions = {}\n): Promise<ResolutionResult> {\n const rootPath = await maybeRealpath(rawPath);\n if (!rootPath) {\n return {};\n }\n\n const modulePathsQueue: DependencyResolution[] = [\n {\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: '',\n version: '',\n path: rootPath,\n originPath: rawPath,\n duplicates: null,\n depth: -1,\n },\n ];\n\n const _visitedPackagePaths = new Set();\n const getNodeModulePaths = createNodeModulePathsCreator();\n const searchResults: ResolutionResult = Object.create(null);\n const maxDepth = limitDepth != null ? limitDepth : MAX_DEPTH;\n for (let depth = 0; modulePathsQueue.length > 0 && depth < maxDepth; depth++) {\n const resolutions = await Promise.all(\n modulePathsQueue.map(async (resolution) => {\n const nodeModulePaths = await getNodeModulePaths(resolution.path);\n const packageJson = await loadPackageJson(fastJoin(resolution.path, 'package.json'));\n if (packageJson) {\n resolution.version = packageJson.version || '';\n return await resolveDependencies(\n packageJson,\n nodeModulePaths,\n depth,\n shouldIncludeDependency\n );\n } else {\n return [];\n }\n })\n );\n\n modulePathsQueue.length = 0;\n for (let resolutionIdx = 0; resolutionIdx < resolutions.length; resolutionIdx++) {\n const modules = resolutions[resolutionIdx];\n for (let moduleIdx = 0; moduleIdx < modules.length; moduleIdx++) {\n const resolution = modules[moduleIdx];\n if (_visitedPackagePaths.has(resolution.path)) {\n continue;\n }\n\n _visitedPackagePaths.add(resolution.path);\n modulePathsQueue.push(resolution);\n\n const prevEntry = searchResults[resolution.name];\n if (prevEntry != null && resolution.path !== prevEntry.path) {\n searchResults[resolution.name] = mergeWithDuplicate(prevEntry, resolution);\n } else if (prevEntry == null) {\n searchResults[resolution.name] = resolution;\n }\n }\n }\n }\n\n return searchResults;\n}\n\nconst isOptionalPeerDependencyMeta = (\n peerDependenciesMeta: Record<string, unknown> | undefined,\n packageName: string\n) => {\n return (\n peerDependenciesMeta &&\n peerDependenciesMeta[packageName] != null &&\n typeof peerDependenciesMeta[packageName] === 'object' &&\n 'optional' in peerDependenciesMeta[packageName] &&\n !!peerDependenciesMeta[packageName].optional\n );\n};\n\nexport async function scanDevDependenciesShallowly(\n rawPath: string,\n { shouldIncludeDependency = defaultShouldIncludeDependency }: ResolutionOptions = {}\n): Promise<ResolutionResult> {\n const rootPath = await maybeRealpath(rawPath);\n if (!rootPath) {\n return {};\n }\n\n const getNodeModulePaths = createNodeModulePathsCreator();\n const searchResults: ResolutionResult = Object.create(null);\n const nodeModulePaths = await getNodeModulePaths(rootPath);\n const packageJson = await loadPackageJson(fastJoin(rootPath, 'package.json'));\n if (!packageJson) {\n return searchResults;\n }\n\n const devDependencies =\n packageJson.devDependencies != null && typeof packageJson.devDependencies === 'object'\n ? packageJson.devDependencies\n : {};\n for (const dependencyName in devDependencies) {\n if (!shouldIncludeDependency(dependencyName)) {\n continue;\n }\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const originPath = fastJoin(nodeModulePaths[idx], dependencyName);\n const nodeModulePath = await maybeRealpath(originPath);\n if (nodeModulePath != null) {\n searchResults[dependencyName] = {\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: dependencyName,\n version: '',\n path: nodeModulePath,\n originPath,\n duplicates: null,\n depth: 0,\n };\n break;\n }\n }\n }\n return searchResults;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resolution.js","sourceRoot":"","sources":["../../src/dependencies/resolution.ts"],"names":[],"mappings":"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","sourcesContent":["import Module from 'node:module';\n\nimport {\n type ResolutionResult,\n type DependencyResolution,\n DependencyResolutionSource,\n} from './types';\nimport {\n type PackageJson,\n defaultShouldIncludeDependency,\n mergeWithDuplicate,\n loadPackageJson,\n maybeRealpath,\n fastJoin,\n} from './utils';\n\ndeclare module 'node:module' {\n export function _nodeModulePaths(base: string): readonly string[];\n}\n\n// NOTE(@kitten): There's no need to search very deep for modules\n// We don't expect native modules to be excessively nested in the dependency tree\nconst MAX_DEPTH = 8;\n\nconst createNodeModulePathsCreator = () => {\n const _nodeModulePathCache = new Map<string, string | null>();\n return async function getNodeModulePaths(packagePath: string) {\n const outputPaths: string[] = [];\n const nodeModulePaths = Module._nodeModulePaths(packagePath);\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const nodeModulePath = nodeModulePaths[idx];\n let target = _nodeModulePathCache.get(nodeModulePath);\n if (target === undefined) {\n target = await maybeRealpath(nodeModulePath);\n if (idx !== 0) {\n _nodeModulePathCache.set(nodeModulePath, target);\n }\n }\n if (target != null) {\n outputPaths.push(target);\n }\n }\n return outputPaths;\n };\n};\n\nasync function resolveDependencies(\n packageJson: PackageJson,\n nodeModulePaths: readonly string[],\n depth: number,\n shouldIncludeDependency: (dependencyName: string) => boolean\n): Promise<DependencyResolution[]> {\n const modules: DependencyResolution[] = [];\n let dependencies =\n packageJson.dependencies != null && typeof packageJson.dependencies === 'object'\n ? packageJson.dependencies\n : {};\n\n // NOTE(@kitten): Also traverse devDependencies for top-level package.json\n const devDependencies =\n packageJson.devDependencies != null && typeof packageJson.devDependencies === 'object'\n ? (packageJson.devDependencies as Record<string, string>)\n : null;\n if (depth === 0 && devDependencies) {\n dependencies = { ...dependencies, ...devDependencies };\n }\n\n for (const dependencyName in dependencies) {\n if (!shouldIncludeDependency(dependencyName)) {\n continue;\n }\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const originPath = fastJoin(nodeModulePaths[idx], dependencyName);\n const nodeModulePath = await maybeRealpath(originPath);\n if (nodeModulePath != null) {\n modules.push({\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: dependencyName,\n version: '',\n path: nodeModulePath,\n originPath,\n duplicates: null,\n depth,\n });\n break;\n }\n }\n }\n\n if (packageJson.peerDependencies != null && typeof packageJson.peerDependencies === 'object') {\n const peerDependenciesMeta =\n packageJson.peerDependenciesMeta != null &&\n typeof packageJson.peerDependenciesMeta === 'object'\n ? (packageJson.peerDependenciesMeta as Record<string, unknown>)\n : undefined;\n for (const dependencyName in packageJson.peerDependencies) {\n if (dependencyName in dependencies || !shouldIncludeDependency(dependencyName)) {\n continue;\n } else if (isOptionalPeerDependencyMeta(peerDependenciesMeta, dependencyName)) {\n // NOTE(@kitten): We only check peer dependencies because some package managers auto-install them\n // which would mean they'd have no reference in any dependencies. However, optional peer dependencies\n // don't auto-install and we can skip them\n continue;\n }\n for (let idx = 0; idx < nodeModulePaths.length; idx++) {\n const originPath = fastJoin(nodeModulePaths[idx], dependencyName);\n const nodeModulePath = await maybeRealpath(originPath);\n if (nodeModulePath != null) {\n modules.push({\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: dependencyName,\n version: '',\n path: nodeModulePath,\n originPath,\n duplicates: null,\n depth,\n });\n break;\n }\n }\n }\n }\n\n return modules;\n}\n\ninterface ResolutionOptions {\n shouldIncludeDependency?(name: string): boolean;\n limitDepth?: number;\n}\n\nexport async function scanDependenciesRecursively(\n rawPath: string,\n { shouldIncludeDependency = defaultShouldIncludeDependency, limitDepth }: ResolutionOptions = {}\n): Promise<ResolutionResult> {\n const rootPath = await maybeRealpath(rawPath);\n if (!rootPath) {\n return {};\n }\n\n const modulePathsQueue: DependencyResolution[] = [\n {\n source: DependencyResolutionSource.RECURSIVE_RESOLUTION,\n name: '',\n version: '',\n path: rootPath,\n originPath: rawPath,\n duplicates: null,\n depth: -1,\n },\n ];\n\n const _visitedPackagePaths = new Set();\n const getNodeModulePaths = createNodeModulePathsCreator();\n const searchResults: ResolutionResult = Object.create(null);\n const maxDepth = limitDepth != null ? limitDepth : MAX_DEPTH;\n for (let depth = 0; modulePathsQueue.length > 0 && depth < maxDepth; depth++) {\n const resolutions = await Promise.all(\n modulePathsQueue.map(async (resolution) => {\n const nodeModulePaths = await getNodeModulePaths(resolution.path);\n const packageJson = await loadPackageJson(fastJoin(resolution.path, 'package.json'));\n if (packageJson) {\n resolution.version = packageJson.version || '';\n return await resolveDependencies(\n packageJson,\n nodeModulePaths,\n depth,\n shouldIncludeDependency\n );\n } else {\n return [];\n }\n })\n );\n\n modulePathsQueue.length = 0;\n for (let resolutionIdx = 0; resolutionIdx < resolutions.length; resolutionIdx++) {\n const modules = resolutions[resolutionIdx];\n for (let moduleIdx = 0; moduleIdx < modules.length; moduleIdx++) {\n const resolution = modules[moduleIdx];\n if (_visitedPackagePaths.has(resolution.path)) {\n continue;\n }\n\n _visitedPackagePaths.add(resolution.path);\n modulePathsQueue.push(resolution);\n\n const prevEntry = searchResults[resolution.name];\n if (prevEntry != null && resolution.path !== prevEntry.path) {\n searchResults[resolution.name] = mergeWithDuplicate(prevEntry, resolution);\n } else if (prevEntry == null) {\n searchResults[resolution.name] = resolution;\n }\n }\n }\n }\n\n return searchResults;\n}\n\nconst isOptionalPeerDependencyMeta = (\n peerDependenciesMeta: Record<string, unknown> | undefined,\n packageName: string\n) => {\n return (\n peerDependenciesMeta &&\n peerDependenciesMeta[packageName] != null &&\n typeof peerDependenciesMeta[packageName] === 'object' &&\n 'optional' in peerDependenciesMeta[packageName] &&\n !!peerDependenciesMeta[packageName].optional\n );\n};\n"]}
|
|
@@ -6,7 +6,7 @@ export type PackageJson = Record<string, unknown> & {
|
|
|
6
6
|
name: string;
|
|
7
7
|
version?: string;
|
|
8
8
|
};
|
|
9
|
-
export declare
|
|
9
|
+
export declare const loadPackageJson: (input: string, ...args: any[]) => Promise<any>;
|
|
10
10
|
export declare function mergeWithDuplicate(a: DependencyResolution, b: DependencyResolution): DependencyResolution;
|
|
11
11
|
export declare function filterMapResolutionResult<T extends {
|
|
12
12
|
name: string;
|
|
@@ -3,14 +3,14 @@ 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.maybeRealpath = exports.fastJoin = void 0;
|
|
6
|
+
exports.loadPackageJson = exports.maybeRealpath = exports.fastJoin = void 0;
|
|
7
7
|
exports.defaultShouldIncludeDependency = defaultShouldIncludeDependency;
|
|
8
|
-
exports.loadPackageJson = loadPackageJson;
|
|
9
8
|
exports.mergeWithDuplicate = mergeWithDuplicate;
|
|
10
9
|
exports.filterMapResolutionResult = filterMapResolutionResult;
|
|
11
10
|
exports.mergeResolutionResults = mergeResolutionResults;
|
|
12
11
|
const fs_1 = __importDefault(require("fs"));
|
|
13
12
|
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const utils_1 = require("../utils");
|
|
14
14
|
const NODE_MODULES_PATTERN = `${path_1.default.sep}node_modules${path_1.default.sep}`;
|
|
15
15
|
// The default dependencies we exclude don't contain dependency chains leading to autolinked modules
|
|
16
16
|
function defaultShouldIncludeDependency(dependencyName) {
|
|
@@ -49,7 +49,7 @@ const maybeRealpath = async (target) => {
|
|
|
49
49
|
}
|
|
50
50
|
};
|
|
51
51
|
exports.maybeRealpath = maybeRealpath;
|
|
52
|
-
async function loadPackageJson(jsonPath) {
|
|
52
|
+
exports.loadPackageJson = (0, utils_1.memoize)(async function loadPackageJson(jsonPath) {
|
|
53
53
|
try {
|
|
54
54
|
const packageJsonText = await fs_1.default.promises.readFile(jsonPath, 'utf8');
|
|
55
55
|
const json = JSON.parse(packageJsonText);
|
|
@@ -64,7 +64,7 @@ async function loadPackageJson(jsonPath) {
|
|
|
64
64
|
catch {
|
|
65
65
|
return null;
|
|
66
66
|
}
|
|
67
|
-
}
|
|
67
|
+
});
|
|
68
68
|
function mergeWithDuplicate(a, b) {
|
|
69
69
|
let target;
|
|
70
70
|
let duplicate;
|