@gunshi/plugin 0.32.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/index.d.ts +95 -57
  2. package/package.json +2 -2
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../../node_modules/.pnpm/args-tokens@0.25.0/node_modules/args-tokens/lib/parser-D95CJBHr.d.ts
1
+ //#region ../../node_modules/.pnpm/args-tokens@0.26.1/node_modules/args-tokens/lib/parser-DT7Ztcch.d.ts
2
2
  //#region src/parser.d.ts
3
3
  /**
4
4
  * Entry point of argument parser.
@@ -55,7 +55,7 @@ interface ArgToken {
55
55
  * Parser Options.
56
56
  */
57
57
  //#endregion
58
- //#region ../../node_modules/.pnpm/args-tokens@0.25.0/node_modules/args-tokens/lib/resolver.d.ts
58
+ //#region ../../node_modules/.pnpm/args-tokens@0.26.1/node_modules/args-tokens/lib/resolver.d.ts
59
59
  //#region src/resolver.d.ts
60
60
  /**
61
61
  * An argument schema definition for command-line argument parsing.
@@ -172,7 +172,10 @@ interface ArgSchema {
172
172
  * When `true`, the argument must be provided by the user.
173
173
  * If missing, an `ArgResolveError` with type 'required' will be thrown.
174
174
  *
175
- * Note: Only `true` is allowed (not `false`) to make intent explicit.
175
+ * For single-value positional arguments, omitting `required` keeps the argument
176
+ * required for compatibility. Set `required: false` to make a positional argument
177
+ * optional. Optional positional arguments leave enough input values for later
178
+ * required positional arguments before consuming a value.
176
179
  *
177
180
  * @example
178
181
  * Required arguments:
@@ -196,7 +199,8 @@ interface ArgSchema {
196
199
  *
197
200
  * When `true`, the resolved value becomes an array.
198
201
  * For options: can be specified multiple times (--tag foo --tag bar)
199
- * For positional: collects remaining positional arguments
202
+ * For positional: collects remaining positional arguments after preserving values for
203
+ * later required positional arguments.
200
204
  *
201
205
  * Note: Only `true` is allowed (not `false`) to make intent explicit.
202
206
  *
@@ -276,7 +280,11 @@ interface ArgSchema {
276
280
  * - `boolean` type: boolean default
277
281
  * - `number` type: number default
278
282
  * - `enum` type: must be one of the `choices` values
279
- * - `positional`/`custom` type: any appropriate default
283
+ * - `positional`/`custom` type: string, boolean, or number default
284
+ *
285
+ * For single-value positional arguments, the default is used when the positional
286
+ * value is missing or when the value is preserved for later required positional
287
+ * arguments, unless `required: true` is set.
280
288
  *
281
289
  * @example
282
290
  * Default values by type:
@@ -533,7 +541,8 @@ type FilterArgs<A extends Args, V extends Record<keyof A, unknown>, K extends ke
533
541
  *
534
542
  * @internal
535
543
  */
536
- type FilterPositionalArgs<A extends Args, V extends Record<keyof A, unknown>> = { [Arg in keyof A as A[Arg]['type'] extends 'positional' ? Arg : never]: V[Arg] };
544
+ type FilterPositionalArgs<A extends Args, V extends Record<keyof A, unknown>> = { [Arg in keyof A as IsRequiredPositionalArg<A[Arg]> extends true ? Arg : never]: V[Arg] };
545
+ type IsRequiredPositionalArg<A extends ArgSchema> = A['type'] extends 'positional' ? A['multiple'] extends true ? A['required'] extends true ? true : false : A['required'] extends false ? A['default'] extends {} ? true : false : true : false;
537
546
  /**
538
547
  * An arguments for {@link resolveArgs | resolve arguments}.
539
548
  */
@@ -581,15 +590,6 @@ type ArgExplicitlyProvided<A extends Args> = { [K in keyof A]: boolean };
581
590
  */
582
591
  //#endregion
583
592
  //#region ../gunshi/src/plugin/context.d.ts
