@flowscripter/dynamic-cli-framework 7.0.9 → 7.0.11

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 (40) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/src/cli/BaseCLI.d.ts.map +1 -1
  5. package/dist/src/cli/BaseCLI.js +18 -22
  6. package/dist/src/runtime/lifecycle/priorities.d.ts +50 -0
  7. package/dist/src/runtime/lifecycle/priorities.d.ts.map +1 -0
  8. package/dist/src/runtime/lifecycle/priorities.js +49 -0
  9. package/dist/src/service/configuration/KeyValueServiceProvider.d.ts +1 -2
  10. package/dist/src/service/configuration/KeyValueServiceProvider.d.ts.map +1 -1
  11. package/dist/src/service/configuration/KeyValueServiceProvider.js +3 -5
  12. package/dist/src/service/fetch/DefaultFetchService.d.ts.map +1 -1
  13. package/dist/src/service/fetch/DefaultFetchService.js +2 -1
  14. package/dist/src/service/printer/DefaultPrinterService.js +1 -1
  15. package/dist/src/service/printer/PrinterServiceProvider.d.ts.map +1 -1
  16. package/dist/src/service/printer/PrinterServiceProvider.js +2 -1
  17. package/dist/src/service/printer/terminal/Quote.js +1 -1
  18. package/dist/src/service/spawn/DefaultSpawnService.d.ts.map +1 -1
  19. package/dist/src/service/spawn/DefaultSpawnService.js +2 -1
  20. package/dist/src/service/upgrade/DefaultUpgradeService.js +1 -1
  21. package/dist/src/service/upgrade/UpgradeServiceProvider.d.ts +15 -0
  22. package/dist/src/service/upgrade/UpgradeServiceProvider.d.ts.map +1 -1
  23. package/dist/src/service/upgrade/UpgradeServiceProvider.js +32 -3
  24. package/dist/src/startup/banner/bannerStartupTask.d.ts +5 -5
  25. package/dist/src/startup/banner/bannerStartupTask.js +5 -5
  26. package/dist/src/startup/banner/command/NoBannerCommand.d.ts +1 -1
  27. package/index.ts +20 -0
  28. package/package.json +1 -1
  29. package/src/cli/BaseCLI.ts +60 -21
  30. package/src/runtime/lifecycle/priorities.ts +67 -0
  31. package/src/service/configuration/KeyValueServiceProvider.ts +3 -5
  32. package/src/service/fetch/DefaultFetchService.ts +2 -1
  33. package/src/service/printer/DefaultPrinterService.ts +1 -1
  34. package/src/service/printer/PrinterServiceProvider.ts +2 -1
  35. package/src/service/printer/terminal/Quote.ts +1 -1
  36. package/src/service/spawn/DefaultSpawnService.ts +2 -1
  37. package/src/service/upgrade/DefaultUpgradeService.ts +1 -1
  38. package/src/service/upgrade/UpgradeServiceProvider.ts +37 -3
  39. package/src/startup/banner/bannerStartupTask.ts +5 -5
  40. package/src/startup/banner/command/NoBannerCommand.ts +1 -1
