@flowscripter/dynamic-cli-framework 5.1.5 → 5.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/src/service/plugin/DefaultPluginService.d.ts +7 -1
  2. package/dist/src/service/plugin/DefaultPluginService.d.ts.map +1 -1
  3. package/dist/src/service/plugin/DefaultPluginService.js +15 -0
  4. package/dist/src/service/plugin/PluginServiceProvider.d.ts.map +1 -1
  5. package/dist/src/service/plugin/PluginServiceProvider.js +2 -5
  6. package/dist/src/service/plugin/command/PluginAddSubCommand.d.ts.map +1 -1
  7. package/dist/src/service/plugin/command/PluginAddSubCommand.js +10 -0
  8. package/dist/src/service/printer/DefaultPrinterService.d.ts +0 -1
  9. package/dist/src/service/printer/DefaultPrinterService.d.ts.map +1 -1
  10. package/dist/src/service/printer/DefaultPrinterService.js +0 -3
  11. package/dist/src/service/printer/terminal/Quote.d.ts.map +1 -1
  12. package/dist/src/service/printer/terminal/Quote.js +4 -1
  13. package/dist/src/terminal/Ansi.d.ts +0 -2
  14. package/dist/src/terminal/Ansi.d.ts.map +1 -1
  15. package/dist/src/terminal/Ansi.js +0 -2
  16. package/dist/src/terminal/Styler.d.ts +0 -1
  17. package/dist/src/terminal/Styler.d.ts.map +1 -1
  18. package/dist/src/terminal/TtyStyler.d.ts +0 -1
  19. package/dist/src/terminal/TtyStyler.d.ts.map +1 -1
  20. package/dist/src/terminal/TtyStyler.js +1 -7
  21. package/package.json +3 -3
  22. package/src/service/plugin/DefaultPluginService.ts +20 -0
  23. package/src/service/plugin/PluginServiceProvider.ts +2 -5
  24. package/src/service/plugin/command/PluginAddSubCommand.ts +14 -0
  25. package/src/service/printer/DefaultPrinterService.ts +0 -4
  26. package/src/service/printer/terminal/Quote.ts +4 -1
  27. package/src/terminal/Ansi.ts +0 -2
  28. package/src/terminal/Styler.ts +0 -1
  29. package/src/terminal/TtyStyler.ts +0 -9
@@ -1,11 +1,17 @@
1
1
  import type { PluginService } from "@flowscripter/dynamic-cli-framework-api";
2
2
  import type { KeyValueService } from "@flowscripter/dynamic-cli-framework-api";