584
- /**
585
- * Type helper to create GunshiParams from extracted args and extensions
586
- *
587
- * @internal
588
- */
589
- type ExtractedParams<G extends GunshiParamsConstraint, L extends Record<string, unknown> = {}> = {
590
- args: ExtractArgs<G>;
591
- extensions: ExtractExtensions<G> & L;
592
- };
593
593
  /**
594
594
  * Gunshi plugin context interface.
595
595
  *
@@ -638,7 +638,7 @@ interface PluginContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
638
638
  *
639
639
  * @param decorator - A decorator function that wraps the base header renderer.
640
640
  */
641
- decorateHeaderRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>, ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>): void;
641
+ decorateHeaderRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>) => Promise<string>, ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>) => Promise<string>): void;
642
642
  /**
643
643
  * Decorate the usage renderer.
644
644
  *
@@ -646,7 +646,7 @@ interface PluginContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
646
646
  *
647
647
  * @param decorator - A decorator function that wraps the base usage renderer.
648
648
  */
649
- decorateUsageRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>, ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>): void;
649
+ decorateUsageRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>) => Promise<string>, ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>) => Promise<string>): void;
650
650
  /**
651
651
  * Decorate the validation errors renderer.
652
652
  *
@@ -654,7 +654,7 @@ interface PluginContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
654
654
  *
655
655
  * @param decorator - A decorator function that wraps the base validation errors renderer.
656
656
  */
657
- decorateValidationErrorsRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>, error: AggregateError) => Promise<string>, ctx: Readonly<CommandContext<ExtractedParams<G, L>>>, error: AggregateError) => Promise<string>): void;
657
+ decorateValidationErrorsRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>, error: AggregateError) => Promise<string>, ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>, error: AggregateError) => Promise<string>): void;
658
658
  /**
659
659
  * Decorate the command execution.
660
660
  *
@@ -664,7 +664,7 @@ interface PluginContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
664
664
  *
665
665
  * @param decorator - A decorator function that wraps the command runner
666
666
  */
667
- decorateCommand<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRunner: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Awaitable<void | string>) => (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Awaitable<void | string>): void;
667
+ decorateCommand<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRunner: (ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>) => Awaitable<void | string>) => (ctx: Readonly<CommandContext<MergeGunshiExtensions<G, L>>>) => Awaitable<void | string>): void;
668
668
  }
669
669
  //#endregion
670
670
  //#region ../gunshi/src/plugin/core.d.ts
@@ -730,6 +730,36 @@ type PluginExtension<T = Record<string, unknown>, G extends GunshiParams = Defau
730
730
  type OnPluginExtension<G extends GunshiParams = DefaultGunshiParams> = (ctx: Readonly<CommandContext<G>>, cmd: Readonly<Command<G>>) => Awaitable<void>;
731
731
  type IsStringLiteral<S extends string> = string extends S ? false : true;
732
732
  type MergeExtension<Id, ResolvedDepExt extends ExtendContext, PluginExt extends ExtendContext> = Id extends infer I ? I extends string ? IsStringLiteral<I> extends true ? ResolvedDepExt & { [K in I]: PluginExt } : ResolvedDepExt : ResolvedDepExt : ResolvedDepExt;
