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.
Files changed (29) hide show
  1. package/assets/yargs-template/task-runner/README.md +1 -1
  2. package/assets/yargs-template/task-runner/package-lock.json +11 -11
  3. package/assets/yargs-template/task-runner/package.json +2 -2
  4. package/assets/yargs-template/task-runner/src/commands/help-command.ts +8 -0
  5. package/assets/yargs-template/task-runner/src/index.ts +8 -1
  6. package/assets/yargs-template/task-runner/src/tasks/show-help.ts +19 -0
  7. package/assets/yargs-template/task-runner/src/types/state.ts +3 -0
  8. package/assets/yargs-template/task-runner/src/wrappers/concurrent-task-group.ts +17 -0
  9. package/assets/yargs-template/task-runner/src/wrappers/sequential-task-group.ts +17 -0
  10. package/assets/yargs-template/task-runner/tests/tasks/check-env.test.ts +56 -9
  11. package/dist/assets/yargs-template/task-runner/README.md +1 -1
  12. package/dist/assets/yargs-template/task-runner/package-lock.json +11 -11
  13. package/dist/assets/yargs-template/task-runner/package.json +2 -2
  14. package/dist/assets/yargs-template/task-runner/src/commands/help-command.ts +8 -0
  15. package/dist/assets/yargs-template/task-runner/src/index.ts +8 -1
  16. package/dist/assets/yargs-template/task-runner/src/tasks/show-help.ts +19 -0
  17. package/dist/assets/yargs-template/task-runner/src/types/state.ts +3 -0
  18. package/dist/assets/yargs-template/task-runner/src/wrappers/concurrent-task-group.ts +17 -0
  19. package/dist/assets/yargs-template/task-runner/src/wrappers/sequential-task-group.ts +17 -0
  20. package/dist/assets/yargs-template/task-runner/tests/tasks/check-env.test.ts +56 -9
  21. package/dist/package.json +5 -5
  22. package/dist/src/services/file-service.d.ts +1 -0
  23. package/dist/src/services/file-service.d.ts.map +1 -1
  24. package/dist/src/services/file-service.js +4 -1
  25. package/dist/src/services/file-service.js.map +1 -1
  26. package/dist/src/tasks/stdout/print-generated-results.js +1 -1
  27. package/package.json +5 -5
  28. package/src/services/file-service.ts +5 -1
  29. package/src/tasks/stdout/print-generated-results.ts +1 -1
@@ -3,7 +3,7 @@
3
3
  To get started, first run `npm install`, then:
4
4
 
5
5
  ```
6
- npm start -- --help
6
+ npm start
7
7
  ```
8
8
 
9
9
  ### Building the project
@@ -10,11 +10,11 @@
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "chalk": "^4.1.2",
13
- "dotenv": "^17.2.3",
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.3.0",
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.3.1",
1337
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz",
1338
- "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==",
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.8",
2467
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
2468
- "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
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.3.2",
2842
- "resolved": "https://registry.npmjs.org/task-script-support/-/task-script-support-2.3.2.tgz",
2843
- "integrity": "sha512-7q9xmr76iESQun1d/73TOnlacnRJTaV0D+XdcGcILT9AjkdCZXg8F45f6VbFJ9f26gBITe6+MLIe9mhJr2ooQw==",
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.3",
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.3.0",
35
+ "task-script-support": "^2.5.0",
36
36
  "tsyringe": "^4.10.0",
37
37
  "yargs": "^18.0.0"
38
38
  },
@@ -0,0 +1,8 @@
1
+ import { singleton } from "tsyringe";
2
+ import { Command } from "../wrappers/command";
3
+ import ShowHelp from "../tasks/show-help";
4
+
5
+ @singleton()
6
+ export class HelpCommand extends Command {
7
+ tasks = [ShowHelp];
8
+ }
@@ -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
- yargs(hideBin(process.argv))
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
- it("should set environmentValidated to true", async () => {
9
- const mockLogService = {
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
- const mockCommandService = {
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
- const checkEnv = Object.create(CheckEnv.prototype);
21
- checkEnv._commandService = mockCommandService;
22
- checkEnv._logService = mockLogService;
23
- checkEnv.state = { id: "test", args: [], data: {} };
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.info).toHaveBeenCalledWith(
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
  });
@@ -3,7 +3,7 @@
3
3
  To get started, first run `npm install`, then:
4
4
 
5
5
  ```
6
- npm start -- --help
6
+ npm start
7
7
  ```
8
8
 
9
9
  ### Building the project
@@ -10,11 +10,11 @@
10
10
  "license": "ISC",
11
11
  "dependencies": {
12
12
  "chalk": "^4.1.2",
13
- "dotenv": "^17.2.3",
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.3.0",
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.3.1",
1337
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz",
1338
- "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==",
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.8",
2467
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
2468
- "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
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.3.2",
2842
- "resolved": "https://registry.npmjs.org/task-script-support/-/task-script-support-2.3.2.tgz",
2843
- "integrity": "sha512-7q9xmr76iESQun1d/73TOnlacnRJTaV0D+XdcGcILT9AjkdCZXg8F45f6VbFJ9f26gBITe6+MLIe9mhJr2ooQw==",
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.3",
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.3.0",
35
+ "task-script-support": "^2.5.0",
36
36
  "tsyringe": "^4.10.0",
37
37
  "yargs": "^18.0.0"
38
38
  },
@@ -0,0 +1,8 @@
1
+ import { singleton } from "tsyringe";
2
+ import { Command } from "../wrappers/command";
3
+ import ShowHelp from "../tasks/show-help";
4
+
5
+ @singleton()
6
+ export class HelpCommand extends Command {
7
+ tasks = [ShowHelp];
8
+ }
@@ -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
- yargs(hideBin(process.argv))
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
- it("should set environmentValidated to true", async () => {
9
- const mockLogService = {
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
- const mockCommandService = {
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
- const checkEnv = Object.create(CheckEnv.prototype);
21
- checkEnv._commandService = mockCommandService;
22
- checkEnv._logService = mockLogService;
23
- checkEnv.state = { id: "test", args: [], data: {} };
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.info).toHaveBeenCalledWith(
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.12",
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.1",
35
- "@inquirer/search": "^4.1.7",
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.3",
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.3.0",
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":"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"}
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 -- help
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.12",
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.1",
35
- "@inquirer/search": "^4.1.7",
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.3",
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.3.0",
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) {
@@ -6,7 +6,7 @@ import { FileService } from "../../services/file-service";
6
6
 
7
7
  const newProjectMessage = (dest: string) => `
8
8
  Try:
9
- cd ${dest} && npm i && npm start -- help
9
+ cd ${dest} && npm i && npm start
10
10
  `;
11
11
 
12
12
  /**