zod-args-parser 1.2.8 → 2.0.0-beta.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.
- package/README.md +525 -588
- package/lib/cjs/autocomplete-scripts/bash-autocomplete-script.cjs +2 -0
- package/lib/cjs/autocomplete-scripts/bash-autocomplete-script.cjs.map +1 -0
- package/lib/cjs/autocomplete-scripts/powershell-autocomplete-script.cjs +2 -0
- package/lib/cjs/autocomplete-scripts/powershell-autocomplete-script.cjs.map +1 -0
- package/lib/cjs/autocomplete-scripts/zsh-autocomplete-script.cjs +42 -0
- package/lib/cjs/autocomplete-scripts/zsh-autocomplete-script.cjs.map +1 -0
- package/lib/cjs/coerce/coerce-methods.cjs +2 -0
- package/lib/cjs/coerce/coerce-methods.cjs.map +1 -0
- package/lib/cjs/coerce/string-to-array.cjs +2 -0
- package/lib/cjs/coerce/string-to-array.cjs.map +1 -0
- package/lib/cjs/coerce/string-to-primitive.cjs +2 -0
- package/lib/cjs/coerce/string-to-primitive.cjs.map +1 -0
- package/lib/cjs/coerce/string-to-set.cjs +2 -0
- package/lib/cjs/coerce/string-to-set.cjs.map +1 -0
- package/lib/cjs/definitions/define-arguments.cjs +2 -0
- package/lib/cjs/definitions/define-arguments.cjs.map +1 -0
- package/lib/cjs/definitions/define-cli.cjs +2 -0
- package/lib/cjs/definitions/define-cli.cjs.map +1 -0
- package/lib/cjs/definitions/define-options.cjs +2 -0
- package/lib/cjs/definitions/define-options.cjs.map +1 -0
- package/lib/cjs/definitions/define-subcommand.cjs +2 -0
- package/lib/cjs/definitions/define-subcommand.cjs.map +1 -0
- package/lib/cjs/definitions/validate-cli-definition.cjs +2 -0
- package/lib/cjs/definitions/validate-cli-definition.cjs.map +1 -0
- package/lib/cjs/help-message/format-arguments.cjs +2 -0
- package/lib/cjs/help-message/format-arguments.cjs.map +1 -0
- package/lib/cjs/help-message/format-options.cjs +2 -0
- package/lib/cjs/help-message/format-options.cjs.map +1 -0
- package/lib/cjs/help-message/format-subcommands.cjs +2 -0
- package/lib/cjs/help-message/format-subcommands.cjs.map +1 -0
- package/lib/cjs/help-message/generate-for-cli.cjs +2 -0
- package/lib/cjs/help-message/generate-for-cli.cjs.map +1 -0
- package/lib/cjs/help-message/generate-for-subcommand.cjs +2 -0
- package/lib/cjs/help-message/generate-for-subcommand.cjs.map +1 -0
- package/lib/cjs/help-message/print-help.cjs +2 -0
- package/lib/cjs/help-message/print-help.cjs.map +1 -0
- package/lib/cjs/help-message/set-defaults.cjs +2 -0
- package/lib/cjs/help-message/set-defaults.cjs.map +1 -0
- package/lib/cjs/help-message/styles.cjs +2 -0
- package/lib/cjs/help-message/styles.cjs.map +1 -0
- package/lib/cjs/help-message/terminal-markdown.cjs +2 -0
- package/lib/cjs/help-message/terminal-markdown.cjs.map +1 -0
- package/lib/cjs/index.cjs +2 -0
- package/lib/cjs/index.cjs.map +1 -0
- package/lib/cjs/markdown/generate-markdown.cjs +2 -0
- package/lib/cjs/markdown/generate-markdown.cjs.map +1 -0
- package/lib/cjs/metadata/arguments-metadata.cjs +2 -0
- package/lib/cjs/metadata/arguments-metadata.cjs.map +1 -0
- package/lib/cjs/metadata/cli-metadata.cjs +2 -0
- package/lib/cjs/metadata/cli-metadata.cjs.map +1 -0
- package/lib/cjs/metadata/options-metadata.cjs +2 -0
- package/lib/cjs/metadata/options-metadata.cjs.map +1 -0
- package/lib/cjs/metadata/subcommands-metadata.cjs +2 -0
- package/lib/cjs/metadata/subcommands-metadata.cjs.map +1 -0
- package/lib/cjs/parse/context/cli-context-builder.cjs +2 -0
- package/lib/cjs/parse/context/cli-context-builder.cjs.map +1 -0
- package/lib/cjs/parse/context/object-context-builder.cjs +2 -0
- package/lib/cjs/parse/context/object-context-builder.cjs.map +1 -0
- package/lib/cjs/parse/parser-utilities.cjs +2 -0
- package/lib/cjs/parse/parser-utilities.cjs.map +1 -0
- package/lib/cjs/parse/safe-parse.cjs +2 -0
- package/lib/cjs/parse/safe-parse.cjs.map +1 -0
- package/lib/cjs/parse/validation/validate-context.cjs +2 -0
- package/lib/cjs/parse/validation/validate-context.cjs.map +1 -0
- package/lib/cjs/parse/validation/validators/arguments.cjs +2 -0
- package/lib/cjs/parse/validation/validators/arguments.cjs.map +1 -0
- package/lib/cjs/parse/validation/validators/conflict.cjs +2 -0
- package/lib/cjs/parse/validation/validators/conflict.cjs.map +1 -0
- package/lib/cjs/parse/validation/validators/exclusive.cjs +2 -0
- package/lib/cjs/parse/validation/validators/exclusive.cjs.map +1 -0
- package/lib/cjs/parse/validation/validators/explicitly-passed.cjs +2 -0
- package/lib/cjs/parse/validation/validators/explicitly-passed.cjs.map +1 -0
- package/lib/cjs/parse/validation/validators/options.cjs +2 -0
- package/lib/cjs/parse/validation/validators/options.cjs.map +1 -0
- package/lib/cjs/parse/validation/validators/requires.cjs +2 -0
- package/lib/cjs/parse/validation/validators/requires.cjs.map +1 -0
- package/lib/cjs/utilities.cjs +2 -0
- package/lib/cjs/utilities.cjs.map +1 -0
- package/lib/esm/autocomplete-scripts/bash-autocomplete-script.js +2 -0
- package/lib/esm/autocomplete-scripts/bash-autocomplete-script.js.map +1 -0
- package/lib/esm/autocomplete-scripts/powershell-autocomplete-script.js +2 -0
- package/lib/esm/autocomplete-scripts/powershell-autocomplete-script.js.map +1 -0
- package/lib/esm/autocomplete-scripts/zsh-autocomplete-script.js +42 -0
- package/lib/esm/autocomplete-scripts/zsh-autocomplete-script.js.map +1 -0
- package/lib/esm/coerce/coerce-methods.js +2 -0
- package/lib/esm/coerce/coerce-methods.js.map +1 -0
- package/lib/esm/coerce/string-to-array.js +2 -0
- package/lib/esm/coerce/string-to-array.js.map +1 -0
- package/lib/esm/coerce/string-to-primitive.js +2 -0
- package/lib/esm/coerce/string-to-primitive.js.map +1 -0
- package/lib/esm/coerce/string-to-set.js +2 -0
- package/lib/esm/coerce/string-to-set.js.map +1 -0
- package/lib/esm/definitions/define-arguments.js +2 -0
- package/lib/esm/definitions/define-arguments.js.map +1 -0
- package/lib/esm/definitions/define-cli.js +2 -0
- package/lib/esm/definitions/define-cli.js.map +1 -0
- package/lib/esm/definitions/define-options.js +2 -0
- package/lib/esm/definitions/define-options.js.map +1 -0
- package/lib/esm/definitions/define-subcommand.js +2 -0
- package/lib/esm/definitions/define-subcommand.js.map +1 -0
- package/lib/esm/definitions/validate-cli-definition.js +2 -0
- package/lib/esm/definitions/validate-cli-definition.js.map +1 -0
- package/lib/esm/help-message/format-arguments.js +2 -0
- package/lib/esm/help-message/format-arguments.js.map +1 -0
- package/lib/esm/help-message/format-options.js +2 -0
- package/lib/esm/help-message/format-options.js.map +1 -0
- package/lib/esm/help-message/format-subcommands.js +2 -0
- package/lib/esm/help-message/format-subcommands.js.map +1 -0
- package/lib/esm/help-message/generate-for-cli.js +2 -0
- package/lib/esm/help-message/generate-for-cli.js.map +1 -0
- package/lib/esm/help-message/generate-for-subcommand.js +2 -0
- package/lib/esm/help-message/generate-for-subcommand.js.map +1 -0
- package/lib/esm/help-message/print-help.js +2 -0
- package/lib/esm/help-message/print-help.js.map +1 -0
- package/lib/esm/help-message/set-defaults.js +2 -0
- package/lib/esm/help-message/set-defaults.js.map +1 -0
- package/lib/esm/help-message/styles.js +2 -0
- package/lib/esm/help-message/styles.js.map +1 -0
- package/lib/esm/help-message/terminal-markdown.js +2 -0
- package/lib/esm/help-message/terminal-markdown.js.map +1 -0
- package/lib/esm/index.js +2 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/markdown/generate-markdown.js +2 -0
- package/lib/esm/markdown/generate-markdown.js.map +1 -0
- package/lib/esm/metadata/arguments-metadata.js +2 -0
- package/lib/esm/metadata/arguments-metadata.js.map +1 -0
- package/lib/esm/metadata/cli-metadata.js +2 -0
- package/lib/esm/metadata/cli-metadata.js.map +1 -0
- package/lib/esm/metadata/options-metadata.js +2 -0
- package/lib/esm/metadata/options-metadata.js.map +1 -0
- package/lib/esm/metadata/subcommands-metadata.js +2 -0
- package/lib/esm/metadata/subcommands-metadata.js.map +1 -0
- package/lib/esm/parse/context/cli-context-builder.js +2 -0
- package/lib/esm/parse/context/cli-context-builder.js.map +1 -0
- package/lib/esm/parse/context/object-context-builder.js +2 -0
- package/lib/esm/parse/context/object-context-builder.js.map +1 -0
- package/lib/esm/parse/parser-utilities.js +2 -0
- package/lib/esm/parse/parser-utilities.js.map +1 -0
- package/lib/esm/parse/safe-parse.js +2 -0
- package/lib/esm/parse/safe-parse.js.map +1 -0
- package/lib/esm/parse/validation/validate-context.js +2 -0
- package/lib/esm/parse/validation/validate-context.js.map +1 -0
- package/lib/esm/parse/validation/validators/arguments.js +2 -0
- package/lib/esm/parse/validation/validators/arguments.js.map +1 -0
- package/lib/esm/parse/validation/validators/conflict.js +2 -0
- package/lib/esm/parse/validation/validators/conflict.js.map +1 -0
- package/lib/esm/parse/validation/validators/exclusive.js +2 -0
- package/lib/esm/parse/validation/validators/exclusive.js.map +1 -0
- package/lib/esm/parse/validation/validators/explicitly-passed.js +2 -0
- package/lib/esm/parse/validation/validators/explicitly-passed.js.map +1 -0
- package/lib/esm/parse/validation/validators/options.js +2 -0
- package/lib/esm/parse/validation/validators/options.js.map +1 -0
- package/lib/esm/parse/validation/validators/requires.js +2 -0
- package/lib/esm/parse/validation/validators/requires.js.map +1 -0
- package/lib/esm/utilities.js +2 -0
- package/lib/esm/utilities.js.map +1 -0
- package/lib/iife/index.js +2 -0
- package/lib/iife/index.js.map +1 -0
- package/lib/mjs/autocomplete-scripts/bash-autocomplete-script.mjs +2 -0
- package/lib/mjs/autocomplete-scripts/bash-autocomplete-script.mjs.map +1 -0
- package/lib/mjs/autocomplete-scripts/powershell-autocomplete-script.mjs +2 -0
- package/lib/mjs/autocomplete-scripts/powershell-autocomplete-script.mjs.map +1 -0
- package/lib/mjs/autocomplete-scripts/zsh-autocomplete-script.mjs +42 -0
- package/lib/mjs/autocomplete-scripts/zsh-autocomplete-script.mjs.map +1 -0
- package/lib/mjs/coerce/coerce-methods.mjs +2 -0
- package/lib/mjs/coerce/coerce-methods.mjs.map +1 -0
- package/lib/mjs/coerce/string-to-array.mjs +2 -0
- package/lib/mjs/coerce/string-to-array.mjs.map +1 -0
- package/lib/mjs/coerce/string-to-primitive.mjs +2 -0
- package/lib/mjs/coerce/string-to-primitive.mjs.map +1 -0
- package/lib/mjs/coerce/string-to-set.mjs +2 -0
- package/lib/mjs/coerce/string-to-set.mjs.map +1 -0
- package/lib/mjs/definitions/define-arguments.mjs +2 -0
- package/lib/mjs/definitions/define-arguments.mjs.map +1 -0
- package/lib/mjs/definitions/define-cli.mjs +2 -0
- package/lib/mjs/definitions/define-cli.mjs.map +1 -0
- package/lib/mjs/definitions/define-options.mjs +2 -0
- package/lib/mjs/definitions/define-options.mjs.map +1 -0
- package/lib/mjs/definitions/define-subcommand.mjs +2 -0
- package/lib/mjs/definitions/define-subcommand.mjs.map +1 -0
- package/lib/mjs/definitions/validate-cli-definition.mjs +2 -0
- package/lib/mjs/definitions/validate-cli-definition.mjs.map +1 -0
- package/lib/mjs/help-message/format-arguments.mjs +2 -0
- package/lib/mjs/help-message/format-arguments.mjs.map +1 -0
- package/lib/mjs/help-message/format-options.mjs +2 -0
- package/lib/mjs/help-message/format-options.mjs.map +1 -0
- package/lib/mjs/help-message/format-subcommands.mjs +2 -0
- package/lib/mjs/help-message/format-subcommands.mjs.map +1 -0
- package/lib/mjs/help-message/generate-for-cli.mjs +2 -0
- package/lib/mjs/help-message/generate-for-cli.mjs.map +1 -0
- package/lib/mjs/help-message/generate-for-subcommand.mjs +2 -0
- package/lib/mjs/help-message/generate-for-subcommand.mjs.map +1 -0
- package/lib/mjs/help-message/print-help.mjs +2 -0
- package/lib/mjs/help-message/print-help.mjs.map +1 -0
- package/lib/mjs/help-message/set-defaults.mjs +2 -0
- package/lib/mjs/help-message/set-defaults.mjs.map +1 -0
- package/lib/mjs/help-message/styles.mjs +2 -0
- package/lib/mjs/help-message/styles.mjs.map +1 -0
- package/lib/mjs/help-message/terminal-markdown.mjs +2 -0
- package/lib/mjs/help-message/terminal-markdown.mjs.map +1 -0
- package/lib/mjs/index.mjs +2 -0
- package/lib/mjs/index.mjs.map +1 -0
- package/lib/mjs/markdown/generate-markdown.mjs +2 -0
- package/lib/mjs/markdown/generate-markdown.mjs.map +1 -0
- package/lib/mjs/metadata/arguments-metadata.mjs +2 -0
- package/lib/mjs/metadata/arguments-metadata.mjs.map +1 -0
- package/lib/mjs/metadata/cli-metadata.mjs +2 -0
- package/lib/mjs/metadata/cli-metadata.mjs.map +1 -0
- package/lib/mjs/metadata/options-metadata.mjs +2 -0
- package/lib/mjs/metadata/options-metadata.mjs.map +1 -0
- package/lib/mjs/metadata/subcommands-metadata.mjs +2 -0
- package/lib/mjs/metadata/subcommands-metadata.mjs.map +1 -0
- package/lib/mjs/parse/context/cli-context-builder.mjs +2 -0
- package/lib/mjs/parse/context/cli-context-builder.mjs.map +1 -0
- package/lib/mjs/parse/context/object-context-builder.mjs +2 -0
- package/lib/mjs/parse/context/object-context-builder.mjs.map +1 -0
- package/lib/mjs/parse/parser-utilities.mjs +2 -0
- package/lib/mjs/parse/parser-utilities.mjs.map +1 -0
- package/lib/mjs/parse/safe-parse.mjs +2 -0
- package/lib/mjs/parse/safe-parse.mjs.map +1 -0
- package/lib/mjs/parse/validation/validate-context.mjs +2 -0
- package/lib/mjs/parse/validation/validate-context.mjs.map +1 -0
- package/lib/mjs/parse/validation/validators/arguments.mjs +2 -0
- package/lib/mjs/parse/validation/validators/arguments.mjs.map +1 -0
- package/lib/mjs/parse/validation/validators/conflict.mjs +2 -0
- package/lib/mjs/parse/validation/validators/conflict.mjs.map +1 -0
- package/lib/mjs/parse/validation/validators/exclusive.mjs +2 -0
- package/lib/mjs/parse/validation/validators/exclusive.mjs.map +1 -0
- package/lib/mjs/parse/validation/validators/explicitly-passed.mjs +2 -0
- package/lib/mjs/parse/validation/validators/explicitly-passed.mjs.map +1 -0
- package/lib/mjs/parse/validation/validators/options.mjs +2 -0
- package/lib/mjs/parse/validation/validators/options.mjs.map +1 -0
- package/lib/mjs/parse/validation/validators/requires.mjs +2 -0
- package/lib/mjs/parse/validation/validators/requires.mjs.map +1 -0
- package/lib/mjs/utilities.mjs +2 -0
- package/lib/mjs/utilities.mjs.map +1 -0
- package/lib/typescript/autocomplete-scripts/bash-autocomplete-script.d.ts +2 -2
- package/lib/typescript/autocomplete-scripts/bash-autocomplete-script.d.ts.map +1 -1
- package/lib/typescript/autocomplete-scripts/powershell-autocomplete-script.d.ts +2 -2
- package/lib/typescript/autocomplete-scripts/powershell-autocomplete-script.d.ts.map +1 -1
- package/lib/typescript/autocomplete-scripts/zsh-autocomplete-script.d.ts +2 -2
- package/lib/typescript/autocomplete-scripts/zsh-autocomplete-script.d.ts.map +1 -1
- package/lib/typescript/coerce/coerce-methods.d.ts +20 -0
- package/lib/typescript/coerce/coerce-methods.d.ts.map +1 -0
- package/lib/typescript/coerce/string-to-array.d.ts +6 -0
- package/lib/typescript/coerce/string-to-array.d.ts.map +1 -0
- package/lib/typescript/coerce/string-to-primitive.d.ts +5 -0
- package/lib/typescript/coerce/string-to-primitive.d.ts.map +1 -0
- package/lib/typescript/coerce/string-to-set.d.ts +6 -0
- package/lib/typescript/coerce/string-to-set.d.ts.map +1 -0
- package/lib/typescript/definitions/define-arguments.d.ts +7 -0
- package/lib/typescript/definitions/define-arguments.d.ts.map +1 -0
- package/lib/typescript/definitions/define-cli.d.ts +24 -0
- package/lib/typescript/definitions/define-cli.d.ts.map +1 -0
- package/lib/typescript/definitions/define-options.d.ts +7 -0
- package/lib/typescript/definitions/define-options.d.ts.map +1 -0
- package/lib/typescript/definitions/define-subcommand.d.ts +17 -0
- package/lib/typescript/definitions/define-subcommand.d.ts.map +1 -0
- package/lib/typescript/definitions/validate-cli-definition.d.ts +4 -0
- package/lib/typescript/definitions/validate-cli-definition.d.ts.map +1 -0
- package/lib/typescript/help-message/format-arguments.d.ts +3 -3
- package/lib/typescript/help-message/format-arguments.d.ts.map +1 -1
- package/lib/typescript/help-message/format-options.d.ts +3 -3
- package/lib/typescript/help-message/format-options.d.ts.map +1 -1
- package/lib/typescript/help-message/format-subcommands.d.ts +3 -3
- package/lib/typescript/help-message/format-subcommands.d.ts.map +1 -1
- package/lib/typescript/help-message/generate-for-cli.d.ts +8 -0
- package/lib/typescript/help-message/generate-for-cli.d.ts.map +1 -0
- package/lib/typescript/help-message/generate-for-subcommand.d.ts +4 -0
- package/lib/typescript/help-message/generate-for-subcommand.d.ts.map +1 -0
- package/lib/typescript/help-message/print-help.d.ts +5 -0
- package/lib/typescript/help-message/print-help.d.ts.map +1 -0
- package/lib/typescript/help-message/set-defaults.d.ts +4 -0
- package/lib/typescript/help-message/set-defaults.d.ts.map +1 -0
- package/lib/typescript/help-message/styles.d.ts +30 -106
- package/lib/typescript/help-message/styles.d.ts.map +1 -1
- package/lib/typescript/help-message/terminal-markdown.d.ts +3 -0
- package/lib/typescript/help-message/terminal-markdown.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +23 -35
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/markdown/generate-markdown.d.ts +2 -2
- package/lib/typescript/markdown/generate-markdown.d.ts.map +1 -1
- package/lib/typescript/metadata/arguments-metadata.d.ts +4 -0
- package/lib/typescript/metadata/arguments-metadata.d.ts.map +1 -0
- package/lib/typescript/metadata/cli-metadata.d.ts +4 -0
- package/lib/typescript/metadata/cli-metadata.d.ts.map +1 -0
- package/lib/typescript/metadata/options-metadata.d.ts +4 -0
- package/lib/typescript/metadata/options-metadata.d.ts.map +1 -0
- package/lib/typescript/metadata/subcommands-metadata.d.ts +4 -0
- package/lib/typescript/metadata/subcommands-metadata.d.ts.map +1 -0
- package/lib/typescript/parse/context/cli-context-builder.d.ts +9 -0
- package/lib/typescript/parse/context/cli-context-builder.d.ts.map +1 -0
- package/lib/typescript/parse/context/object-context-builder.d.ts +6 -0
- package/lib/typescript/parse/context/object-context-builder.d.ts.map +1 -0
- package/lib/typescript/{parser/parse/parser-helpers.d.ts → parse/parser-utilities.d.ts} +18 -9
- package/lib/typescript/parse/parser-utilities.d.ts.map +1 -0
- package/lib/typescript/parse/safe-parse.d.ts +5 -0
- package/lib/typescript/parse/safe-parse.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validate-context.d.ts +6 -0
- package/lib/typescript/parse/validation/validate-context.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validators/arguments.d.ts +12 -0
- package/lib/typescript/parse/validation/validators/arguments.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validators/conflict.d.ts +16 -0
- package/lib/typescript/parse/validation/validators/conflict.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validators/exclusive.d.ts +16 -0
- package/lib/typescript/parse/validation/validators/exclusive.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validators/explicitly-passed.d.ts +5 -0
- package/lib/typescript/parse/validation/validators/explicitly-passed.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validators/options.d.ts +12 -0
- package/lib/typescript/parse/validation/validators/options.d.ts.map +1 -0
- package/lib/typescript/parse/validation/validators/requires.d.ts +18 -0
- package/lib/typescript/parse/validation/validators/requires.d.ts.map +1 -0
- package/lib/typescript/types/context-types.d.ts +135 -0
- package/lib/typescript/types/context-types.d.ts.map +1 -0
- package/lib/typescript/types/definitions-types.d.ts +294 -0
- package/lib/typescript/types/definitions-types.d.ts.map +1 -0
- package/lib/typescript/types/help-message-types.d.ts +134 -0
- package/lib/typescript/types/help-message-types.d.ts.map +1 -0
- package/lib/typescript/types/io-types.d.ts +96 -0
- package/lib/typescript/types/io-types.d.ts.map +1 -0
- package/lib/typescript/types/metadata-types.d.ts +75 -0
- package/lib/typescript/types/metadata-types.d.ts.map +1 -0
- package/lib/typescript/types/schema-types.d.ts +6 -0
- package/lib/typescript/types/schema-types.d.ts.map +1 -0
- package/lib/typescript/types/types.d.ts +61 -0
- package/lib/typescript/types/types.d.ts.map +1 -0
- package/lib/typescript/types/utilities-types.d.ts +17 -0
- package/lib/typescript/types/utilities-types.d.ts.map +1 -0
- package/lib/typescript/utilities.d.ts +24 -10
- package/lib/typescript/utilities.d.ts.map +1 -1
- package/package.json +29 -26
- package/src/autocomplete-scripts/bash-autocomplete-script.ts +13 -9
- package/src/autocomplete-scripts/powershell-autocomplete-script.ts +21 -13
- package/src/autocomplete-scripts/zsh-autocomplete-script.ts +27 -23
- package/src/coerce/coerce-methods.ts +75 -0
- package/src/coerce/string-to-array.ts +18 -0
- package/src/coerce/string-to-primitive.ts +31 -0
- package/src/coerce/string-to-set.ts +15 -0
- package/src/definitions/define-arguments.ts +10 -0
- package/src/definitions/define-cli.ts +105 -0
- package/src/definitions/define-options.ts +12 -0
- package/src/definitions/define-subcommand.ts +57 -0
- package/src/definitions/validate-cli-definition.ts +331 -0
- package/src/help-message/format-arguments.ts +57 -33
- package/src/help-message/format-options.ts +59 -34
- package/src/help-message/format-subcommands.ts +43 -21
- package/src/help-message/generate-for-cli.ts +114 -0
- package/src/help-message/generate-for-subcommand.ts +32 -0
- package/src/help-message/print-help.ts +13 -0
- package/src/help-message/set-defaults.ts +34 -0
- package/src/help-message/styles.ts +148 -103
- package/src/help-message/terminal-markdown.ts +147 -0
- package/src/index.ts +28 -97
- package/src/markdown/generate-markdown.ts +47 -58
- package/src/metadata/arguments-metadata.ts +28 -0
- package/src/metadata/cli-metadata.ts +26 -0
- package/src/metadata/options-metadata.ts +38 -0
- package/src/metadata/subcommands-metadata.ts +35 -0
- package/src/parse/context/cli-context-builder.ts +246 -0
- package/src/parse/context/object-context-builder.ts +63 -0
- package/src/{parser/parse/parser-helpers.ts → parse/parser-utilities.ts} +46 -25
- package/src/parse/safe-parse.ts +76 -0
- package/src/parse/validation/validate-context.ts +23 -0
- package/src/parse/validation/validators/arguments.ts +59 -0
- package/src/parse/validation/validators/conflict.ts +68 -0
- package/src/parse/validation/validators/exclusive.ts +70 -0
- package/src/parse/validation/validators/explicitly-passed.ts +15 -0
- package/src/parse/validation/validators/options.ts +59 -0
- package/src/parse/validation/validators/requires.ts +82 -0
- package/src/types/context-types.ts +171 -0
- package/src/types/definitions-types.ts +340 -0
- package/src/types/help-message-types.ts +153 -0
- package/src/types/io-types.ts +131 -0
- package/src/types/metadata-types.ts +104 -0
- package/src/types/schema-types.ts +9 -0
- package/src/types/types.ts +72 -0
- package/src/types/utilities-types.ts +26 -0
- package/src/utilities.ts +200 -23
- package/lib/commonjs/autocomplete-scripts/bash-autocomplete-script.cjs +0 -42
- package/lib/commonjs/autocomplete-scripts/bash-autocomplete-script.cjs.map +0 -1
- package/lib/commonjs/autocomplete-scripts/powershell-autocomplete-script.cjs +0 -31
- package/lib/commonjs/autocomplete-scripts/powershell-autocomplete-script.cjs.map +0 -1
- package/lib/commonjs/autocomplete-scripts/zsh-autocomplete-script.cjs +0 -41
- package/lib/commonjs/autocomplete-scripts/zsh-autocomplete-script.cjs.map +0 -1
- package/lib/commonjs/help-message/format-arguments.cjs +0 -1
- package/lib/commonjs/help-message/format-arguments.cjs.map +0 -1
- package/lib/commonjs/help-message/format-cli.cjs +0 -1
- package/lib/commonjs/help-message/format-cli.cjs.map +0 -1
- package/lib/commonjs/help-message/format-options.cjs +0 -1
- package/lib/commonjs/help-message/format-options.cjs.map +0 -1
- package/lib/commonjs/help-message/format-subcommands.cjs +0 -1
- package/lib/commonjs/help-message/format-subcommands.cjs.map +0 -1
- package/lib/commonjs/help-message/styles.cjs +0 -1
- package/lib/commonjs/help-message/styles.cjs.map +0 -1
- package/lib/commonjs/index.cjs +0 -1
- package/lib/commonjs/index.cjs.map +0 -1
- package/lib/commonjs/markdown/generate-markdown.cjs +0 -1
- package/lib/commonjs/markdown/generate-markdown.cjs.map +0 -1
- package/lib/commonjs/metadata/get-arguments-metadata.cjs +0 -1
- package/lib/commonjs/metadata/get-arguments-metadata.cjs.map +0 -1
- package/lib/commonjs/metadata/get-cli-metadata.cjs +0 -1
- package/lib/commonjs/metadata/get-cli-metadata.cjs.map +0 -1
- package/lib/commonjs/metadata/get-options-metadata.cjs +0 -1
- package/lib/commonjs/metadata/get-options-metadata.cjs.map +0 -1
- package/lib/commonjs/metadata/get-subcommands-metadata.cjs +0 -1
- package/lib/commonjs/metadata/get-subcommands-metadata.cjs.map +0 -1
- package/lib/commonjs/parser/parse/parse.cjs +0 -1
- package/lib/commonjs/parser/parse/parse.cjs.map +0 -1
- package/lib/commonjs/parser/parse/parser-helpers.cjs +0 -1
- package/lib/commonjs/parser/parse/parser-helpers.cjs.map +0 -1
- package/lib/commonjs/parser/safe-parse.cjs +0 -1
- package/lib/commonjs/parser/safe-parse.cjs.map +0 -1
- package/lib/commonjs/parser/unsafe-parse.cjs +0 -1
- package/lib/commonjs/parser/unsafe-parse.cjs.map +0 -1
- package/lib/commonjs/parser/validate/validate-type.cjs +0 -1
- package/lib/commonjs/parser/validate/validate-type.cjs.map +0 -1
- package/lib/commonjs/parser/validate/validate.cjs +0 -1
- package/lib/commonjs/parser/validate/validate.cjs.map +0 -1
- package/lib/commonjs/utilities.cjs +0 -1
- package/lib/commonjs/utilities.cjs.map +0 -1
- package/lib/commonjs/zod-utilities.cjs +0 -1
- package/lib/commonjs/zod-utilities.cjs.map +0 -1
- package/lib/module/autocomplete-scripts/bash-autocomplete-script.mjs +0 -42
- package/lib/module/autocomplete-scripts/bash-autocomplete-script.mjs.map +0 -1
- package/lib/module/autocomplete-scripts/powershell-autocomplete-script.mjs +0 -31
- package/lib/module/autocomplete-scripts/powershell-autocomplete-script.mjs.map +0 -1
- package/lib/module/autocomplete-scripts/zsh-autocomplete-script.mjs +0 -41
- package/lib/module/autocomplete-scripts/zsh-autocomplete-script.mjs.map +0 -1
- package/lib/module/help-message/format-arguments.mjs +0 -1
- package/lib/module/help-message/format-arguments.mjs.map +0 -1
- package/lib/module/help-message/format-cli.mjs +0 -1
- package/lib/module/help-message/format-cli.mjs.map +0 -1
- package/lib/module/help-message/format-options.mjs +0 -1
- package/lib/module/help-message/format-options.mjs.map +0 -1
- package/lib/module/help-message/format-subcommands.mjs +0 -1
- package/lib/module/help-message/format-subcommands.mjs.map +0 -1
- package/lib/module/help-message/styles.mjs +0 -1
- package/lib/module/help-message/styles.mjs.map +0 -1
- package/lib/module/index.mjs +0 -1
- package/lib/module/index.mjs.map +0 -1
- package/lib/module/markdown/generate-markdown.mjs +0 -1
- package/lib/module/markdown/generate-markdown.mjs.map +0 -1
- package/lib/module/metadata/get-arguments-metadata.mjs +0 -1
- package/lib/module/metadata/get-arguments-metadata.mjs.map +0 -1
- package/lib/module/metadata/get-cli-metadata.mjs +0 -1
- package/lib/module/metadata/get-cli-metadata.mjs.map +0 -1
- package/lib/module/metadata/get-options-metadata.mjs +0 -1
- package/lib/module/metadata/get-options-metadata.mjs.map +0 -1
- package/lib/module/metadata/get-subcommands-metadata.mjs +0 -1
- package/lib/module/metadata/get-subcommands-metadata.mjs.map +0 -1
- package/lib/module/parser/parse/parse.mjs +0 -1
- package/lib/module/parser/parse/parse.mjs.map +0 -1
- package/lib/module/parser/parse/parser-helpers.mjs +0 -1
- package/lib/module/parser/parse/parser-helpers.mjs.map +0 -1
- package/lib/module/parser/safe-parse.mjs +0 -1
- package/lib/module/parser/safe-parse.mjs.map +0 -1
- package/lib/module/parser/unsafe-parse.mjs +0 -1
- package/lib/module/parser/unsafe-parse.mjs.map +0 -1
- package/lib/module/parser/validate/validate-type.mjs +0 -1
- package/lib/module/parser/validate/validate-type.mjs.map +0 -1
- package/lib/module/parser/validate/validate.mjs +0 -1
- package/lib/module/parser/validate/validate.mjs.map +0 -1
- package/lib/module/utilities.mjs +0 -1
- package/lib/module/utilities.mjs.map +0 -1
- package/lib/module/zod-utilities.mjs +0 -1
- package/lib/module/zod-utilities.mjs.map +0 -1
- package/lib/typescript/help-message/format-cli.d.ts +0 -6
- package/lib/typescript/help-message/format-cli.d.ts.map +0 -1
- package/lib/typescript/metadata/get-arguments-metadata.d.ts +0 -4
- package/lib/typescript/metadata/get-arguments-metadata.d.ts.map +0 -1
- package/lib/typescript/metadata/get-cli-metadata.d.ts +0 -4
- package/lib/typescript/metadata/get-cli-metadata.d.ts.map +0 -1
- package/lib/typescript/metadata/get-options-metadata.d.ts +0 -4
- package/lib/typescript/metadata/get-options-metadata.d.ts.map +0 -1
- package/lib/typescript/metadata/get-subcommands-metadata.d.ts +0 -4
- package/lib/typescript/metadata/get-subcommands-metadata.d.ts.map +0 -1
- package/lib/typescript/metadata/metadata-types.d.ts +0 -80
- package/lib/typescript/metadata/metadata-types.d.ts.map +0 -1
- package/lib/typescript/parser/parse/parse-types.d.ts +0 -85
- package/lib/typescript/parser/parse/parse-types.d.ts.map +0 -1
- package/lib/typescript/parser/parse/parse.d.ts +0 -4
- package/lib/typescript/parser/parse/parse.d.ts.map +0 -1
- package/lib/typescript/parser/parse/parser-helpers.d.ts.map +0 -1
- package/lib/typescript/parser/safe-parse.d.ts +0 -4
- package/lib/typescript/parser/safe-parse.d.ts.map +0 -1
- package/lib/typescript/parser/unsafe-parse.d.ts +0 -4
- package/lib/typescript/parser/unsafe-parse.d.ts.map +0 -1
- package/lib/typescript/parser/validate/validate-type.d.ts +0 -22
- package/lib/typescript/parser/validate/validate-type.d.ts.map +0 -1
- package/lib/typescript/parser/validate/validate.d.ts +0 -11
- package/lib/typescript/parser/validate/validate.d.ts.map +0 -1
- package/lib/typescript/types.d.ts +0 -294
- package/lib/typescript/types.d.ts.map +0 -1
- package/lib/typescript/zod-utilities.d.ts +0 -28
- package/lib/typescript/zod-utilities.d.ts.map +0 -1
- package/src/help-message/format-cli.ts +0 -141
- package/src/metadata/get-arguments-metadata.ts +0 -25
- package/src/metadata/get-cli-metadata.ts +0 -23
- package/src/metadata/get-options-metadata.ts +0 -35
- package/src/metadata/get-subcommands-metadata.ts +0 -32
- package/src/metadata/metadata-types.ts +0 -114
- package/src/parser/parse/parse-types.ts +0 -89
- package/src/parser/parse/parse.ts +0 -230
- package/src/parser/safe-parse.ts +0 -103
- package/src/parser/unsafe-parse.ts +0 -98
- package/src/parser/validate/validate-type.ts +0 -21
- package/src/parser/validate/validate.ts +0 -66
- package/src/types.ts +0 -365
- package/src/zod-utilities.ts +0 -214
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { getCliMetadata } from "../metadata/
|
|
1
|
+
import { getCliMetadata } from "../metadata/cli-metadata.ts";
|
|
2
|
+
import { escapeHtmlTags, stripAnsi } from "../utilities.ts";
|
|
2
3
|
|
|
3
|
-
import type {
|
|
4
|
-
import type {
|
|
4
|
+
import type { Cli } from "../types/definitions-types.ts";
|
|
5
|
+
import type { ArgumentMetadata, OptionMetadata, SubcommandMetadata } from "../types/metadata-types.ts";
|
|
5
6
|
|
|
6
|
-
export function generateMarkdown(
|
|
7
|
-
const metadata = getCliMetadata(
|
|
7
|
+
export function generateMarkdown(cliDefinition: Cli): string {
|
|
8
|
+
const metadata = getCliMetadata(cliDefinition);
|
|
8
9
|
|
|
9
10
|
let md = "<!-- Auto-generated by zod-args-parser -->\n\n";
|
|
10
11
|
|
|
@@ -12,8 +13,13 @@ export function generateMarkdown(...parameters: [Cli, ...Subcommand[]]): string
|
|
|
12
13
|
md += `# ${metadata.name}\n\n`;
|
|
13
14
|
|
|
14
15
|
// Description
|
|
15
|
-
if (metadata.description) {
|
|
16
|
-
md += `${metadata.description}\n`;
|
|
16
|
+
if (metadata.description && !metadata.descriptionMarkdown) {
|
|
17
|
+
md += `${forceLineBreak(metadata.description)}\n`;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Description Markdown
|
|
21
|
+
if (metadata.descriptionMarkdown) {
|
|
22
|
+
md += `${forceLineBreak(metadata.descriptionMarkdown)}\n`;
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
// Examples
|
|
@@ -45,18 +51,15 @@ export function generateMarkdown(...parameters: [Cli, ...Subcommand[]]): string
|
|
|
45
51
|
return md;
|
|
46
52
|
}
|
|
47
53
|
|
|
48
|
-
function renderExamples(examples: string
|
|
49
|
-
let outString = "";
|
|
54
|
+
function renderExamples(examples: string) {
|
|
55
|
+
let outString = "\n**Example:**\n";
|
|
50
56
|
|
|
51
57
|
const lang = "bash";
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
outString += "\n" + (list ? "- " : "");
|
|
56
|
-
|
|
59
|
+
outString += "\n";
|
|
57
60
|
outString += "```" + lang + "\n";
|
|
58
|
-
outString +=
|
|
59
|
-
outString += "\n
|
|
61
|
+
outString += examples;
|
|
62
|
+
outString += "\n```\n";
|
|
60
63
|
|
|
61
64
|
return outString;
|
|
62
65
|
}
|
|
@@ -66,6 +69,7 @@ function renderOptions(optionsMetadata: OptionMetadata[] = [], h: number) {
|
|
|
66
69
|
|
|
67
70
|
for (let index = 0; index < optionsMetadata.length; index++) {
|
|
68
71
|
const metadata = optionsMetadata[index];
|
|
72
|
+
if (metadata.hidden) continue;
|
|
69
73
|
|
|
70
74
|
const aliases = [metadata.nameAsArg].concat(metadata.aliasesAsArgs).join(", ");
|
|
71
75
|
|
|
@@ -74,21 +78,25 @@ function renderOptions(optionsMetadata: OptionMetadata[] = [], h: number) {
|
|
|
74
78
|
outString += `${"#".repeat(h)} \`${aliases + placeholder}\``;
|
|
75
79
|
|
|
76
80
|
if (metadata.optional) {
|
|
77
|
-
outString += "
|
|
81
|
+
outString += " _optional_";
|
|
78
82
|
}
|
|
79
83
|
|
|
80
84
|
outString += "\n\n";
|
|
81
85
|
|
|
82
|
-
if (metadata.description) {
|
|
83
|
-
outString +=
|
|
86
|
+
if (metadata.description && !metadata.descriptionMarkdown) {
|
|
87
|
+
outString += `${forceLineBreak(metadata.description)}\n`;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (metadata.descriptionMarkdown) {
|
|
91
|
+
outString += `${forceLineBreak(metadata.descriptionMarkdown)}\n`;
|
|
84
92
|
}
|
|
85
93
|
|
|
86
94
|
if (metadata.defaultValue !== undefined) {
|
|
87
|
-
outString +=
|
|
95
|
+
outString += `\n**default:** \`${metadata.defaultValueAsString}\`\n`;
|
|
88
96
|
}
|
|
89
97
|
|
|
90
98
|
if (metadata.example) {
|
|
91
|
-
outString += renderExamples(metadata.example
|
|
99
|
+
outString += renderExamples(metadata.example);
|
|
92
100
|
}
|
|
93
101
|
|
|
94
102
|
if (index < optionsMetadata.length - 1) {
|
|
@@ -104,21 +112,26 @@ function renderArguments(argumentsMetadata: ArgumentMetadata[] = [], h: number)
|
|
|
104
112
|
|
|
105
113
|
for (let index = 0; index < argumentsMetadata.length; index++) {
|
|
106
114
|
const metadata = argumentsMetadata[index];
|
|
115
|
+
if (metadata.hidden) continue;
|
|
107
116
|
|
|
108
117
|
outString += `${"#".repeat(h)} \`${metadata.name}\``;
|
|
109
118
|
|
|
110
119
|
if (metadata.optional) {
|
|
111
|
-
outString += "
|
|
120
|
+
outString += " _optional_";
|
|
112
121
|
}
|
|
113
122
|
|
|
114
123
|
outString += "\n\n";
|
|
115
124
|
|
|
116
|
-
if (metadata.description) {
|
|
117
|
-
outString +=
|
|
125
|
+
if (metadata.description && !metadata.descriptionMarkdown) {
|
|
126
|
+
outString += `${forceLineBreak(metadata.description)}\n`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (metadata.descriptionMarkdown) {
|
|
130
|
+
outString += `${forceLineBreak(metadata.descriptionMarkdown)}\n`;
|
|
118
131
|
}
|
|
119
132
|
|
|
120
133
|
if (metadata.defaultValue !== undefined) {
|
|
121
|
-
outString +=
|
|
134
|
+
outString += `\n**default:** \`${metadata.defaultValueAsString}\`\n`;
|
|
122
135
|
}
|
|
123
136
|
|
|
124
137
|
if (metadata.example) {
|
|
@@ -138,6 +151,7 @@ function renderSubcommands(subcommandsMetadata: SubcommandMetadata[]) {
|
|
|
138
151
|
|
|
139
152
|
for (let index = 0; index < subcommandsMetadata.length; index++) {
|
|
140
153
|
const metadata = subcommandsMetadata[index];
|
|
154
|
+
if (metadata.hidden) continue;
|
|
141
155
|
|
|
142
156
|
const aliases = [metadata.name].concat(metadata.aliases).join(", ");
|
|
143
157
|
|
|
@@ -145,8 +159,12 @@ function renderSubcommands(subcommandsMetadata: SubcommandMetadata[]) {
|
|
|
145
159
|
|
|
146
160
|
outString += `### ${aliases + placeholder}\n\n`;
|
|
147
161
|
|
|
148
|
-
if (metadata.description) {
|
|
149
|
-
outString += `${metadata.description}\n`;
|
|
162
|
+
if (metadata.description && !metadata.descriptionMarkdown) {
|
|
163
|
+
outString += `${forceLineBreak(metadata.description)}\n`;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (metadata.descriptionMarkdown) {
|
|
167
|
+
outString += `${forceLineBreak(metadata.descriptionMarkdown)}\n`;
|
|
150
168
|
}
|
|
151
169
|
|
|
152
170
|
if (metadata.example) {
|
|
@@ -171,36 +189,7 @@ function renderSubcommands(subcommandsMetadata: SubcommandMetadata[]) {
|
|
|
171
189
|
return outString;
|
|
172
190
|
}
|
|
173
191
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return code;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return html.replace(/[&<>]/g, match => {
|
|
181
|
-
return { "&": "&", "<": "<", ">": ">" }[match as "&" | "<" | ">"];
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
/** Credits: https://github.com/chalk/ansi-regex */
|
|
187
|
-
function ansiRegex({ onlyFirst = false } = {}) {
|
|
188
|
-
// Valid string terminator sequences are BEL, ESC\, and 0x9c
|
|
189
|
-
const ST = String.raw`(?:\u0007|\u001B\u005C|\u009C)`;
|
|
190
|
-
|
|
191
|
-
// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)
|
|
192
|
-
const osc = `(?:\\u001B\\][\\s\\S]*?${ST})`;
|
|
193
|
-
|
|
194
|
-
// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte
|
|
195
|
-
const csi = String.raw`[\u001B\u009B][[\]()#;?]*(?:\d{1,4}(?:[;:]\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~]`;
|
|
196
|
-
|
|
197
|
-
const pattern = `${osc}|${csi}`;
|
|
198
|
-
|
|
199
|
-
return new RegExp(pattern, onlyFirst ? undefined : "g");
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const regex = ansiRegex();
|
|
203
|
-
|
|
204
|
-
function stripAnsi(string: string): string {
|
|
205
|
-
return string.replace(regex, "");
|
|
192
|
+
/** Inserts two trailing spaces before newline. In Markdown, a newline that ends with two spaces forces a line break. */
|
|
193
|
+
function forceLineBreak(string: string): string {
|
|
194
|
+
return string.replace(/(\n+)/g, " $1");
|
|
206
195
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defaultValueAndIsOptional, stringifyValue } from "../utilities.ts";
|
|
2
|
+
|
|
3
|
+
import type { Argument } from "../types/definitions-types.ts";
|
|
4
|
+
import type { ArgumentMetadata } from "../types/metadata-types.ts";
|
|
5
|
+
|
|
6
|
+
export function getArgumentsMetadata(argumentsDefinition: Record<string, Argument>): ArgumentMetadata[] {
|
|
7
|
+
const outputMetadata: ArgumentMetadata[] = [];
|
|
8
|
+
|
|
9
|
+
for (const [name, argument] of Object.entries(argumentsDefinition)) {
|
|
10
|
+
const meta = argument.meta ?? {};
|
|
11
|
+
|
|
12
|
+
const { optional, defaultValue } = argument._preparedType ?? defaultValueAndIsOptional(argument.schema);
|
|
13
|
+
|
|
14
|
+
outputMetadata.push({
|
|
15
|
+
name: meta.name ?? name,
|
|
16
|
+
description: meta.description ?? "",
|
|
17
|
+
descriptionMarkdown: meta.descriptionMarkdown ?? "",
|
|
18
|
+
defaultValue,
|
|
19
|
+
defaultValueAsString: meta.default ?? stringifyValue(defaultValue) ?? "",
|
|
20
|
+
optional: meta.optional ?? optional,
|
|
21
|
+
example: meta.example ?? "",
|
|
22
|
+
schema: argument.schema,
|
|
23
|
+
hidden: meta.hidden ?? false,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return outputMetadata;
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getArgumentsMetadata } from "./arguments-metadata.ts";
|
|
2
|
+
import { getOptionsMetadata } from "./options-metadata.ts";
|
|
3
|
+
import { getSubcommandsMetadata } from "./subcommands-metadata.ts";
|
|
4
|
+
|
|
5
|
+
import type { Cli } from "../types/definitions-types.ts";
|
|
6
|
+
import type { CliMetadata } from "../types/metadata-types.ts";
|
|
7
|
+
|
|
8
|
+
export function getCliMetadata(cliDefinition: Cli): CliMetadata {
|
|
9
|
+
const subcommands = cliDefinition.subcommands ?? [];
|
|
10
|
+
|
|
11
|
+
const meta = cliDefinition.meta ?? {};
|
|
12
|
+
|
|
13
|
+
const outputMetadata: CliMetadata = {
|
|
14
|
+
name: cliDefinition.cliName,
|
|
15
|
+
description: meta.description ?? "",
|
|
16
|
+
descriptionMarkdown: meta.descriptionMarkdown ?? "",
|
|
17
|
+
usage: meta.usage ?? "",
|
|
18
|
+
example: meta.example ?? "",
|
|
19
|
+
allowPositionals: cliDefinition.allowPositionals ?? false,
|
|
20
|
+
options: cliDefinition.options ? getOptionsMetadata(cliDefinition.options) : [],
|
|
21
|
+
arguments: cliDefinition.arguments ? getArgumentsMetadata(cliDefinition.arguments) : [],
|
|
22
|
+
subcommands: subcommands ? getSubcommandsMetadata(subcommands) : [],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return outputMetadata;
|
|
26
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { transformOptionToArgument } from "../parse/parser-utilities.ts";
|
|
2
|
+
import { defaultValueAndIsOptional, stringifyValue } from "../utilities.ts";
|
|
3
|
+
|
|
4
|
+
import type { Option } from "../types/definitions-types.ts";
|
|
5
|
+
import type { OptionMetadata } from "../types/metadata-types.ts";
|
|
6
|
+
|
|
7
|
+
export function getOptionsMetadata(optionsDefinition: Record<string, Option>): OptionMetadata[] {
|
|
8
|
+
const outputMetadata: OptionMetadata[] = [];
|
|
9
|
+
|
|
10
|
+
if (!optionsDefinition) {
|
|
11
|
+
return outputMetadata;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
for (const [optionName, option] of Object.entries(optionsDefinition)) {
|
|
15
|
+
const aliases = option.aliases ?? [];
|
|
16
|
+
const meta = option.meta ?? {};
|
|
17
|
+
|
|
18
|
+
const { optional, defaultValue } = option._preparedType ?? defaultValueAndIsOptional(option.schema);
|
|
19
|
+
|
|
20
|
+
outputMetadata.push({
|
|
21
|
+
name: optionName,
|
|
22
|
+
nameAsArg: transformOptionToArgument(optionName),
|
|
23
|
+
aliases,
|
|
24
|
+
aliasesAsArgs: aliases.map(alias => transformOptionToArgument(alias)),
|
|
25
|
+
placeholder: meta.placeholder ?? "",
|
|
26
|
+
description: meta.description ?? "",
|
|
27
|
+
descriptionMarkdown: meta.descriptionMarkdown ?? "",
|
|
28
|
+
optional: meta.optional ?? optional,
|
|
29
|
+
example: meta.example ?? "",
|
|
30
|
+
defaultValue,
|
|
31
|
+
defaultValueAsString: meta.default ?? stringifyValue(defaultValue) ?? "",
|
|
32
|
+
schema: option.schema,
|
|
33
|
+
hidden: meta.hidden ?? false,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return outputMetadata;
|
|
38
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { getArgumentsMetadata } from "./arguments-metadata.ts";
|
|
2
|
+
import { getOptionsMetadata } from "./options-metadata.ts";
|
|
3
|
+
|
|
4
|
+
import type { Subcommand } from "../types/definitions-types.ts";
|
|
5
|
+
import type { SubcommandMetadata } from "../types/metadata-types.ts";
|
|
6
|
+
|
|
7
|
+
export function getSubcommandsMetadata(commandDefinition: readonly Subcommand[]): SubcommandMetadata[] {
|
|
8
|
+
const outputMetadata: SubcommandMetadata[] = [];
|
|
9
|
+
|
|
10
|
+
if (!commandDefinition || commandDefinition.length === 0) {
|
|
11
|
+
return outputMetadata;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
for (const subcommand of commandDefinition) {
|
|
15
|
+
const optionsMetadata = subcommand.options ? getOptionsMetadata(subcommand.options) : [];
|
|
16
|
+
const argumentsMetadata = subcommand.arguments ? getArgumentsMetadata(subcommand.arguments) : [];
|
|
17
|
+
const meta = subcommand.meta ?? {};
|
|
18
|
+
|
|
19
|
+
outputMetadata.push({
|
|
20
|
+
name: subcommand.name,
|
|
21
|
+
aliases: subcommand.aliases ?? [],
|
|
22
|
+
description: meta.description ?? "",
|
|
23
|
+
descriptionMarkdown: meta.descriptionMarkdown ?? "",
|
|
24
|
+
placeholder: meta.placeholder ?? "",
|
|
25
|
+
usage: meta.usage ?? "",
|
|
26
|
+
example: meta.example ?? "",
|
|
27
|
+
allowPositionals: subcommand.allowPositionals ?? false,
|
|
28
|
+
options: optionsMetadata,
|
|
29
|
+
arguments: argumentsMetadata,
|
|
30
|
+
hidden: meta.hidden ?? false,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return outputMetadata;
|
|
35
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import {
|
|
2
|
+
decoupleFlags,
|
|
3
|
+
findOption,
|
|
4
|
+
findSubcommandDefinition,
|
|
5
|
+
isFlagArgument,
|
|
6
|
+
isOptionArgument,
|
|
7
|
+
transformOptionToArgument,
|
|
8
|
+
} from "../parser-utilities.ts";
|
|
9
|
+
|
|
10
|
+
import type { ContextWide } from "../../types/context-types.ts";
|
|
11
|
+
import type { Cli } from "../../types/definitions-types.ts";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Parse argv and create a cli context
|
|
15
|
+
*
|
|
16
|
+
* @throws {Error}
|
|
17
|
+
*/
|
|
18
|
+
export function buildCliContext(argv: string[], cliDefinition: Cli) {
|
|
19
|
+
const subcommandArray = cliDefinition.subcommands ?? [];
|
|
20
|
+
const allSubcommands = new Set<string>(subcommandArray.flatMap(c => [c.name, ...(c.aliases || [])]));
|
|
21
|
+
|
|
22
|
+
// decouple flags E.g. `-rf` -> `-r, -f`
|
|
23
|
+
argv = decoupleFlags(argv);
|
|
24
|
+
|
|
25
|
+
const context: ContextWide = {
|
|
26
|
+
subcommand: undefined,
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** Get the current subcommand definition or cli definition if subcommand name is `undefined` object */
|
|
30
|
+
const getCommandDefinition = () => findSubcommandDefinition(context.subcommand, cliDefinition);
|
|
31
|
+
|
|
32
|
+
for (let index = 0; index < argv.length; index++) {
|
|
33
|
+
const argvItem = argv[index];
|
|
34
|
+
|
|
35
|
+
// * Subcommand check
|
|
36
|
+
if (index === 0) {
|
|
37
|
+
context.subcommand = allSubcommands.has(argvItem) ? argvItem : undefined;
|
|
38
|
+
|
|
39
|
+
// First argument is a subcommand. Skip to the next argument
|
|
40
|
+
if (context.subcommand) continue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// * Option check
|
|
44
|
+
|
|
45
|
+
const argumentAndValue = argvItem.split("=").filter(Boolean); // E.g --option=value -> ["--option", "value"]
|
|
46
|
+
const argumentWithEquals = argvItem.includes("="); // E.g --option=value
|
|
47
|
+
const argument = argumentAndValue[0];
|
|
48
|
+
const argumentValue: string | undefined = argumentAndValue[1];
|
|
49
|
+
|
|
50
|
+
if (isOptionArgument(argument)) {
|
|
51
|
+
if (isFlagArgument(argument) && argumentWithEquals) {
|
|
52
|
+
throw new Error(`flag arguments cannot be assigned using "=": "${argvItem}"`);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const commandDefinition = getCommandDefinition();
|
|
56
|
+
if (!commandDefinition) {
|
|
57
|
+
throw new Error(`unknown subcommand: "${context.subcommand}"`);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (!commandDefinition.options) {
|
|
61
|
+
if (!context.subcommand) {
|
|
62
|
+
throw new Error(`options are not allowed here: "${argument}"`);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
throw new Error(`subcommand "${context.subcommand}" does not accept options: "${argument}"`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const nameOptionTuple = findOption(argument, commandDefinition.options);
|
|
69
|
+
if (!nameOptionTuple) {
|
|
70
|
+
throw new Error(`unknown option: "${argument}"`);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const [optionName, optionDefinition] = nameOptionTuple;
|
|
74
|
+
|
|
75
|
+
if (context.options && optionName in context.options) {
|
|
76
|
+
throw new Error(`duplicated option: "${argument}"`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!optionDefinition._preparedType) {
|
|
80
|
+
throw new Error(`internal error: missing prepared type for option "${optionName}"`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const { schema, optional, defaultValue, coerceTo } = optionDefinition._preparedType;
|
|
84
|
+
|
|
85
|
+
const nextArgument = argv[index + 1];
|
|
86
|
+
|
|
87
|
+
let optionValue: string | boolean = argumentWithEquals ? argumentValue : nextArgument;
|
|
88
|
+
|
|
89
|
+
// infer value for boolean options
|
|
90
|
+
if (coerceTo === "boolean") {
|
|
91
|
+
if (!argumentWithEquals) {
|
|
92
|
+
optionValue = "true";
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const isNegated = argument.startsWith("--no-");
|
|
96
|
+
|
|
97
|
+
if (isNegated && ["true", "false"].includes(optionValue.toLowerCase())) {
|
|
98
|
+
optionValue = optionValue === "true" ? "false" : "true";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (optionValue === undefined) {
|
|
103
|
+
throw new Error(`expected a value for "${argument}" but got nothing`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (!argumentWithEquals && isOptionArgument(optionValue)) {
|
|
107
|
+
throw new Error(`expected a value for "${argument}" but got an argument "${nextArgument}"`);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
context.options ??= {};
|
|
111
|
+
context.options[optionName] = {
|
|
112
|
+
schema,
|
|
113
|
+
optional,
|
|
114
|
+
defaultValue,
|
|
115
|
+
flag: argument,
|
|
116
|
+
stringValue: optionValue,
|
|
117
|
+
source: "terminal",
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Skip to the next argument if it is the current option's value.
|
|
121
|
+
if (!argumentWithEquals && coerceTo !== "boolean") {
|
|
122
|
+
index++;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const commandDefinition = getCommandDefinition();
|
|
129
|
+
|
|
130
|
+
// * Arguments check
|
|
131
|
+
if (commandDefinition?.arguments) {
|
|
132
|
+
context.arguments ??= {};
|
|
133
|
+
|
|
134
|
+
const currentArgumentCount = Object.keys(context.arguments).length;
|
|
135
|
+
const argumentDefinitionEntries = Object.entries(commandDefinition.arguments);
|
|
136
|
+
|
|
137
|
+
// The current argument is a typed argument and not a positional
|
|
138
|
+
if (currentArgumentCount < argumentDefinitionEntries.length) {
|
|
139
|
+
const [name, argumentDefinition] = argumentDefinitionEntries[currentArgumentCount];
|
|
140
|
+
|
|
141
|
+
if (!argumentDefinition._preparedType) {
|
|
142
|
+
throw new Error(`internal error: missing prepared type for argument "${currentArgumentCount}"`);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const { schema, optional, defaultValue } = argumentDefinition._preparedType;
|
|
146
|
+
|
|
147
|
+
context.arguments[name] = { schema, optional, defaultValue, stringValue: argvItem, source: "terminal" };
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// The current argument is a positional and not a typed argument (when `allowPositionals` is enabled)
|
|
153
|
+
if (commandDefinition?.allowPositionals) {
|
|
154
|
+
context.positionals ??= [];
|
|
155
|
+
context.positionals.push(argvItem);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (!context.subcommand) {
|
|
160
|
+
throw new Error(`unexpected argument "${argvItem}": positionals arguments are not allowed here`);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
throw new Error(
|
|
164
|
+
`unexpected argument "${argvItem}": positionals arguments are not allowed for subcommand "${context.subcommand}"`,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const commandDefinition = getCommandDefinition();
|
|
169
|
+
if (!commandDefinition) {
|
|
170
|
+
throw new Error(`unknown subcommand: "${context.subcommand}"`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Options
|
|
174
|
+
if (commandDefinition.options) {
|
|
175
|
+
context.options ??= {};
|
|
176
|
+
|
|
177
|
+
for (const [name, optionDefinition] of Object.entries(commandDefinition.options)) {
|
|
178
|
+
// option already added to the context (found during argument parsing)
|
|
179
|
+
if (name in context.options) continue;
|
|
180
|
+
|
|
181
|
+
if (!optionDefinition._preparedType) {
|
|
182
|
+
throw new Error(`internal error: missing prepared type for option "${name}"`);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const { schema, optional, defaultValue } = optionDefinition._preparedType;
|
|
186
|
+
|
|
187
|
+
if (optional) {
|
|
188
|
+
// optional without default value
|
|
189
|
+
if (defaultValue === undefined) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// optional with default value
|
|
194
|
+
context.options[name] = { schema, optional, defaultValue, source: "default" };
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// required option
|
|
199
|
+
throw new Error(`missing required option: ${transformOptionToArgument(name)}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Arguments
|
|
204
|
+
if (commandDefinition.arguments) {
|
|
205
|
+
context.arguments ??= {};
|
|
206
|
+
|
|
207
|
+
const currentArgumentCount = Object.keys(context.arguments).length;
|
|
208
|
+
|
|
209
|
+
const argumentDefinitionEntries = Object.entries(commandDefinition.arguments);
|
|
210
|
+
const argumentsDefinitionLength = argumentDefinitionEntries.length;
|
|
211
|
+
|
|
212
|
+
// missing arguments
|
|
213
|
+
if (currentArgumentCount < argumentsDefinitionLength) {
|
|
214
|
+
for (let index = currentArgumentCount; index < argumentsDefinitionLength; index++) {
|
|
215
|
+
const [name, argumentDefinition] = argumentDefinitionEntries[index];
|
|
216
|
+
|
|
217
|
+
if (!argumentDefinition._preparedType) {
|
|
218
|
+
throw new Error(`internal error: missing prepared type for the argument "${name}"`);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const { schema, optional, defaultValue } = argumentDefinition._preparedType;
|
|
222
|
+
|
|
223
|
+
if (optional) {
|
|
224
|
+
// optional argument without default value
|
|
225
|
+
if (defaultValue === undefined) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// optional argument with default value
|
|
230
|
+
context.arguments[name] = { schema, optional, defaultValue, source: "default" };
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// required argument
|
|
235
|
+
throw new Error(`The argument "${name}" is required`);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// make sure `positionals` is defined when `allowPositionals` is enabled
|
|
241
|
+
if (commandDefinition.allowPositionals) {
|
|
242
|
+
context.positionals ??= [];
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return context;
|
|
246
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { ContextWide } from "../../types/context-types.ts";
|
|
2
|
+
import type { Argument, Cli, Option, Subcommand } from "../../types/definitions-types.ts";
|
|
3
|
+
import type { InputTypeWide } from "../../types/io-types.ts";
|
|
4
|
+
|
|
5
|
+
/** @throws {Error} */
|
|
6
|
+
export function buildObjectContext(inputValues: InputTypeWide, commandDefinition: Subcommand | Cli) {
|
|
7
|
+
const context: ContextWide = {
|
|
8
|
+
subcommand: "cliName" in commandDefinition ? undefined : commandDefinition.name,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
if (commandDefinition.options) {
|
|
12
|
+
buildForOptionsOrArguments(commandDefinition.options, context, inputValues.options, "options");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (commandDefinition.arguments) {
|
|
16
|
+
buildForOptionsOrArguments(commandDefinition.arguments, context, inputValues.arguments, "arguments");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (commandDefinition.allowPositionals) {
|
|
20
|
+
context.positionals ??= inputValues.positionals;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return context;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function buildForOptionsOrArguments(
|
|
27
|
+
definitionRecord: Record<string, Option> | Record<string, Argument>,
|
|
28
|
+
context: ContextWide,
|
|
29
|
+
inputRecord: Record<string, unknown> | undefined,
|
|
30
|
+
type: "options" | "arguments",
|
|
31
|
+
) {
|
|
32
|
+
const definitionEntries = Object.entries(definitionRecord) as [string, Option][] | [string, Argument][];
|
|
33
|
+
|
|
34
|
+
for (const [name, definition] of definitionEntries) {
|
|
35
|
+
if (!definition._preparedType) {
|
|
36
|
+
throw new Error(`internal error: missing prepared type for ${type.slice(0, -1)} "${name}"`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const { schema, optional, defaultValue } = definition._preparedType;
|
|
40
|
+
|
|
41
|
+
// Case the value is passed
|
|
42
|
+
if (inputRecord && name in inputRecord) {
|
|
43
|
+
const passedValue = inputRecord[name];
|
|
44
|
+
|
|
45
|
+
context[type] ??= {};
|
|
46
|
+
context[type][name] =
|
|
47
|
+
passedValue === undefined
|
|
48
|
+
? { schema, optional, defaultValue, source: "default" }
|
|
49
|
+
: { schema, optional, defaultValue, passedValue, source: "programmatic" };
|
|
50
|
+
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// case the value is not passed
|
|
55
|
+
if (!optional) {
|
|
56
|
+
throw new Error(`the ${type.slice(0, -1)} "${name}" is required`);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// case the value is optional
|
|
60
|
+
context[type] ??= {};
|
|
61
|
+
context[type][name] = { schema, optional, defaultValue, source: "default" };
|
|
62
|
+
}
|
|
63
|
+
}
|