@aneuhold/core-ts-lib 2.3.10 → 2.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## 🔖 [2.3.11] (2025-11-23)
9
+
10
+ ### ✅ Added
11
+
12
+ - Added `propagatePackageVersion` and `validatePackageDependents` utilities to `DependencyService` for automated version propagation and validation across workspace packages.
13
+ - Updated type definitions for `PackageJson` to include `scripts` property.
14
+
8
15
  ## 🔖 [2.3.10] (2025-11-09)
9
16
 
10
17
  ### 🏗️ Changed
@@ -127,6 +134,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
127
134
 
128
135
  <!-- Link References -->
129
136
 
137
+ [2.3.11]: https://github.com/aneuhold/ts-libs/compare/core-ts-lib-v2.3.10...core-ts-lib-v2.3.11
130
138
  [2.3.10]: https://github.com/aneuhold/ts-libs/compare/core-ts-lib-v2.3.9...core-ts-lib-v2.3.10
131
139
  [2.3.9]: https://github.com/aneuhold/ts-libs/compare/core-ts-lib-v2.3.8...core-ts-lib-v2.3.9
132
140
  [2.3.8]: https://github.com/aneuhold/ts-libs/compare/core-ts-lib-v2.3.7...core-ts-lib-v2.3.8
@@ -26,5 +26,32 @@ export default class DependencyService {
26
26
  * (e.g., "../") or absolute. Defaults to current working directory.
27
27
  */
28
28
  static getChildPackageJsons(searchDirectory?: string): Promise<PackageJsonMap>;
29
+ /**
30
+ * Propagates the version of a specific package to all other packages in the workspace
31
+ * that depend on it.
32
+ *
33
+ * @param packageName The name of the package whose version should be propagated
34
+ * @param version The version to propagate
35
+ * @param workspaceRoot Optional workspace root path. Defaults to finding pnpm-workspace.yaml up the tree.
36
+ */
37
+ static propagatePackageVersion(packageName: string, version: string, workspaceRoot?: string): Promise<void>;
38
+ /**
39
+ * Validates that all other packages in the workspace that depend on the specified package
40
+ * are using the correct version.
41
+ *
42
+ * @param packageName The name of the package to validate dependents for
43
+ * @param version The expected version
44
+ * @param workspaceRoot Optional workspace root path. Defaults to finding pnpm-workspace.yaml up the tree.
45
+ */
46
+ static validatePackageDependents(packageName: string, version: string, workspaceRoot?: string): Promise<void>;
47
+ /**
48
+ * Internal helper to process dependents of a package, either updating them or validating them.
49
+ *
50
+ * @param packageName The name of the package to process dependents for
51
+ * @param version The version to use for update or validation
52
+ * @param mode Whether to update the dependents or just validate them
53
+ * @param workspaceRoot Optional workspace root path
54
+ */
55
+ private static processPackageDependents;
29
56
  }
30
57
  //# sourceMappingURL=DependencyService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DependencyService.d.ts","sourceRoot":"","sources":["../../src/services/DependencyService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC;;;;OAIG;WACU,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDrD;;;;;OAKG;WACU,WAAW,CAAC,WAAW,GAAE,WAA+B,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCrF;;;;;;OAMG;WACU,oBAAoB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAuCrF"}
1
+ {"version":3,"file":"DependencyService.d.ts","sourceRoot":"","sources":["../../src/services/DependencyService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC;;;;OAIG;WACU,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmDrD;;;;;OAKG;WACU,WAAW,CAAC,WAAW,GAAE,WAA+B,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCrF;;;;;;OAMG;WACU,oBAAoB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAwCpF;;;;;;;OAOG;WACU,uBAAuB,CAClC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;;OAOG;WACU,yBAAyB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;;;;OAOG;mBACkB,wBAAwB;CA8E9C"}
@@ -136,5 +136,96 @@ export default class DependencyService {
136
136
  }));
137
137
  return childPackages;
138
138
  }
