task-script-support-cli 0.2.12 → 0.2.14
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/assets/yargs-template/task-runner/README.md +1 -1
- package/assets/yargs-template/task-runner/package-lock.json +11 -11
- package/assets/yargs-template/task-runner/package.json +2 -2
- package/assets/yargs-template/task-runner/src/commands/help-command.ts +8 -0
- package/assets/yargs-template/task-runner/src/index.ts +8 -1
- package/assets/yargs-template/task-runner/src/tasks/show-help.ts +19 -0
- package/assets/yargs-template/task-runner/src/types/state.ts +3 -0
- package/assets/yargs-template/task-runner/src/wrappers/concurrent-task-group.ts +17 -0
- package/assets/yargs-template/task-runner/src/wrappers/sequential-task-group.ts +17 -0
- package/assets/yargs-template/task-runner/tests/tasks/check-env.test.ts +56 -9
- package/dist/assets/yargs-template/task-runner/README.md +1 -1
- package/dist/assets/yargs-template/task-runner/package-lock.json +11 -11
- package/dist/assets/yargs-template/task-runner/package.json +2 -2
- package/dist/assets/yargs-template/task-runner/src/commands/help-command.ts +8 -0
- package/dist/assets/yargs-template/task-runner/src/index.ts +8 -1
- package/dist/assets/yargs-template/task-runner/src/tasks/show-help.ts +19 -0
- package/dist/assets/yargs-template/task-runner/src/types/state.ts +3 -0
- package/dist/assets/yargs-template/task-runner/src/wrappers/concurrent-task-group.ts +17 -0
- package/dist/assets/yargs-template/task-runner/src/wrappers/sequential-task-group.ts +17 -0
- package/dist/assets/yargs-template/task-runner/tests/tasks/check-env.test.ts +56 -9
- package/dist/package.json +5 -5
- package/dist/src/services/file-service.d.ts +1 -0
- package/dist/src/services/file-service.d.ts.map +1 -1
- package/dist/src/services/file-service.js +4 -1
- package/dist/src/services/file-service.js.map +1 -1
- package/dist/src/tasks/stdout/print-generated-results.js +1 -1
- package/package.json +5 -5
- package/src/services/file-service.ts +5 -1
- package/src/tasks/stdout/print-generated-results.ts +1 -1
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"chalk": "^4.1.2",
|
|
13
|
-
"dotenv": "^17.2
|
|
13
|
+
"dotenv": "^17.4.2",
|
|
14
14
|
"figlet": "^1.9.4",
|
|
15
15
|
"immutable": "^5.1.4",
|
|
16
16
|
"reflect-metadata": "^0.2.2",
|
|
17
|
-
"task-script-support": "^2.
|
|
17
|
+
"task-script-support": "^2.5.0",
|
|
18
18
|
"tsyringe": "^4.10.0",
|
|
19
19
|
"yargs": "^18.0.0"
|
|
20
20
|
},
|
|
@@ -1333,9 +1333,9 @@
|
|
|
1333
1333
|
}
|
|
1334
1334
|
},
|
|
1335
1335
|
"node_modules/dotenv": {
|
|
1336
|
-
"version": "17.
|
|
1337
|
-
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.
|
|
1338
|
-
"integrity": "sha512-
|
|
1336
|
+
"version": "17.4.2",
|
|
1337
|
+
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz",
|
|
1338
|
+
"integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==",
|
|
1339
1339
|
"license": "BSD-2-Clause",
|
|
1340
1340
|
"engines": {
|
|
1341
1341
|
"node": ">=12"
|
|
@@ -2463,9 +2463,9 @@
|
|
|
2463
2463
|
"license": "MIT"
|
|
2464
2464
|
},
|
|
2465
2465
|
"node_modules/postcss": {
|
|
2466
|
-
"version": "8.5.
|
|
2467
|
-
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.
|
|
2468
|
-
"integrity": "sha512-
|
|
2466
|
+
"version": "8.5.13",
|
|
2467
|
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz",
|
|
2468
|
+
"integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==",
|
|
2469
2469
|
"dev": true,
|
|
2470
2470
|
"funding": [
|
|
2471
2471
|
{
|
|
@@ -2838,9 +2838,9 @@
|
|
|
2838
2838
|
}
|
|
2839
2839
|
},
|
|
2840
2840
|
"node_modules/task-script-support": {
|
|
2841
|
-
"version": "2.
|
|
2842
|
-
"resolved": "https://registry.npmjs.org/task-script-support/-/task-script-support-2.
|
|
2843
|
-
"integrity": "sha512-
|
|
2841
|
+
"version": "2.5.0",
|
|
2842
|
+
"resolved": "https://registry.npmjs.org/task-script-support/-/task-script-support-2.5.0.tgz",
|
|
2843
|
+
"integrity": "sha512-Tuki0wyyTUiK6tQm1iRdL9wIvMAgtu5Etj0NDD6A3RS9NpeLMW97MZPPt8sSlDZMoeNSpJbkxXJZcElrUT+qOQ==",
|
|
2844
2844
|
"license": "MIT",
|
|
2845
2845
|
"dependencies": {
|
|
2846
2846
|
"immutable": "^5.1.4",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"chalk": "^4.1.2",
|
|
31
|
-
"dotenv": "^17.2
|
|
31
|
+
"dotenv": "^17.4.2",
|
|
32
32
|
"figlet": "^1.9.4",
|
|
33
33
|
"immutable": "^5.1.4",
|
|
34
34
|
"reflect-metadata": "^0.2.2",
|
|
35
|
-
"task-script-support": "^2.
|
|
35
|
+
"task-script-support": "^2.5.0",
|
|
36
36
|
"tsyringe": "^4.10.0",
|
|
37
37
|
"yargs": "^18.0.0"
|
|
38
38
|
},
|
|
@@ -12,11 +12,18 @@ initializeInjectables();
|
|
|
12
12
|
|
|
13
13
|
import { UtilService } from "./services/util-service";
|
|
14
14
|
import { VerifyCommand } from "./commands/verify";
|
|
15
|
+
import { HelpCommand } from "./commands/help-command";
|
|
15
16
|
|
|
16
17
|
const name = UtilService.getAppName();
|
|
18
|
+
const yargsInstance = yargs(hideBin(process.argv));
|
|
19
|
+
container.registerInstance("yargs", yargsInstance);
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
yargsInstance
|
|
19
22
|
.usage(`${UtilService.titleizeAll(name)} CLI Client`)
|
|
23
|
+
.command({
|
|
24
|
+
command: "$0",
|
|
25
|
+
handler: container.resolve(HelpCommand).handler,
|
|
26
|
+
})
|
|
20
27
|
.command(
|
|
21
28
|
"verify",
|
|
22
29
|
"check the app is working",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AppTask } from "../wrappers/app-task";
|
|
2
|
+
import { autoInjectable, inject } from "tsyringe";
|
|
3
|
+
import type { Yargs } from "../types/state";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Show the yargs help menu
|
|
7
|
+
*/
|
|
8
|
+
@autoInjectable()
|
|
9
|
+
export default class ShowHelp extends AppTask {
|
|
10
|
+
loggerName = "ShowHelp";
|
|
11
|
+
|
|
12
|
+
constructor(@inject("yargs") private yargs: Yargs) {
|
|
13
|
+
super();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async run() {
|
|
17
|
+
this.yargs.showHelp();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AppState as State, TaskClass } from "task-script-support";
|
|
2
|
+
import yargs from "yargs";
|
|
2
3
|
|
|
3
4
|
// Add app data here as needed. Use readonly for immutable fields.
|
|
4
5
|
//
|
|
@@ -31,3 +32,5 @@ export const EnvironmentConfigKeys = {
|
|
|
31
32
|
};
|
|
32
33
|
|
|
33
34
|
export type AppTaskClass = TaskClass<AppStateData, CLIArgs>;
|
|
35
|
+
|
|
36
|
+
export type Yargs = typeof yargs;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AppTask } from "./app-task";
|
|
2
|
+
import { autoInjectable } from "tsyringe";
|
|
3
|
+
import { AppTaskClass } from "../types/state";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wrapper for Running a Group of Concurrent Tasks
|
|
7
|
+
*
|
|
8
|
+
* Extend this class and override the tasks array to run tasks
|
|
9
|
+
* concurrently within a Task itself. The fallback run method
|
|
10
|
+
* handles state and execution of the tasks.
|
|
11
|
+
*/
|
|
12
|
+
@autoInjectable()
|
|
13
|
+
export default class ConcurrentTaskGroup extends AppTask {
|
|
14
|
+
tasks: AppTaskClass[] = [];
|
|
15
|
+
run = () =>
|
|
16
|
+
this._commandService!.runTasks([this.tasks], this.state.args, this.state);
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AppTask } from "./app-task";
|
|
2
|
+
import { autoInjectable } from "tsyringe";
|
|
3
|
+
import { AppTaskClass } from "../types/state";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wrapper for Running a Group of Sequential Tasks
|
|
7
|
+
*
|
|
8
|
+
* Extend this class and override the tasks array to run a sequence
|
|
9
|
+
* of tasks in order as a Task. The fallback run method handles state
|
|
10
|
+
* and execution of the tasks.
|
|
11
|
+
*/
|
|
12
|
+
@autoInjectable()
|
|
13
|
+
export default class SequentialTaskGroup extends AppTask {
|
|
14
|
+
tasks: AppTaskClass[] = [];
|
|
15
|
+
run = () =>
|
|
16
|
+
this._commandService!.runTasks(this.tasks, this.state.args, this.state);
|
|
17
|
+
}
|
|
@@ -1,30 +1,77 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
2
|
import CheckEnv from "../../src/tasks/check-env";
|
|
3
3
|
import { LogService } from "../../src/services/log-service";
|
|
4
4
|
import { CommandService } from "task-script-support";
|
|
5
5
|
import { AppStateData, CLIArgs } from "../../src/types/state";
|
|
6
|
+
import { container } from "tsyringe";
|
|
6
7
|
|
|
7
8
|
describe("CheckEnv", () => {
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
let mockLogService = {} as LogService;
|
|
10
|
+
let mockCommandService = {} as CommandService<AppStateData, CLIArgs>;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
container.reset();
|
|
14
|
+
|
|
15
|
+
mockLogService = {
|
|
10
16
|
info: vi.fn(),
|
|
11
17
|
debug: vi.fn(),
|
|
18
|
+
error: vi.fn(),
|
|
12
19
|
} as unknown as LogService;
|
|
13
|
-
|
|
20
|
+
|
|
21
|
+
mockCommandService = {
|
|
14
22
|
setData: vi.fn((state, data) => ({
|
|
15
23
|
...state,
|
|
16
24
|
data: { ...state.data, ...data },
|
|
17
25
|
})),
|
|
18
26
|
} as unknown as CommandService<AppStateData, CLIArgs>;
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
container.registerInstance(LogService, mockLogService);
|
|
29
|
+
container.registerInstance(
|
|
30
|
+
CommandService<AppStateData, CLIArgs>,
|
|
31
|
+
mockCommandService,
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should set environmentValidated to true", async () => {
|
|
36
|
+
const checkEnv = container.resolve(CheckEnv);
|
|
37
|
+
|
|
24
38
|
await checkEnv.run();
|
|
25
|
-
expect(mockLogService.
|
|
39
|
+
expect(mockLogService.debug).toHaveBeenCalledWith(
|
|
26
40
|
"Running Check Environment",
|
|
27
41
|
);
|
|
28
42
|
expect(checkEnv.state.data.environmentValidated).toBe(true);
|
|
29
43
|
});
|
|
44
|
+
|
|
45
|
+
it("should call exit on missing required environment variable", async () => {
|
|
46
|
+
const testError = new Error("process.exit called");
|
|
47
|
+
const mockExit = vi.spyOn(process, "exit").mockImplementation(() => {
|
|
48
|
+
throw testError;
|
|
49
|
+
});
|
|
50
|
+
const checkEnv = container.resolve(CheckEnv);
|
|
51
|
+
checkEnv.requiredEnv = ["MISSING_ENV_VAR"];
|
|
52
|
+
try {
|
|
53
|
+
expect(await checkEnv.run()).toThrow(testError);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
expect(`${err}`).toContain("process.exit");
|
|
56
|
+
expect(err).toBe(testError);
|
|
57
|
+
}
|
|
58
|
+
expect(mockLogService.error).toHaveBeenCalled();
|
|
59
|
+
mockExit.mockRestore();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("should group environment issues into single error log", async () => {
|
|
63
|
+
const testError = new Error("process.exit called");
|
|
64
|
+
const mockExit = vi.spyOn(process, "exit").mockImplementation(() => {
|
|
65
|
+
throw testError;
|
|
66
|
+
});
|
|
67
|
+
const checkEnv = container.resolve(CheckEnv);
|
|
68
|
+
checkEnv.requiredEnv = ["MISSING_ENV_1", "MISSING_ENV_2", "MISSING_ENV_3"];
|
|
69
|
+
try {
|
|
70
|
+
await checkEnv.run();
|
|
71
|
+
} catch (err) {
|
|
72
|
+
expect(err).toBe(testError);
|
|
73
|
+
}
|
|
74
|
+
expect(mockLogService.error).toHaveBeenCalledOnce();
|
|
75
|
+
mockExit.mockRestore();
|
|
76
|
+
});
|
|
30
77
|
});
|
|
@@ -10,11 +10,11 @@
|
|
|
10
10
|
"license": "ISC",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"chalk": "^4.1.2",
|
|
13
|
-
"dotenv": "^17.2
|
|
13
|
+
"dotenv": "^17.4.2",
|
|
14
14
|
"figlet": "^1.9.4",
|
|
15
15
|
"immutable": "^5.1.4",
|
|
16
16
|
"reflect-metadata": "^0.2.2",
|
|
17
|
-
"task-script-support": "^2.
|
|
17
|
+
"task-script-support": "^2.5.0",
|
|
18
18
|
"tsyringe": "^4.10.0",
|
|
19
19
|
"yargs": "^18.0.0"
|
|
20
20
|
},
|
|
@@ -1333,9 +1333,9 @@
|
|
|
1333
1333
|
}
|
|
1334
1334
|
},
|
|
1335
1335
|
"node_modules/dotenv": {
|
|
1336
|
-
"version": "17.
|
|
1337
|
-
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.
|
|
1338
|
-
"integrity": "sha512-
|
|
1336
|
+
"version": "17.4.2",
|
|
1337
|
+
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz",
|
|
1338
|
+
"integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==",
|
|
1339
1339
|
"license": "BSD-2-Clause",
|
|
1340
1340
|
"engines": {
|
|
1341
1341
|
"node": ">=12"
|
|
@@ -2463,9 +2463,9 @@
|
|
|
2463
2463
|
"license": "MIT"
|
|
2464
2464
|
},
|
|
2465
2465
|
"node_modules/postcss": {
|
|
2466
|
-
"version": "8.5.
|
|
2467
|
-
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.
|
|
2468
|
-
"integrity": "sha512-
|
|
2466
|
+
"version": "8.5.13",
|
|
2467
|
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.13.tgz",
|
|
2468
|
+
"integrity": "sha512-qif0+jGGZoLWdHey3UFHHWP0H7Gbmsk8T5VEqyYFbWqPr1XqvLGBbk/sl8V5exGmcYJklJOhOQq1pV9IcsiFag==",
|
|
2469
2469
|
"dev": true,
|
|
2470
2470
|
"funding": [
|
|
2471
2471
|
{
|
|
@@ -2838,9 +2838,9 @@
|
|
|
2838
2838
|
}
|
|
2839
2839
|
},
|
|
2840
2840
|
"node_modules/task-script-support": {
|
|
2841
|
-
"version": "2.
|
|
2842
|
-
"resolved": "https://registry.npmjs.org/task-script-support/-/task-script-support-2.
|
|
2843
|
-
"integrity": "sha512-
|
|
2841
|
+
"version": "2.5.0",
|
|
2842
|
+
"resolved": "https://registry.npmjs.org/task-script-support/-/task-script-support-2.5.0.tgz",
|
|
2843
|
+
"integrity": "sha512-Tuki0wyyTUiK6tQm1iRdL9wIvMAgtu5Etj0NDD6A3RS9NpeLMW97MZPPt8sSlDZMoeNSpJbkxXJZcElrUT+qOQ==",
|
|
2844
2844
|
"license": "MIT",
|
|
2845
2845
|
"dependencies": {
|
|
2846
2846
|
"immutable": "^5.1.4",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"chalk": "^4.1.2",
|
|
31
|
-
"dotenv": "^17.2
|
|
31
|
+
"dotenv": "^17.4.2",
|
|
32
32
|
"figlet": "^1.9.4",
|
|
33
33
|
"immutable": "^5.1.4",
|
|
34
34
|
"reflect-metadata": "^0.2.2",
|
|
35
|
-
"task-script-support": "^2.
|
|
35
|
+
"task-script-support": "^2.5.0",
|
|
36
36
|
"tsyringe": "^4.10.0",
|
|
37
37
|
"yargs": "^18.0.0"
|
|
38
38
|
},
|
|
@@ -12,11 +12,18 @@ initializeInjectables();
|
|
|
12
12
|
|
|
13
13
|
import { UtilService } from "./services/util-service";
|
|
14
14
|
import { VerifyCommand } from "./commands/verify";
|
|
15
|
+
import { HelpCommand } from "./commands/help-command";
|
|
15
16
|
|
|
16
17
|
const name = UtilService.getAppName();
|
|
18
|
+
const yargsInstance = yargs(hideBin(process.argv));
|
|
19
|
+
container.registerInstance("yargs", yargsInstance);
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
yargsInstance
|
|
19
22
|
.usage(`${UtilService.titleizeAll(name)} CLI Client`)
|
|
23
|
+
.command({
|
|
24
|
+
command: "$0",
|
|
25
|
+
handler: container.resolve(HelpCommand).handler,
|
|
26
|
+
})
|
|
20
27
|
.command(
|
|
21
28
|
"verify",
|
|
22
29
|
"check the app is working",
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AppTask } from "../wrappers/app-task";
|
|
2
|
+
import { autoInjectable, inject } from "tsyringe";
|
|
3
|
+
import type { Yargs } from "../types/state";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Show the yargs help menu
|
|
7
|
+
*/
|
|
8
|
+
@autoInjectable()
|
|
9
|
+
export default class ShowHelp extends AppTask {
|
|
10
|
+
loggerName = "ShowHelp";
|
|
11
|
+
|
|
12
|
+
constructor(@inject("yargs") private yargs: Yargs) {
|
|
13
|
+
super();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async run() {
|
|
17
|
+
this.yargs.showHelp();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { AppState as State, TaskClass } from "task-script-support";
|
|
2
|
+
import yargs from "yargs";
|
|
2
3
|
|
|
3
4
|
// Add app data here as needed. Use readonly for immutable fields.
|
|
4
5
|
//
|
|
@@ -31,3 +32,5 @@ export const EnvironmentConfigKeys = {
|
|
|
31
32
|
};
|
|
32
33
|
|
|
33
34
|
export type AppTaskClass = TaskClass<AppStateData, CLIArgs>;
|
|
35
|
+
|
|
36
|
+
export type Yargs = typeof yargs;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AppTask } from "./app-task";
|
|
2
|
+
import { autoInjectable } from "tsyringe";
|
|
3
|
+
import { AppTaskClass } from "../types/state";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wrapper for Running a Group of Concurrent Tasks
|
|
7
|
+
*
|
|
8
|
+
* Extend this class and override the tasks array to run tasks
|
|
9
|
+
* concurrently within a Task itself. The fallback run method
|
|
10
|
+
* handles state and execution of the tasks.
|
|
11
|
+
*/
|
|
12
|
+
@autoInjectable()
|
|
13
|
+
export default class ConcurrentTaskGroup extends AppTask {
|
|
14
|
+
tasks: AppTaskClass[] = [];
|
|
15
|
+
run = () =>
|
|
16
|
+
this._commandService!.runTasks([this.tasks], this.state.args, this.state);
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AppTask } from "./app-task";
|
|
2
|
+
import { autoInjectable } from "tsyringe";
|
|
3
|
+
import { AppTaskClass } from "../types/state";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Wrapper for Running a Group of Sequential Tasks
|
|
7
|
+
*
|
|
8
|
+
* Extend this class and override the tasks array to run a sequence
|
|
9
|
+
* of tasks in order as a Task. The fallback run method handles state
|
|
10
|
+
* and execution of the tasks.
|
|
11
|
+
*/
|
|
12
|
+
@autoInjectable()
|
|
13
|
+
export default class SequentialTaskGroup extends AppTask {
|
|
14
|
+
tasks: AppTaskClass[] = [];
|
|
15
|
+
run = () =>
|
|
16
|
+
this._commandService!.runTasks(this.tasks, this.state.args, this.state);
|
|
17
|
+
}
|
|
@@ -1,30 +1,77 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from "vitest";
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
2
|
import CheckEnv from "../../src/tasks/check-env";
|
|
3
3
|
import { LogService } from "../../src/services/log-service";
|
|
4
4
|
import { CommandService } from "task-script-support";
|
|
5
5
|
import { AppStateData, CLIArgs } from "../../src/types/state";
|
|
6
|
+
import { container } from "tsyringe";
|
|
6
7
|
|
|
7
8
|
describe("CheckEnv", () => {
|
|
8
|
-
|
|
9
|
-
|
|
9
|
+
let mockLogService = {} as LogService;
|
|
10
|
+
let mockCommandService = {} as CommandService<AppStateData, CLIArgs>;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
container.reset();
|
|
14
|
+
|
|
15
|
+
mockLogService = {
|
|
10
16
|
info: vi.fn(),
|
|
11
17
|
debug: vi.fn(),
|
|
18
|
+
error: vi.fn(),
|
|
12
19
|
} as unknown as LogService;
|
|
13
|
-
|
|
20
|
+
|
|
21
|
+
mockCommandService = {
|
|
14
22
|
setData: vi.fn((state, data) => ({
|
|
15
23
|
...state,
|
|
16
24
|
data: { ...state.data, ...data },
|
|
17
25
|
})),
|
|
18
26
|
} as unknown as CommandService<AppStateData, CLIArgs>;
|
|
19
27
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
container.registerInstance(LogService, mockLogService);
|
|
29
|
+
container.registerInstance(
|
|
30
|
+
CommandService<AppStateData, CLIArgs>,
|
|
31
|
+
mockCommandService,
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should set environmentValidated to true", async () => {
|
|
36
|
+
const checkEnv = container.resolve(CheckEnv);
|
|
37
|
+
|
|
24
38
|
await checkEnv.run();
|
|
25
|
-
expect(mockLogService.
|
|
39
|
+
expect(mockLogService.debug).toHaveBeenCalledWith(
|
|
26
40
|
"Running Check Environment",
|
|
27
41
|
);
|
|
28
42
|
expect(checkEnv.state.data.environmentValidated).toBe(true);
|
|
29
43
|
});
|
|
44
|
+
|
|
45
|
+
it("should call exit on missing required environment variable", async () => {
|
|
46
|
+
const testError = new Error("process.exit called");
|
|
47
|
+
const mockExit = vi.spyOn(process, "exit").mockImplementation(() => {
|
|
48
|
+
throw testError;
|
|
49
|
+
});
|
|
50
|
+
const checkEnv = container.resolve(CheckEnv);
|
|
51
|
+
checkEnv.requiredEnv = ["MISSING_ENV_VAR"];
|
|
52
|
+
try {
|
|
53
|
+
expect(await checkEnv.run()).toThrow(testError);
|
|
54
|
+
} catch (err) {
|
|
55
|
+
expect(`${err}`).toContain("process.exit");
|
|
56
|
+
expect(err).toBe(testError);
|
|
57
|
+
}
|
|
58
|
+
expect(mockLogService.error).toHaveBeenCalled();
|
|
59
|
+
mockExit.mockRestore();
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("should group environment issues into single error log", async () => {
|
|
63
|
+
const testError = new Error("process.exit called");
|
|
64
|
+
const mockExit = vi.spyOn(process, "exit").mockImplementation(() => {
|
|
65
|
+
throw testError;
|
|
66
|
+
});
|
|
67
|
+
const checkEnv = container.resolve(CheckEnv);
|
|
68
|
+
checkEnv.requiredEnv = ["MISSING_ENV_1", "MISSING_ENV_2", "MISSING_ENV_3"];
|
|
69
|
+
try {
|
|
70
|
+
await checkEnv.run();
|
|
71
|
+
} catch (err) {
|
|
72
|
+
expect(err).toBe(testError);
|
|
73
|
+
}
|
|
74
|
+
expect(mockLogService.error).toHaveBeenCalledOnce();
|
|
75
|
+
mockExit.mockRestore();
|
|
76
|
+
});
|
|
30
77
|
});
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-script-support-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"preferGlobal": true,
|
|
@@ -31,18 +31,18 @@
|
|
|
31
31
|
"pre-commit": "npx pretty-quick --staged && npm run lint"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@inquirer/prompts": "^8.4.
|
|
35
|
-
"@inquirer/search": "^4.1.
|
|
34
|
+
"@inquirer/prompts": "^8.4.2",
|
|
35
|
+
"@inquirer/search": "^4.1.8",
|
|
36
36
|
"chalk": "^4.1.2",
|
|
37
37
|
"commander": "^14.0.2",
|
|
38
|
-
"dotenv": "^17.2
|
|
38
|
+
"dotenv": "^17.4.2",
|
|
39
39
|
"figlet": "^1.9.4",
|
|
40
40
|
"immutable": "^5.1.4",
|
|
41
41
|
"inquirer-sortable-checkbox": "^1.0.1",
|
|
42
42
|
"lodash": "^4.18.1",
|
|
43
43
|
"node-persist": "^4.0.4",
|
|
44
44
|
"reflect-metadata": "^0.2.2",
|
|
45
|
-
"task-script-support": "^2.
|
|
45
|
+
"task-script-support": "^2.5.0",
|
|
46
46
|
"tsyringe": "^4.10.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
@@ -2,6 +2,7 @@ export declare class FileService {
|
|
|
2
2
|
getRunnerDir(): string;
|
|
3
3
|
join(path1: string, path2: string): string;
|
|
4
4
|
toRelativePath(fromPath: string, toPath: string): string;
|
|
5
|
+
ensurePosix(possiblyWindowsPath: string): string;
|
|
5
6
|
toFullPath(relativePath: string): string;
|
|
6
7
|
getFilename: (somePath: string) => string;
|
|
7
8
|
getFilenameNoExt(somePath: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-service.d.ts","sourceRoot":"./src/","sources":["src/services/file-service.ts"],"names":[],"mappings":"AAOA,qBACa,WAAW;IACtB,YAAY,IAAI,MAAM;IAItB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIjC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI/C,UAAU,CAAC,YAAY,EAAE,MAAM;IAI/B,WAAW,GAAI,UAAU,MAAM,YAA6B;IAC5D,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAKjC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IASxC,gBAAgB,IAAI,MAAM;IAa1B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAI3C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAI3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWlD,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,mBAAmB;CAiB5B"}
|
|
1
|
+
{"version":3,"file":"file-service.d.ts","sourceRoot":"./src/","sources":["src/services/file-service.ts"],"names":[],"mappings":"AAOA,qBACa,WAAW;IACtB,YAAY,IAAI,MAAM;IAItB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAIjC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI/C,WAAW,CAAC,mBAAmB,EAAE,MAAM;IAIvC,UAAU,CAAC,YAAY,EAAE,MAAM;IAI/B,WAAW,GAAI,UAAU,MAAM,YAA6B;IAC5D,gBAAgB,CAAC,QAAQ,EAAE,MAAM;IAKjC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE;IASxC,gBAAgB,IAAI,MAAM;IAa1B,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAI3C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAI3C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWlD,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,yBAAyB;IAejC,OAAO,CAAC,mBAAmB;CAiB5B"}
|
|
@@ -23,7 +23,10 @@ let FileService = class FileService {
|
|
|
23
23
|
return node_path_1.default.join(path1, path2);
|
|
24
24
|
}
|
|
25
25
|
toRelativePath(fromPath, toPath) {
|
|
26
|
-
return node_path_1.default.relative(fromPath, toPath);
|
|
26
|
+
return this.ensurePosix(node_path_1.default.relative(fromPath, toPath));
|
|
27
|
+
}
|
|
28
|
+
ensurePosix(possiblyWindowsPath) {
|
|
29
|
+
return node_path_1.default.posix.join(...possiblyWindowsPath.split("\\"));
|
|
27
30
|
}
|
|
28
31
|
toFullPath(relativePath) {
|
|
29
32
|
return node_path_1.default.resolve(relativePath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-service.js","sourceRoot":"./src/","sources":["src/services/file-service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kDAA0B;AAC1B,sDAAyB;AACzB,0DAA6B;AAC7B,uCAAqC;AAErC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;AAGtD,IAAM,WAAW,GAAjB,MAAM,WAAW;IACtB,YAAY;QACV,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,KAAa;QAC/B,OAAO,mBAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,MAAc;QAC7C,OAAO,mBAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"file-service.js","sourceRoot":"./src/","sources":["src/services/file-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,7 @@ const util_service_1 = require("../../services/util-service");
|
|
|
19
19
|
const file_service_1 = require("../../services/file-service");
|
|
20
20
|
const newProjectMessage = (dest) => `
|
|
21
21
|
Try:
|
|
22
|
-
cd ${dest} && npm i && npm start
|
|
22
|
+
cd ${dest} && npm i && npm start
|
|
23
23
|
`;
|
|
24
24
|
/**
|
|
25
25
|
* Prints the generated output results
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-script-support-cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"preferGlobal": true,
|
|
@@ -31,18 +31,18 @@
|
|
|
31
31
|
"pre-commit": "npx pretty-quick --staged && npm run lint"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@inquirer/prompts": "^8.4.
|
|
35
|
-
"@inquirer/search": "^4.1.
|
|
34
|
+
"@inquirer/prompts": "^8.4.2",
|
|
35
|
+
"@inquirer/search": "^4.1.8",
|
|
36
36
|
"chalk": "^4.1.2",
|
|
37
37
|
"commander": "^14.0.2",
|
|
38
|
-
"dotenv": "^17.2
|
|
38
|
+
"dotenv": "^17.4.2",
|
|
39
39
|
"figlet": "^1.9.4",
|
|
40
40
|
"immutable": "^5.1.4",
|
|
41
41
|
"inquirer-sortable-checkbox": "^1.0.1",
|
|
42
42
|
"lodash": "^4.18.1",
|
|
43
43
|
"node-persist": "^4.0.4",
|
|
44
44
|
"reflect-metadata": "^0.2.2",
|
|
45
|
-
"task-script-support": "^2.
|
|
45
|
+
"task-script-support": "^2.5.0",
|
|
46
46
|
"tsyringe": "^4.10.0"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
@@ -16,7 +16,11 @@ export class FileService {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
toRelativePath(fromPath: string, toPath: string) {
|
|
19
|
-
return path.relative(fromPath, toPath);
|
|
19
|
+
return this.ensurePosix(path.relative(fromPath, toPath));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
ensurePosix(possiblyWindowsPath: string) {
|
|
23
|
+
return path.posix.join(...possiblyWindowsPath.split("\\"));
|
|
20
24
|
}
|
|
21
25
|
|
|
22
26
|
toFullPath(relativePath: string) {
|