733
+ /**
734
+ * Extensions resolved from the declared plugin dependencies.
735
+ *
736
+ * @internal
737
+ */
738
+ type DependencyExtensions<Deps extends ReadonlyArray<PluginDependency | string>, Context extends ExtendContext> = InferDependencyExtensions<Deps, Context>;
739
+ /**
740
+ * Gunshi params available while a plugin extension resolves its dependencies.
741
+ *
742
+ * @internal
743
+ */
744
+ type DependencyParams<Deps extends ReadonlyArray<PluginDependency | string>, Context extends ExtendContext> = GunshiParams<{
745
+ args: Args;
746
+ extensions: DependencyExtensions<Deps, Context>;
747
+ }>;
748
+ /**
749
+ * Extensions available after applying the current plugin extension.
750
+ *
751
+ * @internal
752
+ */
753
+ type MergedPluginExtensions<Id extends string, Deps extends ReadonlyArray<PluginDependency | string>, Context extends ExtendContext, Ext extends ExtendContext> = MergeExtension<Id, DependencyExtensions<Deps, Context>, Ext>;
754
+ /**
755
+ * Gunshi params available after applying the current plugin extension.
756
+ *
757
+ * @internal
758
+ */
759
+ type MergedPluginParams<Id extends string, Deps extends ReadonlyArray<PluginDependency | string>, Context extends ExtendContext, Ext extends ExtendContext> = GunshiParams<{
760
+ args: Args;
761
+ extensions: MergedPluginExtensions<Id, Deps, Context, Ext>;
762
+ }>;
733
763
  /**
734
764
  * Plugin definition options
735
765
  *
@@ -743,13 +773,7 @@ Deps extends ReadonlyArray<PluginDependency | string> = (PluginDependency | stri
743
773
  // for plugin dependencies
744
774
  Ext extends Record<string, unknown> = {},
745
775
  // for plugin extension type
746
- ResolvedDepExt extends GunshiParams = GunshiParams<{
747
- args: Args;
748
- extensions: InferDependencyExtensions<Deps, DepExt>;
749
- }>, PluginExt extends PluginExtension<Ext, ResolvedDepExt> = PluginExtension<Ext, ResolvedDepExt>, MergedExt extends GunshiParams = GunshiParams<{
750
- args: Args;
751
- extensions: MergeExtension<Id, InferDependencyExtensions<Deps, DepExt>, Awaited<ReturnType<PluginExt>>>;
752
- }>> {
776
+ ResolvedDepExt extends GunshiParams = DependencyParams<Deps, DepExt>, PluginExt extends PluginExtension<Ext, ResolvedDepExt> = PluginExtension<Ext, ResolvedDepExt>, MergedExt extends GunshiParams = MergedPluginParams<Id, Deps, DepExt, Awaited<ReturnType<PluginExt>>>> {
753
777
  /**
754
778
  * Plugin unique identifier
755
779
  */
@@ -858,20 +882,11 @@ Deps extends ReadonlyArray<PluginDependency | string> = [],
858
882
  // for plugin dependencies
859
883
  Extension extends {} = {},
860
884
  // for plugin extension type