139
+ /**
140
+ * Propagates the version of a specific package to all other packages in the workspace
141
+ * that depend on it.
142
+ *
143
+ * @param packageName The name of the package whose version should be propagated
144
+ * @param version The version to propagate
145
+ * @param workspaceRoot Optional workspace root path. Defaults to finding pnpm-workspace.yaml up the tree.
146
+ */
147
+ static async propagatePackageVersion(packageName, version, workspaceRoot) {
148
+ await this.processPackageDependents(packageName, version, 'update', workspaceRoot);
149
+ }
150
+ /**
151
+ * Validates that all other packages in the workspace that depend on the specified package
152
+ * are using the correct version.
153
+ *
154
+ * @param packageName The name of the package to validate dependents for
155
+ * @param version The expected version
156
+ * @param workspaceRoot Optional workspace root path. Defaults to finding pnpm-workspace.yaml up the tree.
157
+ */
158
+ static async validatePackageDependents(packageName, version, workspaceRoot) {
159
+ await this.processPackageDependents(packageName, version, 'validate', workspaceRoot);
160
+ }
161
+ /**
162
+ * Internal helper to process dependents of a package, either updating them or validating them.
163
+ *
164
+ * @param packageName The name of the package to process dependents for
165
+ * @param version The version to use for update or validation
166
+ * @param mode Whether to update the dependents or just validate them
167
+ * @param workspaceRoot Optional workspace root path
168
+ */
169
+ static async processPackageDependents(packageName, version, mode, workspaceRoot) {
170
+ const actionName = mode === 'update' ? 'Propagating' : 'Validating';
171
+ DR.logger.info(`${actionName} version ${version} for ${packageName}...`);
172
+ const pnpmWorkspacePath = await FileSystemService.findFileUpTree(workspaceRoot || process.cwd(), 'pnpm-workspace.yaml');
173
+ if (!pnpmWorkspacePath) {
174
+ throw new Error('Could not find pnpm-workspace.yaml');
175
+ }
176
+ const rootDir = path.dirname(pnpmWorkspacePath);
177
+ const childPackages = await this.getChildPackageJsons(rootDir);
178
+ let updatedCount = 0;
179
+ let errorCount = 0;
180
+ await Promise.all(Object.values(childPackages).map(async (childPackageInfo) => {
181
+ const { packageJsonContents, packageJsonPath } = childPackageInfo;
182
+ let modified = false;
183
+ const processDeps = (type, deps) => {
184
+ if (!deps)
185
+ return;
186
+ if (deps[packageName]) {
187
+ const currentDep = deps[packageName];
188
+ const newDep = `^${version}`;
189
+ if (currentDep !== newDep) {
190
+ if (mode === 'update') {
191
+ DR.logger.info(` Updating ${packageJsonContents.name}: ${packageName} ${currentDep} -> ${newDep}`);
192
+ deps[packageName] = newDep;
193
+ modified = true;
194
+ }
195
+ else {
196
+ DR.logger.error(`${packageJsonContents.name} has invalid ${type} for ${packageName}: found "${currentDep}", expected "${newDep}"`);
197
+ errorCount++;
198
+ }
199
+ }
200
+ }
201
+ };
202
+ processDeps('dependencies', packageJsonContents.dependencies);
203
+ processDeps('devDependencies', packageJsonContents.devDependencies);
204
+ processDeps('peerDependencies', packageJsonContents.peerDependencies);
205
+ processDeps('optionalDependencies', packageJsonContents.optionalDependencies);
206
+ // TBH, I don't know why ESLint is saying `modified` is only true. That isn't the case.
207
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
208
+ if (modified && mode === 'update') {
209
+ await writeFile(packageJsonPath, JSON.stringify(packageJsonContents, null, 2));
210
+ updatedCount++;
211
+ }
212
+ }));
213
+ if (mode === 'update') {
214
+ if (updatedCount > 0) {
215
+ DR.logger.success(`Updated ${updatedCount} packages.`);
216
+ }
217
+ else {
218
+ DR.logger.info(`No packages needed updating.`);
219
+ }
220
+ }
221
+ else {
222
+ if (errorCount > 0) {
223
+ throw new Error(`Found ${errorCount} dependency version mismatches for ${packageName}.`);
224
+ }
225
+ else {
226
+ DR.logger.success(`All dependents of ${packageName} are using the correct version.`);
227
+ }
228
+ }
229
+ }
139
230
  }
