@neurodevs/meta-node 0.16.2 → 0.17.1
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/build/__tests__/AbstractPackageTest.d.ts +1 -1
- package/build/__tests__/AbstractPackageTest.js +1 -1
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/NpmPropagationCoordinator.test.d.ts +1 -0
- package/build/__tests__/impl/NpmPropagationCoordinator.test.js +26 -4
- package/build/__tests__/impl/NpmPropagationCoordinator.test.js.map +1 -1
- package/build/__tests__/impl/NpmReleasePropagator.test.d.ts +2 -1
- package/build/__tests__/impl/NpmReleasePropagator.test.js +30 -13
- package/build/__tests__/impl/NpmReleasePropagator.test.js.map +1 -1
- package/build/impl/NpmPropagationCoordinator.d.ts +8 -5
- package/build/impl/NpmPropagationCoordinator.js +17 -9
- package/build/impl/NpmPropagationCoordinator.js.map +1 -1
- package/build/impl/NpmReleasePropagator.d.ts +2 -0
- package/build/impl/NpmReleasePropagator.js +24 -0
- package/build/impl/NpmReleasePropagator.js.map +1 -1
- package/build/testDoubles/PropagationCoordinator/FakePropagationCoordinator.js.map +1 -1
- package/package.json +4 -2
- package/src/__tests__/AbstractPackageTest.ts +1 -1
- package/src/__tests__/impl/NpmPropagationCoordinator.test.ts +39 -4
- package/src/__tests__/impl/NpmReleasePropagator.test.ts +37 -15
- package/src/impl/NpmPropagationCoordinator.ts +41 -12
- package/src/impl/NpmReleasePropagator.ts +31 -0
- package/src/testDoubles/PropagationCoordinator/FakePropagationCoordinator.ts +3 -1
|
@@ -4,7 +4,7 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
4
4
|
protected static readonly packageScope: string;
|
|
5
5
|
protected static readonly packageName: string;
|
|
6
6
|
protected static readonly scopedName: string;
|
|
7
|
-
protected static readonly packageVersion = "
|
|
7
|
+
protected static readonly packageVersion = "2.2.0";
|
|
8
8
|
protected static readonly yarnGlobalDirCmd = "yarn global dir";
|
|
9
9
|
protected static readonly fakeGlobalRoot: string;
|
|
10
10
|
protected static readonly metaNodeVersion: string;
|
|
@@ -6,7 +6,7 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
6
6
|
static packageScope = this.generateId();
|
|
7
7
|
static packageName = this.generateId();
|
|
8
8
|
static scopedName = `${this.packageScope}/${this.packageName}`;
|
|
9
|
-
static packageVersion = '
|
|
9
|
+
static packageVersion = '2.2.0'; // Dummy value in tests to handle necessary cases
|
|
10
10
|
static yarnGlobalDirCmd = 'yarn global dir';
|
|
11
11
|
static fakeGlobalRoot = this.generateId();
|
|
12
12
|
static metaNodeVersion = this.generateId();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EACH,iBAAiB,EACjB,qBAAqB,GACxB,MAAM,2BAA2B,CAAA;AAClC,OAAO,kBAAkB,MAAM,qBAAqB,CAAA;AAEpD,OAAO,aAAa,MAAM,+BAA+B,CAAA;AAGzD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,kBAAkB;IACrD,MAAM,CAAU,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAChD,MAAM,CAAU,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAC/C,MAAM,CAAU,UAAU,GAAG,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,EAAE,CAAA;IACvE,MAAM,CAAU,cAAc,GAAG,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
7
7
|
protected static beforeEach(): Promise<void>;
|
|
8
8
|
protected static createsInstance(): Promise<void>;
|
|
9
9
|
protected static propagatesToCorrectRepoPaths(): Promise<void>;
|
|
10
|
+
protected static propagatesMajorsIfPassedOptionalParameter(): Promise<void>;
|
|
10
11
|
private static run;
|
|
11
12
|
private static setFakeReadFile;
|
|
12
13
|
private static setFakeReleasePropagator;
|
|
@@ -17,14 +17,18 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
17
17
|
this.generateId(),
|
|
18
18
|
this.generateId(),
|
|
19
19
|
this.generateId(),
|
|
20
|
+
this.generateId(),
|
|
20
21
|
this.repoPath,
|
|
21
22
|
];
|
|
22
23
|
static pkgJsons = [
|
|
23
24
|
this.generatePackageJson({
|
|
24
|
-
dependencies: { [this.scopedName]: '^
|
|
25
|
+
dependencies: { [this.scopedName]: '^2.0.1' },
|
|
26
|
+
}),
|
|
27
|
+
this.generatePackageJson({
|
|
28
|
+
devDependencies: { [this.scopedName]: '^2.1.0' },
|
|
25
29
|
}),
|
|
26
30
|
this.generatePackageJson({
|
|
27
|
-
|
|
31
|
+
dependencies: { [this.scopedName]: '^1.0.0' },
|
|
28
32
|
}),
|
|
29
33
|
this.generatePackageJson(),
|
|
30
34
|
this.generatePackageJson({ version: this.packageVersion }),
|
|
@@ -46,6 +50,21 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
46
50
|
repoPaths: [this.repoPaths[0], this.repoPaths[1]],
|
|
47
51
|
}, 'Incorrect repo paths propagated to!');
|
|
48
52
|
}
|
|
53
|
+
static async propagatesMajorsIfPassedOptionalParameter() {
|
|
54
|
+
const instance = this.NpmPropagationCoordinator({
|
|
55
|
+
shouldPropagateMajors: true,
|
|
56
|
+
});
|
|
57
|
+
await instance.run();
|
|
58
|
+
assert.isEqualDeep(FakeReleasePropagator.callsToConstructor[0], {
|
|
59
|
+
packageName: this.scopedName,
|
|
60
|
+
packageVersion: this.packageVersion,
|
|
61
|
+
repoPaths: [
|
|
62
|
+
this.repoPaths[0],
|
|
63
|
+
this.repoPaths[1],
|
|
64
|
+
this.repoPaths[2],
|
|
65
|
+
],
|
|
66
|
+
}, 'Did not propagate majors!');
|
|
67
|
+
}
|
|
49
68
|
static async run() {
|
|
50
69
|
await this.instance.run();
|
|
51
70
|
}
|
|
@@ -61,8 +80,8 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
61
80
|
NpmReleasePropagator.Class = FakeReleasePropagator;
|
|
62
81
|
FakeReleasePropagator.resetTestDouble();
|
|
63
82
|
}
|
|
64
|
-
static NpmPropagationCoordinator() {
|
|
65
|
-
return NpmPropagationCoordinator.Create(this.repoPath, this.repoPaths);
|
|
83
|
+
static NpmPropagationCoordinator(options) {
|
|
84
|
+
return NpmPropagationCoordinator.Create(this.repoPath, this.repoPaths, options);
|
|
66
85
|
}
|
|
67
86
|
}
|
|
68
87
|
__decorate([
|
|
@@ -71,4 +90,7 @@ __decorate([
|
|
|
71
90
|
__decorate([
|
|
72
91
|
test()
|
|
73
92
|
], NpmPropagationCoordinatorTest, "propagatesToCorrectRepoPaths", null);
|
|
93
|
+
__decorate([
|
|
94
|
+
test()
|
|
95
|
+
], NpmPropagationCoordinatorTest, "propagatesMajorsIfPassedOptionalParameter", null);
|
|
74
96
|
//# sourceMappingURL=NpmPropagationCoordinator.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NpmPropagationCoordinator.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/NpmPropagationCoordinator.test.ts"],"names":[],"mappings":";;;;;;AAEA,OAAO,EACH,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,GACxB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,
|
|
1
|
+
{"version":3,"file":"NpmPropagationCoordinator.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/NpmPropagationCoordinator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,9 @@ export default class NpmReleasePropagatorTest extends AbstractPackageTest {
|
|
|
5
5
|
protected static beforeEach(): Promise<void>;
|
|
6
6
|
protected static createsInstance(): Promise<void>;
|
|
7
7
|
protected static runInstallsReleaseForEachRepoPath(): Promise<void>;
|
|
8
|
-
protected static runThrowsIfRepoDoesNotHavePreviousRelease(): Promise<void>;
|
|
9
8
|
protected static commitsChangesToGit(): Promise<void>;
|
|
9
|
+
protected static throwsIfRepoDoesNotHavePreviousRelease(): Promise<void>;
|
|
10
|
+
protected static throwsIfGitHasUncommittedChanges(): Promise<void>;
|
|
10
11
|
private static run;
|
|
11
12
|
private static setFakeExec;
|
|
12
13
|
private static setFakeReadFile;
|
|
@@ -6,7 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { exec as execSync } from 'node:child_process';
|
|
8
8
|
import { promisify } from 'node:util';
|
|
9
|
-
import { callsToExec, fakeExec, fakeReadFile, resetCallsToExec, resetCallsToReadFile, setFakeReadFileResult, } from '@neurodevs/fake-node-core';
|
|
9
|
+
import { callsToExec, fakeExec, fakeReadFile, resetCallsToExec, resetCallsToReadFile, setFakeExecResult, setFakeReadFileResult, } from '@neurodevs/fake-node-core';
|
|
10
10
|
import { test, assert } from '@neurodevs/node-tdd';
|
|
11
11
|
import GitAutocommit from '../../impl/GitAutocommit.js';
|
|
12
12
|
import NpmReleasePropagator from '../../impl/NpmReleasePropagator.js';
|
|
@@ -38,16 +38,7 @@ export default class NpmReleasePropagatorTest extends AbstractPackageTest {
|
|
|
38
38
|
options: { cwd: this.repoPaths[1] },
|
|
39
39
|
},
|
|
40
40
|
];
|
|
41
|
-
assert.isEqualDeep([callsToExec[
|
|
42
|
-
}
|
|
43
|
-
static async runThrowsIfRepoDoesNotHavePreviousRelease() {
|
|
44
|
-
const missingPackageName = this.generateId();
|
|
45
|
-
this.instance = this.NpmReleasePropagator({
|
|
46
|
-
packageName: missingPackageName,
|
|
47
|
-
});
|
|
48
|
-
await assert.doesThrowAsync(async () => {
|
|
49
|
-
await this.run();
|
|
50
|
-
}, `Cannot propagate release for ${missingPackageName} because it is not listed in either dependencies or devDependencies! Please install it in the target repository before running propagation.`);
|
|
41
|
+
assert.isEqualDeep([callsToExec[2], callsToExec[4]], expectedCalls, 'Did not install release in each repo path!');
|
|
51
42
|
}
|
|
52
43
|
static async commitsChangesToGit() {
|
|
53
44
|
await this.run();
|
|
@@ -62,6 +53,29 @@ export default class NpmReleasePropagatorTest extends AbstractPackageTest {
|
|
|
62
53
|
},
|
|
63
54
|
], 'Did not commit changes to git for each repo path!');
|
|
64
55
|
}
|
|
56
|
+
static async throwsIfRepoDoesNotHavePreviousRelease() {
|
|
57
|
+
const missingPackageName = this.generateId();
|
|
58
|
+
this.instance = this.NpmReleasePropagator({
|
|
59
|
+
packageName: missingPackageName,
|
|
60
|
+
});
|
|
61
|
+
await assert.doesThrowAsync(async () => {
|
|
62
|
+
await this.run();
|
|
63
|
+
}, `Cannot propagate release for ${missingPackageName} because it is not listed in either dependencies or devDependencies! Please install it in the target repository before running propagation.`);
|
|
64
|
+
}
|
|
65
|
+
static async throwsIfGitHasUncommittedChanges() {
|
|
66
|
+
setFakeExecResult('git status --porcelain', {
|
|
67
|
+
stdout: 'M somefile.ts',
|
|
68
|
+
});
|
|
69
|
+
await assert.doesThrowAsync(async () => {
|
|
70
|
+
await this.run();
|
|
71
|
+
}, `Cannot propagate release because there are uncommitted git changes in the following repositories:
|
|
72
|
+
|
|
73
|
+
\t - ${this.repoPaths[0]}
|
|
74
|
+
\t - ${this.repoPaths[1]}
|
|
75
|
+
|
|
76
|
+
Please commit or stash these changes before running propagation!
|
|
77
|
+
`);
|
|
78
|
+
}
|
|
65
79
|
static async run() {
|
|
66
80
|
await this.instance.run();
|
|
67
81
|
}
|
|
@@ -106,8 +120,11 @@ __decorate([
|
|
|
106
120
|
], NpmReleasePropagatorTest, "runInstallsReleaseForEachRepoPath", null);
|
|
107
121
|
__decorate([
|
|
108
122
|
test()
|
|
109
|
-
], NpmReleasePropagatorTest, "
|
|
123
|
+
], NpmReleasePropagatorTest, "commitsChangesToGit", null);
|
|
124
|
+
__decorate([
|
|
125
|
+
test()
|
|
126
|
+
], NpmReleasePropagatorTest, "throwsIfRepoDoesNotHavePreviousRelease", null);
|
|
110
127
|
__decorate([
|
|
111
128
|
test()
|
|
112
|
-
], NpmReleasePropagatorTest, "
|
|
129
|
+
], NpmReleasePropagatorTest, "throwsIfGitHasUncommittedChanges", null);
|
|
113
130
|
//# sourceMappingURL=NpmReleasePropagator.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NpmReleasePropagator.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/NpmReleasePropagator.test.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"NpmReleasePropagator.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/NpmReleasePropagator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,18 +4,18 @@ export default class NpmPropagationCoordinator implements PropagationCoordinator
|
|
|
4
4
|
static readFile: typeof readFile;
|
|
5
5
|
private repoPath;
|
|
6
6
|
private repoPaths;
|
|
7
|
+
private shouldPropagateMajors;
|
|
7
8
|
private pkg;
|
|
8
9
|
private currentRepoPath;
|
|
9
10
|
private currentPkgJson;
|
|
10
|
-
protected constructor(repoPath: string, repoPaths: string[]);
|
|
11
|
-
static Create(repoPath: string, repoPaths: string[]): PropagationCoordinator;
|
|
11
|
+
protected constructor(repoPath: string, repoPaths: string[], options?: PropagationCoordinatorOptions);
|
|
12
|
+
static Create(repoPath: string, repoPaths: string[], options?: PropagationCoordinatorOptions): PropagationCoordinator;
|
|
12
13
|
run(): Promise<void>;
|
|
13
14
|
private loadPackageJson;
|
|
14
15
|
private get packageName();
|
|
15
16
|
private get packageVersion();
|
|
16
17
|
private determineWhereToPropagate;
|
|
17
|
-
private get
|
|
18
|
-
private get isDevDependency();
|
|
18
|
+
private get maybeDependencyRange();
|
|
19
19
|
private loadCurrentPkgJson;
|
|
20
20
|
private get readFile();
|
|
21
21
|
private NpmReleaseCoordinator;
|
|
@@ -23,4 +23,7 @@ export default class NpmPropagationCoordinator implements PropagationCoordinator
|
|
|
23
23
|
export interface PropagationCoordinator {
|
|
24
24
|
run(): Promise<void>;
|
|
25
25
|
}
|
|
26
|
-
export type PropagationCoordinatorConstructor = new (repoPath: string, repoPaths: string[]) => PropagationCoordinator;
|
|
26
|
+
export type PropagationCoordinatorConstructor = new (repoPath: string, repoPaths: string[], options?: PropagationCoordinatorOptions) => PropagationCoordinator;
|
|
27
|
+
export interface PropagationCoordinatorOptions {
|
|
28
|
+
shouldPropagateMajors?: boolean;
|
|
29
|
+
}
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import semver from 'semver';
|
|
2
3
|
import NpmReleasePropagator from './NpmReleasePropagator.js';
|
|
3
4
|
export default class NpmPropagationCoordinator {
|
|
4
5
|
static Class;
|
|
5
6
|
static readFile = readFile;
|
|
6
7
|
repoPath;
|
|
7
8
|
repoPaths;
|
|
9
|
+
shouldPropagateMajors;
|
|
8
10
|
pkg;
|
|
9
11
|
currentRepoPath;
|
|
10
12
|
currentPkgJson;
|
|
11
|
-
constructor(repoPath, repoPaths) {
|
|
13
|
+
constructor(repoPath, repoPaths, options) {
|
|
14
|
+
const { shouldPropagateMajors = false } = options ?? {};
|
|
12
15
|
this.repoPath = repoPath;
|
|
13
16
|
this.repoPaths = repoPaths;
|
|
17
|
+
this.shouldPropagateMajors = shouldPropagateMajors;
|
|
14
18
|
}
|
|
15
|
-
static Create(repoPath, repoPaths) {
|
|
16
|
-
return new (this.Class ?? this)(repoPath, repoPaths);
|
|
19
|
+
static Create(repoPath, repoPaths, options) {
|
|
20
|
+
return new (this.Class ?? this)(repoPath, repoPaths, options);
|
|
17
21
|
}
|
|
18
22
|
async run() {
|
|
19
23
|
await this.loadPackageJson();
|
|
@@ -37,20 +41,24 @@ export default class NpmPropagationCoordinator {
|
|
|
37
41
|
}
|
|
38
42
|
async determineWhereToPropagate() {
|
|
39
43
|
const repoPaths = [];
|
|
44
|
+
const target = semver.parse(this.packageVersion);
|
|
40
45
|
for (const repoPath of this.repoPaths) {
|
|
41
46
|
this.currentRepoPath = repoPath;
|
|
42
47
|
this.currentPkgJson = await this.loadCurrentPkgJson();
|
|
43
|
-
|
|
48
|
+
const min = semver.minVersion(this.maybeDependencyRange);
|
|
49
|
+
if (!min || min.toString() === '0.0.0') {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (this.shouldPropagateMajors || min?.major === target?.major) {
|
|
44
53
|
repoPaths.push(repoPath);
|
|
45
54
|
}
|
|
46
55
|
}
|
|
47
56
|
return repoPaths;
|
|
48
57
|
}
|
|
49
|
-
get
|
|
50
|
-
return this.currentPkgJson?.dependencies?.[this.packageName]
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return this.currentPkgJson?.devDependencies?.[this.packageName];
|
|
58
|
+
get maybeDependencyRange() {
|
|
59
|
+
return (this.currentPkgJson?.dependencies?.[this.packageName] ??
|
|
60
|
+
this.currentPkgJson?.devDependencies?.[this.packageName] ??
|
|
61
|
+
'');
|
|
54
62
|
}
|
|
55
63
|
async loadCurrentPkgJson() {
|
|
56
64
|
const pkgJson = await this.readFile(`${this.currentRepoPath}/package.json`, 'utf-8');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NpmPropagationCoordinator.js","sourceRoot":"","sources":["../../src/impl/NpmPropagationCoordinator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAE3C,OAAO,oBAGN,MAAM,2BAA2B,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,yBAAyB;
|
|
1
|
+
{"version":3,"file":"NpmPropagationCoordinator.js","sourceRoot":"","sources":["../../src/impl/NpmPropagationCoordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@ export default class NpmReleasePropagator implements ReleasePropagator {
|
|
|
13
13
|
protected constructor(options: ReleasePropagatorOptions);
|
|
14
14
|
static Create(options: ReleasePropagatorOptions): ReleasePropagator;
|
|
15
15
|
run(): Promise<void>;
|
|
16
|
+
private throwIfUncommittedGitChanges;
|
|
17
|
+
private generateUncommittedErrorFrom;
|
|
16
18
|
private throwIfPreviousReleaseNotFound;
|
|
17
19
|
private loadCurrentPackageJson;
|
|
18
20
|
private get currentPackageJsonPath();
|
|
@@ -23,6 +23,7 @@ export default class NpmReleasePropagator {
|
|
|
23
23
|
return new (this.Class ?? this)(options);
|
|
24
24
|
}
|
|
25
25
|
async run() {
|
|
26
|
+
await this.throwIfUncommittedGitChanges();
|
|
26
27
|
for (const repoPath of this.repoPaths) {
|
|
27
28
|
console.log(`Propagating to ${repoPath}...`);
|
|
28
29
|
this.currentRepoPath = repoPath;
|
|
@@ -31,6 +32,29 @@ export default class NpmReleasePropagator {
|
|
|
31
32
|
await this.gitCommitChanges();
|
|
32
33
|
}
|
|
33
34
|
}
|
|
35
|
+
async throwIfUncommittedGitChanges() {
|
|
36
|
+
const repoPathsWithChanges = [];
|
|
37
|
+
for (const repoPath of this.repoPaths) {
|
|
38
|
+
const changes = await this.exec('git status --porcelain', {
|
|
39
|
+
cwd: repoPath,
|
|
40
|
+
});
|
|
41
|
+
if (changes.stdout.trim().length > 0) {
|
|
42
|
+
repoPathsWithChanges.push(repoPath);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (repoPathsWithChanges.length > 0) {
|
|
46
|
+
const err = this.generateUncommittedErrorFrom(repoPathsWithChanges);
|
|
47
|
+
throw new Error(err);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
generateUncommittedErrorFrom(repoPathsWithChanges) {
|
|
51
|
+
return `Cannot propagate release because there are uncommitted git changes in the following repositor${repoPathsWithChanges.length > 1 ? 'ies' : 'y'}:
|
|
52
|
+
|
|
53
|
+
\t - ${repoPathsWithChanges.join('\n\t - ')}
|
|
54
|
+
|
|
55
|
+
Please commit or stash these changes before running propagation!
|
|
56
|
+
`;
|
|
57
|
+
}
|
|
34
58
|
async throwIfPreviousReleaseNotFound() {
|
|
35
59
|
await this.loadCurrentPackageJson();
|
|
36
60
|
if (!(this.isDependency || this.isDevDependency)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NpmReleasePropagator.js","sourceRoot":"","sources":["../../src/impl/NpmReleasePropagator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,aAAa,MAAM,oBAAoB,CAAA;AAE9C,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAC9B,MAAM,CAAC,KAAK,CAA+B;IAC3C,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;IACjC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAEzB,WAAW,CAAQ;IACnB,cAAc,CAAQ;IACtB,SAAS,CAAU;IAEnB,eAAe,CAAS;IACxB,kBAAkB,CAAc;IAChC,eAAe,CAAS;IAEhC,YAAsB,OAAiC;QACnD,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,OAAO,CAAA;QAE1D,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;QACpC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC9B,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,OAAiC;QAClD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;IAEM,KAAK,CAAC,GAAG;QACZ,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,kBAAkB,QAAQ,KAAK,CAAC,CAAA;YAC5C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAA;YAE/B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"NpmReleasePropagator.js","sourceRoot":"","sources":["../../src/impl/NpmReleasePropagator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FakePropagationCoordinator.js","sourceRoot":"","sources":["../../../src/testDoubles/PropagationCoordinator/FakePropagationCoordinator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,0BAA0B;
|
|
1
|
+
{"version":3,"file":"FakePropagationCoordinator.js","sourceRoot":"","sources":["../../../src/testDoubles/PropagationCoordinator/FakePropagationCoordinator.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAGpC,MAAM,CAAC,kBAAkB,GAG1B,EAAE,CAAA;IAED,MAAM,CAAC,aAAa,GAAG,CAAC,CAAA;IAE/B,YAAmB,QAAiB,EAAE,SAAoB;QACtD,0BAA0B,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC/C,QAAQ;YACR,SAAS;SACZ,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,GAAG;QACZ,0BAA0B,CAAC,aAAa,IAAI,CAAC,CAAA;IACjD,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,0BAA0B,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAClD,0BAA0B,CAAC,aAAa,GAAG,CAAC,CAAA;IAChD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurodevs/meta-node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.1",
|
|
4
4
|
"description": "Meta-layer utilities for maintaining Node.js package ecosystems.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -50,7 +50,8 @@
|
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"fs-extra": "^11.3.2",
|
|
53
|
-
"jsonc-parser": "^3.3.1"
|
|
53
|
+
"jsonc-parser": "^3.3.1",
|
|
54
|
+
"semver": "^7.7.3"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
57
|
"@neurodevs/fake-node-core": "^0.7.3",
|
|
@@ -59,6 +60,7 @@
|
|
|
59
60
|
"@types/fs-extra": "^11.0.4",
|
|
60
61
|
"@types/node": "^24.6.2",
|
|
61
62
|
"@types/node-fetch": "^2.6.13",
|
|
63
|
+
"@types/semver": "^7.7.1",
|
|
62
64
|
"chokidar-cli": "^3.0.0",
|
|
63
65
|
"eslint": "^9.37.0",
|
|
64
66
|
"eslint-config-spruce": "^11.2.26",
|
|
@@ -13,7 +13,7 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
13
13
|
protected static readonly packageScope = this.generateId()
|
|
14
14
|
protected static readonly packageName = this.generateId()
|
|
15
15
|
protected static readonly scopedName = `${this.packageScope}/${this.packageName}`
|
|
16
|
-
protected static readonly packageVersion = '
|
|
16
|
+
protected static readonly packageVersion = '2.2.0' // Dummy value in tests to handle necessary cases
|
|
17
17
|
|
|
18
18
|
protected static readonly yarnGlobalDirCmd = 'yarn global dir'
|
|
19
19
|
protected static readonly fakeGlobalRoot = this.generateId()
|
|
@@ -9,9 +9,11 @@ import { test, assert } from '@neurodevs/node-tdd'
|
|
|
9
9
|
|
|
10
10
|
import NpmPropagationCoordinator, {
|
|
11
11
|
PropagationCoordinator,
|
|
12
|
+
PropagationCoordinatorOptions,
|
|
12
13
|
} from '../../impl/NpmPropagationCoordinator.js'
|
|
13
14
|
import NpmReleasePropagator from '../../impl/NpmReleasePropagator.js'
|
|
14
15
|
import FakeReleasePropagator from '../../testDoubles/ReleasePropagator/FakeReleasePropagator.js'
|
|
16
|
+
|
|
15
17
|
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
16
18
|
|
|
17
19
|
export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
@@ -23,15 +25,19 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
23
25
|
this.generateId(),
|
|
24
26
|
this.generateId(),
|
|
25
27
|
this.generateId(),
|
|
28
|
+
this.generateId(),
|
|
26
29
|
this.repoPath,
|
|
27
30
|
]
|
|
28
31
|
|
|
29
32
|
private static readonly pkgJsons = [
|
|
30
33
|
this.generatePackageJson({
|
|
31
|
-
dependencies: { [this.scopedName]: '^
|
|
34
|
+
dependencies: { [this.scopedName]: '^2.0.1' },
|
|
32
35
|
}),
|
|
33
36
|
this.generatePackageJson({
|
|
34
|
-
devDependencies: { [this.scopedName]: '^
|
|
37
|
+
devDependencies: { [this.scopedName]: '^2.1.0' },
|
|
38
|
+
}),
|
|
39
|
+
this.generatePackageJson({
|
|
40
|
+
dependencies: { [this.scopedName]: '^1.0.0' },
|
|
35
41
|
}),
|
|
36
42
|
this.generatePackageJson(),
|
|
37
43
|
this.generatePackageJson({ version: this.packageVersion }),
|
|
@@ -66,6 +72,29 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
66
72
|
)
|
|
67
73
|
}
|
|
68
74
|
|
|
75
|
+
@test()
|
|
76
|
+
protected static async propagatesMajorsIfPassedOptionalParameter() {
|
|
77
|
+
const instance = this.NpmPropagationCoordinator({
|
|
78
|
+
shouldPropagateMajors: true,
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
await instance.run()
|
|
82
|
+
|
|
83
|
+
assert.isEqualDeep(
|
|
84
|
+
FakeReleasePropagator.callsToConstructor[0],
|
|
85
|
+
{
|
|
86
|
+
packageName: this.scopedName,
|
|
87
|
+
packageVersion: this.packageVersion,
|
|
88
|
+
repoPaths: [
|
|
89
|
+
this.repoPaths[0],
|
|
90
|
+
this.repoPaths[1],
|
|
91
|
+
this.repoPaths[2],
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
'Did not propagate majors!'
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
69
98
|
private static async run() {
|
|
70
99
|
await this.instance.run()
|
|
71
100
|
}
|
|
@@ -88,7 +117,13 @@ export default class NpmPropagationCoordinatorTest extends AbstractPackageTest {
|
|
|
88
117
|
FakeReleasePropagator.resetTestDouble()
|
|
89
118
|
}
|
|
90
119
|
|
|
91
|
-
private static NpmPropagationCoordinator(
|
|
92
|
-
|
|
120
|
+
private static NpmPropagationCoordinator(
|
|
121
|
+
options?: PropagationCoordinatorOptions
|
|
122
|
+
) {
|
|
123
|
+
return NpmPropagationCoordinator.Create(
|
|
124
|
+
this.repoPath,
|
|
125
|
+
this.repoPaths,
|
|
126
|
+
options
|
|
127
|
+
)
|
|
93
128
|
}
|
|
94
129
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { exec as execSync } from 'node:child_process'
|
|
1
|
+
import { ChildProcess, exec as execSync } from 'node:child_process'
|
|
2
2
|
import { readFile } from 'node:fs/promises'
|
|
3
|
+
import { Readable } from 'node:stream'
|
|
3
4
|
import { promisify } from 'node:util'
|
|
4
5
|
import {
|
|
5
6
|
callsToExec,
|
|
@@ -7,6 +8,7 @@ import {
|
|
|
7
8
|
fakeReadFile,
|
|
8
9
|
resetCallsToExec,
|
|
9
10
|
resetCallsToReadFile,
|
|
11
|
+
setFakeExecResult,
|
|
10
12
|
setFakeReadFileResult,
|
|
11
13
|
} from '@neurodevs/fake-node-core'
|
|
12
14
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
@@ -57,25 +59,12 @@ export default class NpmReleasePropagatorTest extends AbstractPackageTest {
|
|
|
57
59
|
]
|
|
58
60
|
|
|
59
61
|
assert.isEqualDeep(
|
|
60
|
-
[callsToExec[
|
|
62
|
+
[callsToExec[2], callsToExec[4]],
|
|
61
63
|
expectedCalls,
|
|
62
64
|
'Did not install release in each repo path!'
|
|
63
65
|
)
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
@test()
|
|
67
|
-
protected static async runThrowsIfRepoDoesNotHavePreviousRelease() {
|
|
68
|
-
const missingPackageName = this.generateId()
|
|
69
|
-
|
|
70
|
-
this.instance = this.NpmReleasePropagator({
|
|
71
|
-
packageName: missingPackageName,
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
await assert.doesThrowAsync(async () => {
|
|
75
|
-
await this.run()
|
|
76
|
-
}, `Cannot propagate release for ${missingPackageName} because it is not listed in either dependencies or devDependencies! Please install it in the target repository before running propagation.`)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
68
|
@test()
|
|
80
69
|
protected static async commitsChangesToGit() {
|
|
81
70
|
await this.run()
|
|
@@ -96,6 +85,39 @@ export default class NpmReleasePropagatorTest extends AbstractPackageTest {
|
|
|
96
85
|
)
|
|
97
86
|
}
|
|
98
87
|
|
|
88
|
+
@test()
|
|
89
|
+
protected static async throwsIfRepoDoesNotHavePreviousRelease() {
|
|
90
|
+
const missingPackageName = this.generateId()
|
|
91
|
+
|
|
92
|
+
this.instance = this.NpmReleasePropagator({
|
|
93
|
+
packageName: missingPackageName,
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
await assert.doesThrowAsync(async () => {
|
|
97
|
+
await this.run()
|
|
98
|
+
}, `Cannot propagate release for ${missingPackageName} because it is not listed in either dependencies or devDependencies! Please install it in the target repository before running propagation.`)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@test()
|
|
102
|
+
protected static async throwsIfGitHasUncommittedChanges() {
|
|
103
|
+
setFakeExecResult('git status --porcelain', {
|
|
104
|
+
stdout: 'M somefile.ts' as unknown as Readable,
|
|
105
|
+
} as ChildProcess)
|
|
106
|
+
|
|
107
|
+
await assert.doesThrowAsync(
|
|
108
|
+
async () => {
|
|
109
|
+
await this.run()
|
|
110
|
+
},
|
|
111
|
+
`Cannot propagate release because there are uncommitted git changes in the following repositories:
|
|
112
|
+
|
|
113
|
+
\t - ${this.repoPaths[0]}
|
|
114
|
+
\t - ${this.repoPaths[1]}
|
|
115
|
+
|
|
116
|
+
Please commit or stash these changes before running propagation!
|
|
117
|
+
`
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
|
|
99
121
|
private static async run() {
|
|
100
122
|
await this.instance.run()
|
|
101
123
|
}
|
|
@@ -1,28 +1,44 @@
|
|
|
1
1
|
import { readFile } from 'node:fs/promises'
|
|
2
2
|
|
|
3
|
+
import semver from 'semver'
|
|
4
|
+
|
|
3
5
|
import NpmReleasePropagator, {
|
|
4
6
|
PackageJson,
|
|
5
7
|
ReleasePropagatorOptions,
|
|
6
8
|
} from './NpmReleasePropagator.js'
|
|
7
9
|
|
|
8
|
-
export default class NpmPropagationCoordinator
|
|
10
|
+
export default class NpmPropagationCoordinator
|
|
11
|
+
implements PropagationCoordinator
|
|
12
|
+
{
|
|
9
13
|
public static Class?: PropagationCoordinatorConstructor
|
|
10
14
|
public static readFile = readFile
|
|
11
15
|
|
|
12
16
|
private repoPath: string
|
|
13
17
|
private repoPaths: string[]
|
|
18
|
+
private shouldPropagateMajors: boolean
|
|
14
19
|
|
|
15
20
|
private pkg!: PackageJson
|
|
16
21
|
private currentRepoPath!: string
|
|
17
22
|
private currentPkgJson!: PackageJson
|
|
18
23
|
|
|
19
|
-
protected constructor(
|
|
24
|
+
protected constructor(
|
|
25
|
+
repoPath: string,
|
|
26
|
+
repoPaths: string[],
|
|
27
|
+
options?: PropagationCoordinatorOptions
|
|
28
|
+
) {
|
|
29
|
+
const { shouldPropagateMajors = false } = options ?? {}
|
|
30
|
+
|
|
20
31
|
this.repoPath = repoPath
|
|
21
32
|
this.repoPaths = repoPaths
|
|
33
|
+
this.shouldPropagateMajors = shouldPropagateMajors
|
|
22
34
|
}
|
|
23
35
|
|
|
24
|
-
public static Create(
|
|
25
|
-
|
|
36
|
+
public static Create(
|
|
37
|
+
repoPath: string,
|
|
38
|
+
repoPaths: string[],
|
|
39
|
+
options?: PropagationCoordinatorOptions
|
|
40
|
+
) {
|
|
41
|
+
return new (this.Class ?? this)(repoPath, repoPaths, options)
|
|
26
42
|
}
|
|
27
43
|
|
|
28
44
|
public async run() {
|
|
@@ -58,23 +74,31 @@ export default class NpmPropagationCoordinator implements PropagationCoordinator
|
|
|
58
74
|
private async determineWhereToPropagate() {
|
|
59
75
|
const repoPaths: string[] = []
|
|
60
76
|
|
|
77
|
+
const target = semver.parse(this.packageVersion)
|
|
78
|
+
|
|
61
79
|
for (const repoPath of this.repoPaths) {
|
|
62
80
|
this.currentRepoPath = repoPath
|
|
63
81
|
this.currentPkgJson = await this.loadCurrentPkgJson()
|
|
64
82
|
|
|
65
|
-
|
|
83
|
+
const min = semver.minVersion(this.maybeDependencyRange)
|
|
84
|
+
|
|
85
|
+
if (!min || min.toString() === '0.0.0') {
|
|
86
|
+
continue
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (this.shouldPropagateMajors || min?.major === target?.major) {
|
|
66
90
|
repoPaths.push(repoPath)
|
|
67
91
|
}
|
|
68
92
|
}
|
|
69
93
|
return repoPaths
|
|
70
94
|
}
|
|
71
95
|
|
|
72
|
-
private get
|
|
73
|
-
return
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
96
|
+
private get maybeDependencyRange() {
|
|
97
|
+
return (
|
|
98
|
+
this.currentPkgJson?.dependencies?.[this.packageName] ??
|
|
99
|
+
this.currentPkgJson?.devDependencies?.[this.packageName] ??
|
|
100
|
+
''
|
|
101
|
+
)
|
|
78
102
|
}
|
|
79
103
|
|
|
80
104
|
private async loadCurrentPkgJson() {
|
|
@@ -100,5 +124,10 @@ export interface PropagationCoordinator {
|
|
|
100
124
|
|
|
101
125
|
export type PropagationCoordinatorConstructor = new (
|
|
102
126
|
repoPath: string,
|
|
103
|
-
repoPaths: string[]
|
|
127
|
+
repoPaths: string[],
|
|
128
|
+
options?: PropagationCoordinatorOptions
|
|
104
129
|
) => PropagationCoordinator
|
|
130
|
+
|
|
131
|
+
export interface PropagationCoordinatorOptions {
|
|
132
|
+
shouldPropagateMajors?: boolean
|
|
133
|
+
}
|
|
@@ -31,16 +31,47 @@ export default class NpmReleasePropagator implements ReleasePropagator {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
public async run() {
|
|
34
|
+
await this.throwIfUncommittedGitChanges()
|
|
35
|
+
|
|
34
36
|
for (const repoPath of this.repoPaths) {
|
|
35
37
|
console.log(`Propagating to ${repoPath}...`)
|
|
36
38
|
this.currentRepoPath = repoPath
|
|
37
39
|
|
|
38
40
|
await this.throwIfPreviousReleaseNotFound()
|
|
41
|
+
|
|
39
42
|
await this.installReleaseForCurrentRepo()
|
|
40
43
|
await this.gitCommitChanges()
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
|
|
47
|
+
private async throwIfUncommittedGitChanges() {
|
|
48
|
+
const repoPathsWithChanges: string[] = []
|
|
49
|
+
|
|
50
|
+
for (const repoPath of this.repoPaths) {
|
|
51
|
+
const changes = await this.exec('git status --porcelain', {
|
|
52
|
+
cwd: repoPath,
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
if (changes.stdout.trim().length > 0) {
|
|
56
|
+
repoPathsWithChanges.push(repoPath)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (repoPathsWithChanges.length > 0) {
|
|
61
|
+
const err = this.generateUncommittedErrorFrom(repoPathsWithChanges)
|
|
62
|
+
throw new Error(err)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private generateUncommittedErrorFrom(repoPathsWithChanges: string[]) {
|
|
67
|
+
return `Cannot propagate release because there are uncommitted git changes in the following repositor${repoPathsWithChanges.length > 1 ? 'ies' : 'y'}:
|
|
68
|
+
|
|
69
|
+
\t - ${repoPathsWithChanges.join('\n\t - ')}
|
|
70
|
+
|
|
71
|
+
Please commit or stash these changes before running propagation!
|
|
72
|
+
`
|
|
73
|
+
}
|
|
74
|
+
|
|
44
75
|
private async throwIfPreviousReleaseNotFound() {
|
|
45
76
|
await this.loadCurrentPackageJson()
|
|
46
77
|
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PropagationCoordinator } from '../../impl/NpmPropagationCoordinator.js'
|
|
2
2
|
|
|
3
|
-
export default class FakePropagationCoordinator
|
|
3
|
+
export default class FakePropagationCoordinator
|
|
4
|
+
implements PropagationCoordinator
|
|
5
|
+
{
|
|
4
6
|
public static callsToConstructor: {
|
|
5
7
|
repoPath?: string
|
|
6
8
|
repoPaths?: string[]
|