expo-modules-autolinking 3.1.0-canary-20250919-7a31b96 → 3.1.0-canary-20251003-7b9d7ff
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 +22 -1
- package/android/expo-gradle-plugin/expo-autolinking-plugin/src/main/kotlin/expo/modules/plugin/ExpoAutolinkingPlugin.kt +5 -8
- package/android/expo-gradle-plugin/expo-autolinking-plugin/src/main/kotlin/expo/modules/plugin/GeneratePackagesListTask.kt +65 -17
- package/android/expo-gradle-plugin/expo-autolinking-plugin-shared/src/main/kotlin/expo/modules/plugin/AutolinkigCommandBuilder.kt +3 -5
- package/android/expo-gradle-plugin/expo-autolinking-plugin-shared/src/main/kotlin/expo/modules/plugin/ExpoGradleExtension.kt +0 -1
- package/android/expo-gradle-plugin/expo-autolinking-plugin-shared/src/main/kotlin/expo/modules/plugin/configuration/ExpoAutolinkingConfig.kt +11 -1
- package/android/expo-gradle-plugin/expo-autolinking-settings-plugin/src/main/kotlin/expo/modules/plugin/ExpoAutolinkingSettingsExtension.kt +0 -6
- package/android/expo-gradle-plugin/expo-autolinking-settings-plugin/src/main/kotlin/expo/modules/plugin/SettingsManager.kt +0 -2
- package/build/ExpoModuleConfig.d.ts +8 -3
- package/build/ExpoModuleConfig.js +19 -6
- package/build/ExpoModuleConfig.js.map +1 -1
- package/build/autolinking/generatePackageList.d.ts +0 -7
- package/build/autolinking/generatePackageList.js +0 -9
- package/build/autolinking/generatePackageList.js.map +1 -1
- package/build/autolinking/index.d.ts +1 -1
- package/build/autolinking/index.js +1 -2
- package/build/autolinking/index.js.map +1 -1
- package/build/commands/verifyCommand.js +4 -3
- 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/index.js +0 -2
- package/build/index.js.map +1 -1
- package/build/platforms/android/android.d.ts +0 -4
- package/build/platforms/android/android.js +19 -92
- package/build/platforms/android/android.js.map +1 -1
- package/build/platforms/android/index.d.ts +1 -1
- package/build/platforms/android/index.js +1 -2
- package/build/platforms/android/index.js.map +1 -1
- package/build/platforms/devtools.js +4 -1
- package/build/platforms/devtools.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/types.d.ts +78 -5
- package/build/types.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/android/autolinking_implementation.gradle +1 -1
- package/src/ExpoModuleConfig.ts +21 -5
- package/src/autolinking/generatePackageList.ts +0 -18
- package/src/autolinking/index.ts +1 -1
- package/src/commands/verifyCommand.ts +6 -3
- package/src/dependencies/CachedDependenciesLinker.ts +3 -11
- package/src/dependencies/resolution.ts +11 -46
- package/src/dependencies/utils.ts +5 -2
- package/src/index.ts +0 -2
- package/src/platforms/android/android.ts +57 -138
- package/src/platforms/android/index.ts +0 -1
- package/src/platforms/devtools.ts +4 -1
- package/src/reactNativeConfig/config.ts +5 -4
- package/src/reactNativeConfig/reactNativeConfig.ts +10 -7
- package/src/types.ts +83 -5
- package/src/utils.ts +17 -0
- package/build/commands/generatePackageListCommand.d.ts +0 -6
- package/build/commands/generatePackageListCommand.js +0 -39
- package/build/commands/generatePackageListCommand.js.map +0 -1
- package/src/commands/generatePackageListCommand.ts +0 -67
package/CHANGELOG.md
CHANGED
|
@@ -6,10 +6,31 @@
|
|
|
6
6
|
|
|
7
7
|
### 🎉 New features
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- Added support for cli command extensions in the interactive devtools menu ([#39598](https://github.com/expo/expo/pull/39598) by [@chrfalch](https://github.com/chrfalch))
|
|
10
10
|
|
|
11
11
|
### 🐛 Bug fixes
|
|
12
12
|
|
|
13
|
+
- [Android] Fix passing exclude options. ([#40014](https://github.com/expo/expo/pull/40014) by [@jakex7](https://github.com/jakex7))
|
|
14
|
+
|
|
15
|
+
### 💡 Others
|
|
16
|
+
|
|
17
|
+
- [Android] Move generate-package-list to Gradle task ([#39917](https://github.com/expo/expo/pull/39917) by [@jakex7](https://github.com/jakex7))
|
|
18
|
+
- [Android] Use module name from `expo-module.config.json`. ([#39985](https://github.com/expo/expo/pull/39985) by [@jakex7](https://github.com/jakex7))
|
|
19
|
+
|
|
20
|
+
## 3.0.14 - 2025-10-01
|
|
21
|
+
|
|
22
|
+
### 💡 Others
|
|
23
|
+
|
|
24
|
+
- 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))
|
|
25
|
+
|
|
26
|
+
## 3.0.13 - 2025-09-22
|
|
27
|
+
|
|
28
|
+
### 🎉 New features
|
|
29
|
+
|
|
30
|
+
- Use app root to generate modules provider ([#39728](https://github.com/expo/expo/pull/39728) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
|
31
|
+
|
|
32
|
+
## 3.0.12 - 2025-09-18
|
|
33
|
+
|
|
13
34
|
### 💡 Others
|
|
14
35
|
|
|
15
36
|
- [iOS] Added support for passing pod targets that should be statically linked and not built as frameworks. ([#39742](https://github.com/expo/expo/pull/39742) by [@chrfalch](https://github.com/chrfalch))
|
|
@@ -2,6 +2,7 @@ package expo.modules.plugin
|
|
|
2
2
|
|
|
3
3
|
import com.android.build.api.variant.AndroidComponentsExtension
|
|
4
4
|
import com.android.build.gradle.internal.tasks.factory.dependsOn
|
|
5
|
+
import expo.modules.plugin.configuration.ExpoModule
|
|
5
6
|
import expo.modules.plugin.text.Colors
|
|
6
7
|
import expo.modules.plugin.text.withColor
|
|
7
8
|
import org.gradle.api.Plugin
|
|
@@ -11,11 +12,10 @@ import org.gradle.api.file.Directory
|
|
|
11
12
|
import org.gradle.api.file.RegularFile
|
|
12
13
|
import org.gradle.api.provider.Provider
|
|
13
14
|
import org.gradle.api.tasks.TaskProvider
|
|
14
|
-
import java.io.File
|
|
15
15
|
import java.nio.file.Paths
|
|
16
16
|
|
|
17
17
|
const val generatedPackageListNamespace = "expo.modules"
|
|
18
|
-
const val generatedPackageListFilename = "ExpoModulesPackageList.
|
|
18
|
+
const val generatedPackageListFilename = "ExpoModulesPackageList.kt"
|
|
19
19
|
const val generatedFilesSrcDir = "generated/expo/src/main/java"
|
|
20
20
|
|
|
21
21
|
open class ExpoAutolinkingPlugin : Plugin<Project> {
|
|
@@ -50,7 +50,7 @@ open class ExpoAutolinkingPlugin : Plugin<Project> {
|
|
|
50
50
|
project.logger.quiet("")
|
|
51
51
|
|
|
52
52
|
// Creates a task that generates a list of expo modules.
|
|
53
|
-
val generatePackagesList = createGeneratePackagesListTask(project, gradleExtension.
|
|
53
|
+
val generatePackagesList = createGeneratePackagesListTask(project, gradleExtension.config.modules, gradleExtension.hash)
|
|
54
54
|
|
|
55
55
|
// Ensures that the task is executed before the build.
|
|
56
56
|
project.tasks
|
|
@@ -80,15 +80,12 @@ open class ExpoAutolinkingPlugin : Plugin<Project> {
|
|
|
80
80
|
return project.layout.buildDirectory.file(packageListRelativePath)
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
fun createGeneratePackagesListTask(project: Project,
|
|
83
|
+
fun createGeneratePackagesListTask(project: Project, modules: List<ExpoModule>, hash: String): TaskProvider<GeneratePackagesListTask> {
|
|
84
84
|
return project.tasks.register("generatePackagesList", GeneratePackagesListTask::class.java) {
|
|
85
85
|
it.hash.set(hash)
|
|
86
86
|
it.namespace.set(generatedPackageListNamespace)
|
|
87
87
|
it.outputFile.set(getPackageListFile(project))
|
|
88
|
-
it.
|
|
89
|
-
// Serializes the autolinking options to JSON to pass them to the task.
|
|
90
|
-
// The types supported as a task input are limited to primitives, strings, and files.
|
|
91
|
-
it.options.set(options.toJson())
|
|
88
|
+
it.modules = modules
|
|
92
89
|
}
|
|
93
90
|
}
|
|
94
91
|
}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
package expo.modules.plugin
|
|
2
2
|
|
|
3
|
+
import expo.modules.plugin.configuration.ExpoModule
|
|
4
|
+
import org.gradle.api.DefaultTask
|
|
3
5
|
import org.gradle.api.file.RegularFileProperty
|
|
4
6
|
import org.gradle.api.provider.Property
|
|
5
|
-
import org.gradle.api.tasks.Exec
|
|
6
7
|
import org.gradle.api.tasks.Input
|
|
8
|
+
import org.gradle.api.tasks.Internal
|
|
7
9
|
import org.gradle.api.tasks.OutputFile
|
|
10
|
+
import org.gradle.api.tasks.TaskAction
|
|
8
11
|
|
|
9
12
|
/**
|
|
10
13
|
* Task that generates a list of packages that should be included in your app's runtime.
|
|
11
14
|
*/
|
|
12
|
-
abstract class GeneratePackagesListTask :
|
|
15
|
+
abstract class GeneratePackagesListTask : DefaultTask() {
|
|
13
16
|
init {
|
|
14
17
|
group = "expo"
|
|
15
18
|
}
|
|
@@ -22,16 +25,17 @@ abstract class GeneratePackagesListTask : Exec() {
|
|
|
22
25
|
abstract val hash: Property<String>
|
|
23
26
|
|
|
24
27
|
/**
|
|
25
|
-
*
|
|
28
|
+
* Java package name under which the package list should be placed.
|
|
26
29
|
*/
|
|
27
30
|
@get:Input
|
|
28
|
-
abstract val
|
|
31
|
+
abstract val namespace: Property<String>
|
|
29
32
|
|
|
30
33
|
/**
|
|
31
|
-
*
|
|
34
|
+
* List of modules.
|
|
32
35
|
*/
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
|
|
37
|
+
@get:Internal
|
|
38
|
+
lateinit var modules: List<ExpoModule>
|
|
35
39
|
|
|
36
40
|
/**
|
|
37
41
|
* The output file where the package list should be written.
|
|
@@ -39,16 +43,60 @@ abstract class GeneratePackagesListTask : Exec() {
|
|
|
39
43
|
@get:OutputFile
|
|
40
44
|
abstract val outputFile: RegularFileProperty
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
@TaskAction
|
|
47
|
+
fun generatePackagesList() {
|
|
48
|
+
val target = outputFile.get().asFile
|
|
49
|
+
val content = generatePackageListFileContent()
|
|
50
|
+
|
|
51
|
+
target.writeText(content)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private fun generatePackageListFileContent(): String {
|
|
55
|
+
return """package ${namespace.get()};
|
|
56
|
+
|
|
57
|
+
import expo.modules.core.interfaces.Package;
|
|
58
|
+
import expo.modules.kotlin.modules.Module;
|
|
59
|
+
import expo.modules.kotlin.ModulesProvider;
|
|
60
|
+
|
|
61
|
+
class ExpoModulesPackageList : ModulesProvider {
|
|
62
|
+
companion object {
|
|
63
|
+
val packagesList: List<Package> = listOf(
|
|
64
|
+
${
|
|
65
|
+
modules
|
|
66
|
+
.filterNot { it.packageName == "expo" }
|
|
67
|
+
.flatMap { module ->
|
|
68
|
+
module.projects.flatMap { project ->
|
|
69
|
+
project.packages.map { " ${it}()" }
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
.joinToString(",\n")
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
val modulesMap: Map<Class<out Module>, String?> = mapOf(
|
|
77
|
+
${
|
|
78
|
+
modules
|
|
79
|
+
.flatMap { module ->
|
|
80
|
+
module.projects.flatMap { project ->
|
|
81
|
+
project.modules.map { (classifier, name) ->
|
|
82
|
+
" ${classifier}::class.java to ${name?.let { "\"${it}\"" }}"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
.joinToString(",\n")
|
|
87
|
+
}
|
|
51
88
|
)
|
|
52
|
-
|
|
89
|
+
|
|
90
|
+
@JvmStatic
|
|
91
|
+
fun getPackageList(): List<Package> {
|
|
92
|
+
return packagesList
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
override fun getModulesMap(): Map<Class<out Module>, String?> {
|
|
97
|
+
return modulesMap
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
""".trimIndent()
|
|
53
101
|
}
|
|
54
102
|
}
|
|
@@ -22,7 +22,7 @@ class AutolinkingCommandBuilder {
|
|
|
22
22
|
|
|
23
23
|
private var autolinkingCommand = emptyList<String>()
|
|
24
24
|
private var useJson = emptyList<String>()
|
|
25
|
-
private val optionsMap =
|
|
25
|
+
private val optionsMap = mutableSetOf<Pair<String, String>>()
|
|
26
26
|
private var searchPaths = emptyList<String>()
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -36,14 +36,14 @@ class AutolinkingCommandBuilder {
|
|
|
36
36
|
* Add an option to the command.
|
|
37
37
|
*/
|
|
38
38
|
fun option(key: String, value: String) = apply {
|
|
39
|
-
optionsMap
|
|
39
|
+
optionsMap.add(key to value)
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* Add a list of values as an option to the command.
|
|
44
44
|
*/
|
|
45
45
|
fun option(key: String, value: List<String>) = apply {
|
|
46
|
-
|
|
46
|
+
value.forEach { optionsMap.add(key to it) }
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
@@ -61,7 +61,6 @@ class AutolinkingCommandBuilder {
|
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
fun useAutolinkingOptions(autolinkingOptions: AutolinkingOptions) = apply {
|
|
64
|
-
autolinkingOptions.ignorePaths?.let { option(IGNORE_PATHS_KEY, it) }
|
|
65
64
|
autolinkingOptions.exclude?.let { option(EXCLUDE_KEY, it) }
|
|
66
65
|
autolinkingOptions.searchPaths?.let { searchPaths(it) }
|
|
67
66
|
}
|
|
@@ -77,7 +76,6 @@ class AutolinkingCommandBuilder {
|
|
|
77
76
|
}
|
|
78
77
|
|
|
79
78
|
companion object {
|
|
80
|
-
const val IGNORE_PATHS_KEY = "ignore-paths"
|
|
81
79
|
const val EXCLUDE_KEY = "exclude"
|
|
82
80
|
}
|
|
83
81
|
}
|
|
@@ -103,7 +103,8 @@ data class GradleProject(
|
|
|
103
103
|
val sourceDir: String,
|
|
104
104
|
val publication: Publication? = null,
|
|
105
105
|
val aarProjects: List<GradleAarProject> = emptyList(),
|
|
106
|
-
val modules: List<
|
|
106
|
+
val modules: List<ModuleInfo> = emptyList(),
|
|
107
|
+
val packages: List<String> = emptyList(),
|
|
107
108
|
val shouldUsePublicationScriptPath: String? = null,
|
|
108
109
|
@Transient val configuration: GradleProjectConfiguration = GradleProjectConfiguration()
|
|
109
110
|
) {
|
|
@@ -118,6 +119,15 @@ data class GradleProjectConfiguration(
|
|
|
118
119
|
var shouldUsePublication: Boolean = false
|
|
119
120
|
)
|
|
120
121
|
|
|
122
|
+
/**
|
|
123
|
+
* Object representing a module with name and classifier
|
|
124
|
+
*/
|
|
125
|
+
@Serializable
|
|
126
|
+
data class ModuleInfo(
|
|
127
|
+
val classifier: String,
|
|
128
|
+
val name: String?,
|
|
129
|
+
)
|
|
130
|
+
|
|
121
131
|
/**
|
|
122
132
|
* Object representing a gradle plugin
|
|
123
133
|
*/
|
|
@@ -40,11 +40,6 @@ open class ExpoAutolinkingSettingsExtension(
|
|
|
40
40
|
*/
|
|
41
41
|
var searchPaths: List<String>? = null
|
|
42
42
|
|
|
43
|
-
/**
|
|
44
|
-
* Paths to ignore when looking up for modules.
|
|
45
|
-
*/
|
|
46
|
-
var ignorePaths: List<String>? = null
|
|
47
|
-
|
|
48
43
|
/**
|
|
49
44
|
* Package names to exclude when looking up for modules.
|
|
50
45
|
*/
|
|
@@ -82,7 +77,6 @@ open class ExpoAutolinkingSettingsExtension(
|
|
|
82
77
|
settings,
|
|
83
78
|
projectRoot,
|
|
84
79
|
searchPaths,
|
|
85
|
-
ignorePaths,
|
|
86
80
|
exclude
|
|
87
81
|
).useExpoModules()
|
|
88
82
|
}
|
|
@@ -28,12 +28,10 @@ class SettingsManager(
|
|
|
28
28
|
val settings: Settings,
|
|
29
29
|
val projectRoot: File,
|
|
30
30
|
searchPaths: List<String>? = null,
|
|
31
|
-
ignorePaths: List<String>? = null,
|
|
32
31
|
exclude: List<String>? = null
|
|
33
32
|
) {
|
|
34
33
|
private val autolinkingOptions = AutolinkingOptions(
|
|
35
34
|
searchPaths,
|
|
36
|
-
ignorePaths,
|
|
37
35
|
exclude
|
|
38
36
|
)
|
|
39
37
|
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { AndroidGradleAarProjectDescriptor, AndroidGradlePluginDescriptor, AndroidPublication, RawExpoModuleConfig, RawModuleConfigApple, SupportedPlatform } from './types';
|
|
2
|
+
export declare class ExpoAndroidModuleConfig {
|
|
3
|
+
classifier: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
constructor(classifier: string, name: string | null);
|
|
6
|
+
}
|
|
2
7
|
export declare class ExpoAndroidProjectConfig {
|
|
3
8
|
name: string;
|
|
4
9
|
path: string;
|
|
5
|
-
modules?:
|
|
10
|
+
modules?: ExpoAndroidModuleConfig[] | undefined;
|
|
6
11
|
publication?: AndroidPublication | undefined;
|
|
7
12
|
gradleAarProjects?: AndroidGradleAarProjectDescriptor[] | undefined;
|
|
8
13
|
shouldUsePublicationScriptPath?: string | undefined;
|
|
@@ -10,7 +15,7 @@ export declare class ExpoAndroidProjectConfig {
|
|
|
10
15
|
* Whether this project is the root one.
|
|
11
16
|
*/
|
|
12
17
|
isDefault: boolean;
|
|
13
|
-
constructor(name: string, path: string, modules?:
|
|
18
|
+
constructor(name: string, path: string, modules?: ExpoAndroidModuleConfig[] | undefined, publication?: AndroidPublication | undefined, gradleAarProjects?: AndroidGradleAarProjectDescriptor[] | undefined, shouldUsePublicationScriptPath?: string | undefined,
|
|
14
19
|
/**
|
|
15
20
|
* Whether this project is the root one.
|
|
16
21
|
*/
|
|
@@ -79,4 +84,4 @@ export declare class ExpoModuleConfig {
|
|
|
79
84
|
*/
|
|
80
85
|
toJSON(): RawExpoModuleConfig;
|
|
81
86
|
}
|
|
82
|
-
export declare
|
|
87
|
+
export declare const discoverExpoModuleConfigAsync: (input: string, ...args: any[]) => Promise<any>;
|
|
@@ -3,16 +3,25 @@ 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 = exports.ExpoAndroidModuleConfig = 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;
|
|
13
13
|
}
|
|
14
14
|
return value != null ? [value] : [];
|
|
15
15
|
}
|
|
16
|
+
class ExpoAndroidModuleConfig {
|
|
17
|
+
classifier;
|
|
18
|
+
name;
|
|
19
|
+
constructor(classifier, name) {
|
|
20
|
+
this.classifier = classifier;
|
|
21
|
+
this.name = name;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.ExpoAndroidModuleConfig = ExpoAndroidModuleConfig;
|
|
16
25
|
class ExpoAndroidProjectConfig {
|
|
17
26
|
name;
|
|
18
27
|
path;
|
|
@@ -118,10 +127,14 @@ class ExpoModuleConfig {
|
|
|
118
127
|
androidProjects(defaultProjectName) {
|
|
119
128
|
const androidProjects = [];
|
|
120
129
|
// Adding the "root" Android project - it might not be valide.
|
|
121
|
-
androidProjects.push(new ExpoAndroidProjectConfig(this.rawConfig.android?.name ?? defaultProjectName, this.rawConfig.android?.path ?? 'android', this.rawConfig.android?.modules
|
|
130
|
+
androidProjects.push(new ExpoAndroidProjectConfig(this.rawConfig.android?.name ?? defaultProjectName, this.rawConfig.android?.path ?? 'android', this.rawConfig.android?.modules?.map((module) => typeof module === 'string'
|
|
131
|
+
? new ExpoAndroidModuleConfig(module, null)
|
|
132
|
+
: new ExpoAndroidModuleConfig(module.class, module.name)), this.rawConfig.android?.publication, this.rawConfig.android?.gradleAarProjects, this.rawConfig.android?.shouldUsePublicationScriptPath, !this.rawConfig.android?.path // it's default project because path is not defined
|
|
122
133
|
));
|
|
123
134
|
this.rawConfig.android?.projects?.forEach((project) => {
|
|
124
|
-
androidProjects.push(new ExpoAndroidProjectConfig(project.name, project.path, project.modules
|
|
135
|
+
androidProjects.push(new ExpoAndroidProjectConfig(project.name, project.path, project.modules?.map((module) => typeof module === 'string'
|
|
136
|
+
? new ExpoAndroidModuleConfig(module, null)
|
|
137
|
+
: new ExpoAndroidModuleConfig(module.class, module.name)), project.publication, project.gradleAarProjects, project.shouldUsePublicationScriptPath));
|
|
125
138
|
});
|
|
126
139
|
return androidProjects;
|
|
127
140
|
}
|
|
@@ -159,7 +172,7 @@ class ExpoModuleConfig {
|
|
|
159
172
|
exports.ExpoModuleConfig = ExpoModuleConfig;
|
|
160
173
|
/** Names of Expo Module config files (highest to lowest priority) */
|
|
161
174
|
const EXPO_MODULE_CONFIG_FILENAMES = ['expo-module.config.json', 'unimodule.json'];
|
|
162
|
-
async function discoverExpoModuleConfigAsync(directoryPath) {
|
|
175
|
+
exports.discoverExpoModuleConfigAsync = (0, utils_1.memoize)(async function discoverExpoModuleConfigAsync(directoryPath) {
|
|
163
176
|
for (let idx = 0; idx < EXPO_MODULE_CONFIG_FILENAMES.length; idx++) {
|
|
164
177
|
// TODO: Validate the raw config against a schema.
|
|
165
178
|
// TODO: Support for `*.js` files, not only static `*.json`.
|
|
@@ -175,5 +188,5 @@ async function discoverExpoModuleConfigAsync(directoryPath) {
|
|
|
175
188
|
return new ExpoModuleConfig(JSON.parse(text));
|
|
176
189
|
}
|
|
177
190
|
return null;
|
|
178
|
-
}
|
|
191
|
+
});
|
|
179
192
|
//# sourceMappingURL=ExpoModuleConfig.js.map
|
|
@@ -1 +1 @@
|
|
|
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';\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 ExpoAndroidModuleConfig {\n constructor(\n public classifier: string,\n public name: string | null\n ) {}\n}\n\nexport class ExpoAndroidProjectConfig {\n constructor(\n public name: string,\n public path: string,\n public modules?: ExpoAndroidModuleConfig[],\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?.map((module) =>\n typeof module === 'string'\n ? new ExpoAndroidModuleConfig(module, null)\n : new ExpoAndroidModuleConfig(module.class, module.name)\n ),\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?.map((module) =>\n typeof module === 'string'\n ? new ExpoAndroidModuleConfig(module, null)\n : new ExpoAndroidModuleConfig(module.class, module.name)\n ),\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"]}
|
|
@@ -1,11 +1,4 @@
|
|
|
1
1
|
import { ModuleDescriptor, SupportedPlatform } from '../types';
|
|
2
|
-
interface GeneratePackageListParams {
|
|
3
|
-
platform: SupportedPlatform;
|
|
4
|
-
targetPath: string;
|
|
5
|
-
namespace: string;
|
|
6
|
-
}
|
|
7
|
-
/** Generates a source file listing all packages to link (Android-only) */
|
|
8
|
-
export declare function generatePackageListAsync(modules: ModuleDescriptor[], params: GeneratePackageListParams): Promise<void>;
|
|
9
2
|
interface GenerateModulesProviderParams {
|
|
10
3
|
platform: SupportedPlatform;
|
|
11
4
|
targetPath: string;
|
|
@@ -1,16 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.generatePackageListAsync = generatePackageListAsync;
|
|
4
3
|
exports.generateModulesProviderAsync = generateModulesProviderAsync;
|
|
5
4
|
const platforms_1 = require("../platforms");
|
|
6
|
-
/** Generates a source file listing all packages to link (Android-only) */
|
|
7
|
-
async function generatePackageListAsync(modules, params) {
|
|
8
|
-
const platformLinking = (0, platforms_1.getLinkingImplementationForPlatform)(params.platform);
|
|
9
|
-
if (!('generatePackageListAsync' in platformLinking)) {
|
|
10
|
-
throw new Error(`Generating package list is not available for platform "${params.platform}"`);
|
|
11
|
-
}
|
|
12
|
-
await platformLinking.generatePackageListAsync(modules, params.targetPath, params.namespace);
|
|
13
|
-
}
|
|
14
5
|
/** Generates ExpoModulesProvider file listing all packages to link (Apple-only)
|
|
15
6
|
*/
|
|
16
7
|
async function generateModulesProviderAsync(modules, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generatePackageList.js","sourceRoot":"","sources":["../../src/autolinking/generatePackageList.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generatePackageList.js","sourceRoot":"","sources":["../../src/autolinking/generatePackageList.ts"],"names":[],"mappings":";;AAWA,oEAeC;AA1BD,4CAAmE;AASnE;GACG;AACI,KAAK,UAAU,4BAA4B,CAChD,OAA2B,EAC3B,MAAqC;IAErC,MAAM,eAAe,GAAG,IAAA,+CAAmC,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7E,IAAI,CAAC,CAAC,8BAA8B,IAAI,eAAe,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,8DAA8D,MAAM,CAAC,QAAQ,GAAG,CACjF,CAAC;IACJ,CAAC;IACD,MAAM,eAAe,CAAC,4BAA4B,CAChD,OAAgC,EAChC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,eAAe,CACvB,CAAC;AACJ,CAAC","sourcesContent":["import { getLinkingImplementationForPlatform } from '../platforms';\nimport { ModuleDescriptor, ModuleDescriptorIos, SupportedPlatform } from '../types';\n\ninterface GenerateModulesProviderParams {\n platform: SupportedPlatform;\n targetPath: string;\n entitlementPath: string | null;\n}\n\n/** Generates ExpoModulesProvider file listing all packages to link (Apple-only)\n */\nexport async function generateModulesProviderAsync(\n modules: ModuleDescriptor[],\n params: GenerateModulesProviderParams\n) {\n const platformLinking = getLinkingImplementationForPlatform(params.platform);\n if (!('generateModulesProviderAsync' in platformLinking)) {\n throw new Error(\n `Generating modules provider is not available for platform \"${params.platform}\"`\n );\n }\n await platformLinking.generateModulesProviderAsync(\n modules as ModuleDescriptorIos[],\n params.targetPath,\n params.entitlementPath\n );\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AutolinkingOptions } from '../commands/autolinkingOptions';
|
|
2
2
|
import { ExtraDependencies, ModuleDescriptor, SearchResults, SupportedPlatform } from '../types';
|
|
3
3
|
export { getConfiguration } from './getConfiguration';
|
|
4
|
-
export { generateModulesProviderAsync
|
|
4
|
+
export { generateModulesProviderAsync } from './generatePackageList';
|
|
5
5
|
/** @deprecated */
|
|
6
6
|
export interface SearchOptions extends Partial<AutolinkingOptions> {
|
|
7
7
|
projectRoot: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.generateModulesProviderAsync = exports.getConfiguration = void 0;
|
|
4
4
|
exports.findModulesAsync = apiFindModulesAsync;
|
|
5
5
|
exports.resolveExtraBuildDependenciesAsync = apiResolveExtraBuildDependenciesAsync;
|
|
6
6
|
exports.resolveModulesAsync = apiResolveModulesAsync;
|
|
@@ -11,7 +11,6 @@ var getConfiguration_1 = require("./getConfiguration");
|
|
|
11
11
|
Object.defineProperty(exports, "getConfiguration", { enumerable: true, get: function () { return getConfiguration_1.getConfiguration; } });
|
|
12
12
|
var generatePackageList_1 = require("./generatePackageList");
|
|
13
13
|
Object.defineProperty(exports, "generateModulesProviderAsync", { enumerable: true, get: function () { return generatePackageList_1.generateModulesProviderAsync; } });
|
|
14
|
-
Object.defineProperty(exports, "generatePackageListAsync", { enumerable: true, get: function () { return generatePackageList_1.generatePackageListAsync; } });
|
|
15
14
|
/** @deprecated */
|
|
16
15
|
async function apiFindModulesAsync(providedOptions) {
|
|
17
16
|
const autolinkingOptionsLoader = (0, autolinkingOptions_1.createAutolinkingOptionsLoader)(providedOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/autolinking/index.ts"],"names":[],"mappings":";;;AAsDyB,+CAAgB;AACE,mFAAkC;AACjD,qDAAmB;AAxD/C,uEAAoG;AAEpG,+CAAiD;AACjD,qDAA2F;AAE3F,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/autolinking/index.ts"],"names":[],"mappings":";;;AAsDyB,+CAAgB;AACE,mFAAkC;AACjD,qDAAmB;AAxD/C,uEAAoG;AAEpG,+CAAiD;AACjD,qDAA2F;AAE3F,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,6DAAqE;AAA5D,mIAAA,4BAA4B,OAAA;AAgBrC,kBAAkB;AAClB,KAAK,UAAU,mBAAmB,CAAC,eAA8B;IAC/D,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC,eAAe,CAAC,CAAC;IACjF,OAAO,IAAA,8BAAgB,EAAC;QACtB,OAAO,EAAE,MAAM,wBAAwB,CAAC,UAAU,EAAE;QACpD,kBAAkB,EAAE,MAAM,wBAAwB,CAAC,kBAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC;KAChG,CAAC,CAAC;AACL,CAAC;AAED,kBAAkB;AAClB,KAAK,UAAU,qCAAqC,CAClD,eAA+B;IAE/B,OAAO,IAAA,mDAAkC,EAAC;QACxC,WAAW,EAAE,eAAe,CAAC,WAAW;QACxC,QAAQ,EAAE,eAAe,CAAC,QAAQ;KACnC,CAAC,CAAC;AACL,CAAC;AAED,kBAAkB;AAClB,KAAK,UAAU,sBAAsB,CACnC,aAA4B,EAC5B,eAA8B;IAE9B,MAAM,wBAAwB,GAAG,IAAA,mDAA8B,EAAC,eAAe,CAAC,CAAC;IACjF,OAAO,IAAA,oCAAmB,EACxB,aAAa,EACb,MAAM,wBAAwB,CAAC,kBAAkB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAC5E,CAAC;AACJ,CAAC","sourcesContent":["import { AutolinkingOptions, createAutolinkingOptionsLoader } from '../commands/autolinkingOptions';\nimport { ExtraDependencies, ModuleDescriptor, SearchResults, SupportedPlatform } from '../types';\nimport { findModulesAsync } from './findModules';\nimport { resolveExtraBuildDependenciesAsync, resolveModulesAsync } from './resolveModules';\n\nexport { getConfiguration } from './getConfiguration';\nexport { generateModulesProviderAsync } from './generatePackageList';\n\n/** @deprecated */\nexport interface SearchOptions extends Partial<AutolinkingOptions> {\n projectRoot: string;\n platform: SupportedPlatform;\n [extra: string]: unknown;\n}\n\n/** @deprecated */\nexport interface ResolveOptions {\n projectRoot: string;\n platform: SupportedPlatform;\n [extra: string]: unknown;\n}\n\n/** @deprecated */\nasync function apiFindModulesAsync(providedOptions: SearchOptions): Promise<SearchResults> {\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader(providedOptions);\n return findModulesAsync({\n appRoot: await autolinkingOptionsLoader.getAppRoot(),\n autolinkingOptions: await autolinkingOptionsLoader.getPlatformOptions(providedOptions.platform),\n });\n}\n\n/** @deprecated */\nasync function apiResolveExtraBuildDependenciesAsync(\n providedOptions: ResolveOptions\n): Promise<ExtraDependencies> {\n return resolveExtraBuildDependenciesAsync({\n commandRoot: providedOptions.projectRoot,\n platform: providedOptions.platform,\n });\n}\n\n/** @deprecated */\nasync function apiResolveModulesAsync(\n searchResults: SearchResults,\n providedOptions: SearchOptions\n): Promise<ModuleDescriptor[]> {\n const autolinkingOptionsLoader = createAutolinkingOptionsLoader(providedOptions);\n return resolveModulesAsync(\n searchResults,\n await autolinkingOptionsLoader.getPlatformOptions(providedOptions.platform)\n );\n}\n\nexport {\n apiFindModulesAsync as findModulesAsync,\n apiResolveExtraBuildDependenciesAsync as resolveExtraBuildDependenciesAsync,\n apiResolveModulesAsync as resolveModulesAsync,\n};\n"]}
|
|
@@ -85,20 +85,21 @@ async function verifySearchResults(results, options) {
|
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
87
87
|
if (options.verbose) {
|
|
88
|
+
const sortResolutions = (resolutions) => [...resolutions].sort((a, b) => a.name.localeCompare(b.name));
|
|
88
89
|
if (groups.reactNativeProjectConfig.length) {
|
|
89
90
|
console.log(`🔎 Found ${groups.reactNativeProjectConfig.length} modules from React Native project config`);
|
|
90
|
-
for (const revision of groups.reactNativeProjectConfig) {
|
|
91
|
+
for (const revision of sortResolutions(groups.reactNativeProjectConfig)) {
|
|
91
92
|
console.log(` - ${await getHumanReadableDependency(revision)}`);
|
|
92
93
|
}
|
|
93
94
|
}
|
|
94
95
|
if (groups.searchPaths.length) {
|
|
95
96
|
console.log(`🔎 Found ${groups.searchPaths.length} modules in search paths`);
|
|
96
|
-
for (const revision of groups.searchPaths) {
|
|
97
|
+
for (const revision of sortResolutions(groups.searchPaths)) {
|
|
97
98
|
console.log(` - ${await getHumanReadableDependency(revision)}`);
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
console.log(`🔎 Found ${groups.dependencies.length} modules in dependencies`);
|
|
101
|
-
for (const revision of groups.dependencies) {
|
|
102
|
+
for (const revision of sortResolutions(groups.dependencies)) {
|
|
102
103
|
console.log(` - ${await getHumanReadableDependency(revision)}`);
|
|
103
104
|
}
|
|
104
105
|
}
|
|
@@ -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\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 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: {
|