package/dist/index.d.ts CHANGED
@@ -120,6 +120,7 @@ export { PLUGIN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
120
120
  export type { PluginService } from "@flowscripter/dynamic-cli-framework-api";
121
121
  export { default as PluginServiceProvider } from "./src/service/plugin/PluginServiceProvider.ts";
122
122
  export { default as BaseCLI } from "./src/cli/BaseCLI.ts";
123
+ export { SHUTDOWN_SERVICE_PRIORITY, STARTUP_SERVICE_PRIORITY, CONFIGURATION_SERVICE_PRIORITY, KEY_VALUE_SERVICE_PRIORITY, PRINTER_SERVICE_PRIORITY, PROMPTER_SERVICE_PRIORITY, TABLE_GENERATOR_SERVICE_PRIORITY, ARGUMENT_PROMPTER_SERVICE_PRIORITY, SPAWN_SERVICE_PRIORITY, FETCH_SERVICE_PRIORITY, UPGRADE_SERVICE_PRIORITY, UPGRADE_CHECK_STARTUP_TASK_PRIORITY, IMAGE_PRINTER_SERVICE_PRIORITY, PLUGIN_SERVICE_PRIORITY, AUTO_UPGRADE_STARTUP_TASK_PRIORITY, COMPLETION_SERVICE_PRIORITY, CLEANUP_SHUTDOWN_TASK_PRIORITY, KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY, } from "./src/runtime/lifecycle/priorities.ts";
123
124
  export { default as DefaultRuntimeCLI } from "./src/cli/DefaultRuntimeCLI.ts";
124
125
  export type { default as Terminal } from "./src/terminal/Terminal.ts";
125
126
  export type { default as Styler } from "./src/terminal/Styler.ts";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -74,6 +74,7 @@ export { PLUGIN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
74
74
  export { default as PluginServiceProvider } from "./src/service/plugin/PluginServiceProvider.js";
75
75
  // Core CLI
76
76
  export { default as BaseCLI } from "./src/cli/BaseCLI.js";
77
+ export { SHUTDOWN_SERVICE_PRIORITY, STARTUP_SERVICE_PRIORITY, CONFIGURATION_SERVICE_PRIORITY, KEY_VALUE_SERVICE_PRIORITY, PRINTER_SERVICE_PRIORITY, PROMPTER_SERVICE_PRIORITY, TABLE_GENERATOR_SERVICE_PRIORITY, ARGUMENT_PROMPTER_SERVICE_PRIORITY, SPAWN_SERVICE_PRIORITY, FETCH_SERVICE_PRIORITY, UPGRADE_SERVICE_PRIORITY, UPGRADE_CHECK_STARTUP_TASK_PRIORITY, IMAGE_PRINTER_SERVICE_PRIORITY, PLUGIN_SERVICE_PRIORITY, AUTO_UPGRADE_STARTUP_TASK_PRIORITY, COMPLETION_SERVICE_PRIORITY, CLEANUP_SHUTDOWN_TASK_PRIORITY, KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY, } from "./src/runtime/lifecycle/priorities.js";
77
78
  export { default as DefaultRuntimeCLI } from "./src/cli/DefaultRuntimeCLI.js";
78
79
  export { SpecialKey } from "./src/terminal/KeyReader.js";
79
80
  export { default as TtyKeyReader } from "./src/terminal/TtyKeyReader.js";
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCLI.d.ts","sourceRoot":"","sources":["../../../src/cli/BaseCLI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yCAAyC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAGvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAS3E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AAGpD,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AAkBpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,OAAO,OAAO,OAAQ,YAAW,GAAG;;IAazC,YACE,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,cAAc,EACpC,oBAAoB,EAAE,cAAc,EACpC,aAAa,EAAE,OAAO,EACtB,aAAa,EAAE,OAAO,EACtB,cAAc,EAAE,QAAQ,EACxB,cAAc,EAAE,QAAQ,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,OAAO,CAAC,EAAE,qBAAqB,EAoEhC;IAED;;;;;;;OAOG;IACI,kBAAkB,CAAC,eAAe,EAAE,eAAe,QAEzD;IAED;;;;;;;;OAQG;IACH;;;;;OAKG;IACI,cAAc,CAAC,IAAI,EAAE,WAAW,QAEtC;IAEM,UAAU,CAAC,OAAO,EAAE,OAAO,QAQjC;IAEK,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAwOzD;CACF"}
1
+ {"version":3,"file":"BaseCLI.d.ts","sourceRoot":"","sources":["../../../src/cli/BaseCLI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yCAAyC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAGvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAS3E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,QAAQ,MAAM,yBAAyB,CAAC;AAGpD,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,KAAK,SAAS,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAC;AAqCpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,CAAC,OAAO,OAAO,OAAQ,YAAW,GAAG;;IAazC,YACE,SAAS,EAAE,SAAS,EACpB,oBAAoB,EAAE,cAAc,EACpC,oBAAoB,EAAE,cAAc,EACpC,aAAa,EAAE,OAAO,EACtB,aAAa,EAAE,OAAO,EACtB,cAAc,EAAE,QAAQ,EACxB,cAAc,EAAE,QAAQ,EACxB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,OAAO,CAAC,EAAE,qBAAqB,EAkEhC;IAED;;;;;;;OAOG;IACI,kBAAkB,CAAC,eAAe,EAAE,eAAe,QAEzD;IAED;;;;;;;;OAQG;IACH;;;;;OAKG;IACI,cAAc,CAAC,IAAI,EAAE,WAAW,QAEtC;IAEM,UAAU,CAAC,OAAO,EAAE,OAAO,QAQjC;IAEK,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CA8PzD;CACF"}
@@ -29,8 +29,9 @@ import CompletionServiceProvider from "../service/completion/CompletionServicePr
29
29
  import ImagePrinterServiceProvider from "../service/imagePrinter/ImagePrinterServiceProvider.js";
30
30
  import SpawnServiceProvider from "../service/spawn/SpawnServiceProvider.js";
31
31
  import FetchServiceProvider from "../service/fetch/FetchServiceProvider.js";
32
- import UpgradeServiceProvider, { createUpgradeCheckStartupTask, } from "../service/upgrade/UpgradeServiceProvider.js";
32
+ import UpgradeServiceProvider, { createAutoUpgradeStartupTask, createUpgradeCheckStartupTask, } from "../service/upgrade/UpgradeServiceProvider.js";
33
33
  import PluginServiceProvider from "../service/plugin/PluginServiceProvider.js";
34
+ import { ARGUMENT_PROMPTER_SERVICE_PRIORITY, AUTO_UPGRADE_STARTUP_TASK_PRIORITY, COMPLETION_SERVICE_PRIORITY, CONFIGURATION_SERVICE_PRIORITY, FETCH_SERVICE_PRIORITY, IMAGE_PRINTER_SERVICE_PRIORITY, KEY_VALUE_SERVICE_PRIORITY, PLUGIN_SERVICE_PRIORITY, PRINTER_SERVICE_PRIORITY, PROMPTER_SERVICE_PRIORITY, SHUTDOWN_SERVICE_PRIORITY, SPAWN_SERVICE_PRIORITY, STARTUP_SERVICE_PRIORITY, TABLE_GENERATOR_SERVICE_PRIORITY, UPGRADE_CHECK_STARTUP_TASK_PRIORITY, UPGRADE_SERVICE_PRIORITY, } from "../runtime/lifecycle/priorities.js";
34
35
  const logger = getLogger("BaseCLI");
35
36
  /**
36
37
  * Base implementation of a {@link CLI}.
@@ -128,9 +129,7 @@ export default class BaseCLI {
128
129
  this.#commandRegistry = new DefaultCommandRegistry([], commandValidator);
129
130
  // create a context
130
131
  this.#context = new DefaultContext(this.#cliConfig);
131
- // priority 95 sits between shutdown (100) and configuration (90) - it has no ordering
132
- // dependency on anything since its own initService() is a no-op.
133
- this.#startupServiceProvider = new StartupServiceProvider(95);
132
+ this.#startupServiceProvider = new StartupServiceProvider(STARTUP_SERVICE_PRIORITY);
134
133
  this.#stdoutTerminal = stdoutTerminal;
135
134
  this.#printerService = new DefaultPrinterService(stdoutWritableStream, stderrWritableStream, stdoutIsColor, stderrIsColor, stdoutTerminal, stderrTerminal, styler);
136
135
  }
@@ -182,10 +181,10 @@ export default class BaseCLI {
182
181
  throw new Error("If only one command is added, it must be a global command, sub-command, or group command!");
183
182
  }
184
183
  // create and add core services
185
- this.addServiceProvider(new ShutdownServiceProvider(100));
184
+ this.addServiceProvider(new ShutdownServiceProvider(SHUTDOWN_SERVICE_PRIORITY));
186
185
  this.addServiceProvider(this.#startupServiceProvider);
187
- this.addServiceProvider(new PrinterServiceProvider(80, this.#printerService));
188
- this.addServiceProvider(new TableGeneratorServiceProvider(70));
186
+ this.addServiceProvider(new PrinterServiceProvider(PRINTER_SERVICE_PRIORITY, this.#printerService));
187
+ this.addServiceProvider(new TableGeneratorServiceProvider(TABLE_GENERATOR_SERVICE_PRIORITY));
189
188
  const canPrompt = this.#keyReader !== undefined && this.#stderrTerminal.isTty();
190
189
  if (this.#options.promptingEnabled && !canPrompt) {
191
190
  throw new Error("promptingEnabled requires a keyReader and a TTY stderr terminal");
@@ -194,7 +193,7 @@ export default class BaseCLI {
194
193
  if (canPrompt) {
195
194
  prompterService = new DefaultPrompterService(DEFAULT_PROMPTER_CONFIG, this.#stderrTerminal, this.#keyReader, this.#printerService);
196
195
  prompterService.promptEnabled = this.#options.promptingEnabled;
197
- this.addServiceProvider(new PrompterServiceProvider(75, prompterService));
196
+ this.addServiceProvider(new PrompterServiceProvider(PROMPTER_SERVICE_PRIORITY, prompterService));
198
197
  }
199
198
  else {
200
199
  logger.debug(() => `Skipping PrompterServiceProvider: keyReader present: ${this.#keyReader !== undefined}, stderr isTty: ${this.#stderrTerminal.isTty()}`);
@@ -202,7 +201,7 @@ export default class BaseCLI {
202
201
  if (this.#options.argumentPrompterServiceEnabled) {
203
202
  if (prompterService !== undefined) {
204
203
  const argumentPrompterService = new DefaultArgumentPrompterService(prompterService);
205
- this.addServiceProvider(new ArgumentPrompterServiceProvider(65, argumentPrompterService));
204
+ this.addServiceProvider(new ArgumentPrompterServiceProvider(ARGUMENT_PROMPTER_SERVICE_PRIORITY, argumentPrompterService));
206
205
  }
207
206
  else {
208
207
  logger.debug("Skipping ArgumentPrompterServiceProvider: argumentPrompterServiceEnabled is true but prompting is unavailable");
@@ -210,7 +209,7 @@ export default class BaseCLI {
210
209
  }
211
210
  if (this.#options.imagePrinterServiceEnabled) {
212
211
  if (this.#stdoutTerminal.isTty()) {
213
- this.addServiceProvider(new ImagePrinterServiceProvider(55, this.#stdoutTerminal));
212
+ this.addServiceProvider(new ImagePrinterServiceProvider(IMAGE_PRINTER_SERVICE_PRIORITY, this.#stdoutTerminal));
214
213
  }
215
214
  else {
216
215
  logger.debug("Skipping ImagePrinterServiceProvider: imagePrinterServiceEnabled is true but stdout is not a TTY");
@@ -219,30 +218,26 @@ export default class BaseCLI {
219
218
  // The plugin service routes package manager output through SpawnService so that it is
220
219
  // quoted, marked and cleared on success; enabling plugins therefore also enables spawning.
221
220
  if (this.#options.spawnServiceEnabled || this.#options.pluginServiceEnabled) {
222
- this.addServiceProvider(new SpawnServiceProvider(58));
221
+ this.addServiceProvider(new SpawnServiceProvider(SPAWN_SERVICE_PRIORITY));
223
222
  }
224
223
  if (this.#options.fetchServiceEnabled) {
225
- this.addServiceProvider(new FetchServiceProvider(57));
224
+ this.addServiceProvider(new FetchServiceProvider(FETCH_SERVICE_PRIORITY));
226
225
  }
227
226
  if (this.#options.completionServiceEnabled) {
228
227
  const completionService = new DefaultCompletionService();
229
- this.addServiceProvider(new CompletionServiceProvider(5, completionService, this.#commandRegistry));
228
+ this.addServiceProvider(new CompletionServiceProvider(COMPLETION_SERVICE_PRIORITY, completionService, this.#commandRegistry));
230
229
  }
231
230
  let upgradeServiceProvider;
232
231
  if (this.#options.upgradeServiceEnabled) {
233
- // 56 runs after Spawn(58)/Fetch(57) - whose dependencies it needs
234
- // but before the consumer-configured Banner/Plugin(50) priority band.
235
- upgradeServiceProvider = new UpgradeServiceProvider(56, this.#options.upgradeLocationsConfig);
232
+ upgradeServiceProvider = new UpgradeServiceProvider(UPGRADE_SERVICE_PRIORITY, this.#options.upgradeLocationsConfig);
236
233
  this.addServiceProvider(upgradeServiceProvider);
237
234
  }
238
235
  if (this.#options.pluginServiceEnabled) {
239
- this.addServiceProvider(new PluginServiceProvider(50, this.#options.pluginServiceRemoteConfig, this.#options.pluginServiceLocalConfig, this.#commandRegistry, this.#serviceProviderRegistry));
236
+ this.addServiceProvider(new PluginServiceProvider(PLUGIN_SERVICE_PRIORITY, this.#options.pluginServiceRemoteConfig, this.#options.pluginServiceLocalConfig, this.#commandRegistry, this.#serviceProviderRegistry));
240
237
  }
241
- const configurationServiceProvider = new ConfigurationServiceProvider(90, this.#options.envVarsSupportEnabled, this.#options.configFileSupportEnabled, this.#options.secretServiceEnabled);
238
+ const configurationServiceProvider = new ConfigurationServiceProvider(CONFIGURATION_SERVICE_PRIORITY, this.#options.envVarsSupportEnabled, this.#options.configFileSupportEnabled, this.#options.secretServiceEnabled);
242
239
  this.addServiceProvider(configurationServiceProvider);
243
- // priority 89 sits just below ConfigurationServiceProvider's 90 - its config-file read
244
- // happens in its own initService(), before KeyValueServiceProvider's initService() runs.
245
- const keyValueServiceProvider = new KeyValueServiceProvider(89, configurationServiceProvider, this.#options.keyValueServiceEnabled, this.#options.secretServiceEnabled);
240
+ const keyValueServiceProvider = new KeyValueServiceProvider(KEY_VALUE_SERVICE_PRIORITY, configurationServiceProvider, this.#options.keyValueServiceEnabled, this.#options.secretServiceEnabled);
246
241
  this.addServiceProvider(keyValueServiceProvider);
247
242
  for (const serviceProvider of this.#serviceProviderRegistry.getServiceProviders()) {
248
243
  const serviceInfo = await serviceProvider.getServiceInfo(this.#cliConfig);
@@ -254,7 +249,8 @@ export default class BaseCLI {
254
249
  });
255
250
  }
256
251
  if (upgradeServiceProvider?.upgradeService) {
257
- this.addStartupTask(createUpgradeCheckStartupTask(upgradeServiceProvider.upgradeService, 56));
252
+ this.addStartupTask(createUpgradeCheckStartupTask(upgradeServiceProvider.upgradeService, UPGRADE_CHECK_STARTUP_TASK_PRIORITY));
253
+ this.addStartupTask(createAutoUpgradeStartupTask(upgradeServiceProvider, AUTO_UPGRADE_STARTUP_TASK_PRIORITY));
258
254
  }
259
255
  // directly-registered StartupTasks (e.g. the banner task) aren't backed by a ServiceProvider,
260
256
  // so their modifierCommands need to be added to the command registry here instead, keyed by
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Priorities of the framework's built-in service providers, startup tasks and shutdown tasks.
3
+ * Higher values run earlier (see {@link sortByPriority}). Service provider priorities also order
4
+ * their `initService()` calls within the startup sequence: when a provider and a directly
5
+ * registered startup task share a priority, the provider runs first.
6
+ *
7
+ * Consumer service providers and startup tasks (e.g. the banner task) choose their own
8
+ * priorities relative to these.
9
+ */
10
+ /** Shutdown service provider: first, so signal handling is in place before anything else. */
11
+ export declare const SHUTDOWN_SERVICE_PRIORITY = 100;
12
+ /** Startup service provider: no ordering dependency, as its `initService()` is a no-op. */
13
+ export declare const STARTUP_SERVICE_PRIORITY = 95;
14
+ /** Configuration service provider: reads the config file in its `initService()`. */
15
+ export declare const CONFIGURATION_SERVICE_PRIORITY = 90;
16
+ /** Key-value service provider: just below configuration, whose config-file read it depends on. */
17
+ export declare const KEY_VALUE_SERVICE_PRIORITY = 89;
18
+ /** Printer service provider. */
19
+ export declare const PRINTER_SERVICE_PRIORITY = 80;
20
+ /** Prompter service provider. */
21
+ export declare const PROMPTER_SERVICE_PRIORITY = 75;
22
+ /** Table generator service provider. */
23
+ export declare const TABLE_GENERATOR_SERVICE_PRIORITY = 70;
24
+ /** Argument prompter service provider: below the prompter it uses. */
25
+ export declare const ARGUMENT_PROMPTER_SERVICE_PRIORITY = 65;
26
+ /** Spawn service provider. */
27
+ export declare const SPAWN_SERVICE_PRIORITY = 58;
28
+ /** Fetch service provider. */
29
+ export declare const FETCH_SERVICE_PRIORITY = 57;
30
+ /** Upgrade service provider: below the spawn and fetch services it uses. */
31
+ export declare const UPGRADE_SERVICE_PRIORITY = 56;
32
+ /** Background startup task which refreshes the cached upgrade check result. */
33
+ export declare const UPGRADE_CHECK_STARTUP_TASK_PRIORITY = 56;
34
+ /** Image printer service provider. */
35
+ export declare const IMAGE_PRINTER_SERVICE_PRIORITY = 55;
36
+ /** Plugin service provider. */
37
+ export declare const PLUGIN_SERVICE_PRIORITY = 50;
38
+ /**
39
+ * Startup task which prompts to enable automatic upgrades and performs them. It runs below
40
+ * consumer startup tasks such as the banner (typically 45 or more) and above the completion
41
+ * prompt.
42
+ */
43
+ export declare const AUTO_UPGRADE_STARTUP_TASK_PRIORITY = 10;
44
+ /** Completion service provider, whose `initService()` prompts to enable shell completion. */
45
+ export declare const COMPLETION_SERVICE_PRIORITY = 5;
46
+ /** Shutdown tasks which clean up in-flight work (spinners, progress bars, spawns, fetches). */
47
+ export declare const CLEANUP_SHUTDOWN_TASK_PRIORITY = 0;
48
+ /** Shutdown task which flushes key-value data to the config file, after all other cleanup. */
49
+ export declare const KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY = -100;
50
+ //# sourceMappingURL=priorities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"priorities.d.ts","sourceRoot":"","sources":["../../../../src/runtime/lifecycle/priorities.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,6FAA6F;AAC7F,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,oFAAoF;AACpF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,kGAAkG;AAClG,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,gCAAgC;AAChC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,iCAAiC;AACjC,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,wCAAwC;AACxC,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,sEAAsE;AACtE,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAErD,8BAA8B;AAC9B,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,8BAA8B;AAC9B,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,+EAA+E;AAC/E,eAAO,MAAM,mCAAmC,KAAK,CAAC;AAEtD,sCAAsC;AACtC,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,+BAA+B;AAC/B,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,KAAK,CAAC;AAErD,6FAA6F;AAC7F,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,+FAA+F;AAC/F,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD,8FAA8F;AAC9F,eAAO,MAAM,sCAAsC,OAAO,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Priorities of the framework's built-in service providers, startup tasks and shutdown tasks.
3
+ * Higher values run earlier (see {@link sortByPriority}). Service provider priorities also order
4
+ * their `initService()` calls within the startup sequence: when a provider and a directly
5
+ * registered startup task share a priority, the provider runs first.
6
+ *
7
+ * Consumer service providers and startup tasks (e.g. the banner task) choose their own
8
+ * priorities relative to these.
9
+ */
10
+ /** Shutdown service provider: first, so signal handling is in place before anything else. */
11
+ export const SHUTDOWN_SERVICE_PRIORITY = 100;
12
+ /** Startup service provider: no ordering dependency, as its `initService()` is a no-op. */
13
+ export const STARTUP_SERVICE_PRIORITY = 95;
14
+ /** Configuration service provider: reads the config file in its `initService()`. */
15
+ export const CONFIGURATION_SERVICE_PRIORITY = 90;
16
+ /** Key-value service provider: just below configuration, whose config-file read it depends on. */
17
+ export const KEY_VALUE_SERVICE_PRIORITY = 89;
18
+ /** Printer service provider. */
19
+ export const PRINTER_SERVICE_PRIORITY = 80;
20
+ /** Prompter service provider. */
21
+ export const PROMPTER_SERVICE_PRIORITY = 75;
22
+ /** Table generator service provider. */
23
+ export const TABLE_GENERATOR_SERVICE_PRIORITY = 70;
24
+ /** Argument prompter service provider: below the prompter it uses. */
25
+ export const ARGUMENT_PROMPTER_SERVICE_PRIORITY = 65;
26
+ /** Spawn service provider. */
27
+ export const SPAWN_SERVICE_PRIORITY = 58;
28
+ /** Fetch service provider. */
29
+ export const FETCH_SERVICE_PRIORITY = 57;
30
+ /** Upgrade service provider: below the spawn and fetch services it uses. */
31
+ export const UPGRADE_SERVICE_PRIORITY = 56;
32
+ /** Background startup task which refreshes the cached upgrade check result. */
33
+ export const UPGRADE_CHECK_STARTUP_TASK_PRIORITY = 56;
34
+ /** Image printer service provider. */
35
+ export const IMAGE_PRINTER_SERVICE_PRIORITY = 55;
36
+ /** Plugin service provider. */
37
+ export const PLUGIN_SERVICE_PRIORITY = 50;
38
+ /**
39
+ * Startup task which prompts to enable automatic upgrades and performs them. It runs below
40
+ * consumer startup tasks such as the banner (typically 45 or more) and above the completion
41
+ * prompt.
42
+ */
43
+ export const AUTO_UPGRADE_STARTUP_TASK_PRIORITY = 10;
44
+ /** Completion service provider, whose `initService()` prompts to enable shell completion. */
45
+ export const COMPLETION_SERVICE_PRIORITY = 5;
46
+ /** Shutdown tasks which clean up in-flight work (spinners, progress bars, spawns, fetches). */
47
+ export const CLEANUP_SHUTDOWN_TASK_PRIORITY = 0;
48
+ /** Shutdown task which flushes key-value data to the config file, after all other cleanup. */
49
+ export const KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY = -100;
@@ -103,8 +103,7 @@ export default class KeyValueServiceProvider implements ServiceProvider {
103
103
  * interface: `runner.ts` applies this same scoping to every `ServiceProvider`'s `initService()`
104
104
  * call (scope "service"), and `PluginServiceProvider.initService()` relies on casting its
105
105
  * received `context` to `DefaultContext` to register services discovered from plugins at
106
- * runtime - a capability every `ServiceProvider` already had before this scoping was
107
- * introduced, since `initService()` always received the real `DefaultContext` directly.
106
+ * runtime.
108
107
  */
109
108
  getContextForScope(context: Context, scopeType: KeyValueServiceScopeType, scopeKey: string): Context;
110
109
  initService(context: Context): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"KeyValueServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/configuration/KeyValueServiceProvider.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;AACzE,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,yCAAyC,CAAC;AAIjD,OAAO,KAAK,4BAA4B,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AA+BlF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,eAAe;;IACrE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAwB;IAClD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAIjC,SAAgB,sBAAsB,EAAE,OAAO,CAAC;IAChD,SAAgB,oBAAoB,EAAE,OAAO,CAAC;IAW9C;;;;;;;;OAQG;IACH,YACE,eAAe,EAAE,MAAM,EACvB,4BAA4B,EAAE,4BAA4B,EAC1D,sBAAsB,UAAQ,EAC9B,oBAAoB,UAAQ,EAY7B;IAEM,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAUhE;IAED;;;;;;;;;;OAUG;IACI,wBAAwB,CAC7B,SAAS,EAAE,wBAAwB,EACnC,QAAQ,EAAE,MAAM,GACf,eAAe,CAsBjB;IAED;;;;;;;;;;;;;;;OAeG;IACI,kBAAkB,CACvB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,wBAAwB,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAaT;IAeY,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxD;CACF"}
1
+ {"version":3,"file":"KeyValueServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/configuration/KeyValueServiceProvider.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;AACzE,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,yCAAyC,CAAC;AAIjD,OAAO,KAAK,4BAA4B,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAgClF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,YAAW,eAAe;;IACrE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAwB;IAClD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAIjC,SAAgB,sBAAsB,EAAE,OAAO,CAAC;IAChD,SAAgB,oBAAoB,EAAE,OAAO,CAAC;IAW9C;;;;;;;;OAQG;IACH,YACE,eAAe,EAAE,MAAM,EACvB,4BAA4B,EAAE,4BAA4B,EAC1D,sBAAsB,UAAQ,EAC9B,oBAAoB,UAAQ,EAY7B;IAEM,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAUhE;IAED;;;;;;;;;;OAUG;IACI,wBAAwB,CAC7B,SAAS,EAAE,wBAAwB,EACnC,QAAQ,EAAE,MAAM,GACf,eAAe,CAsBjB;IAED;;;;;;;;;;;;;;OAcG;IACI,kBAAkB,CACvB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,wBAAwB,EACnC,QAAQ,EAAE,MAAM,GACf,OAAO,CAaT;IAeY,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CASxD;CACF"}
@@ -1,6 +1,7 @@
1
1
  import { KEY_VALUE_SERVICE_ID, SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
2
  import DefaultKeyValueService from "./DefaultKeyValueService.js";
3
3
  import DefaultSecretService from "./DefaultSecretService.js";
4
+ import { KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.js";
4
5
  /**
5
6
  * Registered under {@link KEY_VALUE_SERVICE_ID} in the plain, undecorated {@link Context} purely
6
7
  * so {@link Context.doesServiceExist} reports correctly - every real access goes through a
@@ -167,8 +168,7 @@ export default class KeyValueServiceProvider {
167
168
  * interface: `runner.ts` applies this same scoping to every `ServiceProvider`'s `initService()`
168
169
  * call (scope "service"), and `PluginServiceProvider.initService()` relies on casting its
169
170
  * received `context` to `DefaultContext` to register services discovered from plugins at
170
- * runtime - a capability every `ServiceProvider` already had before this scoping was
171
- * introduced, since `initService()` always received the real `DefaultContext` directly.
171
+ * runtime.
172
172
  */
173
173
  getContextForScope(context, scopeType, scopeKey) {
174
174
  if (!this.keyValueServiceEnabled && !this.secretServiceEnabled) {
@@ -199,9 +199,7 @@ export default class KeyValueServiceProvider {
199
199
  const shutdownService = context.getServiceById(SHUTDOWN_SERVICE_ID);
200
200
  shutdownService.registerTask({
201
201
  id: `${KEY_VALUE_SERVICE_ID}-flush`,
202
- // low priority - shutdown tasks run in descending priority order, so this runs after
203
- // other shutdown cleanup (which defaults to priority 0).
204
- priority: -100,
202
+ priority: KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY,
205
203
  run: () => this.#flushDirtyScopes(),
206
204
  });
207
205
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultFetchService.d.ts","sourceRoot":"","sources":["../../../../src/service/fetch/DefaultFetchService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,YAAY,EAEb,MAAM,yCAAyC,CAAC;AAMjD,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,YAAY;;IAGvD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAExC;IAEY,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyCrF;CACF"}
1
+ {"version":3,"file":"DefaultFetchService.d.ts","sourceRoot":"","sources":["../../../../src/service/fetch/DefaultFetchService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,YAAY,EAEb,MAAM,yCAAyC,CAAC;AAOjD,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,YAAY;;IAGvD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAExC;IAEY,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyCrF;CACF"}
@@ -1,5 +1,6 @@
1
1
  import { SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
2
2
  import getLogger from "../../util/logger.js";
3
+ import { CLEANUP_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.js";
3
4
  const logger = getLogger("DefaultFetchService");
4
5
  export default class DefaultFetchService {
5
6
  #context;
@@ -26,7 +27,7 @@ export default class DefaultFetchService {
26
27
  shutdownService.enterLongRunningMode();
27
28
  shutdownService.registerTask({
28
29
  id: `fetch:${input.toString()}`,
29
- priority: 0,
30
+ priority: CLEANUP_SHUTDOWN_TASK_PRIORITY,
30
31
  run: async () => {
31
32
  if (settled) {
32
33
  return;
@@ -29,7 +29,7 @@ export default class DefaultPrinterService {
29
29
  // <reset>". Checking endsWith("\n") on the styled text is then always false, so the
30
30
  // subtraction below never fires and every such line is over-counted by one - which, summed
31
31
  // across every write in a marked region, causes clearMarked() to erase far more physical
32
- // rows than were actually written (see #150).
32
+ // rows than were actually written.
33
33
  const stripped = Bun.stripANSI(message);
34
34
  return stripped.split("\n").length - (stripped.endsWith("\n") ? 1 : 0);
35
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PrinterServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/printer/PrinterServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAK9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE;;GAEG;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,cAAc,CAAC;IAExC;;;;;OAKG;IACH,YAAmB,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAGzE;IAEM,cAAc,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAUjE;IAED,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3C;CACF"}
1
+ {"version":3,"file":"PrinterServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/printer/PrinterServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAEvE,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAK9E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE;;GAEG;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,cAAc,CAAC;IAExC;;;;;OAKG;IACH,YAAmB,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAGzE;IAEM,cAAc,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAUjE;IAED,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3C;CACF"}
@@ -4,6 +4,7 @@ import DarkModeCommand from "./command/DarkModeCommand.js";
4
4
  import NoColorCommand from "./command/NoColorCommand.js";
5
5
  import NoHyperlinksCommand from "./command/NoHyperlinksCommand.js";
6
6
  import { SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
7
+ import { CLEANUP_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.js";
7
8
  /**
8
9
  * Provides a {@link PrinterService}.
9
10
  */
@@ -36,7 +37,7 @@ export default class PrinterServiceProvider {
36
37
  const shutdownService = context.getServiceById(SHUTDOWN_SERVICE_ID);
37
38
  shutdownService.registerTask({
38
39
  id: PRINTER_SERVICE_ID,
39
- priority: 0,
40
+ priority: CLEANUP_SHUTDOWN_TASK_PRIORITY,
40
41
  run: async () => {
41
42
  await this.printerService.hideSpinner();
42
43
  await this.printerService.hideAllProgressBars();
@@ -47,7 +47,7 @@ export default class Quote {
47
47
  // *after* that newline (e.g. "foo\n" -> "<color>foo\n<reset>"). Naively checking
48
48
  // endsWith("\n") on such styled text is always false, and splitting on "\n" then treats the
49
49
  // trailing reset sequence as a spurious extra line, which gets its own quote prefix -
50
- // rendering as if two quote levels were active for a single actual line (see #150). Every
50
+ // rendering as if two quote levels were active for a single actual line. Every
51
51
  // line gets re-colored below regardless, so strip all existing ANSI upfront rather than
52
52
  // trying to preserve and restore it.
53
53
  const body = Bun.stripANSI(message);
@@ -1 +1 @@
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
+ {"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;AASjD;;;;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,6 +1,7 @@
1
1
  import process from "node:process";
2
2
  import { PRINTER_SERVICE_ID, SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
3
3
  import getLogger from "../../util/logger.js";
4
+ import { CLEANUP_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.js";
4
5
  const logger = getLogger("DefaultSpawnService");
5
6
  const SHUTDOWN_GRACE_PERIOD_MS = 5000;
6
7
  /**
@@ -94,7 +95,7 @@ export default class DefaultSpawnService {
94
95
  }
95
96
  shutdownService.registerTask({
96
97
  id: `spawn:${command.join(" ")}`,
97
- priority: 0,
98
+ priority: CLEANUP_SHUTDOWN_TASK_PRIORITY,
98
99
  run: async () => {
99
100
  if (settled) {
100
101
  return;
@@ -329,7 +329,7 @@ export default class DefaultUpgradeService {
329
329
  // Homebrew relinks a formula's installed binary from its Cellar directory into a `bin/` symlink,
330
330
  // so resolving the running executable's real path confirms a homebrew install without spawning
331
331
  // `brew`, which has a slow cold start - avoiding it keeps the background upgrade-check
332
- // StartupTask (see UpgradeServiceProvider) fast even though it now runs to completion.
332
+ // StartupTask (see UpgradeServiceProvider) fast even though it runs to completion.
333
333
  #isRunningFromHomebrewCellar(formula) {
334
334
  let realExecutable = process.execPath;
335
335
  try {
@@ -11,6 +11,13 @@ import type { StartupTask } from "@flowscripter/dynamic-cli-framework-api";
11
11
  * regular blocking init task) so it can run in `"background"` mode.
12
12
  */
13
13
  export declare function createUpgradeCheckStartupTask(upgradeService: DefaultUpgradeService, priority: number): StartupTask;
14
+ /**
15
+ * Build the blocking {@link StartupTask} which offers to enable automatic upgrades and, when they
16
+ * are enabled, checks for and installs a newer version (see
17
+ * {@link UpgradeServiceProvider.runAutoUpgrade}). It is registered separately from the provider's
18
+ * own init task so it can run at a lower priority, after consumer startup tasks such as the banner.
19
+ */
20
+ export declare function createAutoUpgradeStartupTask(provider: UpgradeServiceProvider, priority: number): StartupTask;
14
21
  export default class UpgradeServiceProvider implements ServiceProvider {
15
22
  #private;
16
23
  readonly serviceId: string;
@@ -19,5 +26,13 @@ export default class UpgradeServiceProvider implements ServiceProvider {
19
26
  get upgradeService(): DefaultUpgradeService | undefined;
20
27
  getServiceInfo(cliConfig: CLIConfig): Promise<ServiceInfo>;
21
28
  initService(context: Context): Promise<void>;
29
+ /**
30
+ * Offer to enable automatic upgrades (storing the answer as `upgrade-status` in the upgrade
31
+ * service's scope) and, when they are enabled, check for and install a newer version. Must be
32
+ * called after {@link initService}.
33
+ *
34
+ * @param context the startup task's context, used to look up the Prompter and Printer services.
35
+ */
36
+ runAutoUpgrade(context: Context): Promise<void>;
22
37
  }
23
38
  //# sourceMappingURL=UpgradeServiceProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UpgradeServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/upgrade/UpgradeServiceProvider.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;AAYzE,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAI3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,qBAAqB,EACrC,QAAQ,EAAE,MAAM,GACf,WAAW,CASb;AAED,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,eAAe;;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAsB;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAKjC,YAAmB,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAGzE;IAED,IAAW,cAAc,IAAI,qBAAqB,GAAG,SAAS,CAE7D;IAEM,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAOhE;IAEY,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqFxD;CAoCF"}
1
+ {"version":3,"file":"UpgradeServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/upgrade/UpgradeServiceProvider.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;AAYzE,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yCAAyC,CAAC;AAI3E;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,qBAAqB,EACrC,QAAQ,EAAE,MAAM,GACf,WAAW,CASb;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,sBAAsB,EAChC,QAAQ,EAAE,MAAM,GACf,WAAW,CAOb;AAED,MAAM,CAAC,OAAO,OAAO,sBAAuB,YAAW,eAAe;;IACpE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAsB;IAChD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAMjC,YAAmB,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAGzE;IAED,IAAW,cAAc,IAAI,qBAAqB,GAAG,SAAS,CAE7D;IAEM,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAOhE;IAEM,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBlD;IAED;;;;;;OAMG;IACU,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqE3D;CAoCF"}
@@ -24,12 +24,27 @@ export function createUpgradeCheckStartupTask(upgradeService, priority) {
24
24
  },
25
25
  };
26
26
  }
27
+ /**
28
+ * Build the blocking {@link StartupTask} which offers to enable automatic upgrades and, when they
29
+ * are enabled, checks for and installs a newer version (see
30
+ * {@link UpgradeServiceProvider.runAutoUpgrade}). It is registered separately from the provider's
31
+ * own init task so it can run at a lower priority, after consumer startup tasks such as the banner.
32
+ */
33
+ export function createAutoUpgradeStartupTask(provider, priority) {
34
+ return {
35
+ id: `${UPGRADE_SERVICE_ID}-auto-upgrade`,
36
+ priority,
37
+ mode: "blocking",
38
+ run: (context) => provider.runAutoUpgrade(context),
39
+ };
40
+ }
27
41
  export default class UpgradeServiceProvider {
28
42
  serviceId = UPGRADE_SERVICE_ID;
29
43
  servicePriority;
30
44
  #config;
31
45
  #upgradeService;
32
46
  #cliConfig;
47
+ #keyValueService;
33
48
  constructor(servicePriority, config) {
34
49
  this.servicePriority = servicePriority;
35
50
  this.#config = config;
@@ -45,9 +60,8 @@ export default class UpgradeServiceProvider {
45
60
  commands: [new UpgradeSubCommand()],
46
61
  });
47
62
  }
48
- async initService(context) {
63
+ initService(context) {
49
64
  const upgradeService = this.#upgradeService;
50
- const cliConfig = this.#cliConfig;
51
65
  const spawnService = context.doesServiceExist(SPAWN_SERVICE_ID)
52
66
  ? context.getServiceById(SPAWN_SERVICE_ID)
53
67
  : undefined;
@@ -60,10 +74,25 @@ export default class UpgradeServiceProvider {
60
74
  if (fetchService === undefined) {
61
75
  logger.debug(() => "FetchService not available, upgrade version checks will be unavailable");
62
76
  }
63
- const keyValueService = context.doesServiceExist(KEY_VALUE_SERVICE_ID)
77
+ // the KeyValueService from this context is bound to the upgrade service's own scope, so it is
78
+ // kept for runAutoUpgrade(), whose task context is scoped to the task ID instead
79
+ this.#keyValueService = context.doesServiceExist(KEY_VALUE_SERVICE_ID)
64
80
  ? context.getServiceById(KEY_VALUE_SERVICE_ID)
65
81
  : undefined;
66
82
  upgradeService.setContext(context);
83
+ return Promise.resolve();
84
+ }
85
+ /**
86
+ * Offer to enable automatic upgrades (storing the answer as `upgrade-status` in the upgrade
87
+ * service's scope) and, when they are enabled, check for and install a newer version. Must be
88
+ * called after {@link initService}.
89
+ *
90
+ * @param context the startup task's context, used to look up the Prompter and Printer services.
91
+ */
92
+ async runAutoUpgrade(context) {
93
+ const upgradeService = this.#upgradeService;
94
+ const cliConfig = this.#cliConfig;
95
+ const keyValueService = this.#keyValueService;
67
96
  if (!context.doesServiceExist(PROMPTER_SERVICE_ID)) {
68
97
  logger.debug(() => "PrompterService not available, skipping auto-upgrade");
69
98
  return;
@@ -1,15 +1,15 @@
1
1
  import type { StartupTask } from "@flowscripter/dynamic-cli-framework-api";
2
2
  export declare const BANNER_STARTUP_TASK_ID = "@flowscripter/dynamic-cli-framework/banner-startup-task";
3
3
  /**
4
- * Build the ascii banner {@link StartupTask}, replacing the old `BannerServiceProvider`.
4
+ * Build the ascii banner {@link StartupTask}.
5
5
  *
6
6
  * A consumer opts in by passing the result of this function in the `serviceProviders` array
7
7
  * argument of {@link launchMultiCommandCLI}/{@link launchSingleCommandCLI} (or via
8
- * `BaseCLI.addStartupTask`), the same way `new BannerServiceProvider(priority)` used to be passed
9
- * in that array - there's no default/automatic banner registration.
8
+ * `BaseCLI.addStartupTask`) - there's no default/automatic banner registration.
10
9
  *
11
- * @param priority the priority of the task (higher runs earlier - the same semantics
12
- * `BannerServiceProvider.servicePriority` had).
10
+ * @param priority the priority of the task (higher runs earlier). It must be above
11
+ * `AUTO_UPGRADE_STARTUP_TASK_PRIORITY` (10) for the banner to print before the automatic upgrade
12
+ * prompt and upgrade.
13
13
  * @param fontName an optional [FIGlet](http://www.figlet.org) font name to use for the banner,
14
14
  * defaults to "standard".
15
15
  */
@@ -3,15 +3,15 @@ import DefaultUpgradeService from "../../service/upgrade/DefaultUpgradeService.j
3
3
  import NoBannerCommand, {} from "./command/NoBannerCommand.js";
4
4
  export const BANNER_STARTUP_TASK_ID = "@flowscripter/dynamic-cli-framework/banner-startup-task";
5
5
  /**
6
- * Build the ascii banner {@link StartupTask}, replacing the old `BannerServiceProvider`.
6
+ * Build the ascii banner {@link StartupTask}.
7
7
  *
8
8
  * A consumer opts in by passing the result of this function in the `serviceProviders` array
9
9
  * argument of {@link launchMultiCommandCLI}/{@link launchSingleCommandCLI} (or via
10
- * `BaseCLI.addStartupTask`), the same way `new BannerServiceProvider(priority)` used to be passed
11
- * in that array - there's no default/automatic banner registration.
10
+ * `BaseCLI.addStartupTask`) - there's no default/automatic banner registration.
12
11
  *
13
- * @param priority the priority of the task (higher runs earlier - the same semantics
14
- * `BannerServiceProvider.servicePriority` had).
12
+ * @param priority the priority of the task (higher runs earlier). It must be above
13
+ * `AUTO_UPGRADE_STARTUP_TASK_PRIORITY` (10) for the banner to print before the automatic upgrade
14
+ * prompt and upgrade.
15
15
  * @param fontName an optional [FIGlet](http://www.figlet.org) font name to use for the banner,
16
16
  * defaults to "standard".
17
17
  */
@@ -4,7 +4,7 @@ import type { Context } from "@flowscripter/dynamic-cli-framework-api";
4
4
  import type { GlobalCommandArgument } from "@flowscripter/dynamic-cli-framework-api";
5
5
  /**
6
6
  * Task-local, mutable state shared between {@link NoBannerCommand} and the banner
7
- * {@link StartupTask}'s `run()`, in place of a held `BannerServiceProvider` reference.
7
+ * {@link StartupTask}'s `run()`.
8
8
  */
9
9
  export interface BannerState {
10
10
  printBanner: boolean;
package/index.ts CHANGED
@@ -207,6 +207,26 @@ export { default as PluginServiceProvider } from "./src/service/plugin/PluginSer
207
207
 
208
208
  // Core CLI
209
209
  export { default as BaseCLI } from "./src/cli/BaseCLI.ts";
210
+ export {
211
+ SHUTDOWN_SERVICE_PRIORITY,
212
+ STARTUP_SERVICE_PRIORITY,
213
+ CONFIGURATION_SERVICE_PRIORITY,
214
+ KEY_VALUE_SERVICE_PRIORITY,
215
+ PRINTER_SERVICE_PRIORITY,
216
+ PROMPTER_SERVICE_PRIORITY,
217
+ TABLE_GENERATOR_SERVICE_PRIORITY,
218
+ ARGUMENT_PROMPTER_SERVICE_PRIORITY,
219
+ SPAWN_SERVICE_PRIORITY,
220
+ FETCH_SERVICE_PRIORITY,
221
+ UPGRADE_SERVICE_PRIORITY,
222
+ UPGRADE_CHECK_STARTUP_TASK_PRIORITY,
223
+ IMAGE_PRINTER_SERVICE_PRIORITY,
224
+ PLUGIN_SERVICE_PRIORITY,
225
+ AUTO_UPGRADE_STARTUP_TASK_PRIORITY,
226
+ COMPLETION_SERVICE_PRIORITY,
227
+ CLEANUP_SHUTDOWN_TASK_PRIORITY,
228
+ KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY,
229
+ } from "./src/runtime/lifecycle/priorities.ts";
210
230
  export { default as DefaultRuntimeCLI } from "./src/cli/DefaultRuntimeCLI.ts";
211
231
 
212
232
  // Terminal API
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowscripter/dynamic-cli-framework",
3
- "version": "7.0.9",
3
+ "version": "7.0.11",
4
4
  "description": "A framework for developing CLI applications which supports dynamic discovery and installation of new commands",
5
5
  "keywords": [
6
6
  "bun",
@@ -57,9 +57,28 @@ import ImagePrinterServiceProvider from "../service/imagePrinter/ImagePrinterSer
57
57
  import SpawnServiceProvider from "../service/spawn/SpawnServiceProvider.ts";
58
58
  import FetchServiceProvider from "../service/fetch/FetchServiceProvider.ts";
59
59
  import UpgradeServiceProvider, {
60
+ createAutoUpgradeStartupTask,
60
61
  createUpgradeCheckStartupTask,
61
62
  } from "../service/upgrade/UpgradeServiceProvider.ts";
62
63
  import PluginServiceProvider from "../service/plugin/PluginServiceProvider.ts";
64
+ import {
65
+ ARGUMENT_PROMPTER_SERVICE_PRIORITY,
66
+ AUTO_UPGRADE_STARTUP_TASK_PRIORITY,
67
+ COMPLETION_SERVICE_PRIORITY,
68
+ CONFIGURATION_SERVICE_PRIORITY,
69
+ FETCH_SERVICE_PRIORITY,
70
+ IMAGE_PRINTER_SERVICE_PRIORITY,
71
+ KEY_VALUE_SERVICE_PRIORITY,
72
+ PLUGIN_SERVICE_PRIORITY,
73
+ PRINTER_SERVICE_PRIORITY,
74
+ PROMPTER_SERVICE_PRIORITY,
75
+ SHUTDOWN_SERVICE_PRIORITY,
76
+ SPAWN_SERVICE_PRIORITY,
77
+ STARTUP_SERVICE_PRIORITY,
78
+ TABLE_GENERATOR_SERVICE_PRIORITY,
79
+ UPGRADE_CHECK_STARTUP_TASK_PRIORITY,
80
+ UPGRADE_SERVICE_PRIORITY,
81
+ } from "../runtime/lifecycle/priorities.ts";
63
82
  const logger = getLogger("BaseCLI");
64
83
 
65
84
  /**
@@ -177,9 +196,7 @@ export default class BaseCLI implements CLI {
177
196
  // create a context
178
197
  this.#context = new DefaultContext(this.#cliConfig);
179
198
 
180
- // priority 95 sits between shutdown (100) and configuration (90) - it has no ordering
181
- // dependency on anything since its own initService() is a no-op.
182
- this.#startupServiceProvider = new StartupServiceProvider(95);
199
+ this.#startupServiceProvider = new StartupServiceProvider(STARTUP_SERVICE_PRIORITY);
183
200
 
184
201
  this.#stdoutTerminal = stdoutTerminal;
185
202
  this.#printerService = new DefaultPrinterService(
@@ -251,10 +268,12 @@ export default class BaseCLI implements CLI {
251
268
  }
252
269
 
253
270
  // create and add core services
254
- this.addServiceProvider(new ShutdownServiceProvider(100));
271
+ this.addServiceProvider(new ShutdownServiceProvider(SHUTDOWN_SERVICE_PRIORITY));
255
272
  this.addServiceProvider(this.#startupServiceProvider);
256
- this.addServiceProvider(new PrinterServiceProvider(80, this.#printerService));
257
- this.addServiceProvider(new TableGeneratorServiceProvider(70));
273
+ this.addServiceProvider(
274
+ new PrinterServiceProvider(PRINTER_SERVICE_PRIORITY, this.#printerService),
275
+ );
276
+ this.addServiceProvider(new TableGeneratorServiceProvider(TABLE_GENERATOR_SERVICE_PRIORITY));
258
277
 
259
278
  const canPrompt = this.#keyReader !== undefined && this.#stderrTerminal.isTty();
260
279
 
@@ -271,7 +290,9 @@ export default class BaseCLI implements CLI {
271
290
  this.#printerService,
272
291
  );
273
292
  prompterService.promptEnabled = this.#options.promptingEnabled;
274
- this.addServiceProvider(new PrompterServiceProvider(75, prompterService));
293
+ this.addServiceProvider(
294
+ new PrompterServiceProvider(PROMPTER_SERVICE_PRIORITY, prompterService),
295
+ );
275
296
  } else {
276
297
  logger.debug(
277
298
  () =>
@@ -284,7 +305,12 @@ export default class BaseCLI implements CLI {
284
305
  if (this.#options.argumentPrompterServiceEnabled) {
285
306
  if (prompterService !== undefined) {
286
307
  const argumentPrompterService = new DefaultArgumentPrompterService(prompterService);
287
- this.addServiceProvider(new ArgumentPrompterServiceProvider(65, argumentPrompterService));
308
+ this.addServiceProvider(
309
+ new ArgumentPrompterServiceProvider(
310
+ ARGUMENT_PROMPTER_SERVICE_PRIORITY,
311
+ argumentPrompterService,
312
+ ),
313
+ );
288
314
  } else {
289
315
  logger.debug(
290
316
  "Skipping ArgumentPrompterServiceProvider: argumentPrompterServiceEnabled is true but prompting is unavailable",
@@ -294,7 +320,9 @@ export default class BaseCLI implements CLI {
294
320
 
295
321
  if (this.#options.imagePrinterServiceEnabled) {
296
322
  if (this.#stdoutTerminal.isTty()) {
297
- this.addServiceProvider(new ImagePrinterServiceProvider(55, this.#stdoutTerminal));
323
+ this.addServiceProvider(
324
+ new ImagePrinterServiceProvider(IMAGE_PRINTER_SERVICE_PRIORITY, this.#stdoutTerminal),
325
+ );
298
326
  } else {
299
327
  logger.debug(
300
328
  "Skipping ImagePrinterServiceProvider: imagePrinterServiceEnabled is true but stdout is not a TTY",
@@ -305,32 +333,37 @@ export default class BaseCLI implements CLI {
305
333
  // The plugin service routes package manager output through SpawnService so that it is
306
334
  // quoted, marked and cleared on success; enabling plugins therefore also enables spawning.
307
335
  if (this.#options.spawnServiceEnabled || this.#options.pluginServiceEnabled) {
308
- this.addServiceProvider(new SpawnServiceProvider(58));
336
+ this.addServiceProvider(new SpawnServiceProvider(SPAWN_SERVICE_PRIORITY));
309
337
  }
310
338
 
311
339
  if (this.#options.fetchServiceEnabled) {
312
- this.addServiceProvider(new FetchServiceProvider(57));
340
+ this.addServiceProvider(new FetchServiceProvider(FETCH_SERVICE_PRIORITY));
313
341
  }
314
342
 
315
343
  if (this.#options.completionServiceEnabled) {
316
344
  const completionService = new DefaultCompletionService();
317
345
  this.addServiceProvider(
318
- new CompletionServiceProvider(5, completionService, this.#commandRegistry),
346
+ new CompletionServiceProvider(
347
+ COMPLETION_SERVICE_PRIORITY,
348
+ completionService,
349
+ this.#commandRegistry,
350
+ ),
319
351
  );
320
352
  }
321
353
 
322
354
  let upgradeServiceProvider: UpgradeServiceProvider | undefined;
323
355
  if (this.#options.upgradeServiceEnabled) {
324
- // 56 runs after Spawn(58)/Fetch(57) - whose dependencies it needs
325
- // but before the consumer-configured Banner/Plugin(50) priority band.
326
- upgradeServiceProvider = new UpgradeServiceProvider(56, this.#options.upgradeLocationsConfig);
356
+ upgradeServiceProvider = new UpgradeServiceProvider(
357
+ UPGRADE_SERVICE_PRIORITY,
358
+ this.#options.upgradeLocationsConfig,
359
+ );
327
360
  this.addServiceProvider(upgradeServiceProvider);
328
361
  }
329
362
 
330
363
  if (this.#options.pluginServiceEnabled) {
331
364
  this.addServiceProvider(
332
365
  new PluginServiceProvider(
333
- 50,
366
+ PLUGIN_SERVICE_PRIORITY,
334
367
  this.#options.pluginServiceRemoteConfig,
335
368
  this.#options.pluginServiceLocalConfig,
336
369
  this.#commandRegistry,
@@ -340,16 +373,14 @@ export default class BaseCLI implements CLI {
340
373
  }
341
374
 
342
375
  const configurationServiceProvider = new ConfigurationServiceProvider(
343
- 90,
376
+ CONFIGURATION_SERVICE_PRIORITY,
344
377
  this.#options.envVarsSupportEnabled,
345
378
  this.#options.configFileSupportEnabled,
346
379
  this.#options.secretServiceEnabled,
347
380
  );
348
381
  this.addServiceProvider(configurationServiceProvider);
349
- // priority 89 sits just below ConfigurationServiceProvider's 90 - its config-file read
350
- // happens in its own initService(), before KeyValueServiceProvider's initService() runs.
351
382
  const keyValueServiceProvider = new KeyValueServiceProvider(
352
- 89,
383
+ KEY_VALUE_SERVICE_PRIORITY,
353
384
  configurationServiceProvider,
354
385
  this.#options.keyValueServiceEnabled,
355
386
  this.#options.secretServiceEnabled,
@@ -369,7 +400,15 @@ export default class BaseCLI implements CLI {
369
400
  }
370
401
 
371
402
  if (upgradeServiceProvider?.upgradeService) {
372
- this.addStartupTask(createUpgradeCheckStartupTask(upgradeServiceProvider.upgradeService, 56));
403
+ this.addStartupTask(
404
+ createUpgradeCheckStartupTask(
405
+ upgradeServiceProvider.upgradeService,
406
+ UPGRADE_CHECK_STARTUP_TASK_PRIORITY,
407
+ ),
408
+ );
409
+ this.addStartupTask(
410
+ createAutoUpgradeStartupTask(upgradeServiceProvider, AUTO_UPGRADE_STARTUP_TASK_PRIORITY),
411
+ );
373
412
  }
374
413
 
375
414
  // directly-registered StartupTasks (e.g. the banner task) aren't backed by a ServiceProvider,
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Priorities of the framework's built-in service providers, startup tasks and shutdown tasks.
3
+ * Higher values run earlier (see {@link sortByPriority}). Service provider priorities also order
4
+ * their `initService()` calls within the startup sequence: when a provider and a directly
5
+ * registered startup task share a priority, the provider runs first.
6
+ *
7
+ * Consumer service providers and startup tasks (e.g. the banner task) choose their own
8
+ * priorities relative to these.
9
+ */
10
+
11
+ /** Shutdown service provider: first, so signal handling is in place before anything else. */
12
+ export const SHUTDOWN_SERVICE_PRIORITY = 100;
13
+
14
+ /** Startup service provider: no ordering dependency, as its `initService()` is a no-op. */
15
+ export const STARTUP_SERVICE_PRIORITY = 95;
16
+
17
+ /** Configuration service provider: reads the config file in its `initService()`. */
18
+ export const CONFIGURATION_SERVICE_PRIORITY = 90;
19
+
20
+ /** Key-value service provider: just below configuration, whose config-file read it depends on. */
21
+ export const KEY_VALUE_SERVICE_PRIORITY = 89;
22
+
23
+ /** Printer service provider. */
24
+ export const PRINTER_SERVICE_PRIORITY = 80;
25
+
26
+ /** Prompter service provider. */
27
+ export const PROMPTER_SERVICE_PRIORITY = 75;
28
+
29
+ /** Table generator service provider. */
30
+ export const TABLE_GENERATOR_SERVICE_PRIORITY = 70;
31
+
32
+ /** Argument prompter service provider: below the prompter it uses. */
33
+ export const ARGUMENT_PROMPTER_SERVICE_PRIORITY = 65;
34
+
35
+ /** Spawn service provider. */
36
+ export const SPAWN_SERVICE_PRIORITY = 58;
37
+
38
+ /** Fetch service provider. */
39
+ export const FETCH_SERVICE_PRIORITY = 57;
40
+
41
+ /** Upgrade service provider: below the spawn and fetch services it uses. */
42
+ export const UPGRADE_SERVICE_PRIORITY = 56;
43
+
44
+ /** Background startup task which refreshes the cached upgrade check result. */
45
+ export const UPGRADE_CHECK_STARTUP_TASK_PRIORITY = 56;
46
+
47
+ /** Image printer service provider. */
48
+ export const IMAGE_PRINTER_SERVICE_PRIORITY = 55;
49
+
50
+ /** Plugin service provider. */
51
+ export const PLUGIN_SERVICE_PRIORITY = 50;
52
+
53
+ /**
54
+ * Startup task which prompts to enable automatic upgrades and performs them. It runs below
55
+ * consumer startup tasks such as the banner (typically 45 or more) and above the completion
56
+ * prompt.
57
+ */
58
+ export const AUTO_UPGRADE_STARTUP_TASK_PRIORITY = 10;
59
+
60
+ /** Completion service provider, whose `initService()` prompts to enable shell completion. */
61
+ export const COMPLETION_SERVICE_PRIORITY = 5;
62
+
63
+ /** Shutdown tasks which clean up in-flight work (spinners, progress bars, spawns, fetches). */
64
+ export const CLEANUP_SHUTDOWN_TASK_PRIORITY = 0;
65
+
66
+ /** Shutdown task which flushes key-value data to the config file, after all other cleanup. */
67
+ export const KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY = -100;
@@ -12,6 +12,7 @@ import DefaultSecretService from "./DefaultSecretService.ts";
12
12
  import type ConfigurationServiceProvider from "./ConfigurationServiceProvider.ts";
13
13
  import type { KeyValueServiceScopeType } from "./ConfigurationServiceProvider.ts";
14
14
  import type DefaultContext from "../../runtime/DefaultContext.ts";
15
+ import { KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.ts";
15
16
 
16
17
  /**
17
18
  * Registered under {@link KEY_VALUE_SERVICE_ID} in the plain, undecorated {@link Context} purely
@@ -206,8 +207,7 @@ export default class KeyValueServiceProvider implements ServiceProvider {
206
207
  * interface: `runner.ts` applies this same scoping to every `ServiceProvider`'s `initService()`
207
208
  * call (scope "service"), and `PluginServiceProvider.initService()` relies on casting its
208
209
  * received `context` to `DefaultContext` to register services discovered from plugins at
209
- * runtime - a capability every `ServiceProvider` already had before this scoping was
210
- * introduced, since `initService()` always received the real `DefaultContext` directly.
210
+ * runtime.
211
211
  */
212
212
  public getContextForScope(
213
213
  context: Context,
@@ -246,9 +246,7 @@ export default class KeyValueServiceProvider implements ServiceProvider {
246
246
  const shutdownService = context.getServiceById(SHUTDOWN_SERVICE_ID) as ShutdownService;
247
247
  shutdownService.registerTask({
248
248
  id: `${KEY_VALUE_SERVICE_ID}-flush`,
249
- // low priority - shutdown tasks run in descending priority order, so this runs after
250
- // other shutdown cleanup (which defaults to priority 0).
251
- priority: -100,
249
+ priority: KEY_VALUE_FLUSH_SHUTDOWN_TASK_PRIORITY,
252
250
  run: () => this.#flushDirtyScopes(),
253
251
  });
254
252
  }
@@ -6,6 +6,7 @@ import type {
6
6
  } from "@flowscripter/dynamic-cli-framework-api";
7
7
  import { SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
8
8
  import getLogger from "../../util/logger.ts";
9
+ import { CLEANUP_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.ts";
9
10
 
10
11
  const logger = getLogger("DefaultFetchService");
11
12
 
@@ -38,7 +39,7 @@ export default class DefaultFetchService implements FetchService {
38
39
  shutdownService.enterLongRunningMode();
39
40
  shutdownService.registerTask({
40
41
  id: `fetch:${input.toString()}`,
41
- priority: 0,
42
+ priority: CLEANUP_SHUTDOWN_TASK_PRIORITY,
42
43
  run: async () => {
43
44
  if (settled) {
44
45
  return;
@@ -39,7 +39,7 @@ export default class DefaultPrinterService implements PrinterService {
39
39
  // <reset>". Checking endsWith("\n") on the styled text is then always false, so the
40
40
  // subtraction below never fires and every such line is over-counted by one - which, summed
41
41
  // across every write in a marked region, causes clearMarked() to erase far more physical
42
- // rows than were actually written (see #150).
42
+ // rows than were actually written.
43
43
  const stripped = Bun.stripANSI(message);
44
44
  return stripped.split("\n").length - (stripped.endsWith("\n") ? 1 : 0);
45
45
  }
@@ -9,6 +9,7 @@ import NoHyperlinksCommand from "./command/NoHyperlinksCommand.ts";
9
9
  import type { CLIConfig } from "@flowscripter/dynamic-cli-framework-api";
10
10
  import type { ShutdownService } from "@flowscripter/dynamic-cli-framework-api";
11
11
  import { SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
12
+ import { CLEANUP_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.ts";
12
13
 
13
14
  /**
14
15
  * Provides a {@link PrinterService}.
@@ -45,7 +46,7 @@ export default class PrinterServiceProvider implements ServiceProvider {
45
46
  const shutdownService = context.getServiceById(SHUTDOWN_SERVICE_ID) as ShutdownService;
46
47
  shutdownService.registerTask({
47
48
  id: PRINTER_SERVICE_ID,
48
- priority: 0,
49
+ priority: CLEANUP_SHUTDOWN_TASK_PRIORITY,
49
50
  run: async () => {
50
51
  await this.printerService.hideSpinner();
51
52
  await this.printerService.hideAllProgressBars();
@@ -63,7 +63,7 @@ export default class Quote {
63
63
  // *after* that newline (e.g. "foo\n" -> "<color>foo\n<reset>"). Naively checking
64
64
  // endsWith("\n") on such styled text is always false, and splitting on "\n" then treats the
65
65
  // trailing reset sequence as a spurious extra line, which gets its own quote prefix -
66
- // rendering as if two quote levels were active for a single actual line (see #150). Every
66
+ // rendering as if two quote levels were active for a single actual line. Every
67
67
  // line gets re-colored below regardless, so strip all existing ANSI upfront rather than
68
68
  // trying to preserve and restore it.
69
69
  const body = Bun.stripANSI(message);
@@ -9,6 +9,7 @@ import type {
9
9
  } from "@flowscripter/dynamic-cli-framework-api";
10
10
  import { PRINTER_SERVICE_ID, SHUTDOWN_SERVICE_ID } from "@flowscripter/dynamic-cli-framework-api";
11
11
  import getLogger from "../../util/logger.ts";
12
+ import { CLEANUP_SHUTDOWN_TASK_PRIORITY } from "../../runtime/lifecycle/priorities.ts";
12
13
 
13
14
  const logger = getLogger("DefaultSpawnService");
14
15
 
@@ -124,7 +125,7 @@ export default class DefaultSpawnService implements SpawnService {
124
125
 
125
126
  shutdownService.registerTask({
126
127
  id: `spawn:${command.join(" ")}`,
127
- priority: 0,
128
+ priority: CLEANUP_SHUTDOWN_TASK_PRIORITY,
128
129
  run: async () => {
129
130
  if (settled) {
130
131
  return;
@@ -428,7 +428,7 @@ export default class DefaultUpgradeService implements UpgradeService {
428
428
  // Homebrew relinks a formula's installed binary from its Cellar directory into a `bin/` symlink,
429
429
  // so resolving the running executable's real path confirms a homebrew install without spawning
430
430
  // `brew`, which has a slow cold start - avoiding it keeps the background upgrade-check
431
- // StartupTask (see UpgradeServiceProvider) fast even though it now runs to completion.
431
+ // StartupTask (see UpgradeServiceProvider) fast even though it runs to completion.
432
432
  #isRunningFromHomebrewCellar(formula: string): boolean {
433
433
  let realExecutable = process.execPath;
434
434
  try {
@@ -40,12 +40,31 @@ export function createUpgradeCheckStartupTask(
40
40
  };
41
41
  }
42
42
 
43
+ /**
44
+ * Build the blocking {@link StartupTask} which offers to enable automatic upgrades and, when they
45
+ * are enabled, checks for and installs a newer version (see
46
+ * {@link UpgradeServiceProvider.runAutoUpgrade}). It is registered separately from the provider's
47
+ * own init task so it can run at a lower priority, after consumer startup tasks such as the banner.
48
+ */
49
+ export function createAutoUpgradeStartupTask(
50
+ provider: UpgradeServiceProvider,
51
+ priority: number,
52
+ ): StartupTask {
53
+ return {
54
+ id: `${UPGRADE_SERVICE_ID}-auto-upgrade`,
55
+ priority,
56
+ mode: "blocking",
57
+ run: (context: Context) => provider.runAutoUpgrade(context),
58
+ };
59
+ }
60
+
43
61
  export default class UpgradeServiceProvider implements ServiceProvider {
44
62
  readonly serviceId: string = UPGRADE_SERVICE_ID;
45
63
  readonly servicePriority: number;
46
64
  readonly #config: UpgradeLocationsConfig;
47
65
  #upgradeService: DefaultUpgradeService | undefined;
48
66
  #cliConfig: CLIConfig | undefined;
67
+ #keyValueService: KeyValueService | undefined;
49
68
 
50
69
  public constructor(servicePriority: number, config: UpgradeLocationsConfig) {
51
70
  this.servicePriority = servicePriority;
@@ -65,9 +84,8 @@ export default class UpgradeServiceProvider implements ServiceProvider {
65
84
  });
66
85
  }
67
86
 
68
- public async initService(context: Context): Promise<void> {
87
+ public initService(context: Context): Promise<void> {
69
88
  const upgradeService = this.#upgradeService!;
70
- const cliConfig = this.#cliConfig!;
71
89
 
72
90
  const spawnService = context.doesServiceExist(SPAWN_SERVICE_ID)
73
91
  ? (context.getServiceById(SPAWN_SERVICE_ID) as SpawnService)
@@ -81,10 +99,26 @@ export default class UpgradeServiceProvider implements ServiceProvider {
81
99
  if (fetchService === undefined) {
82
100
  logger.debug(() => "FetchService not available, upgrade version checks will be unavailable");
83
101
  }
84
- const keyValueService = context.doesServiceExist(KEY_VALUE_SERVICE_ID)
102
+ // the KeyValueService from this context is bound to the upgrade service's own scope, so it is
103
+ // kept for runAutoUpgrade(), whose task context is scoped to the task ID instead
104
+ this.#keyValueService = context.doesServiceExist(KEY_VALUE_SERVICE_ID)
85
105
  ? (context.getServiceById(KEY_VALUE_SERVICE_ID) as KeyValueService)
86
106
  : undefined;
87
107
  upgradeService.setContext(context);
108
+ return Promise.resolve();
109
+ }
110
+
111
+ /**
112
+ * Offer to enable automatic upgrades (storing the answer as `upgrade-status` in the upgrade
113
+ * service's scope) and, when they are enabled, check for and install a newer version. Must be
114
+ * called after {@link initService}.
115
+ *
116
+ * @param context the startup task's context, used to look up the Prompter and Printer services.
117
+ */
118
+ public async runAutoUpgrade(context: Context): Promise<void> {
119
+ const upgradeService = this.#upgradeService!;
120
+ const cliConfig = this.#cliConfig!;
121
+ const keyValueService = this.#keyValueService;
88
122
 
89
123
  if (!context.doesServiceExist(PROMPTER_SERVICE_ID)) {
90
124
  logger.debug(() => "PrompterService not available, skipping auto-upgrade");
@@ -13,15 +13,15 @@ import NoBannerCommand, { type BannerState } from "./command/NoBannerCommand.ts"
13
13
  export const BANNER_STARTUP_TASK_ID = "@flowscripter/dynamic-cli-framework/banner-startup-task";
14
14
 
15
15
  /**
16
- * Build the ascii banner {@link StartupTask}, replacing the old `BannerServiceProvider`.
16
+ * Build the ascii banner {@link StartupTask}.
17
17
  *
18
18
  * A consumer opts in by passing the result of this function in the `serviceProviders` array
19
19
  * argument of {@link launchMultiCommandCLI}/{@link launchSingleCommandCLI} (or via
20
- * `BaseCLI.addStartupTask`), the same way `new BannerServiceProvider(priority)` used to be passed
21
- * in that array - there's no default/automatic banner registration.
20
+ * `BaseCLI.addStartupTask`) - there's no default/automatic banner registration.
22
21
  *
23
- * @param priority the priority of the task (higher runs earlier - the same semantics
24
- * `BannerServiceProvider.servicePriority` had).
22
+ * @param priority the priority of the task (higher runs earlier). It must be above
23
+ * `AUTO_UPGRADE_STARTUP_TASK_PRIORITY` (10) for the banner to print before the automatic upgrade
24
+ * prompt and upgrade.
25
25
  * @param fontName an optional [FIGlet](http://www.figlet.org) font name to use for the banner,
26
26
  * defaults to "standard".
27
27
  */
@@ -5,7 +5,7 @@ import type { GlobalCommandArgument } from "@flowscripter/dynamic-cli-framework-
5
5
 
6
6
  /**
7
7
  * Task-local, mutable state shared between {@link NoBannerCommand} and the banner
8
- * {@link StartupTask}'s `run()`, in place of a held `BannerServiceProvider` reference.
8
+ * {@link StartupTask}'s `run()`.
9
9
  */
10
10
  export interface BannerState {
11
11
  printBanner: boolean;