1
+ import 'dart:collection' ;
1
2
import 'dart:io' ;
2
3
3
4
import 'package:package_config/package_config.dart' ;
4
5
import 'package:path/path.dart' as path;
6
+ import 'package:pubspec_parse/pubspec_parse.dart' ;
5
7
import 'package:serverpod_cli/src/config/config.dart' ;
8
+ import 'package:serverpod_cli/src/util/pubspec_helpers.dart' ;
6
9
import 'package:serverpod_shared/serverpod_shared.dart' ;
7
10
import 'package:yaml/yaml.dart' ;
8
11
9
12
const _serverSuffix = '_server' ;
10
13
14
+ bool _isServerpodModule (String packageName) {
15
+ return packageName.endsWith (_serverSuffix) || packageName == 'serverpod' ;
16
+ }
17
+
11
18
List <ModuleConfig > loadModuleConfigs ({
19
+ required Pubspec projectPubspec,
12
20
required PackageConfig packageConfig,
13
21
Map <String , String ?> nickNameOverrides = const {},
14
22
}) {
15
- var modules = < ModuleConfig > [];
23
+ var projectModuleDependencies = _listModuleDependencies (
24
+ projectPubspec: projectPubspec,
25
+ packageConfig: packageConfig,
26
+ );
16
27
17
- for (var packageInfo in packageConfig.packages) {
18
- try {
19
- var packageName = packageInfo.name;
28
+ var moduleConfigs = _loadModuleConfigs (
29
+ modules: projectModuleDependencies,
30
+ nickNameOverrides: nickNameOverrides,
31
+ );
32
+
33
+ return moduleConfigs;
34
+ }
20
35
21
- if (! packageName.endsWith (_serverSuffix) && packageName != 'serverpod' ) {
36
+ Set <Package > _listModuleDependencies ({
37
+ required Pubspec projectPubspec,
38
+ required PackageConfig packageConfig,
39
+ }) {
40
+ var projectModuleDependencies = < Package > {};
41
+ var visitedModules = < String > {};
42
+ var foundModules = Queue <String >();
43
+
44
+ void queueModulesInPubspec (Pubspec projectPubspec) {
45
+ for (var dependencyName in projectPubspec.dependencies.keys) {
46
+ if (! _isServerpodModule (dependencyName)) {
22
47
continue ;
23
48
}
24
49
25
- var packageSrcRoot = packageInfo.packageUriRoot;
26
- var moduleProjectRoot = List <String >.from (packageSrcRoot.pathSegments)
27
- ..removeLast ()
28
- ..removeLast ();
29
- var generatorConfigSegments = path
30
- .joinAll ([...moduleProjectRoot, 'config' , 'generator.yaml' ]).split (
31
- path.separator);
50
+ foundModules.add (dependencyName);
51
+ }
52
+ }
53
+
54
+ queueModulesInPubspec (projectPubspec);
55
+
56
+ while (foundModules.isNotEmpty) {
57
+ var moduleName = foundModules.removeFirst ();
58
+ if (visitedModules.contains (moduleName)) {
59
+ continue ;
60
+ }
61
+
62
+ visitedModules.add (moduleName);
63
+
64
+ var packageInfo = packageConfig.packages
65
+ .where ((pkg) => pkg.name == moduleName)
66
+ .firstOrNull;
67
+
68
+ if (packageInfo == null ) {
69
+ throw ServerpodModulesNotFoundException (
70
+ 'Failed to locate module dependency path in package config for '
71
+ 'dependency: $moduleName ' ,
72
+ );
73
+ }
74
+
75
+ projectModuleDependencies.add (packageInfo);
32
76
33
- var generatorConfigUri = packageSrcRoot.replace (
34
- pathSegments: generatorConfigSegments,
77
+ Pubspec modulePubspec;
78
+ try {
79
+ var modulePubspecFile = File .fromUri (
80
+ packageInfo.root.resolve ('pubspec.yaml' ),
35
81
);
82
+ modulePubspec = parsePubspec (modulePubspecFile);
83
+ } catch (_) {
84
+ continue ;
85
+ }
86
+
87
+ queueModulesInPubspec (modulePubspec);
88
+ }
89
+
90
+ return projectModuleDependencies;
91
+ }
92
+
93
+ List <ModuleConfig > _loadModuleConfigs ({
94
+ required Set <Package > modules,
95
+ Map <String , String ?> nickNameOverrides = const {},
96
+ }) {
97
+ var moduleConfigs = < ModuleConfig > [];
98
+
99
+ for (var packageInfo in modules) {
100
+ try {
101
+ var packageName = packageInfo.name;
102
+
103
+ var packageSrcRoot = packageInfo.root;
104
+
105
+ var generatorConfigUri =
106
+ packageSrcRoot.resolve (path.joinAll (['config' , 'generator.yaml' ]));
36
107
37
108
var generatorConfigFile = File .fromUri (generatorConfigUri);
38
109
if (! generatorConfigFile.existsSync ()) {
39
110
continue ;
40
111
}
41
112
42
- var moduleProjectUri = packageSrcRoot.replace (
43
- pathSegments: moduleProjectRoot,
44
- );
45
-
46
113
var migrationVersions = findAllMigrationVersionsSync (
47
- directory: Directory .fromUri (moduleProjectUri ),
114
+ directory: Directory .fromUri (packageSrcRoot ),
48
115
);
49
116
50
117
var moduleInfo = loadConfigFile (generatorConfigFile);
@@ -53,21 +120,21 @@ List<ModuleConfig> loadModuleConfigs({
53
120
var manualNickname = nickNameOverrides[moduleName];
54
121
var nickname = manualNickname ?? moduleInfo['nickname' ] ?? moduleName;
55
122
56
- modules .add (
123
+ moduleConfigs .add (
57
124
ModuleConfig (
58
125
type: GeneratorConfig .getPackageType (moduleInfo),
59
126
name: moduleName,
60
127
nickname: nickname,
61
128
migrationVersions: migrationVersions,
62
- serverPackageDirectoryPathParts: moduleProjectRoot ,
129
+ serverPackageDirectoryPathParts: packageSrcRoot.pathSegments ,
63
130
),
64
131
);
65
132
} catch (e) {
66
133
continue ;
67
134
}
68
135
}
69
136
70
- return modules ;
137
+ return moduleConfigs ;
71
138
}
72
139
73
140
Map <dynamic , dynamic > loadConfigFile (File file) {
0 commit comments