@smartsoft001/core 2.143.0 → 2.145.0
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/migrations.json +11 -0
- package/package.json +15 -11
- package/src/migrations/use-stack-packages/README.md +52 -0
- package/src/migrations/use-stack-packages/use-stack-packages.d.ts +2 -0
- package/src/migrations/use-stack-packages/use-stack-packages.js +147 -0
- package/src/migrations/use-stack-packages/use-stack-packages.js.map +1 -0
package/migrations.json
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"generators": {
|
|
3
|
+
"use-stack-packages": {
|
|
4
|
+
"cli": "nx",
|
|
5
|
+
"version": "2.145.0",
|
|
6
|
+
"description": "Replace individually installed @smartsoft001 packages with the stack package that already pins them.",
|
|
7
|
+
"factory": "./src/migrations/use-stack-packages/use-stack-packages",
|
|
8
|
+
"documentation": "./src/migrations/use-stack-packages/README.md"
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
package/package.json
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smartsoft001/core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.145.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
7
|
+
"ng-update": {
|
|
8
|
+
"migrations": "./migrations.json",
|
|
9
|
+
"supportsOptionalMigrations": true
|
|
10
|
+
},
|
|
7
11
|
"description": "Every framework-agnostic @smartsoft001 package in one install: the model decorators, the domain contracts, the helpers and the shared DTOs.",
|
|
8
12
|
"license": "MIT",
|
|
9
13
|
"dependencies": {
|
|
10
|
-
"@smartsoft001/models": "2.
|
|
11
|
-
"@smartsoft001/domain-core": "2.
|
|
12
|
-
"@smartsoft001/utils": "2.
|
|
13
|
-
"@smartsoft001/users": "2.
|
|
14
|
-
"@smartsoft001/auth-domain": "2.
|
|
15
|
-
"@smartsoft001/crud-domain": "2.
|
|
16
|
-
"@smartsoft001/crud-shell-dtos": "2.
|
|
17
|
-
"@smartsoft001/auth-shell-dtos": "2.
|
|
18
|
-
"@smartsoft001/crud-shell-app-services": "2.
|
|
19
|
-
"@smartsoft001/auth-shell-app-services": "2.
|
|
14
|
+
"@smartsoft001/models": "2.145.0",
|
|
15
|
+
"@smartsoft001/domain-core": "2.145.0",
|
|
16
|
+
"@smartsoft001/utils": "2.145.0",
|
|
17
|
+
"@smartsoft001/users": "2.145.0",
|
|
18
|
+
"@smartsoft001/auth-domain": "2.145.0",
|
|
19
|
+
"@smartsoft001/crud-domain": "2.145.0",
|
|
20
|
+
"@smartsoft001/crud-shell-dtos": "2.145.0",
|
|
21
|
+
"@smartsoft001/auth-shell-dtos": "2.145.0",
|
|
22
|
+
"@smartsoft001/crud-shell-app-services": "2.145.0",
|
|
23
|
+
"@smartsoft001/auth-shell-app-services": "2.145.0"
|
|
20
24
|
}
|
|
21
25
|
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# use-stack-packages
|
|
2
|
+
|
|
3
|
+
Since 2.143.0 the framework publishes four meta packages that pin a set of libraries at one
|
|
4
|
+
version: `@smartsoft001/core`, `@smartsoft001/angular-stack`, `@smartsoft001/nestjs-stack` and
|
|
5
|
+
`@smartsoft001/payments-stack`. This migration rewrites your `package.json` so a project that
|
|
6
|
+
already installs a whole set installs the set instead of listing its parts.
|
|
7
|
+
|
|
8
|
+
## What it changes
|
|
9
|
+
|
|
10
|
+
In `dependencies` and in `devDependencies`, whenever a section lists **two or more** packages that
|
|
11
|
+
one stack pins, those entries are replaced by a single entry for the stack:
|
|
12
|
+
|
|
13
|
+
```diff
|
|
14
|
+
"dependencies": {
|
|
15
|
+
- "@smartsoft001/angular": "2.143.0",
|
|
16
|
+
- "@smartsoft001/crud-shell-angular": "2.143.0"
|
|
17
|
+
+ "@smartsoft001/angular-stack": "2.143.0"
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Details worth knowing:
|
|
22
|
+
|
|
23
|
+
- The stack takes the version the replaced entries carried. They are normally in lockstep. When
|
|
24
|
+
they are not, the highest version wins and the log line says so.
|
|
25
|
+
- `@smartsoft001/core` is resolved first, and is itself part of the Angular and the NestJS stack.
|
|
26
|
+
A project with the full core set plus `@smartsoft001/angular` ends up with `angular-stack` alone,
|
|
27
|
+
because that stack already pins `core`.
|
|
28
|
+
- An entry for a stack you already install is folded into the result rather than duplicated.
|
|
29
|
+
- The new entry keeps the position and the section of the first entry it replaces. If the section
|
|
30
|
+
was sorted alphabetically it stays sorted.
|
|
31
|
+
- Every replacement is logged, and one final line names the packages that stayed individually
|
|
32
|
+
installed.
|
|
33
|
+
|
|
34
|
+
## What it deliberately does not change
|
|
35
|
+
|
|
36
|
+
- **A single member of a stack.** Installing one library on purpose is a legitimate choice, so one
|
|
37
|
+
entry is never turned into a stack that would pull in the rest.
|
|
38
|
+
- **Packages no stack pins**: `@smartsoft001/fb`, `@smartsoft001/google` and
|
|
39
|
+
`@smartsoft001/claude-plugins` are left exactly as they are.
|
|
40
|
+
- **Members split across sections.** Each section is counted on its own, so one member in
|
|
41
|
+
`dependencies` and one in `devDependencies` is two lonely entries, not a stack.
|
|
42
|
+
- **Anything outside `package.json`.** Imports keep working because the stacks re-export nothing and
|
|
43
|
+
hide nothing: every library stays installed, just by way of the stack. Your lockfile is not
|
|
44
|
+
touched, so run your package manager's install afterwards.
|
|
45
|
+
|
|
46
|
+
Running the migration a second time changes nothing.
|
|
47
|
+
|
|
48
|
+
## How to undo it
|
|
49
|
+
|
|
50
|
+
The change is confined to `package.json`, so `git checkout -- package.json` before you install is
|
|
51
|
+
enough. If you have already installed, put the individual entries back at the version the stack
|
|
52
|
+
carried and install again. The stacks add no code of their own, so nothing else needs reverting.
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = update;
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
5
|
+
/**
|
|
6
|
+
* The meta packages and the packages each of them pins.
|
|
7
|
+
*
|
|
8
|
+
* This mirrors the `dependencies` block of every `package.json` under
|
|
9
|
+
* `packages/meta` and has to be kept in step with them by hand: a consumer's
|
|
10
|
+
* `node_modules` is not guaranteed to contain the meta packages, so the
|
|
11
|
+
* migration cannot read the lists at runtime.
|
|
12
|
+
*
|
|
13
|
+
* `@smartsoft001/core` comes first, and is itself a member of the Angular and
|
|
14
|
+
* the NestJS stack, so a project that pulls in the whole core set collapses to
|
|
15
|
+
* `core` and from there into the framework stack.
|
|
16
|
+
*/
|
|
17
|
+
const STACKS = {
|
|
18
|
+
'@smartsoft001/core': [
|
|
19
|
+
'@smartsoft001/models',
|
|
20
|
+
'@smartsoft001/domain-core',
|
|
21
|
+
'@smartsoft001/utils',
|
|
22
|
+
'@smartsoft001/users',
|
|
23
|
+
'@smartsoft001/auth-domain',
|
|
24
|
+
'@smartsoft001/crud-domain',
|
|
25
|
+
'@smartsoft001/crud-shell-dtos',
|
|
26
|
+
'@smartsoft001/auth-shell-dtos',
|
|
27
|
+
'@smartsoft001/crud-shell-app-services',
|
|
28
|
+
'@smartsoft001/auth-shell-app-services',
|
|
29
|
+
],
|
|
30
|
+
'@smartsoft001/angular-stack': [
|
|
31
|
+
'@smartsoft001/core',
|
|
32
|
+
'@smartsoft001/angular',
|
|
33
|
+
'@smartsoft001/crud-shell-angular',
|
|
34
|
+
],
|
|
35
|
+
'@smartsoft001/nestjs-stack': [
|
|
36
|
+
'@smartsoft001/core',
|
|
37
|
+
'@smartsoft001/nestjs',
|
|
38
|
+
'@smartsoft001/mongo',
|
|
39
|
+
'@smartsoft001/crud-shell-nestjs',
|
|
40
|
+
'@smartsoft001/auth-shell-nestjs',
|
|
41
|
+
],
|
|
42
|
+
'@smartsoft001/payments-stack': [
|
|
43
|
+
'@smartsoft001/trans-domain',
|
|
44
|
+
'@smartsoft001/trans-shell-app-services',
|
|
45
|
+
'@smartsoft001/trans-shell-nestjs',
|
|
46
|
+
'@smartsoft001/paypal',
|
|
47
|
+
'@smartsoft001/payu',
|
|
48
|
+
'@smartsoft001/paynow',
|
|
49
|
+
'@smartsoft001/revolut',
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
/** Every package a stack pins, the stacks themselves excluded. */
|
|
53
|
+
const MEMBERS = new Set(Object.values(STACKS)
|
|
54
|
+
.flat()
|
|
55
|
+
.filter((name) => !(name in STACKS)));
|
|
56
|
+
const SECTIONS = ['dependencies', 'devDependencies'];
|
|
57
|
+
/** Compares the numbers in two npm specifiers, so `^2.143.0` beats `2.140.0`. */
|
|
58
|
+
function compareVersions(a, b) {
|
|
59
|
+
const numbers = (value) => (value.match(/\d+/g) ?? []).map(Number);
|
|
60
|
+
const left = numbers(a);
|
|
61
|
+
const right = numbers(b);
|
|
62
|
+
for (let index = 0; index < Math.max(left.length, right.length); index++) {
|
|
63
|
+
const difference = (left[index] ?? 0) - (right[index] ?? 0);
|
|
64
|
+
if (difference !== 0) {
|
|
65
|
+
return difference;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
function highestVersion(versions) {
|
|
71
|
+
return versions.reduce((highest, version) => compareVersions(version, highest) > 0 ? version : highest);
|
|
72
|
+
}
|
|
73
|
+
function isSorted(names) {
|
|
74
|
+
return names.every((name, index) => index === 0 || names[index - 1] <= name);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Replaces every group of two or more members of one stack with the stack,
|
|
78
|
+
* in the position of the first entry it replaces.
|
|
79
|
+
*/
|
|
80
|
+
function collapse(deps) {
|
|
81
|
+
const keepSorted = isSorted(Object.keys(deps));
|
|
82
|
+
const replacements = [];
|
|
83
|
+
let entries = Object.entries(deps);
|
|
84
|
+
for (const [stack, members] of Object.entries(STACKS)) {
|
|
85
|
+
const present = entries.filter(([name]) => members.includes(name));
|
|
86
|
+
if (present.length < 2) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// An entry for the stack itself is folded in rather than left duplicated.
|
|
90
|
+
const replaces = ([name]) => members.includes(name) || name === stack;
|
|
91
|
+
const versions = entries.filter(replaces).map(([, version]) => version);
|
|
92
|
+
const version = highestVersion(versions);
|
|
93
|
+
replacements.push({
|
|
94
|
+
stack,
|
|
95
|
+
version,
|
|
96
|
+
versions,
|
|
97
|
+
replaced: present.map(([name]) => name),
|
|
98
|
+
});
|
|
99
|
+
const next = [];
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (!replaces(entry)) {
|
|
102
|
+
next.push(entry);
|
|
103
|
+
}
|
|
104
|
+
else if (next.every(([name]) => name !== stack)) {
|
|
105
|
+
next.push([stack, version]);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
entries = next;
|
|
109
|
+
}
|
|
110
|
+
if (keepSorted) {
|
|
111
|
+
entries.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
112
|
+
}
|
|
113
|
+
return { deps: Object.fromEntries(entries), replacements };
|
|
114
|
+
}
|
|
115
|
+
function describeReplacement(section, replacement) {
|
|
116
|
+
const { stack, version, versions, replaced } = replacement;
|
|
117
|
+
const disagreed = versions.some((other) => other !== versions[0])
|
|
118
|
+
? `, versions differed (${versions.join(', ')}), kept the highest`
|
|
119
|
+
: '';
|
|
120
|
+
return `${section}: ${replaced.join(', ')} -> ${stack}@${version}${disagreed}`;
|
|
121
|
+
}
|
|
122
|
+
async function update(tree) {
|
|
123
|
+
const leftovers = [];
|
|
124
|
+
(0, devkit_1.updateJson)(tree, 'package.json', (json) => {
|
|
125
|
+
for (const section of SECTIONS) {
|
|
126
|
+
const current = json[section];
|
|
127
|
+
if (!current) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const { deps, replacements } = collapse(current);
|
|
131
|
+
json[section] = deps;
|
|
132
|
+
for (const replacement of replacements) {
|
|
133
|
+
devkit_1.logger.info(describeReplacement(section, replacement));
|
|
134
|
+
}
|
|
135
|
+
for (const name of Object.keys(deps)) {
|
|
136
|
+
if (MEMBERS.has(name) && !leftovers.includes(name)) {
|
|
137
|
+
leftovers.push(name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return json;
|
|
142
|
+
});
|
|
143
|
+
if (leftovers.length > 0) {
|
|
144
|
+
devkit_1.logger.info(`Still installed individually: ${leftovers.join(', ')}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=use-stack-packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-stack-packages.js","sourceRoot":"","sources":["../../../../../../../packages/meta/core/src/migrations/use-stack-packages/use-stack-packages.ts"],"names":[],"mappings":"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"}
|