861
- ResolvedDepExtensions extends GunshiParams = GunshiParams<{
862
- args: Args;
863
- extensions: InferDependencyExtensions<Deps, Context>;
864
- }>, PluginExt extends PluginExtension<Extension, DefaultGunshiParams> = PluginExtension<Extension, ResolvedDepExtensions>, MergedExtensions extends GunshiParams = GunshiParams<{
865
- args: Args;
866
- extensions: MergeExtension<Id, InferDependencyExtensions<Deps, Context>, Awaited<ReturnType<PluginExt>>>;
867
- }>>(options: {
885
+ ResolvedDepExtensions extends GunshiParams = DependencyParams<Deps, Context>, PluginExt extends PluginExtension<Extension, DefaultGunshiParams> = PluginExtension<Extension, ResolvedDepExtensions>, MergedExtensions extends GunshiParams = MergedPluginParams<Id, Deps, Context, Awaited<ReturnType<PluginExt>>>>(options: {
868
886
  id: Id;
869
887
  name?: string;
870
888
  dependencies?: Deps;
871
- setup?: (ctx: Readonly<PluginContext<GunshiParams<{
872
- args: Args;
873
- extensions: MergeExtension<Id, InferDependencyExtensions<Deps, Context>, Awaited<ReturnType<PluginExt>>>;
874
- }>>>) => Awaitable<void>;
889
+ setup?: (ctx: Readonly<PluginContext<MergedPluginParams<Id, Deps, Context, Awaited<ReturnType<PluginExt>>>>>) => Awaitable<void>;
875
890
  extension: PluginExt;
876
891
  onExtension?: OnPluginExtension<MergedExtensions>;
877
892
  }): PluginWithExtension<Awaited<ReturnType<PluginExt>>>;
@@ -896,20 +911,11 @@ Deps extends ReadonlyArray<PluginDependency | string> = [],
896
911
  // for plugin dependencies
897
912
  Extension extends Record<string, unknown> = {},
898
913
  // for plugin extension type
899
- ResolvedDepExtensions extends GunshiParams = GunshiParams<{
900
- args: Args;
901
- extensions: InferDependencyExtensions<Deps, Context>;
902
- }>, PluginExt extends PluginExtension<Extension, DefaultGunshiParams> = PluginExtension<Extension, ResolvedDepExtensions>, MergedExtensions extends GunshiParams = GunshiParams<{
903
- args: Args;
904
- extensions: MergeExtension<Id, InferDependencyExtensions<Deps, Context>, Awaited<ReturnType<PluginExt>>>;
905
- }>>(options: {
914
+ ResolvedDepExtensions extends GunshiParams = DependencyParams<Deps, Context>, PluginExt extends PluginExtension<Extension, DefaultGunshiParams> = PluginExtension<Extension, ResolvedDepExtensions>, MergedExtensions extends GunshiParams = MergedPluginParams<Id, Deps, Context, Awaited<ReturnType<PluginExt>>>>(options: {
906
915
  id: Id;
907
916
  name?: string;
908
917
  dependencies?: Deps;
909
- setup?: (ctx: Readonly<PluginContext<GunshiParams<{
910
- args: Args;
911
- extensions: MergeExtension<Id, InferDependencyExtensions<Deps, Context>, Awaited<ReturnType<PluginExt>>>;
912
- }>>>) => Awaitable<void>;
918
+ setup?: (ctx: Readonly<PluginContext<MergedPluginParams<Id, Deps, Context, Awaited<ReturnType<PluginExt>>>>>) => Awaitable<void>;
913
919
  onExtension?: OnPluginExtension<MergedExtensions>;
914
920
  }): PluginWithoutExtension<DefaultGunshiParams['extensions']>;
915
921
  //#endregion
@@ -1011,11 +1017,37 @@ type ExtractExtensions<G> = G extends GunshiParams<any> ? G['extensions'] : G ex
1011
1017
  * @internal
1012
1018
  */
1013
1019
  type NormalizeToGunshiParams<G> = G extends GunshiParams<any> ? G : G extends {
1014
- extensions: ExtendContext;
1020
+ args: infer A extends Args;
1021
+ extensions: infer E extends ExtendContext;
1022
+ } ? GunshiParams<{
1023
+ args: A;
1024
+ extensions: E;
1025
+ }> : G extends {
1026
+ args: infer A extends Args;
1027
+ } ? GunshiParams<{
1028
+ args: A;
1029
+ extensions: {};
1030
+ }> : G extends {
1031
+ extensions: infer E extends ExtendContext;
1015
1032
  } ? GunshiParams<{
1016
1033
  args: Args;
1017
- extensions: G['extensions'];
1034
+ extensions: E;
1018
1035
  }> : DefaultGunshiParams;
1036
+ /**
1037
+ * Type helper to merge command context extensions into G
1038
+ *
1039
+ * @internal
1040
+ */
1041
+ type MergeGunshiExtensions<G extends GunshiParamsConstraint, E extends ExtendContext> = GunshiParams<{
1042
+ /**
1043
+ * Command argument definitions.
1044
+ */
1045
+ args: ExtractArgs<G>;
1046
+ /**
1047
+ * Merged command context extensions.
1048
+ */
1049
+ extensions: ExtractExtensions<G> & E;
1050
+ }>;
1019
1051
  /**
1020
1052
  * Command environment.
1021
1053
  *
@@ -1329,7 +1361,7 @@ interface CommandContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
1329
1361
  validationError?: AggregateError;
1330
1362
  }
1331
1363
  /**
1332
- * CommandContextCore type (base type without extensions)
1364
+ * Readonly command context available to a command context extension factory.
1333
1365
  *
1334
1366
  * @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command context.
1335
1367
  *
@@ -1605,7 +1637,16 @@ declare const CLI_OPTIONS_DEFAULT: CliOptions<DefaultGunshiParams>;
1605
1637
  *
1606
1638
  * @internal
1607
1639
  */
1608
- type ExtractExtensions$1<E extends Record<string, CommandContextExtension>> = { [K in keyof E]: E[K] extends CommandContextExtension<infer T> ? T : never };
1640
+ type ExtractExtensionValues<E extends Record<string, CommandContextExtension>> = { [K in keyof E]: E[K] extends CommandContextExtension<infer T> ? T : never };
1641
+ /**
1642
+ * Return type of {@link createCommandContext}
1643
+ *
1644
+ * @internal
1645
+ */
1646
+ type CommandContextResult<G extends GunshiParamsConstraint, E extends Record<string, CommandContextExtension>> = {} extends ExtractExtensionValues<E> ? Readonly<CommandContext<G>> : Readonly<CommandContext<GunshiParams<{
1647
+ args: ExtractArgs<G>;
1648
+ extensions: ExtractExtensionValues<E>;
1649
+ }>>>;
1609
1650
  /**
1610
1651
  * Parameters of {@link createCommandContext}
1611
1652
  */
@@ -1692,10 +1733,7 @@ declare function createCommandContext<G extends GunshiParamsConstraint = Default
1692
1733
  commandPath,
1693
1734
  omitted,
1694
1735
  validationError
1695
- }: CommandContextParams<G, V, C, E>): Promise<{} extends ExtractExtensions$1<E> ? Readonly<CommandContext<G>> : Readonly<CommandContext<GunshiParams<{
1696
- args: ExtractArgs<G>;
1697
- extensions: ExtractExtensions$1<E>;
1698
- }>>>>;
1736
+ }: CommandContextParams<G, V, C, E>): Promise<CommandContextResult<G, E>>;
1699
1737
  //#endregion