140
231
  //# sourceMappingURL=DependencyService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DependencyService.js","sourceRoot":"","sources":["../../src/services/DependencyService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAC7C,OAAO,iBAAiB,MAAM,0CAA0C,CAAC;AAEzE;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,uBAAuB;QAClC,kCAAkC;QAClC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,mBAAgC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAClC,MAAM,sBAAsB,GAAG,MAAM,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;YAC5E,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAgB,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,2FAA2F,aAAa,EAAE,CAC3G,CAAC;QACJ,CAAC;QAED,MAAM,gBAAgB,GAAG;YACvB,GAAG,mBAAmB,CAAC,YAAY;YACnC,GAAG,mBAAmB,CAAC,eAAe;SACvC,CAAC;QAEF,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5D,4CAA4C;QAC5C,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,EAAE;YAC9D,MAAM,EAAE,mBAAmB,EAAE,eAAe,EAAE,GAAG,gBAAgB,CAAC;YAElE,MAAM,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAAC;YAE9D,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;oBAC/C,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;wBACjC,YAAY,CAAC,UAAU,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;oBAClD,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;wBACjC,eAAe,CAAC,UAAU,CAAC,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,sCAAsC;YACtC,MAAM,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,cAA2B,WAAW,CAAC,KAAK;QACnE,MAAM,IAAI,GAAG,CAAC,OAAe,EAAU,EAAE;YACvC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC7D,QAAQ,WAAW,EAAE,CAAC;gBACpB,KAAK,WAAW,CAAC,KAAK;oBACpB,OAAO,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC;gBAC5B,KAAK,WAAW,CAAC,KAAK;oBACpB,OAAO,GAAG,KAAK,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC;gBACnC,KAAK,WAAW,CAAC,KAAK,CAAC;gBACvB;oBACE,OAAO,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,KAAK,EAAE,QAAgB,EAAiB,EAAE;YAC9D,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC;gBACrF,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAA4B,CAAC;gBAC1F,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;gBACpC,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC;gBAC9B,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7D,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,UAAU,OAAO,UAAU,EAAE,CAAC,CAAC;YAC1F,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACrD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC,CAAC;YACjF,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,eAAwB;QACxD,MAAM,aAAa,GAAmB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QAC/F,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAE3E,kDAAkD;QAClD,MAAM,wBAAwB,GAAG,SAAS,CAAC,MAAM,CAC/C,CAAC,QAAQ,EAAE,EAAE,CACX,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,8BAA8B;YACnE,QAAQ,KAAK,cAAc,IAAI,gCAAgC;YAC/D,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC;YAClC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1B,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC9B,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CACf,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE;YAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACvD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAgB,CAAC;gBAChE,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC;oBACzB,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG;wBACpC,mBAAmB,EAAE,eAAe;wBACpC,eAAe,EAAE,QAAQ;qBAC1B,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,MAAM,CAAC,IAAI,CACZ,mBAAmB,QAAQ,kEAAkE,CAC9F,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,WAAW,GAAG,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBACrD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,QAAQ,KAAK,WAAW,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,aAAa,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"DependencyService.js","sourceRoot":"","sources":["../../src/services/DependencyService.ts"],"names":[],"mappings":"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"}
@@ -160,4 +160,123 @@ export default class DependencyService {
160
160
  );
161
161
  return childPackages;
162
162
  }
