@flowscripter/dynamic-cli-framework 6.0.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/README.md +2 -0
  2. package/dist/index.d.ts +10 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +7 -2
  5. package/dist/src/cli/BaseCLI.d.ts +8 -0
  6. package/dist/src/cli/BaseCLI.d.ts.map +1 -1
  7. package/dist/src/cli/BaseCLI.js +37 -4
  8. package/dist/src/launcher.d.ts +3 -3
  9. package/dist/src/launcher.d.ts.map +1 -1
  10. package/dist/src/launcher.js +6 -4
  11. package/dist/src/runtime/lifecycle/PriorityTaskList.d.ts +22 -0
  12. package/dist/src/runtime/lifecycle/PriorityTaskList.d.ts.map +1 -0
  13. package/dist/src/runtime/lifecycle/PriorityTaskList.js +23 -0
  14. package/dist/src/runtime/runner.d.ts +15 -7
  15. package/dist/src/runtime/runner.d.ts.map +1 -1
  16. package/dist/src/runtime/runner.js +82 -53
  17. package/dist/src/service/configuration/ConfigurationServiceProvider.d.ts +26 -82
  18. package/dist/src/service/configuration/ConfigurationServiceProvider.d.ts.map +1 -1
  19. package/dist/src/service/configuration/ConfigurationServiceProvider.js +68 -163
  20. package/dist/src/service/configuration/DefaultKeyValueService.d.ts +6 -3
  21. package/dist/src/service/configuration/DefaultKeyValueService.d.ts.map +1 -1
  22. package/dist/src/service/configuration/DefaultKeyValueService.js +7 -24
  23. package/dist/src/service/configuration/DefaultSecretService.d.ts +1 -3
  24. package/dist/src/service/configuration/DefaultSecretService.d.ts.map +1 -1
  25. package/dist/src/service/configuration/DefaultSecretService.js +2 -10
  26. package/dist/src/service/configuration/KeyValueServiceProvider.d.ts +105 -0
  27. package/dist/src/service/configuration/KeyValueServiceProvider.d.ts.map +1 -0
  28. package/dist/src/service/configuration/KeyValueServiceProvider.js +201 -0
  29. package/dist/src/service/configuration/command/ConfigCommand.d.ts +4 -5
  30. package/dist/src/service/configuration/command/ConfigCommand.d.ts.map +1 -1
  31. package/dist/src/service/configuration/command/ConfigCommand.js +7 -6
  32. package/dist/src/service/configuration/command/DumpConfigCommand.d.ts +7 -3
  33. package/dist/src/service/configuration/command/DumpConfigCommand.d.ts.map +1 -1
  34. package/dist/src/service/configuration/command/DumpConfigCommand.js +10 -5
  35. package/dist/src/service/fetch/DefaultFetchService.d.ts +2 -2
  36. package/dist/src/service/fetch/DefaultFetchService.d.ts.map +1 -1
  37. package/dist/src/service/fetch/DefaultFetchService.js +17 -12
  38. package/dist/src/service/fetch/FetchServiceProvider.d.ts.map +1 -1
  39. package/dist/src/service/fetch/FetchServiceProvider.js +2 -3
  40. package/dist/src/service/printer/PrinterServiceProvider.d.ts.map +1 -1
  41. package/dist/src/service/printer/PrinterServiceProvider.js +11 -7
  42. package/dist/src/service/printer/command/DarkModeCommand.d.ts +3 -5
  43. package/dist/src/service/printer/command/DarkModeCommand.d.ts.map +1 -1
  44. package/dist/src/service/printer/command/DarkModeCommand.js +6 -6
  45. package/dist/src/service/printer/command/LogLevelCommand.d.ts +3 -5
  46. package/dist/src/service/printer/command/LogLevelCommand.d.ts.map +1 -1
  47. package/dist/src/service/printer/command/LogLevelCommand.js +9 -9
  48. package/dist/src/service/printer/command/NoColorCommand.d.ts +3 -5
  49. package/dist/src/service/printer/command/NoColorCommand.d.ts.map +1 -1
  50. package/dist/src/service/printer/command/NoColorCommand.js +6 -6
  51. package/dist/src/service/printer/command/NoHyperlinksCommand.d.ts +2 -4
  52. package/dist/src/service/printer/command/NoHyperlinksCommand.d.ts.map +1 -1
  53. package/dist/src/service/printer/command/NoHyperlinksCommand.js +5 -5
  54. package/dist/src/service/prompter/PrompterServiceProvider.js +1 -1
  55. package/dist/src/service/prompter/command/NoPromptCommand.d.ts +2 -4
  56. package/dist/src/service/prompter/command/NoPromptCommand.d.ts.map +1 -1
  57. package/dist/src/service/prompter/command/NoPromptCommand.js +5 -5
  58. package/dist/src/service/shutdown/DefaultShutdownService.d.ts +4 -3
  59. package/dist/src/service/shutdown/DefaultShutdownService.d.ts.map +1 -1
  60. package/dist/src/service/shutdown/DefaultShutdownService.js +4 -3
  61. package/dist/src/service/shutdown/ShutdownServiceProvider.js +2 -2
  62. package/dist/src/service/spawn/DefaultSpawnService.d.ts +2 -2
  63. package/dist/src/service/spawn/DefaultSpawnService.d.ts.map +1 -1
  64. package/dist/src/service/spawn/DefaultSpawnService.js +17 -14
  65. package/dist/src/service/spawn/SpawnServiceProvider.d.ts.map +1 -1
  66. package/dist/src/service/spawn/SpawnServiceProvider.js +1 -4
  67. package/dist/src/service/startup/DefaultStartupService.d.ts +10 -0
  68. package/dist/src/service/startup/DefaultStartupService.d.ts.map +1 -0
  69. package/dist/src/service/startup/DefaultStartupService.js +13 -0
  70. package/dist/src/service/startup/StartupServiceProvider.d.ts +17 -0
  71. package/dist/src/service/startup/StartupServiceProvider.d.ts.map +1 -0
  72. package/dist/src/service/startup/StartupServiceProvider.js +26 -0
  73. package/dist/src/service/upgrade/DefaultUpgradeService.d.ts +10 -4
  74. package/dist/src/service/upgrade/DefaultUpgradeService.d.ts.map +1 -1
  75. package/dist/src/service/upgrade/DefaultUpgradeService.js +156 -37
  76. package/dist/src/service/upgrade/UpgradeServiceProvider.d.ts +10 -0
  77. package/dist/src/service/upgrade/UpgradeServiceProvider.d.ts.map +1 -1
  78. package/dist/src/service/upgrade/UpgradeServiceProvider.js +25 -6
  79. package/dist/src/service/upgrade/command/UpgradeSubCommand.d.ts +0 -3
  80. package/dist/src/service/upgrade/command/UpgradeSubCommand.d.ts.map +1 -1
  81. package/dist/src/service/upgrade/command/UpgradeSubCommand.js +5 -13
  82. package/dist/src/startup/banner/bannerStartupTask.d.ts +17 -0
  83. package/dist/src/startup/banner/bannerStartupTask.d.ts.map +1 -0
  84. package/dist/src/startup/banner/bannerStartupTask.js +66 -0
  85. package/dist/src/{service → startup}/banner/command/NoBannerCommand.d.ts +8 -2
  86. package/dist/src/startup/banner/command/NoBannerCommand.d.ts.map +1 -0
  87. package/dist/src/{service → startup}/banner/command/NoBannerCommand.js +4 -4
  88. package/index.ts +19 -3
  89. package/package.json +7 -7
  90. package/src/cli/BaseCLI.ts +49 -3
  91. package/src/launcher.ts +7 -2
  92. package/src/runtime/lifecycle/PriorityTaskList.ts +34 -0
  93. package/src/runtime/runner.ts +106 -67
  94. package/src/service/configuration/ConfigurationServiceProvider.ts +80 -180
  95. package/src/service/configuration/DefaultKeyValueService.ts +8 -27
  96. package/src/service/configuration/DefaultSecretService.ts +3 -13
  97. package/src/service/configuration/KeyValueServiceProvider.ts +246 -0
  98. package/src/service/configuration/command/ConfigCommand.ts +12 -11
  99. package/src/service/configuration/command/DumpConfigCommand.ts +10 -9
  100. package/src/service/fetch/DefaultFetchService.ts +18 -12
  101. package/src/service/fetch/FetchServiceProvider.ts +2 -4
  102. package/src/service/printer/PrinterServiceProvider.ts +11 -7
  103. package/src/service/printer/command/DarkModeCommand.ts +7 -8
  104. package/src/service/printer/command/LogLevelCommand.ts +10 -11
  105. package/src/service/printer/command/NoColorCommand.ts +7 -8
  106. package/src/service/printer/command/NoHyperlinksCommand.ts +6 -7
  107. package/src/service/prompter/PrompterServiceProvider.ts +1 -1
  108. package/src/service/prompter/command/NoPromptCommand.ts +6 -7
  109. package/src/service/shutdown/DefaultShutdownService.ts +5 -4
  110. package/src/service/shutdown/ShutdownServiceProvider.ts +2 -2
  111. package/src/service/spawn/DefaultSpawnService.ts +18 -14
  112. package/src/service/spawn/SpawnServiceProvider.ts +1 -5
  113. package/src/service/startup/DefaultStartupService.ts +17 -0
  114. package/src/service/startup/StartupServiceProvider.ts +36 -0
  115. package/src/service/upgrade/DefaultUpgradeService.ts +202 -42
  116. package/src/service/upgrade/UpgradeServiceProvider.ts +31 -8
  117. package/src/service/upgrade/command/UpgradeSubCommand.ts +5 -15
  118. package/src/startup/banner/bannerStartupTask.ts +96 -0
  119. package/src/{service → startup}/banner/command/NoBannerCommand.ts +12 -5
  120. package/dist/src/service/banner/BannerServiceProvider.d.ts +0 -29
  121. package/dist/src/service/banner/BannerServiceProvider.d.ts.map +0 -1
  122. package/dist/src/service/banner/BannerServiceProvider.js +0 -69
  123. package/dist/src/service/banner/command/NoBannerCommand.d.ts.map +0 -1
  124. package/src/service/banner/BannerServiceProvider.ts +0 -89