3
- import type { MarketplacePluginManager, SearchQuery, VersionedPluginDescriptor, NpmjsPluginRepositoryConfig, NpmPluginRepositoryConfig } from "@flowscripter/dynamic-plugin-framework";
3
+ import type { MarketplacePluginManager, SearchQuery, VersionedPluginDescriptor, NpmjsPluginRepositoryConfig, NpmPluginRepositoryConfig, FetchInterface } from "@flowscripter/dynamic-plugin-framework";
4
4
  export default class DefaultPluginService implements PluginService {
5
5
  #private;
6
6
  constructor(remoteConfig: NpmjsPluginRepositoryConfig, localConfig: NpmPluginRepositoryConfig);
7
7
  get pluginManager(): MarketplacePluginManager;
8
8
  applyKeyValueOverrides(keyValueService: KeyValueService): Promise<void>;
9
+ /**
10
+ * Supply the {@link FetchInterface} for the underlying `pluginManager` to delegate fetch calls
11
+ * to, so it respects the host CLI's shutdown handling and default timeout.
12
+ */
13
+ setFetch(fetchInterface: FetchInterface): void;
14
+ checkAvailable(pluginId: string, version?: string): Promise<boolean>;
9
15
  search(query: Readonly<SearchQuery>): AsyncIterable<Readonly<VersionedPluginDescriptor>>;
10
16
  install(descriptor: Readonly<VersionedPluginDescriptor>): Promise<void>;
11
17
  uninstall(pluginId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultPluginService.d.ts","sourceRoot":"","sources":["../../../../src/service/plugin/DefaultPluginService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,KAAK,EACV,wBAAwB,EACxB,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,wCAAwC,CAAC;AAOhD,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,aAAa;;gBAKpD,YAAY,EAAE,2BAA2B,EAAE,WAAW,EAAE,yBAAyB;IAS7F,IAAI,aAAa,IAAI,wBAAwB,CAE5C;IAEK,sBAAsB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAIlF,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAInE,eAAe,IAAI,aAAa,CAAC;QAC/B,UAAU,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QAChD,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CAGH"}
1
+ {"version":3,"file":"DefaultPluginService.d.ts","sourceRoot":"","sources":["../../../../src/service/plugin/DefaultPluginService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,KAAK,EACV,wBAAwB,EACxB,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EAEzB,cAAc,EACf,MAAM,wCAAwC,CAAC;AAWhD,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,aAAa;;gBAKpD,YAAY,EAAE,2BAA2B,EAAE,WAAW,EAAE,yBAAyB;IAS7F,IAAI,aAAa,IAAI,wBAAwB,CAE5C;IAEK,sBAAsB,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7E;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAMxC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI1E,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAIlF,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,aAAa,IAAI,aAAa,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;IAInE,eAAe,IAAI,aAAa,CAAC;QAC/B,UAAU,EAAE,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QAChD,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CAGH"}
@@ -1,4 +1,7 @@
1
1
  import { NpmPluginManager, NpmjsPluginRepository, NpmPluginRepository, } from "@flowscripter/dynamic-plugin-framework";
2
+ function isFetchCapable(value) {
3
+ return typeof value === "object" && value !== null && "setFetch" in value;
4
+ }
2
5
  export default class DefaultPluginService {
3
6
  #defaultRemoteConfig;
4
7
  #defaultLocalConfig;
@@ -22,6 +25,18 @@ export default class DefaultPluginService {
22
25
  }
23
26
  this.#pluginManager = new NpmPluginManager(remotesConfig.map((config) => new NpmjsPluginRepository(config)), new NpmPluginRepository(localConfig));
24
27
  }
28
+ /**
29
+ * Supply the {@link FetchInterface} for the underlying `pluginManager` to delegate fetch calls
30
+ * to, so it respects the host CLI's shutdown handling and default timeout.
31
+ */
32
+ setFetch(fetchInterface) {
33
+ if (isFetchCapable(this.#pluginManager)) {
34
+ this.#pluginManager.setFetch(fetchInterface);
35
+ }
36
+ }
37
+ async checkAvailable(pluginId, version) {
38
+ return this.#pluginManager.checkAvailable(pluginId, version);
39
+ }
25
40
  search(query) {
26
41
  return this.#pluginManager.search(query);
27
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PluginServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/plugin/PluginServiceProvider.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;AAWzE,OAAO,KAAK,EAEV,2BAA2B,EAC3B,yBAAyB,EAE1B,MAAM,wCAAwC,CAAC;AAIhD,OAA8B,EAC5B,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAA8B,EAC5B,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,sBAAsB,MAAM,kDAAkD,CAAC;AACtF,OAAO,8BAA8B,MAAM,0DAA0D,CAAC;AAMtG,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,eAAe;;IACnE,QAAQ,CAAC,SAAS,oBAAqB;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;gBAW/B,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,2BAA2B,EACzC,WAAW,EAAE,yBAAyB,EACtC,eAAe,EAAE,sBAAsB,EACvC,uBAAuB,EAAE,8BAA8B,EACvD,4BAA4B,GAAE,4BAAiC,EAC/D,4BAA4B,GAAE,4BAAiC;IAW3D,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAS1D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAmEnD"}
1
+ {"version":3,"file":"PluginServiceProvider.d.ts","sourceRoot":"","sources":["../../../../src/service/plugin/PluginServiceProvider.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;AAWzE,OAAO,KAAK,EACV,2BAA2B,EAC3B,yBAAyB,EAE1B,MAAM,wCAAwC,CAAC;AAIhD,OAA8B,EAC5B,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAA8B,EAC5B,KAAK,4BAA4B,EAClC,MAAM,4BAA4B,CAAC;AACpC,OAAO,sBAAsB,MAAM,kDAAkD,CAAC;AACtF,OAAO,8BAA8B,MAAM,0DAA0D,CAAC;AAMtG,MAAM,CAAC,OAAO,OAAO,qBAAsB,YAAW,eAAe;;IACnE,QAAQ,CAAC,SAAS,oBAAqB;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;gBAW/B,eAAe,EAAE,MAAM,EACvB,YAAY,EAAE,2BAA2B,EACzC,WAAW,EAAE,yBAAyB,EACtC,eAAe,EAAE,sBAAsB,EACvC,uBAAuB,EAAE,8BAA8B,EACvD,4BAA4B,GAAE,4BAAiC,EAC/D,4BAA4B,GAAE,4BAAiC;IAW3D,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAS1D,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAiEnD"}
@@ -60,15 +60,12 @@ export default class PluginServiceProvider {
60
60
  pluginManager.setSpawn(adapter);
61
61
  }
62
62
  if (!context.doesServiceExist(FETCH_SERVICE_ID)) {
63
- logger.debug("FetchService not available, plugin manager will fetch directly");
64
- }
65
- else if (!("setFetch" in pluginManager)) {
66
- logger.debug("Plugin manager does not support FetchCapable, skipping fetch injection");
63
+ logger.debug("FetchService not available, plugin service will fetch directly");
67
64
  }
68
65
  else {
69
66
  const fetchService = context.getServiceById(FETCH_SERVICE_ID);
70
67
  const adapter = new FetchInterfaceAdapter(fetchService, this.#fetchInterfaceAdapterOptions);
71
- pluginManager.setFetch(adapter);
68
+ pluginService.setFetch(adapter);
72
69
  }
73
70
  await pluginManager.registerExtensions(DYNAMIC_CLI_FRAMEWORK_COMMAND_FACTORY_EXTENSION_POINT);
74
71
  await pluginManager.registerExtensions(DYNAMIC_CLI_FRAMEWORK_SERVICE_PROVIDER_FACTORY_EXTENSION_POINT);
@@ -1 +1 @@
1
- {"version":3,"file":"PluginAddSubCommand.d.ts","sourceRoot":"","sources":["../../../../../src/service/plugin/command/PluginAddSubCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AASxE,qBAAa,mBAAoB,YAAW,UAAU;IACpD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,6BAA6B;IACjD,QAAQ,CAAC,mBAAmB,SAAS;IACrC,QAAQ,CAAC,OAAO,UAAM;IACtB,QAAQ,CAAC,WAAW;;;;QAMlB;IAEI,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkDvE"}
1
+ {"version":3,"file":"PluginAddSubCommand.d.ts","sourceRoot":"","sources":["../../../../../src/service/plugin/command/PluginAddSubCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yCAAyC,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AASxE,qBAAa,mBAAoB,YAAW,UAAU;IACpD,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,6BAA6B;IACjD,QAAQ,CAAC,mBAAmB,SAAS;IACrC,QAAQ,CAAC,OAAO,UAAM;IACtB,QAAQ,CAAC,WAAW;;;;QAMlB;IAEI,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgEvE"}
@@ -52,6 +52,16 @@ export class PluginAddSubCommand {
52
52
  const installLabel = descriptor.version && descriptor.version !== "latest"
53
53
  ? `${descriptor.pluginId}@${descriptor.version}`
54
54
  : descriptor.pluginId;
55
+ // Confirm the package (and specific version/tag, if requested) actually exists on the
56
+ // remote marketplace before invoking the package manager - so a non-existent plugin or
57
+ // version is reported clearly instead of failing later (and less clearly) inside
58
+ // `bun add`/`npm install`.
59
+ const versionToCheck = descriptor.version === "latest" ? undefined : descriptor.version;
60
+ if (!(await pluginService.checkAvailable(descriptor.pluginId, versionToCheck))) {
61
+ throw new Error(versionToCheck
62
+ ? `Version ${versionToCheck} of plugin ${descriptor.pluginId} was not found in the configured plugin registry`
63
+ : `Plugin ${descriptor.pluginId} was not found in the configured plugin registry`);
64
+ }
55
65
  await printerService.info(`Installing ${installLabel}...\n`, Icon.INFORMATION);
56
66
  await pluginService.install(descriptor);
57
67
  await printerService.print(`Plugin ${descriptor.pluginId} installed.\n`, Icon.SUCCESS);
@@ -22,7 +22,6 @@ export default class DefaultPrinterService implements PrinterService {
22
22
  emphasised(message: string): string;
23
23
  selected(message: string): string;
24
24
  italic(message: string): string;
25
- dim(message: string): string;
26
25
  yellow(message: string): string;
27
26
  orange(message: string): string;
28
27
  red(message: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultPrinterService.d.ts","sourceRoot":"","sources":["../../../../src/service/printer/DefaultPrinterService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DefaultPrinterService.d.ts","sourceRoot":"","sources":["../../../../src/service/printer/DefaultPrinterService.ts"],"names":[],"mappings":"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"}
@@ -118,9 +118,6 @@ export default class DefaultPrinterService {
118
118
  italic(message) {
119
119
  return this.#styler.italicText(message);
120
120
  }
121
- dim(message) {
122
- return this.#styler.dimText(message);
123
- }
124
121
  yellow(message) {
125
122
  return this.#styler.colorText(message, this.#theme[Color.YELLOW]);
126
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Quote.d.ts","sourceRoot":"","sources":["../../../../../src/service/printer/terminal/Quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAWtD,MAAM,CAAC,OAAO,OAAO,KAAK;;gBAIL,MAAM,EAAE,MAAM;IAIjC,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAEM,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,GAAG,IAAI,IAAI;IA6BX,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAS5C"}
1
+ {"version":3,"file":"Quote.d.ts","sourceRoot":"","sources":["../../../../../src/service/printer/terminal/Quote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,6BAA6B,CAAC;AAWtD,MAAM,CAAC,OAAO,OAAO,KAAK;;gBAIL,MAAM,EAAE,MAAM;IAIjC,IAAW,QAAQ,IAAI,OAAO,CAE7B;IAEM,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzB,GAAG,IAAI,IAAI;IA6BX,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;CAY5C"}
@@ -44,7 +44,10 @@ export default class Quote {
44
44
  }
45
45
  const endsWithNewline = message.endsWith("\n");
46
46
  const raw = endsWithNewline ? message.slice(0, -1) : message;
47
- const lines = raw.split("\n").map((line) => this.#prefixLine() + this.#styler.dimText(line));
47
+ const color = this.#levels[this.#levels.length - 1].color;
48
+ const lines = raw
49
+ .split("\n")
50
+ .map((line) => this.#prefixLine() + this.#styler.colorText(line, color));
48
51
  return lines.join("\n") + (endsWithNewline ? "\n" : "");
49
52
  }
50
53
  }
@@ -5,8 +5,6 @@ export declare const HIDE_CURSOR: string;
5
5
  export declare const SHOW_CURSOR: string;
6
6
  export declare const ITALIC_START: string;
7
7
  export declare const ITALIC_END: string;
8
- export declare const DIM_START: string;
9
- export declare const DIM_END: string;
10
8
  export declare const FOREGROUND_COLOR_END: string;
11
9
  export declare const BACKGROUND_COLOR_END: string;
12
10
  export declare const HYPERLINK_END = "\u001B]8;;\u0007";
@@ -1 +1 @@
1
- {"version":3,"file":"Ansi.d.ts","sourceRoot":"","sources":["../../../src/terminal/Ansi.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,QAAa,CAAC;AACrC,eAAO,MAAM,WAAW,QAAY,CAAC;AACrC,eAAO,MAAM,SAAS,QAAa,CAAC;AACpC,eAAO,MAAM,WAAW,QAAe,CAAC;AACxC,eAAO,MAAM,WAAW,QAAe,CAAC;AACxC,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,UAAU,QAAc,CAAC;AACtC,eAAO,MAAM,SAAS,QAAa,CAAC;AACpC,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAChD,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAChD,eAAO,MAAM,aAAa,qBAA8B,CAAC;AAEzD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
1
+ {"version":3,"file":"Ansi.d.ts","sourceRoot":"","sources":["../../../src/terminal/Ansi.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,QAAa,CAAC;AACrC,eAAO,MAAM,WAAW,QAAY,CAAC;AACrC,eAAO,MAAM,SAAS,QAAa,CAAC;AACpC,eAAO,MAAM,WAAW,QAAe,CAAC;AACxC,eAAO,MAAM,WAAW,QAAe,CAAC;AACxC,eAAO,MAAM,YAAY,QAAa,CAAC;AACvC,eAAO,MAAM,UAAU,QAAc,CAAC;AACtC,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAChD,eAAO,MAAM,oBAAoB,QAAc,CAAC;AAChD,eAAO,MAAM,aAAa,qBAA8B,CAAC;AAEzD,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAElD"}
@@ -9,8 +9,6 @@ export const HIDE_CURSOR = CSI + "?25l";
9
9
  export const SHOW_CURSOR = CSI + "?25h";
10
10
  export const ITALIC_START = CSI + "3m";
11
11
  export const ITALIC_END = CSI + "23m";
12
- export const DIM_START = CSI + "2m";
13
- export const DIM_END = CSI + "22m";
14
12
  export const FOREGROUND_COLOR_END = CSI + "39m";
15
13
  export const BACKGROUND_COLOR_END = CSI + "49m";
16
14
  export const HYPERLINK_END = `${OSC}8${SEP}${SEP}${BEL}`;
@@ -4,7 +4,6 @@ export default interface Styler {
4
4
  colorText(text: string, colorValue: number): string;
5
5
  backgroundColorText(text: string, colorValue: number): string;
6
6
  italicText(text: string): string;
7
- dimText(text: string): string;
8
7
  hyperlink(text: string, url: string): string;
9
8
  }
10
9
  //# sourceMappingURL=Styler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Styler.d.ts","sourceRoot":"","sources":["../../../src/terminal/Styler.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,WAAW,MAAM;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9C"}
1
+ {"version":3,"file":"Styler.d.ts","sourceRoot":"","sources":["../../../src/terminal/Styler.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,WAAW,MAAM;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IACpD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9C"}
@@ -15,7 +15,6 @@ export default class TtyStyler implements Styler {
15
15
  colorText(text: string, colorValue: number): string;
16
16
  backgroundColorText(text: string, colorValue: number): string;
17
17
  italicText(text: string): string;
18
- dimText(text: string): string;
19
18
  hyperlink(text: string, url: string): string;
20
19
  }
21
20
  //# sourceMappingURL=TtyStyler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TtyStyler.d.ts","sourceRoot":"","sources":["../../../src/terminal/TtyStyler.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,SAAU,YAAW,MAAM;IAC9C,YAAY,EAAE,OAAO,CAAQ;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAE3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;;;;;OAOG;gBACS,UAAU,GAAE,MAAU,EAAE,iBAAiB,GAAE,OAAc;IAKrE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAgBnD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAyB7D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOhC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAO7B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAM7C"}
1
+ {"version":3,"file":"TtyStyler.d.ts","sourceRoot":"","sources":["../../../src/terminal/TtyStyler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,SAAU,YAAW,MAAM;IAC9C,YAAY,EAAE,OAAO,CAAQ;IAC7B,iBAAiB,EAAE,OAAO,CAAC;IAE3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;;;;;OAOG;gBACS,UAAU,GAAE,MAAU,EAAE,iBAAiB,GAAE,OAAc;IAKrE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAgBnD,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAyB7D,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAOhC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAM7C"}
@@ -1,4 +1,4 @@
1
- import { BACKGROUND_COLOR_END, DIM_END, DIM_START, FOREGROUND_COLOR_END, HYPERLINK_END, hyperlinkStart, ITALIC_END, ITALIC_START, } from "./Ansi.js";
1
+ import { BACKGROUND_COLOR_END, FOREGROUND_COLOR_END, HYPERLINK_END, hyperlinkStart, ITALIC_END, ITALIC_START, } from "./Ansi.js";
2
2
  export default class TtyStyler {
3
3
  colorEnabled = true;
4
4
  hyperlinksEnabled;
@@ -50,12 +50,6 @@ export default class TtyStyler {
50
50
  }
51
51
  return ITALIC_START + text + ITALIC_END;
52
52
  }
53
- dimText(text) {
54
- if (!this.colorEnabled || this.colorLevel === 0) {
55
- return text;
56
- }
57
- return DIM_START + text + DIM_END;
58
- }
59
53
  hyperlink(text, url) {
60
54
  if (!this.hyperlinksEnabled) {
61
55
  return `${text}: ${url}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flowscripter/dynamic-cli-framework",
3
- "version": "5.1.5",
3
+ "version": "5.1.7",
4
4
  "description": "A framework for developing CLI applications which supports dynamic discovery and installation of new commands",
5
5
  "keywords": [
6
6
  "bun",
@@ -48,8 +48,8 @@
48
48
  "build": "tsc -p tsconfig.build.json"
49
49
  },
50
50
  "dependencies": {
51
- "@flowscripter/dynamic-cli-framework-api": "^2.2.0",
52
- "@flowscripter/dynamic-plugin-framework": "2.1.1",
51
+ "@flowscripter/dynamic-cli-framework-api": "^2.3.0",
52
+ "@flowscripter/dynamic-plugin-framework": "^2.2.1",
53
53
  "emphasize": "^7.0.0",
54
54
  "fastest-levenshtein": "^1.0.16",
55
55
  "figlet": "^1.11.0",
@@ -6,6 +6,8 @@ import type {
6
6
  VersionedPluginDescriptor,
7
7
  NpmjsPluginRepositoryConfig,
8
8
  NpmPluginRepositoryConfig,
9
+ FetchCapable,
10
+ FetchInterface,
9
11
  } from "@flowscripter/dynamic-plugin-framework";
10
12
  import {
11
13
  NpmPluginManager,
@@ -13,6 +15,10 @@ import {
13
15
  NpmPluginRepository,
14
16
  } from "@flowscripter/dynamic-plugin-framework";
15
17
 
18
+ function isFetchCapable(value: unknown): value is FetchCapable {
19
+ return typeof value === "object" && value !== null && "setFetch" in value;
20
+ }
21
+
16
22
  export default class DefaultPluginService implements PluginService {
17
23
  readonly #defaultRemoteConfig: NpmjsPluginRepositoryConfig;
18
24
  readonly #defaultLocalConfig: NpmPluginRepositoryConfig;
@@ -50,6 +56,20 @@ export default class DefaultPluginService implements PluginService {
50
56
  );
51
57
  }
52
58
 
59
+ /**
60
+ * Supply the {@link FetchInterface} for the underlying `pluginManager` to delegate fetch calls
61
+ * to, so it respects the host CLI's shutdown handling and default timeout.
62
+ */
63
+ setFetch(fetchInterface: FetchInterface): void {
64
+ if (isFetchCapable(this.#pluginManager)) {
65
+ this.#pluginManager.setFetch(fetchInterface);
66
+ }
67
+ }
68
+
69
+ async checkAvailable(pluginId: string, version?: string): Promise<boolean> {
70
+ return this.#pluginManager.checkAvailable(pluginId, version);
71
+ }
72
+
53
73
  search(query: Readonly<SearchQuery>): AsyncIterable<Readonly<VersionedPluginDescriptor>> {
54
74
  return this.#pluginManager.search(query);
55
75
  }
@@ -12,7 +12,6 @@ import { DYNAMIC_CLI_FRAMEWORK_SERVICE_PROVIDER_FACTORY_EXTENSION_POINT } from "
12
12
  import type { CommandFactory } from "@flowscripter/dynamic-cli-framework-api";
13
13
  import type { ServiceProviderFactory } from "@flowscripter/dynamic-cli-framework-api";
14
14
  import type {
15
- FetchCapable,
16
15
  NpmjsPluginRepositoryConfig,
17
16
  NpmPluginRepositoryConfig,
18
17
  SpawnCapable,
@@ -98,13 +97,11 @@ export default class PluginServiceProvider implements ServiceProvider {
98
97
  }
99
98
 
100
99
  if (!context.doesServiceExist(FETCH_SERVICE_ID)) {
101
- logger.debug("FetchService not available, plugin manager will fetch directly");
102
- } else if (!("setFetch" in pluginManager)) {
103
- logger.debug("Plugin manager does not support FetchCapable, skipping fetch injection");
100
+ logger.debug("FetchService not available, plugin service will fetch directly");
104
101
  } else {
105
102
  const fetchService = context.getServiceById(FETCH_SERVICE_ID) as FetchService;
106
103
  const adapter = new FetchInterfaceAdapter(fetchService, this.#fetchInterfaceAdapterOptions);
107
- (pluginManager as unknown as FetchCapable).setFetch(adapter);
104
+ pluginService.setFetch(adapter);
108
105
  }
109
106
 
110
107
  await pluginManager.registerExtensions(DYNAMIC_CLI_FRAMEWORK_COMMAND_FACTORY_EXTENSION_POINT);
@@ -69,6 +69,20 @@ export class PluginAddSubCommand implements SubCommand {
69
69
  descriptor.version && descriptor.version !== "latest"
70
70
  ? `${descriptor.pluginId}@${descriptor.version}`
71
71
  : descriptor.pluginId;
72
+
73
+ // Confirm the package (and specific version/tag, if requested) actually exists on the
74
+ // remote marketplace before invoking the package manager - so a non-existent plugin or
75
+ // version is reported clearly instead of failing later (and less clearly) inside
76
+ // `bun add`/`npm install`.
77
+ const versionToCheck = descriptor.version === "latest" ? undefined : descriptor.version;
78
+ if (!(await pluginService.checkAvailable(descriptor.pluginId, versionToCheck))) {
79
+ throw new Error(
80
+ versionToCheck
81
+ ? `Version ${versionToCheck} of plugin ${descriptor.pluginId} was not found in the configured plugin registry`
82
+ : `Plugin ${descriptor.pluginId} was not found in the configured plugin registry`,
83
+ );
84
+ }
85
+
72
86
  await printerService.info(`Installing ${installLabel}...\n`, Icon.INFORMATION);
73
87
  await pluginService.install(descriptor);
74
88
  await printerService.print(`Plugin ${descriptor.pluginId} installed.\n`, Icon.SUCCESS);
@@ -152,10 +152,6 @@ export default class DefaultPrinterService implements PrinterService {
152
152
  return this.#styler.italicText(message);
153
153
  }
154
154
 
155
- public dim(message: string): string {
156
- return this.#styler.dimText(message);
157
- }
158
-
159
155
  public yellow(message: string): string {
160
156
  return this.#styler.colorText(message, this.#theme[Color.YELLOW]!);
161
157
  }
@@ -60,7 +60,10 @@ export default class Quote {
60
60
  }
61
61
  const endsWithNewline = message.endsWith("\n");
62
62
  const raw = endsWithNewline ? message.slice(0, -1) : message;
63
- const lines = raw.split("\n").map((line) => this.#prefixLine() + this.#styler.dimText(line));
63
+ const color = this.#levels[this.#levels.length - 1]!.color;
64
+ const lines = raw
65
+ .split("\n")
66
+ .map((line) => this.#prefixLine() + this.#styler.colorText(line, color));
64
67
  return lines.join("\n") + (endsWithNewline ? "\n" : "");
65
68
  }
66
69
  }
@@ -10,8 +10,6 @@ export const HIDE_CURSOR = CSI + "?25l";
10
10
  export const SHOW_CURSOR = CSI + "?25h";
11
11
  export const ITALIC_START = CSI + "3m";
12
12
  export const ITALIC_END = CSI + "23m";
13
- export const DIM_START = CSI + "2m";
14
- export const DIM_END = CSI + "22m";
15
13
  export const FOREGROUND_COLOR_END = CSI + "39m";
16
14
  export const BACKGROUND_COLOR_END = CSI + "49m";
17
15
  export const HYPERLINK_END = `${OSC}8${SEP}${SEP}${BEL}`;
@@ -4,6 +4,5 @@ export default interface Styler {
4
4
  colorText(text: string, colorValue: number): string;
5
5
  backgroundColorText(text: string, colorValue: number): string;
6
6
  italicText(text: string): string;
7
- dimText(text: string): string;
8
7
  hyperlink(text: string, url: string): string;
9
8
  }
@@ -1,7 +1,5 @@
1
1
  import {
2
2
  BACKGROUND_COLOR_END,
3
- DIM_END,
4
- DIM_START,
5
3
  FOREGROUND_COLOR_END,
6
4
  HYPERLINK_END,
7
5
  hyperlinkStart,
@@ -77,13 +75,6 @@ export default class TtyStyler implements Styler {
77
75
  return ITALIC_START + text + ITALIC_END;
78
76
  }
79
77
 
80
- dimText(text: string): string {
81
- if (!this.colorEnabled || this.colorLevel === 0) {
82
- return text;
83
- }
84
- return DIM_START + text + DIM_END;
85
- }
86
-
87
78
  hyperlink(text: string, url: string): string {
88
79
  if (!this.hyperlinksEnabled) {
89
80
  return `${text}: ${url}`;