163
+
164
+ /**
165
+ * Propagates the version of a specific package to all other packages in the workspace
166
+ * that depend on it.
167
+ *
168
+ * @param packageName The name of the package whose version should be propagated
169
+ * @param version The version to propagate
170
+ * @param workspaceRoot Optional workspace root path. Defaults to finding pnpm-workspace.yaml up the tree.
171
+ */
172
+ static async propagatePackageVersion(
173
+ packageName: string,
174
+ version: string,
175
+ workspaceRoot?: string
176
+ ): Promise<void> {
177
+ await this.processPackageDependents(packageName, version, 'update', workspaceRoot);
178
+ }
179
+
180
+ /**
181
+ * Validates that all other packages in the workspace that depend on the specified package
182
+ * are using the correct version.
183
+ *
184
+ * @param packageName The name of the package to validate dependents for
185
+ * @param version The expected version
186
+ * @param workspaceRoot Optional workspace root path. Defaults to finding pnpm-workspace.yaml up the tree.
187
+ */
188
+ static async validatePackageDependents(
189
+ packageName: string,
190
+ version: string,
191
+ workspaceRoot?: string
192
+ ): Promise<void> {
193
+ await this.processPackageDependents(packageName, version, 'validate', workspaceRoot);
194
+ }
195
+
196
+ /**
197
+ * Internal helper to process dependents of a package, either updating them or validating them.
198
+ *
199
+ * @param packageName The name of the package to process dependents for
200
+ * @param version The version to use for update or validation
201
+ * @param mode Whether to update the dependents or just validate them
202
+ * @param workspaceRoot Optional workspace root path
203
+ */
204
+ private static async processPackageDependents(
205
+ packageName: string,
206
+ version: string,
207
+ mode: 'update' | 'validate',
208
+ workspaceRoot?: string
209
+ ): Promise<void> {
210
+ const actionName = mode === 'update' ? 'Propagating' : 'Validating';
211
+ DR.logger.info(`${actionName} version ${version} for ${packageName}...`);
212
+
213
+ const pnpmWorkspacePath = await FileSystemService.findFileUpTree(
214
+ workspaceRoot || process.cwd(),
215
+ 'pnpm-workspace.yaml'
216
+ );
217
+
218
+ if (!pnpmWorkspacePath) {
219
+ throw new Error('Could not find pnpm-workspace.yaml');
220
+ }
221
+
222
+ const rootDir = path.dirname(pnpmWorkspacePath);
223
+ const childPackages = await this.getChildPackageJsons(rootDir);
224
+ let updatedCount = 0;
225
+ let errorCount = 0;
226
+
227
+ await Promise.all(
228
+ Object.values(childPackages).map(async (childPackageInfo) => {
229
+ const { packageJsonContents, packageJsonPath } = childPackageInfo;
230
+ let modified = false;
231
+
232
+ const processDeps = (type: string, deps: Record<string, string> | undefined) => {
233
+ if (!deps) return;
234
+ if (deps[packageName]) {
235
+ const currentDep = deps[packageName];
236
+ const newDep = `^${version}`;
237
+ if (currentDep !== newDep) {
238
+ if (mode === 'update') {
239
+ DR.logger.info(
240
+ ` Updating ${packageJsonContents.name}: ${packageName} ${currentDep} -> ${newDep}`
241
+ );
242
+ deps[packageName] = newDep;
243
+ modified = true;
244
+ } else {
245
+ DR.logger.error(
246
+ `${packageJsonContents.name} has invalid ${type} for ${packageName}: found "${currentDep}", expected "${newDep}"`
247
+ );
248
+ errorCount++;
249
+ }
250
+ }
251
+ }
252
+ };
253
+
254
+ processDeps('dependencies', packageJsonContents.dependencies);
255
+ processDeps('devDependencies', packageJsonContents.devDependencies);
256
+ processDeps('peerDependencies', packageJsonContents.peerDependencies);
257
+ processDeps('optionalDependencies', packageJsonContents.optionalDependencies);
258
+
259
+ // TBH, I don't know why ESLint is saying `modified` is only true. That isn't the case.
260
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
261
+ if (modified && mode === 'update') {
262
+ await writeFile(packageJsonPath, JSON.stringify(packageJsonContents, null, 2));
263
+ updatedCount++;
264
+ }
265
+ })
266
+ );
267
+
268
+ if (mode === 'update') {
269
+ if (updatedCount > 0) {
270
+ DR.logger.success(`Updated ${updatedCount} packages.`);
271
+ } else {
272
+ DR.logger.info(`No packages needed updating.`);
273
+ }
274
+ } else {
275
+ if (errorCount > 0) {
276
+ throw new Error(`Found ${errorCount} dependency version mismatches for ${packageName}.`);
277
+ } else {
278
+ DR.logger.success(`All dependents of ${packageName} are using the correct version.`);
279
+ }
280
+ }
281
+ }
163
282
  }