@@ -2,15 +2,13 @@ import type { GlobalModifierCommand } from "@flowscripter/dynamic-cli-framework-
2
2
  import type { GlobalCommandArgument } from "@flowscripter/dynamic-cli-framework-api";
3
3
  import { type SingleValueType } from "@flowscripter/dynamic-cli-framework-api";
4
4
  import type { Context } from "@flowscripter/dynamic-cli-framework-api";
5
- import type PrinterServiceProvider from "../PrinterServiceProvider.ts";
6
5
  export default class NoHyperlinksCommand implements GlobalModifierCommand {
7
- #private;
8
6
  readonly name = "no-hyperlinks";
9
7
  readonly description = "Disable hyperlinks for output";
10
8
  readonly enableConfiguration = true;
11
9
  readonly argument: GlobalCommandArgument;
12
10
  readonly executePriority: number;
13
- constructor(printerServiceProvider: PrinterServiceProvider, executePriority: number);
14
- execute(_context: Context, argumentValue: SingleValueType): Promise<void>;
11
+ constructor(executePriority: number);
12
+ execute(context: Context, argumentValue: SingleValueType): Promise<void>;
15
13
  }
16
14
  //# sourceMappingURL=NoHyperlinksCommand.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NoHyperlinksCommand.d.ts","sourceRoot":"","sources":["../../../../../src/service/printer/command/NoHyperlinksCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,yCAAyC,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,sBAAsB,MAAM,8BAA8B,CAAC;AAEvE,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,qBAAqB;;IACvE,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAItC;IACF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAIjC,YAAmB,sBAAsB,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,EAGzF;IAEM,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/E;CACF"}