1700
1738
  //#region src/index.d.ts
1701
1739
  /**
@@ -1704,4 +1742,4 @@ declare function createCommandContext<G extends GunshiParamsConstraint = Default
1704
1742
  */
1705
1743
 
1706
1744
  //#endregion
1707
- export { ANONYMOUS_COMMAND_NAME, type ArgSchema, type ArgToken, type ArgValues, type Args, Awaitable, CLI_OPTIONS_DEFAULT, Command, CommandContext, CommandContextCore, CommandContextExtension, CommandContextParams, CommandDecorator, CommandExamplesFetcher, CommandRunner, DefaultGunshiParams, ExtendContext, ExtractArgs, ExtractExtensions, GunshiParams, GunshiParamsConstraint, LazyCommand, NormalizeToGunshiParams, OnPluginExtension, Plugin, PluginContext, PluginDependency, PluginExtension, PluginFunction, PluginOptions, PluginWithExtension, PluginWithoutExtension, Prettify, RendererDecorator, ValidationErrorsDecorator, createCommandContext, plugin };
1745
+ export { ANONYMOUS_COMMAND_NAME, type ArgSchema, type ArgToken, type ArgValues, type Args, Awaitable, CLI_OPTIONS_DEFAULT, Command, CommandContext, CommandContextCore, CommandContextExtension, CommandContextParams, CommandDecorator, CommandExamplesFetcher, CommandRunner, DefaultGunshiParams, ExtendContext, ExtractArgs, ExtractExtensions, GunshiParams, GunshiParamsConstraint, LazyCommand, MergeGunshiExtensions, NormalizeToGunshiParams, OnPluginExtension, Plugin, PluginContext, PluginDependency, PluginExtension, PluginFunction, PluginOptions, PluginWithExtension, PluginWithoutExtension, Prettify, RendererDecorator, ValidationErrorsDecorator, createCommandContext, plugin };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gunshi/plugin",
3
3
  "description": "plugin development kit for gunshi",
4
- "version": "0.32.0",
4
+ "version": "0.34.0",
5
5
  "author": {
6
6
  "name": "kazuya kawaguchi",
7
7
  "email": "kawakazu80@gmail.com"
@@ -56,7 +56,7 @@
56
56
  "jsr-exports-lint": "^0.4.2",
57
57
  "publint": "^0.3.20",
58
58
  "tsdown": "0.21.0",
59
- "gunshi": "0.32.0"
59
+ "gunshi": "0.34.0"
60
60
  },
61
61
  "scripts": {
62
62
  "build": "tsdown",