@neurodevs/meta-node 0.18.6 → 0.19.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 +3 -3
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/NpmWorkspaceTypeChecker.test.d.ts +15 -0
- package/build/__tests__/impl/NpmWorkspaceTypeChecker.test.js +69 -0
- package/build/__tests__/impl/NpmWorkspaceTypeChecker.test.js.map +1 -0
- package/build/impl/NpmWorkspaceTypeChecker.d.ts +17 -0
- package/build/impl/NpmWorkspaceTypeChecker.js +36 -0
- package/build/impl/NpmWorkspaceTypeChecker.js.map +1 -0
- package/build/index.d.ts +4 -0
- package/build/index.js +5 -0
- package/build/index.js.map +1 -1
- package/build/testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.d.ts +8 -0
- package/build/testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js +15 -0
- package/build/testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/AbstractPackageTest.ts +4 -4
- package/src/__tests__/impl/NpmWorkspaceTypeChecker.test.ts +90 -0
- package/src/impl/NpmWorkspaceTypeChecker.ts +50 -0
- package/src/index.ts +8 -0
- package/src/testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.ts +18 -0
|
@@ -35,7 +35,7 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
35
35
|
command: string;
|
|
36
36
|
}[];
|
|
37
37
|
protected static readonly originalKeybindingsFile: string;
|
|
38
|
-
protected static setFakeSnippetsFile(): void;
|
|
39
38
|
protected static setFakeKeybindingsFile(): void;
|
|
40
39
|
protected static setFakeMetaNodeVersion(): void;
|
|
40
|
+
protected static setFakeSnippetsFile(): void;
|
|
41
41
|
}
|
|
@@ -43,9 +43,6 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
43
43
|
};
|
|
44
44
|
static originalKeybindings = [this.originalKeybinding];
|
|
45
45
|
static originalKeybindingsFile = JSON.stringify(this.originalKeybindings, null, 4);
|
|
46
|
-
static setFakeSnippetsFile() {
|
|
47
|
-
setFakeReadFileResult(this.snippetsPath, this.originalSnippetsFile);
|
|
48
|
-
}
|
|
49
46
|
static setFakeKeybindingsFile() {
|
|
50
47
|
setFakeReadFileResult(this.keybindingsPath, this.originalKeybindingsFile);
|
|
51
48
|
}
|
|
@@ -55,5 +52,8 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
55
52
|
});
|
|
56
53
|
setFakeReadFileResult(path.join(this.fakeGlobalRoot, 'node_modules', '@neurodevs', 'meta-node', 'package.json'), JSON.stringify({ version: this.metaNodeVersion }));
|
|
57
54
|
}
|
|
55
|
+
static setFakeSnippetsFile() {
|
|
56
|
+
setFakeReadFileResult(this.snippetsPath, this.originalSnippetsFile);
|
|
57
|
+
}
|
|
58
58
|
}
|
|
59
59
|
//# sourceMappingURL=AbstractPackageTest.js.map
|
|
@@ -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,CAAC,iDAAiD;IAE1F,MAAM,CAAU,gBAAgB,GAAG,iBAAiB,CAAA;IACpD,MAAM,CAAU,cAAc,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAClD,MAAM,CAAU,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;IAEnD,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;IAC5B,CAAC;IAES,MAAM,CAAC,mBAAmB,CAAC,OAA8B;QAC/D,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,OAAO,EAAE,IAAI,CAAC,cAAc;YAC5B,YAAY,EAAE,EAAE;YAChB,eAAe,EAAE,EAAE;YACnB,GAAG,OAAO;SACb,CAAA;IACL,CAAC;IAES,MAAM,CAAC,SAAS,CAAC,KAAa;QACpC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IAC5C,CAAC;IAES,MAAM,CAAU,SAAS,GAAG,aAAa,CAC/C,yCAAyC,CAC5C,CAAA;IAES,MAAM,KAAK,YAAY;QAC7B,OAAO,GAAG,IAAI,CAAC,SAAS,gCAAgC,CAAA;IAC5D,CAAC;IAES,MAAM,CAAU,eAAe,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;IAE7D,MAAM,CAAU,gBAAgB,GAAG;QACzC,GAAG,IAAI,CAAC,eAAe;KAC1B,CAAA;IAES,MAAM,CAAU,oBAAoB,GAAG,IAAI,CAAC,SAAS,CAC3D,IAAI,CAAC,gBAAgB,EACrB,IAAI,EACJ,CAAC,CACJ,CAAA;IAES,MAAM,KAAK,eAAe;QAChC,OAAO,GAAG,IAAI,CAAC,SAAS,mBAAmB,CAAA;IAC/C,CAAC;IAES,MAAM,CAAU,kBAAkB,GAAG;QAC3C,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE;QACtB,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;KAC7B,CAAA;IAES,MAAM,CAAU,mBAAmB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAE/D,MAAM,CAAU,uBAAuB,GAAG,IAAI,CAAC,SAAS,CAC9D,IAAI,CAAC,mBAAmB,EACxB,IAAI,EACJ,CAAC,CACJ,CAAA;IAES,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"AbstractPackageTest.js","sourceRoot":"","sources":["../../src/__tests__/AbstractPackageTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
2
|
+
export default class NpmWorkspaceTypeCheckerTest extends AbstractPackageTest {
|
|
3
|
+
private static instance;
|
|
4
|
+
private static readonly workspacePath;
|
|
5
|
+
private static readonly repoName1;
|
|
6
|
+
private static readonly repoName2;
|
|
7
|
+
private static readonly repoPaths;
|
|
8
|
+
protected static beforeEach(): Promise<void>;
|
|
9
|
+
protected static createsInstance(): Promise<void>;
|
|
10
|
+
protected static checksTypesForAllNpmReposInWorkspacePath(): Promise<void>;
|
|
11
|
+
protected static catchesExitCodeIfThereAreTypeErrors(): Promise<void>;
|
|
12
|
+
private static setFakeReadDir;
|
|
13
|
+
private static setFakeExec;
|
|
14
|
+
private static NpmWorkspaceTypeChecker;
|
|
15
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { exec as execSync } from 'node:child_process';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
import { callsToExec, fakeExec, fakeReadDir, resetCallsToExec, resetCallsToReadDir, setExecThrowsFor, setFakeReadDirResult, } from '@neurodevs/fake-node-core';
|
|
10
|
+
import { test, assert } from '@neurodevs/node-tdd';
|
|
11
|
+
const exec = promisify(execSync);
|
|
12
|
+
import NpmWorkspaceTypeChecker from '../../impl/NpmWorkspaceTypeChecker.js';
|
|
13
|
+
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
14
|
+
export default class NpmWorkspaceTypeCheckerTest extends AbstractPackageTest {
|
|
15
|
+
static instance;
|
|
16
|
+
static workspacePath = this.generateId();
|
|
17
|
+
static repoName1 = this.generateId();
|
|
18
|
+
static repoName2 = this.generateId();
|
|
19
|
+
static repoPaths = [
|
|
20
|
+
`${this.workspacePath}/${this.repoName1}`,
|
|
21
|
+
`${this.workspacePath}/${this.repoName2}`,
|
|
22
|
+
];
|
|
23
|
+
static async beforeEach() {
|
|
24
|
+
await super.beforeEach();
|
|
25
|
+
this.setFakeReadDir();
|
|
26
|
+
this.setFakeExec();
|
|
27
|
+
this.instance = this.NpmWorkspaceTypeChecker();
|
|
28
|
+
}
|
|
29
|
+
static async createsInstance() {
|
|
30
|
+
assert.isTruthy(this.instance, 'Failed to create instance!');
|
|
31
|
+
}
|
|
32
|
+
static async checksTypesForAllNpmReposInWorkspacePath() {
|
|
33
|
+
await this.instance.run();
|
|
34
|
+
const calls = callsToExec.filter((call) => call.command === 'npx tsc --noEmit' &&
|
|
35
|
+
(call.options?.cwd === this.repoPaths[0] ||
|
|
36
|
+
call.options?.cwd === this.repoPaths[1]));
|
|
37
|
+
assert.isEqual(calls.length, 2, 'Failed to check types for first repo!');
|
|
38
|
+
}
|
|
39
|
+
static async catchesExitCodeIfThereAreTypeErrors() {
|
|
40
|
+
setExecThrowsFor('npx tsc --noEmit');
|
|
41
|
+
await this.instance.run();
|
|
42
|
+
}
|
|
43
|
+
static setFakeReadDir() {
|
|
44
|
+
NpmWorkspaceTypeChecker.readDir =
|
|
45
|
+
fakeReadDir;
|
|
46
|
+
resetCallsToReadDir();
|
|
47
|
+
setFakeReadDirResult(this.workspacePath, [
|
|
48
|
+
this.repoName1,
|
|
49
|
+
this.repoName2,
|
|
50
|
+
]);
|
|
51
|
+
}
|
|
52
|
+
static setFakeExec() {
|
|
53
|
+
NpmWorkspaceTypeChecker.exec = fakeExec;
|
|
54
|
+
resetCallsToExec();
|
|
55
|
+
}
|
|
56
|
+
static NpmWorkspaceTypeChecker() {
|
|
57
|
+
return NpmWorkspaceTypeChecker.Create(this.workspacePath);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
__decorate([
|
|
61
|
+
test()
|
|
62
|
+
], NpmWorkspaceTypeCheckerTest, "createsInstance", null);
|
|
63
|
+
__decorate([
|
|
64
|
+
test()
|
|
65
|
+
], NpmWorkspaceTypeCheckerTest, "checksTypesForAllNpmReposInWorkspacePath", null);
|
|
66
|
+
__decorate([
|
|
67
|
+
test()
|
|
68
|
+
], NpmWorkspaceTypeCheckerTest, "catchesExitCodeIfThereAreTypeErrors", null);
|
|
69
|
+
//# sourceMappingURL=NpmWorkspaceTypeChecker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmWorkspaceTypeChecker.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/NpmWorkspaceTypeChecker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { exec as execSync } from 'node:child_process';
|
|
2
|
+
import { readdir } from 'node:fs/promises';
|
|
3
|
+
export default class NpmWorkspaceTypeChecker implements WorkspaceTypeChecker {
|
|
4
|
+
static Class?: WorkspaceTypeCheckerConstructor;
|
|
5
|
+
static readDir: typeof readdir;
|
|
6
|
+
static exec: typeof execSync.__promisify__;
|
|
7
|
+
private workspacePath;
|
|
8
|
+
protected constructor(workspacePath: string);
|
|
9
|
+
static Create(workspacePath: string): WorkspaceTypeChecker;
|
|
10
|
+
run(): Promise<void>;
|
|
11
|
+
private get readDir();
|
|
12
|
+
private get exec();
|
|
13
|
+
}
|
|
14
|
+
export interface WorkspaceTypeChecker {
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export type WorkspaceTypeCheckerConstructor = new (workspacePath: string) => WorkspaceTypeChecker;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { exec as execSync } from 'node:child_process';
|
|
2
|
+
import { readdir } from 'node:fs/promises';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
export default class NpmWorkspaceTypeChecker {
|
|
5
|
+
static Class;
|
|
6
|
+
static readDir = readdir;
|
|
7
|
+
static exec = promisify(execSync);
|
|
8
|
+
workspacePath;
|
|
9
|
+
constructor(workspacePath) {
|
|
10
|
+
this.workspacePath = workspacePath;
|
|
11
|
+
}
|
|
12
|
+
static Create(workspacePath) {
|
|
13
|
+
return new (this.Class ?? this)(workspacePath);
|
|
14
|
+
}
|
|
15
|
+
async run() {
|
|
16
|
+
console.info('Starting type checking...\n');
|
|
17
|
+
const repoNames = await this.readDir(this.workspacePath);
|
|
18
|
+
for (const repoName of repoNames) {
|
|
19
|
+
const fullRepoPath = `${this.workspacePath}/${repoName}`;
|
|
20
|
+
console.info(`Checking types for ${fullRepoPath}...`);
|
|
21
|
+
try {
|
|
22
|
+
await this.exec('npx tsc --noEmit', { cwd: fullRepoPath });
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
console.error(`Type errors found in ${fullRepoPath}!`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
get readDir() {
|
|
30
|
+
return NpmWorkspaceTypeChecker.readDir;
|
|
31
|
+
}
|
|
32
|
+
get exec() {
|
|
33
|
+
return NpmWorkspaceTypeChecker.exec;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=NpmWorkspaceTypeChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NpmWorkspaceTypeChecker.js","sourceRoot":"","sources":["../../src/impl/NpmWorkspaceTypeChecker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,MAAM,CAAC,OAAO,OAAO,uBAAuB;IACjC,MAAM,CAAC,KAAK,CAAkC;IAC9C,MAAM,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;IAEhC,aAAa,CAAQ;IAE7B,YAAsB,aAAqB;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACtC,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,aAAqB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,aAAa,CAAC,CAAA;IAClD,CAAC;IAEM,KAAK,CAAC,GAAG;QACZ,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QAC3C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAExD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,QAAQ,EAAE,CAAA;YACxD,OAAO,CAAC,IAAI,CAAC,sBAAsB,YAAY,KAAK,CAAC,CAAA;YAErD,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAA;YAC9D,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,CAAC,KAAK,CAAC,wBAAwB,YAAY,GAAG,CAAC,CAAA;YAC1D,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAY,OAAO;QACf,OAAO,uBAAuB,CAAC,OAAO,CAAA;IAC1C,CAAC;IACD,IAAY,IAAI;QACZ,OAAO,uBAAuB,CAAC,IAAI,CAAA;IACvC,CAAC"}
|
package/build/index.d.ts
CHANGED
|
@@ -38,3 +38,7 @@ export { default as TypescriptClassSnippetSuite } from './impl/TypescriptClassSn
|
|
|
38
38
|
export * from './impl/TypescriptClassSnippetSuite.js';
|
|
39
39
|
export { default as FakeSnippetSuite } from './testDoubles/SnippetSuite/FakeSnippetSuite.js';
|
|
40
40
|
export * from './testDoubles/SnippetSuite/FakeSnippetSuite.js';
|
|
41
|
+
export { default as NpmWorkspaceTypeChecker } from './impl/NpmWorkspaceTypeChecker.js';
|
|
42
|
+
export * from './impl/NpmWorkspaceTypeChecker.js';
|
|
43
|
+
export { default as FakeWorkspaceTypeChecker } from './testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js';
|
|
44
|
+
export * from './testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js';
|
package/build/index.js
CHANGED
|
@@ -47,4 +47,9 @@ export { default as TypescriptClassSnippetSuite } from './impl/TypescriptClassSn
|
|
|
47
47
|
export * from './impl/TypescriptClassSnippetSuite.js';
|
|
48
48
|
export { default as FakeSnippetSuite } from './testDoubles/SnippetSuite/FakeSnippetSuite.js';
|
|
49
49
|
export * from './testDoubles/SnippetSuite/FakeSnippetSuite.js';
|
|
50
|
+
// WorkspaceTypeChecker
|
|
51
|
+
export { default as NpmWorkspaceTypeChecker } from './impl/NpmWorkspaceTypeChecker.js';
|
|
52
|
+
export * from './impl/NpmWorkspaceTypeChecker.js';
|
|
53
|
+
export { default as FakeWorkspaceTypeChecker } from './testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js';
|
|
54
|
+
export * from './testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js';
|
|
50
55
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,iBAAiB;AAEjB,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAClF,cAAc,iCAAiC,CAAA;AAE/C,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,oDAAoD,CAAA;AAClG,cAAc,oDAAoD,CAAA;AAElE,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAChE,cAAc,wBAAwB,CAAA;AAEtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,yBAAyB;AAEzB,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC1F,cAAc,qCAAqC,CAAA;AAEnD,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,oEAAoE,CAAA;AAC1H,cAAc,oEAAoE,CAAA;AAElF,oBAAoB;AAEpB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,gCAAgC,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,mBAAmB;AAEnB,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACpF,cAAc,kCAAkC,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wDAAwD,CAAA;AACxG,cAAc,wDAAwD,CAAA;AAEtE,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,uCAAuC,CAAA;AAC9F,cAAc,uCAAuC,CAAA;AAErD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,iBAAiB;AAEjB,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAClF,cAAc,iCAAiC,CAAA;AAE/C,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,oDAAoD,CAAA;AAClG,cAAc,oDAAoD,CAAA;AAElE,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAChE,cAAc,wBAAwB,CAAA;AAEtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,yBAAyB;AAEzB,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,qCAAqC,CAAA;AAC1F,cAAc,qCAAqC,CAAA;AAEnD,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,oEAAoE,CAAA;AAC1H,cAAc,oEAAoE,CAAA;AAElF,oBAAoB;AAEpB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,gCAAgC,CAAA;AAChF,cAAc,gCAAgC,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0DAA0D,CAAA;AAC3G,cAAc,0DAA0D,CAAA;AAExE,mBAAmB;AAEnB,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACpF,cAAc,kCAAkC,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wDAAwD,CAAA;AACxG,cAAc,wDAAwD,CAAA;AAEtE,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,uCAAuC,CAAA;AAC9F,cAAc,uCAAuC,CAAA;AAErD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,uBAAuB;AAEvB,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AACtF,cAAc,mCAAmC,CAAA;AAEjD,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,gEAAgE,CAAA;AACpH,cAAc,gEAAgE,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WorkspaceTypeChecker } from '../../impl/NpmWorkspaceTypeChecker.js';
|
|
2
|
+
export default class FakeWorkspaceTypeChecker implements WorkspaceTypeChecker {
|
|
3
|
+
static callsToConstructor: (string | undefined)[];
|
|
4
|
+
static numCallsToRun: number;
|
|
5
|
+
constructor(workspacePath?: string);
|
|
6
|
+
run(): Promise<void>;
|
|
7
|
+
static resetTestDouble(): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default class FakeWorkspaceTypeChecker {
|
|
2
|
+
static callsToConstructor = [];
|
|
3
|
+
static numCallsToRun = 0;
|
|
4
|
+
constructor(workspacePath) {
|
|
5
|
+
FakeWorkspaceTypeChecker.callsToConstructor.push(workspacePath);
|
|
6
|
+
}
|
|
7
|
+
async run() {
|
|
8
|
+
FakeWorkspaceTypeChecker.numCallsToRun += 1;
|
|
9
|
+
}
|
|
10
|
+
static resetTestDouble() {
|
|
11
|
+
FakeWorkspaceTypeChecker.callsToConstructor = [];
|
|
12
|
+
FakeWorkspaceTypeChecker.numCallsToRun = 0;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=FakeWorkspaceTypeChecker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FakeWorkspaceTypeChecker.js","sourceRoot":"","sources":["../../../src/testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,wBAAwB;IAClC,MAAM,CAAC,kBAAkB,GAA2B,EAAE,CAAA;IACtD,MAAM,CAAC,aAAa,GAAG,CAAC,CAAA;IAE/B,YAAmB,aAAsB;QACrC,wBAAwB,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACnE,CAAC;IACM,KAAK,CAAC,GAAG;QACZ,wBAAwB,CAAC,aAAa,IAAI,CAAC,CAAA;IAC/C,CAAC;IAEM,MAAM,CAAC,eAAe;QACzB,wBAAwB,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAChD,wBAAwB,CAAC,aAAa,GAAG,CAAC,CAAA;IAC9C,CAAC"}
|
package/package.json
CHANGED
|
@@ -74,10 +74,6 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
74
74
|
4
|
|
75
75
|
)
|
|
76
76
|
|
|
77
|
-
protected static setFakeSnippetsFile() {
|
|
78
|
-
setFakeReadFileResult(this.snippetsPath, this.originalSnippetsFile)
|
|
79
|
-
}
|
|
80
|
-
|
|
81
77
|
protected static setFakeKeybindingsFile() {
|
|
82
78
|
setFakeReadFileResult(
|
|
83
79
|
this.keybindingsPath,
|
|
@@ -101,4 +97,8 @@ export default class AbstractPackageTest extends AbstractModuleTest {
|
|
|
101
97
|
JSON.stringify({ version: this.metaNodeVersion })
|
|
102
98
|
)
|
|
103
99
|
}
|
|
100
|
+
|
|
101
|
+
protected static setFakeSnippetsFile() {
|
|
102
|
+
setFakeReadFileResult(this.snippetsPath, this.originalSnippetsFile)
|
|
103
|
+
}
|
|
104
104
|
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { exec as execSync } from 'node:child_process'
|
|
2
|
+
import { readdir } from 'node:fs/promises'
|
|
3
|
+
import { promisify } from 'node:util'
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
callsToExec,
|
|
7
|
+
fakeExec,
|
|
8
|
+
fakeReadDir,
|
|
9
|
+
resetCallsToExec,
|
|
10
|
+
resetCallsToReadDir,
|
|
11
|
+
setExecThrowsFor,
|
|
12
|
+
setFakeReadDirResult,
|
|
13
|
+
} from '@neurodevs/fake-node-core'
|
|
14
|
+
import { test, assert } from '@neurodevs/node-tdd'
|
|
15
|
+
|
|
16
|
+
const exec = promisify(execSync)
|
|
17
|
+
|
|
18
|
+
import NpmWorkspaceTypeChecker, {
|
|
19
|
+
WorkspaceTypeChecker,
|
|
20
|
+
} from '../../impl/NpmWorkspaceTypeChecker.js'
|
|
21
|
+
import AbstractPackageTest from '../AbstractPackageTest.js'
|
|
22
|
+
|
|
23
|
+
export default class NpmWorkspaceTypeCheckerTest extends AbstractPackageTest {
|
|
24
|
+
private static instance: WorkspaceTypeChecker
|
|
25
|
+
|
|
26
|
+
private static readonly workspacePath = this.generateId()
|
|
27
|
+
|
|
28
|
+
private static readonly repoName1 = this.generateId()
|
|
29
|
+
private static readonly repoName2 = this.generateId()
|
|
30
|
+
|
|
31
|
+
private static readonly repoPaths = [
|
|
32
|
+
`${this.workspacePath}/${this.repoName1}`,
|
|
33
|
+
`${this.workspacePath}/${this.repoName2}`,
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
protected static async beforeEach() {
|
|
37
|
+
await super.beforeEach()
|
|
38
|
+
|
|
39
|
+
this.setFakeReadDir()
|
|
40
|
+
this.setFakeExec()
|
|
41
|
+
|
|
42
|
+
this.instance = this.NpmWorkspaceTypeChecker()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@test()
|
|
46
|
+
protected static async createsInstance() {
|
|
47
|
+
assert.isTruthy(this.instance, 'Failed to create instance!')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@test()
|
|
51
|
+
protected static async checksTypesForAllNpmReposInWorkspacePath() {
|
|
52
|
+
await this.instance.run()
|
|
53
|
+
|
|
54
|
+
const calls = callsToExec.filter(
|
|
55
|
+
(call) =>
|
|
56
|
+
call.command === 'npx tsc --noEmit' &&
|
|
57
|
+
(call.options?.cwd === this.repoPaths[0] ||
|
|
58
|
+
call.options?.cwd === this.repoPaths[1])
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
assert.isEqual(calls.length, 2, 'Failed to check types for first repo!')
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@test()
|
|
65
|
+
protected static async catchesExitCodeIfThereAreTypeErrors() {
|
|
66
|
+
setExecThrowsFor('npx tsc --noEmit')
|
|
67
|
+
|
|
68
|
+
await this.instance.run()
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
private static setFakeReadDir() {
|
|
72
|
+
NpmWorkspaceTypeChecker.readDir =
|
|
73
|
+
fakeReadDir as unknown as typeof readdir
|
|
74
|
+
resetCallsToReadDir()
|
|
75
|
+
|
|
76
|
+
setFakeReadDirResult(this.workspacePath, [
|
|
77
|
+
this.repoName1,
|
|
78
|
+
this.repoName2,
|
|
79
|
+
])
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private static setFakeExec() {
|
|
83
|
+
NpmWorkspaceTypeChecker.exec = fakeExec as unknown as typeof exec
|
|
84
|
+
resetCallsToExec()
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private static NpmWorkspaceTypeChecker() {
|
|
88
|
+
return NpmWorkspaceTypeChecker.Create(this.workspacePath)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { exec as execSync } from 'node:child_process'
|
|
2
|
+
import { readdir } from 'node:fs/promises'
|
|
3
|
+
import { promisify } from 'node:util'
|
|
4
|
+
|
|
5
|
+
export default class NpmWorkspaceTypeChecker implements WorkspaceTypeChecker {
|
|
6
|
+
public static Class?: WorkspaceTypeCheckerConstructor
|
|
7
|
+
public static readDir = readdir
|
|
8
|
+
public static exec = promisify(execSync)
|
|
9
|
+
|
|
10
|
+
private workspacePath: string
|
|
11
|
+
|
|
12
|
+
protected constructor(workspacePath: string) {
|
|
13
|
+
this.workspacePath = workspacePath
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
public static Create(workspacePath: string) {
|
|
17
|
+
return new (this.Class ?? this)(workspacePath)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public async run() {
|
|
21
|
+
console.info('Starting type checking...\n')
|
|
22
|
+
const repoNames = await this.readDir(this.workspacePath)
|
|
23
|
+
|
|
24
|
+
for (const repoName of repoNames) {
|
|
25
|
+
const fullRepoPath = `${this.workspacePath}/${repoName}`
|
|
26
|
+
console.info(`Checking types for ${fullRepoPath}...`)
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
await this.exec('npx tsc --noEmit', { cwd: fullRepoPath })
|
|
30
|
+
} catch {
|
|
31
|
+
console.error(`Type errors found in ${fullRepoPath}!`)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private get readDir() {
|
|
37
|
+
return NpmWorkspaceTypeChecker.readDir
|
|
38
|
+
}
|
|
39
|
+
private get exec() {
|
|
40
|
+
return NpmWorkspaceTypeChecker.exec
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface WorkspaceTypeChecker {
|
|
45
|
+
run(): Promise<void>
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export type WorkspaceTypeCheckerConstructor = new (
|
|
49
|
+
workspacePath: string
|
|
50
|
+
) => WorkspaceTypeChecker
|
package/src/index.ts
CHANGED
|
@@ -75,3 +75,11 @@ export * from './impl/TypescriptClassSnippetSuite.js'
|
|
|
75
75
|
|
|
76
76
|
export { default as FakeSnippetSuite } from './testDoubles/SnippetSuite/FakeSnippetSuite.js'
|
|
77
77
|
export * from './testDoubles/SnippetSuite/FakeSnippetSuite.js'
|
|
78
|
+
|
|
79
|
+
// WorkspaceTypeChecker
|
|
80
|
+
|
|
81
|
+
export { default as NpmWorkspaceTypeChecker } from './impl/NpmWorkspaceTypeChecker.js'
|
|
82
|
+
export * from './impl/NpmWorkspaceTypeChecker.js'
|
|
83
|
+
|
|
84
|
+
export { default as FakeWorkspaceTypeChecker } from './testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js'
|
|
85
|
+
export * from './testDoubles/WorkspaceTypeChecker/FakeWorkspaceTypeChecker.js'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { WorkspaceTypeChecker } from '../../impl/NpmWorkspaceTypeChecker.js'
|
|
2
|
+
|
|
3
|
+
export default class FakeWorkspaceTypeChecker implements WorkspaceTypeChecker {
|
|
4
|
+
public static callsToConstructor: (string | undefined)[] = []
|
|
5
|
+
public static numCallsToRun = 0
|
|
6
|
+
|
|
7
|
+
public constructor(workspacePath?: string) {
|
|
8
|
+
FakeWorkspaceTypeChecker.callsToConstructor.push(workspacePath)
|
|
9
|
+
}
|
|
10
|
+
public async run() {
|
|
11
|
+
FakeWorkspaceTypeChecker.numCallsToRun += 1
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public static resetTestDouble() {
|
|
15
|
+
FakeWorkspaceTypeChecker.callsToConstructor = []
|
|
16
|
+
FakeWorkspaceTypeChecker.numCallsToRun = 0
|
|
17
|
+
}
|
|
18
|
+
}
|