@@ -6,6 +6,7 @@ import type { JsonWithVersionProperty } from './JsonWithVersionProperty.js';
6
6
  export interface PackageJson extends JsonWithVersionProperty {
7
7
  name: string;
8
8
  packageManager?: string;
9
+ scripts?: Record<string, string>;
9
10
  dependencies?: Record<string, string>;
10
11
  devDependencies?: Record<string, string>;
11
12
  peerDependencies?: Record<string, string>;
@@ -1 +1 @@
1
- {"version":3,"file":"PackageJson.d.ts","sourceRoot":"","sources":["../../src/types/PackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,uBAAuB;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/C"}
1
+ {"version":3,"file":"PackageJson.d.ts","sourceRoot":"","sources":["../../src/types/PackageJson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,WAAY,SAAQ,uBAAuB;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/C"}
@@ -7,6 +7,7 @@ import type { JsonWithVersionProperty } from './JsonWithVersionProperty.js';
7
7
  export interface PackageJson extends JsonWithVersionProperty {
8
8
  name: string;
9
9
  packageManager?: string;
10
+ scripts?: Record<string, string>;
10
11
  dependencies?: Record<string, string>;
11
12
  devDependencies?: Record<string, string>;
12
13
  peerDependencies?: Record<string, string>;
package/package.json CHANGED
@@ -2,18 +2,21 @@
2
2
  "name": "@aneuhold/core-ts-lib",
3
3
  "author": "Anton G. Neuhold Jr.",
4
4
  "license": "MIT",
5
- "version": "2.3.10",
5
+ "version": "2.3.11",
6
6
  "description": "A core library for all of my TypeScript projects",
7
7
  "packageManager": "pnpm@10.12.1",
8
8
  "type": "module",
9
9
  "scripts": {
10
- "build": "rimraf lib && tsc --project tsconfig.build.json && tsx ./scripts/copyTsFiles.ts",
11
- "watch": "nodemon --ignore lib/ -e ts --exec \"tsc --project tsconfig.build.json && tsx ./scripts/copyTsFiles.ts\"",
10
+ "build": "rimraf lib && pnpm build:withoutClean",
11
+ "build:withoutClean": "tsc --project tsconfig.build.json && tsx ./scripts/copyTsFiles.ts && pnpm propagateVersion",
12
+ "propagateVersion": "tsx ../../scripts/propagateVersion.ts",
13
+ "watch": "nodemon --ignore lib/ -e ts --exec \"pnpm build:withoutClean\"",
12
14
  "lint": "eslint",
13
15
  "test": "vitest run",
14
16
  "preparePkg": "tsx ./scripts/bumpVersionAndInitializeChangelog.ts",
15
17
  "jsr:validate": "tsx ./scripts/validateJsrPublish.ts",
16
18
  "npm:validate": "tsx ./scripts/validateNpmPublish.ts",
19
+ "versionPropagation:validate": "tsx ../../scripts/validatePackageVersions.ts",
17
20
  "checkAll": "pnpm build && pnpm lint && pnpm test && pnpm jsr:validate",
18
21
  "jsr:publish": "tsx ./scripts/publishJsr.ts",
19
22
  "npm:publish": "npm publish --access public",
@@ -74,4 +77,4 @@
74
77
  "typescript": "~5.9.3",
75
78
  "vitest": "^4.0.8"
76
79
  }
77
- }
80
+ }