1
+ {"version":3,"file":"NoHyperlinksCommand.d.ts","sourceRoot":"","sources":["../../../../../src/service/printer/command/NoHyperlinksCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,yCAAyC,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,qBAAqB;IACvE,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAItC;IACF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC,YAAmB,eAAe,EAAE,MAAM,EAEzC;IAEM,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { ValueTypeName } from "@flowscripter/dynamic-cli-framework-api";
2
+ import { PRINTER_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
3
  export default class NoHyperlinksCommand {
3
4
  name = "no-hyperlinks";
4
5
  description = "Disable hyperlinks for output";
@@ -9,13 +10,12 @@ export default class NoHyperlinksCommand {
9
10
  configurationKey: "NO_HYPERLINKS",
10
11
  };
11
12
  executePriority;
12
- #printerServiceProvider;
13
- constructor(printerServiceProvider, executePriority) {
14
- this.#printerServiceProvider = printerServiceProvider;
13
+ constructor(executePriority) {
15
14
  this.executePriority = executePriority;
16
15
  }
17
- execute(_context, argumentValue) {
18
- this.#printerServiceProvider.printerService.hyperlinksEnabled = !argumentValue;
16
+ execute(context, argumentValue) {
17
+ const printerService = context.getServiceById(PRINTER_SERVICE_ID);
18
+ printerService.hyperlinksEnabled = !argumentValue;
19
19
  return Promise.resolve();
20
20
  }
21
21
  }
@@ -11,7 +11,7 @@ export default class PrompterServiceProvider {
11
11
  getServiceInfo(_cliConfig) {
12
12
  return Promise.resolve({
13
13
  service: this.prompterService,
14
- commands: [new NoPromptCommand(this, this.servicePriority)],
14
+ commands: [new NoPromptCommand(this.servicePriority)],
15
15
  });
16
16
  }
17
17
  initService(_context) {
@@ -2,15 +2,13 @@ import type { GlobalModifierCommand } from "@flowscripter/dynamic-cli-framework-
2
2
  import type { GlobalCommandArgument } from "@flowscripter/dynamic-cli-framework-api";
3
3
  import { type SingleValueType } from "@flowscripter/dynamic-cli-framework-api";
4
4
  import type { Context } from "@flowscripter/dynamic-cli-framework-api";
5
- import type PrompterServiceProvider from "../PrompterServiceProvider.ts";
6
5
  export default class NoPromptCommand implements GlobalModifierCommand {
7
- #private;
8
6
  readonly name = "no-prompt";
9
7
  readonly description = "Disable interactive prompting";
10
8
  readonly enableConfiguration = true;
11
9
  readonly argument: GlobalCommandArgument;
12
10
  readonly executePriority: number;
13
- constructor(prompterServiceProvider: PrompterServiceProvider, executePriority: number);
14
- execute(_context: Context, argumentValue: SingleValueType): Promise<void>;
11
+ constructor(executePriority: number);
12
+ execute(context: Context, argumentValue: SingleValueType): Promise<void>;
15
13
  }
16
14
  //# sourceMappingURL=NoPromptCommand.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NoPromptCommand.d.ts","sourceRoot":"","sources":["../../../../../src/service/prompter/command/NoPromptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,yCAAyC,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,uBAAuB,MAAM,+BAA+B,CAAC;AAEzE,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,qBAAqB;;IACnE,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAItC;IACF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAIjC,YAAmB,uBAAuB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,EAG3F;IAEM,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/E;CACF"}
1
+ {"version":3,"file":"NoPromptCommand.d.ts","sourceRoot":"","sources":["../../../../../src/service/prompter/command/NoPromptCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AACrF,OAAO,EAAE,KAAK,eAAe,EAAiB,MAAM,yCAAyC,CAAC;AAC9F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAIvE,MAAM,CAAC,OAAO,OAAO,eAAgB,YAAW,qBAAqB;IACnE,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CAAC,WAAW,mCAAmC;IACvD,QAAQ,CAAC,mBAAmB,QAAQ;IACpC,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,CAItC;IACF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAEjC,YAAmB,eAAe,EAAE,MAAM,EAEzC;IAEM,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAK9E;CACF"}
@@ -1,4 +1,5 @@
1
1
  import { ValueTypeName } from "@flowscripter/dynamic-cli-framework-api";
2
+ import { PROMPTER_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
3
  export default class NoPromptCommand {
3
4
  name = "no-prompt";
4
5
  description = "Disable interactive prompting";
@@ -9,13 +10,12 @@ export default class NoPromptCommand {
9
10
  configurationKey: "NO_PROMPT",
10
11
  };
11
12
  executePriority;
12
- #prompterServiceProvider;
13
- constructor(prompterServiceProvider, executePriority) {
14
- this.#prompterServiceProvider = prompterServiceProvider;
13
+ constructor(executePriority) {
15
14
  this.executePriority = executePriority;
16
15
  }
17
- execute(_context, argumentValue) {
18
- this.#prompterServiceProvider.prompterService.promptEnabled = !argumentValue;
16
+ execute(context, argumentValue) {
17
+ const prompterService = context.getServiceById(PROMPTER_SERVICE_ID);
18
+ prompterService.promptEnabled = !argumentValue;
19
19
  return Promise.resolve();
20
20
  }
21
21
  }
@@ -1,7 +1,8 @@
1
- import type { ShutdownService } from "@flowscripter/dynamic-cli-framework-api";
1
+ import type { ShutdownService, ShutdownTask } from "@flowscripter/dynamic-cli-framework-api";
2
+ import PriorityTaskList from "../../runtime/lifecycle/PriorityTaskList.ts";
2
3
  export default class DefaultShutdownService implements ShutdownService {
3
- static readonly callbacks: Array<() => Promise<void>>;
4
- addShutdownListener(callback: () => Promise<void>): void;
4
+ static readonly taskList: PriorityTaskList<ShutdownTask>;
5
+ registerTask(task: ShutdownTask): void;
5
6
  enterLongRunningMode(): void;
6
7
  leaveLongRunningMode(): void;
7
8
  get isShutdownRequested(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultShutdownService.d.ts","sourceRoot":"","sources":["../../../../src/service/shutdown/DefaultShutdownService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAG/E,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,eAAe;IACpE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM;IAE3D,mBAAmB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAEvD;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,IAAI,mBAAmB,IAAI,OAAO,CAEjC;CACF"}
1
+ {"version":3,"file":"DefaultShutdownService.d.ts","sourceRoot":"","sources":["../../../../src/service/shutdown/DefaultShutdownService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,gBAAgB,MAAM,6CAA6C,CAAC;AAG3E,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,eAAe;IACpE,MAAM,CAAC,QAAQ,CAAC,QAAQ,iCAAwC;IAEhE,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAErC;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,oBAAoB,IAAI,IAAI,CAE3B;IAED,IAAI,mBAAmB,IAAI,OAAO,CAEjC;CACF"}
@@ -1,8 +1,9 @@
1
+ import PriorityTaskList from "../../runtime/lifecycle/PriorityTaskList.js";
1
2
  import { shutdownState } from "./ShutdownState.js";
2
3
  export default class DefaultShutdownService {
3
- static callbacks = [];
4
- addShutdownListener(callback) {
5
- DefaultShutdownService.callbacks.push(callback);
4
+ static taskList = new PriorityTaskList();
5
+ registerTask(task) {
6
+ DefaultShutdownService.taskList.add(task);
6
7
  }
7
8
  enterLongRunningMode() {
8
9
  shutdownState.longRunningMode = true;
@@ -49,8 +49,8 @@ export default class ShutdownServiceProvider {
49
49
  process.removeListener("beforeExit", ShutdownServiceProvider.shutdown);
50
50
  process.removeListener("SIGINT", ShutdownServiceProvider.onInterrupt);
51
51
  process.removeListener("SIGTERM", ShutdownServiceProvider.onTerminate);
52
- for await (const callback of DefaultShutdownService.callbacks) {
53
- await callback();
52
+ for (const task of DefaultShutdownService.taskList.sorted()) {
53
+ await task.run();
54
54
  }
55
55
  }
56
56
  catch (error) {
@@ -1,4 +1,4 @@
1
- import type { PrinterService, ShutdownService, SpawnOptions, SpawnResult, SpawnService } from "@flowscripter/dynamic-cli-framework-api";
1
+ import type { Context, SpawnOptions, SpawnResult, SpawnService } from "@flowscripter/dynamic-cli-framework-api";
2
2
  /**
3
3
  * On Windows, batch-file shims (e.g. `npm.cmd`, `bun.cmd`) cannot be launched directly via
4
4
  * `CreateProcess` - they must be run through `cmd.exe /c`. Resolve the command through the shell
@@ -7,7 +7,7 @@ import type { PrinterService, ShutdownService, SpawnOptions, SpawnResult, SpawnS
7
7
  export declare function resolveForPlatform(command: ReadonlyArray<string>): string[];
8
8
  export default class DefaultSpawnService implements SpawnService {
9
9
  #private;
10
- setDependencies(printerService: PrinterService, shutdownService: ShutdownService): void;
10
+ setContext(context: Context): void;
11
11
  spawn(command: ReadonlyArray<string>, options?: SpawnOptions): Promise<SpawnResult>;
12
12
  }
13
13
  //# sourceMappingURL=DefaultSpawnService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultSpawnService.d.ts","sourceRoot":"","sources":["../../../../src/service/spawn/DefaultSpawnService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EACf,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,yCAAyC,CAAC;AAOjD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAa3E;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,YAAY;;IAIvD,eAAe,CAAC,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CAG7F;IA+CY,KAAK,CAChB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAC9B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAsFtB;CACF"}
1
+ {"version":3,"file":"DefaultSpawnService.d.ts","sourceRoot":"","sources":["../../../../src/service/spawn/DefaultSpawnService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EAGP,YAAY,EACZ,WAAW,EACX,YAAY,EACb,MAAM,yCAAyC,CAAC;AAQjD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAa3E;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,YAAY;;IAGvD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAExC;IA+CY,KAAK,CAChB,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,EAC9B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA0FtB;CACF"}
@@ -1,4 +1,5 @@
1
1
  import process from "node:process";
2
+ import { PRINTER_SERVICE_ID, SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
3
  import getLogger from "../../util/logger.js";
3
4
  const logger = getLogger("DefaultSpawnService");
4
5
  const SHUTDOWN_GRACE_PERIOD_MS = 5000;
@@ -22,11 +23,9 @@ export function resolveForPlatform(command) {
22
23
  return ["cmd.exe", "/d", "/s", "/c", resolved, ...args];
23
24
  }
24
25
  export default class DefaultSpawnService {
25
- #printerService;
26
- #shutdownService;
27
- setDependencies(printerService, shutdownService) {
28
- this.#printerService = printerService;
29
- this.#shutdownService = shutdownService;
26
+ #context;
27
+ setContext(context) {
28
+ this.#context = context;
30
29
  }
31
30
  async #terminate(proc, command) {
32
31
  logger.debug(() => `Sending SIGTERM to spawned command '${command.join(" ")}'`);
@@ -65,11 +64,11 @@ export default class DefaultSpawnService {
65
64
  }
66
65
  }
67
66
  async spawn(command, options = {}) {
68
- if (this.#printerService === undefined || this.#shutdownService === undefined) {
69
- throw new Error("DefaultSpawnService.spawn() called before setDependencies()");
67
+ if (this.#context === undefined) {
68
+ throw new Error("DefaultSpawnService.spawn() called before setContext()");
70
69
  }
71
- const printerService = this.#printerService;
72
- const shutdownService = this.#shutdownService;
70
+ const printerService = this.#context.getServiceById(PRINTER_SERVICE_ID);
71
+ const shutdownService = this.#context.getServiceById(SHUTDOWN_SERVICE_ID);
73
72
  const mode = options.mode ?? "inherit";
74
73
  const longRunning = options.longRunning ?? true;
75
74
  if (mode === "inherit") {
@@ -93,11 +92,15 @@ export default class DefaultSpawnService {
93
92
  if (longRunning) {
94
93
  shutdownService.enterLongRunningMode();
95
94
  }
96
- shutdownService.addShutdownListener(async () => {
97
- if (settled) {
98
- return;
99
- }
100
- await this.#terminate(proc, command);
95
+ shutdownService.registerTask({
96
+ id: `spawn:${command.join(" ")}`,
97
+ priority: 0,
98
+ run: async () => {
99
+ if (settled) {
100
+ return;
101
+ }
102
+ await this.#terminate(proc, command);
103
+ },
101
104
  });
102
105
  // These are intentionally not awaited here - they only complete once the child's stdout/
103
106
  // stderr streams reach EOF, which can happen slightly after proc.exited resolves. They are
@@ -1 +1 @@
1
- {"version":3,"file":"SpawnServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/spawn/SpawnServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,eAAe;;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAoB;IAC9C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAGjC,YAAmB,eAAe,EAAE,MAAM,EAEzC;IAEM,cAAc,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAMjE;IAEM,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlD;CACF"}
1
+ {"version":3,"file":"SpawnServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/spawn/SpawnServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,eAAe;;IAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAoB;IAC9C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAGjC,YAAmB,eAAe,EAAE,MAAM,EAEzC;IAEM,cAAc,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAMjE;IAEM,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlD;CACF"}
@@ -1,4 +1,3 @@
1
- import { PRINTER_SERVICE_ID, SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
1
  import { SPAWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
3
2
  import DefaultSpawnService from "./DefaultSpawnService.js";
4
3
  export default class SpawnServiceProvider {
@@ -16,9 +15,7 @@ export default class SpawnServiceProvider {
16
15
  });
17
16
  }
18
17
  initService(context) {
19
- const printerService = context.getServiceById(PRINTER_SERVICE_ID);
20
- const shutdownService = context.getServiceById(SHUTDOWN_SERVICE_ID);
21
- this.#spawnService.setDependencies(printerService, shutdownService);
18
+ this.#spawnService.setContext(context);
22
19
  return Promise.resolve();
23
20
  }
24
21
  }
@@ -0,0 +1,10 @@
1
+ import type { StartupService, StartupTask } from "@flowscripter/dynamic-cli-framework-api";
2
+ export default class DefaultStartupService implements StartupService {
3
+ #private;
4
+ registerTask(task: StartupTask): void;
5
+ /**
6
+ * Return all registered {@link StartupTask} instances, in descending priority order.
7
+ */
8
+ getTasks(): ReadonlyArray<StartupTask>;
9
+ }
10
+ //# sourceMappingURL=DefaultStartupService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DefaultStartupService.d.ts","sourceRoot":"","sources":["../../../../src/service/startup/DefaultStartupService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAG3F,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,cAAc;;IAG3D,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAE3C;IAED;;OAEG;IACI,QAAQ,IAAI,aAAa,CAAC,WAAW,CAAC,CAE5C;CACF"}
@@ -0,0 +1,13 @@
1
+ import PriorityTaskList from "../../runtime/lifecycle/PriorityTaskList.js";
2
+ export default class DefaultStartupService {
3
+ #taskList = new PriorityTaskList();
4
+ registerTask(task) {
5
+ this.#taskList.add(task);
6
+ }
7
+ /**
8
+ * Return all registered {@link StartupTask} instances, in descending priority order.
9
+ */
10
+ getTasks() {
11
+ return this.#taskList.sorted();
12
+ }
13
+ }
@@ -0,0 +1,17 @@
1
+ import type { CLIConfig, Context, ServiceInfo, ServiceProvider } from "@flowscripter/dynamic-cli-framework-api";
2
+ import DefaultStartupService from "./DefaultStartupService.ts";
3
+ /**
4
+ * Minimal internal {@link ServiceProvider} which registers a {@link DefaultStartupService} in the
5
+ * {@link Context}. There is no natural per-provider work for this service to do on init - tasks
6
+ * registered against it are run by the {@link run} orchestration loop directly, not via
7
+ * {@link initService}.
8
+ */
9
+ export default class StartupServiceProvider implements ServiceProvider {
10
+ readonly serviceId: string;
11
+ readonly servicePriority: number;
12
+ readonly startupService: DefaultStartupService;
13
+ constructor(servicePriority: number);
14
+ getServiceInfo(_cliConfig: CLIConfig): Promise<ServiceInfo>;
15
+ initService(_context: Context): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=StartupServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StartupServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/startup/StartupServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,WAAW,EACX,eAAe,EAChB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,eAAe;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAsB;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAE/C,YAAmB,eAAe,EAAE,MAAM,EAGzC;IAEM,cAAc,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAKjE;IAEM,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnD;CACF"}
@@ -0,0 +1,26 @@
1
+ import { STARTUP_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
+ import DefaultStartupService from "./DefaultStartupService.js";
3
+ /**
4
+ * Minimal internal {@link ServiceProvider} which registers a {@link DefaultStartupService} in the
5
+ * {@link Context}. There is no natural per-provider work for this service to do on init - tasks
6
+ * registered against it are run by the {@link run} orchestration loop directly, not via
7
+ * {@link initService}.
8
+ */
9
+ export default class StartupServiceProvider {
10
+ serviceId = STARTUP_SERVICE_ID;
11
+ servicePriority;
12
+ startupService;
13
+ constructor(servicePriority) {
14
+ this.servicePriority = servicePriority;
15
+ this.startupService = new DefaultStartupService();
16
+ }
17
+ getServiceInfo(_cliConfig) {
18
+ return Promise.resolve({
19
+ service: this.startupService,
20
+ commands: [],
21
+ });
22
+ }
23
+ initService(_context) {
24
+ return Promise.resolve();
25
+ }
26
+ }
@@ -1,13 +1,19 @@
1
- import type { CLIConfig, FetchService, PrinterService, SpawnService, UpgradeCheckResult, UpgradeResult } from "@flowscripter/dynamic-cli-framework-api";
1
+ import type { CLIConfig, Context, UpgradeCheckResult, UpgradeResult } from "@flowscripter/dynamic-cli-framework-api";
2
2
  import { InstallMethod, SupportedArch, SupportedOs, type UpgradeService } from "@flowscripter/dynamic-cli-framework-api";
3
3
  import type { UpgradeLocationsConfig } from "./UpgradeLocationsConfig.ts";
4
- export declare const VERSION_CHECK_TIMEOUT_MS = 250;
4
+ export declare const UPGRADE_CHECK_CACHE_KEY = "upgrade-check-result";
5
5
  export declare function describeUpgradeCheckResult(result: UpgradeCheckResult): string;
6
6
  export default class DefaultUpgradeService implements UpgradeService {
7
7
  #private;
8
8
  constructor(config: UpgradeLocationsConfig, cliConfig: CLIConfig);
9
- setDependencies(spawnService: SpawnService | undefined, fetchService: FetchService | undefined, printerService: PrinterService | undefined): void;
10
- getUpgradeCheckResult(waitForResult?: boolean): Promise<UpgradeCheckResult>;
9
+ setContext(context: Context): void;
10
+ getUpgradeCheckResult(): Promise<UpgradeCheckResult>;
11
+ /**
12
+ * Run (or reuse an in-flight/cached) {@link getUpgradeCheckResult}, then persist a "checked" or
13
+ * "unsupported" result to {@link UPGRADE_CHECK_CACHE_KEY} so the banner task's cheap KV read can
14
+ * pick it up on a later invocation.
15
+ */
16
+ refreshUpgradeCheckCache(): Promise<UpgradeCheckResult>;
11
17
  detectOs(): SupportedOs | undefined;
12
18
  detectArch(): SupportedArch | undefined;
13
19
  detectInstallMethod(os: SupportedOs): Promise<InstallMethod | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultUpgradeService.d.ts","sourceRoot":"","sources":["../../../../src/service/upgrade/DefaultUpgradeService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EAEd,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACd,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,aAAa,EACb,aAAa,EACb,WAAW,EACX,KAAK,cAAc,EACpB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAS1E,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAY5C,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAI7E;AAQD,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,cAAc;;IAQlE,YAAmB,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAGtE;IAEM,eAAe,CACpB,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,cAAc,EAAE,cAAc,GAAG,SAAS,GACzC,IAAI,CAIN;IAoCM,qBAAqB,CAAC,aAAa,UAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0B/E;IAEM,QAAQ,IAAI,WAAW,GAAG,SAAS,CAWzC;IAEM,UAAU,IAAI,aAAa,GAAG,SAAS,CAS7C;IAEY,mBAAmB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAcpF;IAEY,eAAe,CAC1B,UAAU,CAAC,EAAE,WAAW,EACxB,YAAY,CAAC,EAAE,aAAa,EAC5B,qBAAqB,CAAC,EAAE,aAAa,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;IAEY,OAAO,CAClB,UAAU,CAAC,EAAE,WAAW,EACxB,YAAY,CAAC,EAAE,aAAa,EAC5B,qBAAqB,CAAC,EAAE,aAAa,GACpC,OAAO,CAAC,aAAa,CAAC,CAsDxB;CAiRF"}
1
+ {"version":3,"file":"DefaultUpgradeService.d.ts","sourceRoot":"","sources":["../../../../src/service/upgrade/DefaultUpgradeService.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EAOP,kBAAkB,EAClB,aAAa,EAEd,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAEL,aAAa,EAIb,aAAa,EACb,WAAW,EACX,KAAK,cAAc,EACpB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAuC1E,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAY9D,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAI7E;AAQD,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,cAAc;;IAMlE,YAAmB,MAAM,EAAE,sBAAsB,EAAE,SAAS,EAAE,SAAS,EAGtE;IAEM,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAExC;IA4DM,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAe1D;IAED;;;;OAIG;IACU,wBAAwB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CASnE;IAEM,QAAQ,IAAI,WAAW,GAAG,SAAS,CAWzC;IAEM,UAAU,IAAI,aAAa,GAAG,SAAS,CAS7C;IAEY,mBAAmB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAsCpF;IA2CY,eAAe,CAC1B,UAAU,CAAC,EAAE,WAAW,EACxB,YAAY,CAAC,EAAE,aAAa,EAC5B,qBAAqB,CAAC,EAAE,aAAa,GACpC,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;IAEY,OAAO,CAClB,UAAU,CAAC,EAAE,WAAW,EACxB,YAAY,CAAC,EAAE,aAAa,EAC5B,qBAAqB,CAAC,EAAE,aAAa,GACpC,OAAO,CAAC,aAAa,CAAC,CAkDxB;CAwTF"}