git-remote-ops 0.1.0 → 0.2.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/AGENTS.md +33 -32
- package/README.md +80 -206
- package/dist/cli.js +215 -0
- package/dist/cli.js.map +1 -0
- package/{types → dist}/client.d.ts +11 -15
- package/dist/client.d.ts.map +1 -0
- package/{esm → dist}/client.js +107 -83
- package/dist/client.js.map +1 -0
- package/{types → dist}/errors.d.ts +30 -16
- package/dist/errors.d.ts.map +1 -0
- package/{esm → dist}/errors.js +17 -8
- package/dist/errors.js.map +1 -0
- package/{types → dist}/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/{esm → dist}/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/{types → dist}/logger.d.ts +11 -0
- package/dist/logger.d.ts.map +1 -0
- package/{esm → dist}/logger.js +3 -19
- package/dist/logger.js.map +1 -0
- package/{esm → dist}/objects/commit.js +1 -0
- package/dist/objects/commit.js.map +1 -0
- package/{esm → dist}/objects/index.js +1 -0
- package/dist/objects/index.js.map +1 -0
- package/{types → dist}/objects/tree.d.ts.map +1 -1
- package/{esm → dist}/objects/tree.js +2 -2
- package/dist/objects/tree.js.map +1 -0
- package/{esm → dist}/pack/delta.js +1 -0
- package/dist/pack/delta.js.map +1 -0
- package/{esm → dist}/pack/index.js +1 -0
- package/dist/pack/index.js.map +1 -0
- package/{types → dist}/pack/objects.d.ts.map +1 -1
- package/{esm → dist}/pack/objects.js +3 -3
- package/dist/pack/objects.js.map +1 -0
- package/{types → dist}/pack/parser.d.ts +19 -3
- package/dist/pack/parser.d.ts.map +1 -0
- package/{esm → dist}/pack/parser.js +46 -15
- package/dist/pack/parser.js.map +1 -0
- package/{esm → dist}/protocol/index.js +1 -0
- package/dist/protocol/index.js.map +1 -0
- package/{types → dist}/protocol/pkt_line.d.ts +3 -3
- package/{types → dist}/protocol/pkt_line.d.ts.map +1 -1
- package/{esm → dist}/protocol/pkt_line.js +1 -0
- package/dist/protocol/pkt_line.js.map +1 -0
- package/{esm → dist}/protocol/refs.js +1 -0
- package/dist/protocol/refs.js.map +1 -0
- package/{types → dist}/protocol/upload_pack.d.ts +1 -0
- package/{types → dist}/protocol/upload_pack.d.ts.map +1 -1
- package/{esm → dist}/protocol/upload_pack.js +10 -1
- package/dist/protocol/upload_pack.js.map +1 -0
- package/dist/store.d.ts +28 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +179 -0
- package/dist/store.js.map +1 -0
- package/{types → dist}/transport.d.ts +15 -2
- package/dist/transport.d.ts.map +1 -0
- package/{esm → dist}/transport.js +44 -15
- package/dist/transport.js.map +1 -0
- package/{types → dist}/types.d.ts +12 -7
- package/dist/types.d.ts.map +1 -0
- package/{esm → dist}/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/package.json +42 -29
- package/esm/_dnt.shims.js +0 -72
- package/esm/cli.js +0 -217
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/_argument_types.js +0 -1
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/_errors.js +0 -133
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/_spread.js +0 -1
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/_type_utils.js +0 -1
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/_utils.js +0 -141
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/command.js +0 -1861
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/help/_help_generator.js +0 -357
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/mod.js +0 -13
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/type.js +0 -27
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/action_list.js +0 -16
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/boolean.js +0 -13
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/child_command.js +0 -14
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/command.js +0 -9
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/enum.js +0 -24
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/file.js +0 -12
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/integer.js +0 -9
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/number.js +0 -9
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/secret.js +0 -7
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types/string.js +0 -9
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/types.js +0 -2
- package/esm/deps/jsr.io/@cliffy/command/1.1.0/upgrade/_check_version.js +0 -26
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/_errors.js +0 -129
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/_utils.js +0 -100
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/_validate_flags.js +0 -166
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/flags.js +0 -750
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/mod.js +0 -55
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/types/boolean.js +0 -11
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/types/integer.js +0 -9
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/types/number.js +0 -11
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/types/string.js +0 -4
- package/esm/deps/jsr.io/@cliffy/flags/1.1.0/types.js +0 -1
- package/esm/deps/jsr.io/@cliffy/internal/1.1.0/runtime/exit.js +0 -16
- package/esm/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_args.js +0 -11
- package/esm/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_columns.js +0 -25
- package/esm/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_env.js +0 -18
- package/esm/deps/jsr.io/@cliffy/internal/1.1.0/runtime/inspect.js +0 -11
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/_layout.js +0 -616
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/_utils.js +0 -79
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/border.js +0 -18
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/cell.js +0 -190
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/column.js +0 -117
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/consume_words.js +0 -64
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/mod.js +0 -42
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/row.js +0 -82
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/table.js +0 -341
- package/esm/deps/jsr.io/@cliffy/table/1.1.0/unicode_width.js +0 -101
- package/esm/deps/jsr.io/@std/crypto/1.1.0/_types.js +0 -2
- package/esm/deps/jsr.io/@std/crypto/1.1.0/_wasm/lib/deno_std_wasm_crypto.internal.js +0 -237
- package/esm/deps/jsr.io/@std/crypto/1.1.0/_wasm/lib/deno_std_wasm_crypto.js +0 -2277
- package/esm/deps/jsr.io/@std/crypto/1.1.0/_wasm/mod.js +0 -46
- package/esm/deps/jsr.io/@std/crypto/1.1.0/aes_gcm.js +0 -132
- package/esm/deps/jsr.io/@std/crypto/1.1.0/crypto.js +0 -270
- package/esm/deps/jsr.io/@std/crypto/1.1.0/mod.js +0 -23
- package/esm/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.js +0 -61
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -51
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -13
- package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -2
- package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -87
- package/esm/deps/jsr.io/@std/fmt/1.0.10/colors.js +0 -903
- package/esm/deps/jsr.io/@std/text/1.0.18/closest_string.js +0 -46
- package/esm/deps/jsr.io/@std/text/1.0.18/levenshtein_distance.js +0 -127
- package/esm/package.json +0 -3
- package/types/_dnt.shims.d.ts +0 -16
- package/types/_dnt.shims.d.ts.map +0 -1
- package/types/client.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_argument_types.d.ts +0 -163
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_argument_types.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_errors.d.ts +0 -71
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_errors.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_spread.d.ts +0 -16
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_spread.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_type_utils.d.ts +0 -15
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_type_utils.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_utils.d.ts +0 -38
- package/types/deps/jsr.io/@cliffy/command/1.1.0/_utils.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/command.d.ts +0 -1086
- package/types/deps/jsr.io/@cliffy/command/1.1.0/command.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/help/_help_generator.d.ts +0 -33
- package/types/deps/jsr.io/@cliffy/command/1.1.0/help/_help_generator.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/mod.d.ts +0 -78
- package/types/deps/jsr.io/@cliffy/command/1.1.0/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/type.d.ts +0 -51
- package/types/deps/jsr.io/@cliffy/command/1.1.0/type.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/action_list.d.ts +0 -10
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/action_list.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/boolean.d.ts +0 -10
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/boolean.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/child_command.d.ts +0 -10
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/child_command.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/command.d.ts +0 -8
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/command.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/enum.d.ts +0 -11
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/enum.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/file.d.ts +0 -6
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/file.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/integer.d.ts +0 -8
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/integer.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/number.d.ts +0 -8
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/number.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/secret.d.ts +0 -6
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/secret.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/string.d.ts +0 -8
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types/string.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types.d.ts +0 -161
- package/types/deps/jsr.io/@cliffy/command/1.1.0/types.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/command/1.1.0/upgrade/_check_version.d.ts +0 -4
- package/types/deps/jsr.io/@cliffy/command/1.1.0/upgrade/_check_version.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/_errors.d.ts +0 -67
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/_errors.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/_utils.d.ts +0 -17
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/_utils.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/_validate_flags.d.ts +0 -11
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/_validate_flags.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/flags.d.ts +0 -154
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/flags.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/mod.d.ts +0 -57
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/boolean.d.ts +0 -4
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/boolean.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/integer.d.ts +0 -4
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/integer.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/number.d.ts +0 -4
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/number.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/string.d.ts +0 -4
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types/string.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types.d.ts +0 -170
- package/types/deps/jsr.io/@cliffy/flags/1.1.0/types.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/exit.d.ts +0 -8
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/exit.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_args.d.ts +0 -7
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_args.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_columns.d.ts +0 -7
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_columns.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_env.d.ts +0 -8
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/get_env.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/inspect.d.ts +0 -7
- package/types/deps/jsr.io/@cliffy/internal/1.1.0/runtime/inspect.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/_layout.d.ts +0 -108
- package/types/deps/jsr.io/@cliffy/table/1.1.0/_layout.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/_utils.d.ts +0 -26
- package/types/deps/jsr.io/@cliffy/table/1.1.0/_utils.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/border.d.ts +0 -21
- package/types/deps/jsr.io/@cliffy/table/1.1.0/border.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/cell.d.ts +0 -155
- package/types/deps/jsr.io/@cliffy/table/1.1.0/cell.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/column.d.ts +0 -97
- package/types/deps/jsr.io/@cliffy/table/1.1.0/column.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/consume_words.d.ts +0 -30
- package/types/deps/jsr.io/@cliffy/table/1.1.0/consume_words.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/mod.d.ts +0 -43
- package/types/deps/jsr.io/@cliffy/table/1.1.0/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/row.d.ts +0 -67
- package/types/deps/jsr.io/@cliffy/table/1.1.0/row.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/table.d.ts +0 -235
- package/types/deps/jsr.io/@cliffy/table/1.1.0/table.d.ts.map +0 -1
- package/types/deps/jsr.io/@cliffy/table/1.1.0/unicode_width.d.ts +0 -40
- package/types/deps/jsr.io/@cliffy/table/1.1.0/unicode_width.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/_types.d.ts +0 -9
- package/types/deps/jsr.io/@std/crypto/1.1.0/_types.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/_wasm/lib/deno_std_wasm_crypto.d.ts +0 -2
- package/types/deps/jsr.io/@std/crypto/1.1.0/_wasm/lib/deno_std_wasm_crypto.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/_wasm/lib/deno_std_wasm_crypto.internal.d.ts +0 -69
- package/types/deps/jsr.io/@std/crypto/1.1.0/_wasm/lib/deno_std_wasm_crypto.internal.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/_wasm/mod.d.ts +0 -13
- package/types/deps/jsr.io/@std/crypto/1.1.0/_wasm/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/aes_gcm.d.ts +0 -76
- package/types/deps/jsr.io/@std/crypto/1.1.0/aes_gcm.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/crypto.d.ts +0 -149
- package/types/deps/jsr.io/@std/crypto/1.1.0/crypto.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/mod.d.ts +0 -22
- package/types/deps/jsr.io/@std/crypto/1.1.0/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.d.ts +0 -40
- package/types/deps/jsr.io/@std/crypto/1.1.0/timing_safe_equal.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
- package/types/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
- package/types/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
- package/types/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
- package/types/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts +0 -700
- package/types/deps/jsr.io/@std/fmt/1.0.10/colors.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/1.0.18/closest_string.d.ts +0 -42
- package/types/deps/jsr.io/@std/text/1.0.18/closest_string.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/1.0.18/levenshtein_distance.d.ts +0 -23
- package/types/deps/jsr.io/@std/text/1.0.18/levenshtein_distance.d.ts.map +0 -1
- package/types/errors.d.ts.map +0 -1
- package/types/index.d.ts.map +0 -1
- package/types/logger.d.ts.map +0 -1
- package/types/pack/parser.d.ts.map +0 -1
- package/types/transport.d.ts.map +0 -1
- package/types/types.d.ts.map +0 -1
- /package/{types → dist}/cli.d.ts +0 -0
- /package/{types → dist}/cli.d.ts.map +0 -0
- /package/{types → dist}/objects/commit.d.ts +0 -0
- /package/{types → dist}/objects/commit.d.ts.map +0 -0
- /package/{types → dist}/objects/index.d.ts +0 -0
- /package/{types → dist}/objects/index.d.ts.map +0 -0
- /package/{types → dist}/objects/tree.d.ts +0 -0
- /package/{types → dist}/pack/delta.d.ts +0 -0
- /package/{types → dist}/pack/delta.d.ts.map +0 -0
- /package/{types → dist}/pack/index.d.ts +0 -0
- /package/{types → dist}/pack/index.d.ts.map +0 -0
- /package/{types → dist}/pack/objects.d.ts +0 -0
- /package/{types → dist}/protocol/index.d.ts +0 -0
- /package/{types → dist}/protocol/index.d.ts.map +0 -0
- /package/{types → dist}/protocol/refs.d.ts +0 -0
- /package/{types → dist}/protocol/refs.d.ts.map +0 -0
|
@@ -1,750 +0,0 @@
|
|
|
1
|
-
import { getArgs } from "../../internal/1.1.0/runtime/get_args.js";
|
|
2
|
-
import { getDefaultValue, getOption, matchWildCardOptions, paramCaseToCamelCase, } from "./_utils.js";
|
|
3
|
-
import { DuplicateOptionError, InvalidOptionValueError, MissingArgumentError, MissingArgumentsError, MissingOptionValueError, TooManyArgumentsError, UnexpectedArgumentAfterVariadicArgumentError, UnexpectedOptionValueError, UnexpectedRequiredArgumentError, UnknownConflictingOptionError, UnknownOptionError, UnknownRequiredOptionError, UnknownTypeError, } from "./_errors.js";
|
|
4
|
-
import { boolean } from "./types/boolean.js";
|
|
5
|
-
import { number } from "./types/number.js";
|
|
6
|
-
import { string } from "./types/string.js";
|
|
7
|
-
import { validateFlags } from "./_validate_flags.js";
|
|
8
|
-
import { integer } from "./types/integer.js";
|
|
9
|
-
const DefaultTypes = {
|
|
10
|
-
string,
|
|
11
|
-
number,
|
|
12
|
-
integer,
|
|
13
|
-
boolean,
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Command-line arguments parser with built-in validations.
|
|
17
|
-
*
|
|
18
|
-
* The `parseFlags` method takes as its first argument the arguments to be parsed,
|
|
19
|
-
* usually `Deno.args`, or a {@linkcode ParseFlagsContext}. As the second
|
|
20
|
-
* argument you can define {@linkcode ParseFlagsOptions}.
|
|
21
|
-
*
|
|
22
|
-
* ### Basic usage
|
|
23
|
-
*
|
|
24
|
-
* If `parseFlags` is called without defining specific flags with the options
|
|
25
|
-
* object, all arguments are parsed and added to the flags object returned by the
|
|
26
|
-
* `parseFlags` method. All non-options arguments are added to the `unknown` array
|
|
27
|
-
* and all flags specified after the double dash (`--`) are added to the `literal`
|
|
28
|
-
* array.
|
|
29
|
-
*
|
|
30
|
-
* @example Parse arguments without validation
|
|
31
|
-
*
|
|
32
|
-
* ```typescript
|
|
33
|
-
* import { parseFlags } from "https://deno.land/x/cliffy/flags/mod.ts";
|
|
34
|
-
*
|
|
35
|
-
* console.log(parseFlags(Deno.args));
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* ```console
|
|
39
|
-
* $ deno run https://deno.land/x/cliffy/examples/flags/flags.ts -a foo -b bar
|
|
40
|
-
* {
|
|
41
|
-
* flags: { a: "foo", b: "bar" },
|
|
42
|
-
* literal: [],
|
|
43
|
-
* unknown: [],
|
|
44
|
-
* stopEarly: false,
|
|
45
|
-
* stopOnUnknown: false
|
|
46
|
-
* }
|
|
47
|
-
*
|
|
48
|
-
* $ deno run https://deno.land/x/cliffy/examples/flags/flags.ts \
|
|
49
|
-
* -x 3 \
|
|
50
|
-
* -y.z -n5 \
|
|
51
|
-
* -abc \
|
|
52
|
-
* --beep=boop \
|
|
53
|
-
* foo bar baz \
|
|
54
|
-
* --deno.land \
|
|
55
|
-
* --deno.com -- --cliffy
|
|
56
|
-
* {
|
|
57
|
-
* flags: {
|
|
58
|
-
* x: "3",
|
|
59
|
-
* y: { z: true },
|
|
60
|
-
* n: "5",
|
|
61
|
-
* a: true,
|
|
62
|
-
* b: true,
|
|
63
|
-
* c: true,
|
|
64
|
-
* beep: "boop",
|
|
65
|
-
* deno: { land: true, com: true }
|
|
66
|
-
* },
|
|
67
|
-
* literal: [ "--cliffy" ],
|
|
68
|
-
* unknown: [ "foo", "bar", "baz" ],
|
|
69
|
-
* stopEarly: false,
|
|
70
|
-
* stopOnUnknown: false
|
|
71
|
-
* }
|
|
72
|
-
* ```
|
|
73
|
-
*
|
|
74
|
-
* ### Define flags
|
|
75
|
-
*
|
|
76
|
-
* You can specify flags with the options object. For all unknown or invalid flags
|
|
77
|
-
* an `ValidationError` is thrown. Read more about error handling
|
|
78
|
-
* [here](./error_handling.md). A list of all available flag options can be found
|
|
79
|
-
* [here](./flag_options.md).
|
|
80
|
-
*
|
|
81
|
-
* @example Parse flags with validation
|
|
82
|
-
*
|
|
83
|
-
* ```typescript
|
|
84
|
-
* import { parseFlags } from "https://deno.land/x/cliffy/flags/mod.ts";
|
|
85
|
-
*
|
|
86
|
-
* const { flags } = parseFlags(Deno.args, {
|
|
87
|
-
* flags: [{
|
|
88
|
-
* name: "help",
|
|
89
|
-
* aliases: ["h"],
|
|
90
|
-
* standalone: true,
|
|
91
|
-
* }, {
|
|
92
|
-
* name: "verbose",
|
|
93
|
-
* aliases: ["v"],
|
|
94
|
-
* collect: true,
|
|
95
|
-
* value: (val: boolean, previous = 0) => val ? previous + 1 : 0,
|
|
96
|
-
* }, {
|
|
97
|
-
* name: "file",
|
|
98
|
-
* aliases: ["f"],
|
|
99
|
-
* type: "string",
|
|
100
|
-
* }],
|
|
101
|
-
* });
|
|
102
|
-
*
|
|
103
|
-
* console.log(flags);
|
|
104
|
-
* ```
|
|
105
|
-
*
|
|
106
|
-
* ```console
|
|
107
|
-
* $ deno run https://deno.land/x/cliffy/examples/flags/options.ts -vvv -f ./example.ts
|
|
108
|
-
* { verbose: 3, file: "./example.ts" }
|
|
109
|
-
* ```
|
|
110
|
-
*
|
|
111
|
-
* ### Parse context
|
|
112
|
-
*
|
|
113
|
-
* The `parseFlags` method accepts also a parse context as first argument. The
|
|
114
|
-
* context can either be a manually created object or the result of a previously
|
|
115
|
-
* called `parseFlags` method.
|
|
116
|
-
*
|
|
117
|
-
* This can be used to parse command line flags in multiple steps, for example,
|
|
118
|
-
* when parsing options that precede a subcommand.
|
|
119
|
-
*
|
|
120
|
-
* @example Pre-parsing global options
|
|
121
|
-
*
|
|
122
|
-
* ```ts
|
|
123
|
-
* import { parseFlags } from "https://deno.land/x/cliffy/flags/mod.ts";
|
|
124
|
-
*
|
|
125
|
-
* const globalFlags = [{
|
|
126
|
-
* name: "foo-global",
|
|
127
|
-
* alias: ["g"],
|
|
128
|
-
* collect: true,
|
|
129
|
-
* }];
|
|
130
|
-
*
|
|
131
|
-
* const flags = [{
|
|
132
|
-
* name: "foo",
|
|
133
|
-
* alias: ["f"],
|
|
134
|
-
* collect: true,
|
|
135
|
-
* }];
|
|
136
|
-
*
|
|
137
|
-
* const args = ["--foo-global", "cmd1", "--foo-global", "--foo", "arg1", "--foo"];
|
|
138
|
-
*
|
|
139
|
-
* // Parse main command args (all flags until the first unknown argument).
|
|
140
|
-
* const ctx = parseFlags(args, {
|
|
141
|
-
* flags: globalFlags,
|
|
142
|
-
* stopEarly: true, // Stop on first non option argument.
|
|
143
|
-
* stopOnUnknown: true, // Stop on first option argument.
|
|
144
|
-
* dotted: false, // Don't convert dotted option keys to nested objects.
|
|
145
|
-
* });
|
|
146
|
-
*
|
|
147
|
-
* // Shift sub-command from arguments.
|
|
148
|
-
* const subCommand = ctx.unknown.shift();
|
|
149
|
-
*
|
|
150
|
-
* // Parse all sub command args.
|
|
151
|
-
* parseFlags(ctx, {
|
|
152
|
-
* flags: [
|
|
153
|
-
* ...globalFlags,
|
|
154
|
-
* ...flags,
|
|
155
|
-
* ],
|
|
156
|
-
* });
|
|
157
|
-
*
|
|
158
|
-
* console.log("sub-command:", subCommand); // -> cmd1
|
|
159
|
-
* console.log("options:", ctx.flags); // -> { fooGlobal: [ true, true ], foo: [ true, true ] }
|
|
160
|
-
* console.log("arguments:", ctx.unknown); // -> [ "arg1" ]
|
|
161
|
-
* ```
|
|
162
|
-
*
|
|
163
|
-
* @param argsOrCtx Command line arguments e.g: `Deno.args` or parse context.
|
|
164
|
-
* @param opts Parse options.
|
|
165
|
-
*/
|
|
166
|
-
export function parseFlags(argsOrCtx = getArgs(), opts = {}) {
|
|
167
|
-
let args;
|
|
168
|
-
let ctx;
|
|
169
|
-
if (Array.isArray(argsOrCtx)) {
|
|
170
|
-
ctx = {};
|
|
171
|
-
args = argsOrCtx;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
ctx = argsOrCtx;
|
|
175
|
-
args = argsOrCtx.unknown;
|
|
176
|
-
argsOrCtx.unknown = [];
|
|
177
|
-
}
|
|
178
|
-
args = args.slice();
|
|
179
|
-
ctx.flags ??= {};
|
|
180
|
-
// ctx.args ??= [];
|
|
181
|
-
ctx.literal ??= [];
|
|
182
|
-
ctx.unknown ??= [];
|
|
183
|
-
ctx.stopEarly = false;
|
|
184
|
-
ctx.stopOnUnknown = false;
|
|
185
|
-
ctx.defaults ??= {};
|
|
186
|
-
ctx.parsedFlags ??= [];
|
|
187
|
-
opts.dotted ??= true;
|
|
188
|
-
validateOptions(opts);
|
|
189
|
-
const options = parseArgs(ctx, args, opts);
|
|
190
|
-
validateFlags(ctx, opts, options);
|
|
191
|
-
validateArguments(ctx, opts, options);
|
|
192
|
-
if (opts.dotted) {
|
|
193
|
-
parseDottedOptions(ctx);
|
|
194
|
-
}
|
|
195
|
-
return ctx;
|
|
196
|
-
}
|
|
197
|
-
function validateOptions(opts) {
|
|
198
|
-
opts.flags?.forEach((opt) => {
|
|
199
|
-
opt.depends?.forEach((flag) => {
|
|
200
|
-
if (!opts.flags || !getOption(opts.flags, flag)) {
|
|
201
|
-
throw new UnknownRequiredOptionError(flag, opts.flags ?? []);
|
|
202
|
-
}
|
|
203
|
-
});
|
|
204
|
-
opt.conflicts?.forEach((flag) => {
|
|
205
|
-
if (!opts.flags || !getOption(opts.flags, flag)) {
|
|
206
|
-
throw new UnknownConflictingOptionError(flag, opts.flags ?? []);
|
|
207
|
-
}
|
|
208
|
-
});
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
function parseArgs(ctx, args, opts) {
|
|
212
|
-
/** Option name mapping: propertyName -> option.name */
|
|
213
|
-
const optionsMap = new Map();
|
|
214
|
-
let inLiteral = false;
|
|
215
|
-
let argIndex = 0;
|
|
216
|
-
for (let argsIndex = 0; argsIndex < args.length; argsIndex++) {
|
|
217
|
-
let option;
|
|
218
|
-
let current = args[argsIndex];
|
|
219
|
-
let currentValue;
|
|
220
|
-
let negate = false;
|
|
221
|
-
let skipArgument = false;
|
|
222
|
-
// literal args after --
|
|
223
|
-
if (inLiteral) {
|
|
224
|
-
ctx.literal.push(current);
|
|
225
|
-
continue;
|
|
226
|
-
}
|
|
227
|
-
else if (current === "--") {
|
|
228
|
-
inLiteral = true;
|
|
229
|
-
continue;
|
|
230
|
-
}
|
|
231
|
-
else if (ctx.stopEarly || ctx.stopOnUnknown) {
|
|
232
|
-
ctx.unknown.push(current);
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
235
|
-
const maybeIsFlag = current.length > 1 && current[0] === "-";
|
|
236
|
-
if (!maybeIsFlag) {
|
|
237
|
-
if (opts.stopEarly) {
|
|
238
|
-
ctx.stopEarly = true;
|
|
239
|
-
}
|
|
240
|
-
if (opts.stopEarly || !opts.args?.length) {
|
|
241
|
-
ctx.unknown.push(current);
|
|
242
|
-
continue;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
const maybeIsShort = maybeIsFlag && current[1] !== "-";
|
|
246
|
-
const maybeIsLong = maybeIsShort
|
|
247
|
-
? false
|
|
248
|
-
: maybeIsFlag && current.length > 3 && current[2] !== "-";
|
|
249
|
-
// normalize short flags: -abc => -a -b -c
|
|
250
|
-
const currentRaw = current;
|
|
251
|
-
let splitCount = 0;
|
|
252
|
-
if (maybeIsShort && current.length > 2 && current[2] !== ".") {
|
|
253
|
-
const flags = splitFlags(current);
|
|
254
|
-
splitCount = flags.length;
|
|
255
|
-
args.splice(argsIndex, 1, ...flags);
|
|
256
|
-
current = args[argsIndex];
|
|
257
|
-
}
|
|
258
|
-
else if (maybeIsLong && current.startsWith("--no-")) {
|
|
259
|
-
negate = true;
|
|
260
|
-
}
|
|
261
|
-
// split value: --foo="bar=baz" => --foo bar=baz
|
|
262
|
-
const equalSignIndex = current.indexOf("=");
|
|
263
|
-
if (equalSignIndex !== -1) {
|
|
264
|
-
currentValue = current.slice(equalSignIndex + 1);
|
|
265
|
-
current = current.slice(0, equalSignIndex);
|
|
266
|
-
}
|
|
267
|
-
if (opts.flags) {
|
|
268
|
-
if (maybeIsFlag) {
|
|
269
|
-
option = getOption(opts.flags, current);
|
|
270
|
-
}
|
|
271
|
-
if (!option) {
|
|
272
|
-
const name = current.replace(/^-+/, "");
|
|
273
|
-
option = matchWildCardOptions(name, opts.flags);
|
|
274
|
-
if (!option) {
|
|
275
|
-
if (opts.stopOnUnknown) {
|
|
276
|
-
ctx.stopOnUnknown = true;
|
|
277
|
-
ctx.unknown.push(args[argsIndex]);
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
// Check if value is a positional argument
|
|
281
|
-
if (opts.args?.length) {
|
|
282
|
-
const argDef = opts.args[argIndex];
|
|
283
|
-
if (argDef) {
|
|
284
|
-
const args = ctx.args ??= [];
|
|
285
|
-
if (argDef.optional && currentRaw === "") {
|
|
286
|
-
if (!argDef.variadic) {
|
|
287
|
-
args.push(undefined);
|
|
288
|
-
argIndex++;
|
|
289
|
-
}
|
|
290
|
-
continue;
|
|
291
|
-
}
|
|
292
|
-
// Parse argument value
|
|
293
|
-
if (argDef.list) {
|
|
294
|
-
args.push(parseListValue(opts, {
|
|
295
|
-
label: "Argument",
|
|
296
|
-
name: argDef.name || `arg[${argIndex}]`,
|
|
297
|
-
type: argDef.type || "string",
|
|
298
|
-
value: currentRaw,
|
|
299
|
-
separator: argDef.separator,
|
|
300
|
-
}));
|
|
301
|
-
}
|
|
302
|
-
else {
|
|
303
|
-
args.push(parseValue(opts, {
|
|
304
|
-
label: "Argument",
|
|
305
|
-
name: argDef.name || `arg[${argIndex}]`,
|
|
306
|
-
type: argDef.type || "string",
|
|
307
|
-
value: currentRaw,
|
|
308
|
-
}));
|
|
309
|
-
}
|
|
310
|
-
// Increase argsIndex by amount of normalized arguments.
|
|
311
|
-
if (splitCount > 1) {
|
|
312
|
-
argsIndex += splitCount - 1;
|
|
313
|
-
}
|
|
314
|
-
if (!argDef.variadic) {
|
|
315
|
-
argIndex++;
|
|
316
|
-
}
|
|
317
|
-
else if (opts.args[argIndex + 1]) {
|
|
318
|
-
throw new UnexpectedArgumentAfterVariadicArgumentError(currentRaw);
|
|
319
|
-
}
|
|
320
|
-
continue;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
if (!maybeIsFlag) {
|
|
324
|
-
throw new TooManyArgumentsError([currentRaw]);
|
|
325
|
-
}
|
|
326
|
-
throw new UnknownOptionError(current, opts.flags);
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
if (opts.args?.length && !maybeIsFlag) {
|
|
332
|
-
const argDef = opts.args[argIndex];
|
|
333
|
-
if (argDef) {
|
|
334
|
-
const posArgs = ctx.args ??= [];
|
|
335
|
-
if (argDef.optional && currentRaw === "") {
|
|
336
|
-
if (!argDef.variadic) {
|
|
337
|
-
posArgs.push(undefined);
|
|
338
|
-
argIndex++;
|
|
339
|
-
}
|
|
340
|
-
continue;
|
|
341
|
-
}
|
|
342
|
-
if (argDef.list) {
|
|
343
|
-
posArgs.push(parseListValue(opts, {
|
|
344
|
-
label: "Argument",
|
|
345
|
-
name: argDef.name || `arg[${argIndex}]`,
|
|
346
|
-
type: argDef.type || "string",
|
|
347
|
-
value: currentRaw,
|
|
348
|
-
separator: argDef.separator,
|
|
349
|
-
}));
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
posArgs.push(parseValue(opts, {
|
|
353
|
-
label: "Argument",
|
|
354
|
-
name: argDef.name || `arg[${argIndex}]`,
|
|
355
|
-
type: argDef.type || "string",
|
|
356
|
-
value: currentRaw,
|
|
357
|
-
}));
|
|
358
|
-
}
|
|
359
|
-
if (!argDef.variadic) {
|
|
360
|
-
argIndex++;
|
|
361
|
-
}
|
|
362
|
-
else if (opts.args[argIndex + 1]) {
|
|
363
|
-
throw new UnexpectedArgumentAfterVariadicArgumentError(currentRaw);
|
|
364
|
-
}
|
|
365
|
-
continue;
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
option = {
|
|
369
|
-
name: current.replace(/^-+/, ""),
|
|
370
|
-
optionalValue: true,
|
|
371
|
-
type: "string",
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
ctx.parsedFlags.push(args[argsIndex]);
|
|
375
|
-
if (option.standalone) {
|
|
376
|
-
ctx.standalone = option;
|
|
377
|
-
}
|
|
378
|
-
const positiveName = negate
|
|
379
|
-
? option.name.replace(/^no-?/, "")
|
|
380
|
-
: option.name;
|
|
381
|
-
const propName = paramCaseToCamelCase(positiveName);
|
|
382
|
-
if (typeof ctx.flags[propName] !== "undefined") {
|
|
383
|
-
if (!opts.flags?.length) {
|
|
384
|
-
option.collect = true;
|
|
385
|
-
}
|
|
386
|
-
else if (!option.collect && !ctx.defaults[option.name]) {
|
|
387
|
-
throw new DuplicateOptionError(current);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
if (option.type && !option.args?.length) {
|
|
391
|
-
option.args = [{
|
|
392
|
-
name: option.name,
|
|
393
|
-
type: option.type,
|
|
394
|
-
optional: option.optionalValue,
|
|
395
|
-
variadic: option.variadic,
|
|
396
|
-
list: option.list,
|
|
397
|
-
separator: option.separator,
|
|
398
|
-
default: option.default,
|
|
399
|
-
value: option.value,
|
|
400
|
-
}];
|
|
401
|
-
}
|
|
402
|
-
if (opts.flags?.length && !option.args?.length &&
|
|
403
|
-
typeof currentValue !== "undefined") {
|
|
404
|
-
throw new UnexpectedOptionValueError(option.name, currentValue);
|
|
405
|
-
}
|
|
406
|
-
let optionArgsIndex = 0;
|
|
407
|
-
let inOptionalArg = false;
|
|
408
|
-
const next = () => currentValue ?? args[argsIndex + 1];
|
|
409
|
-
const previous = ctx.flags[propName];
|
|
410
|
-
parseNext(option);
|
|
411
|
-
if (skipArgument) {
|
|
412
|
-
continue;
|
|
413
|
-
}
|
|
414
|
-
if (typeof ctx.flags[propName] === "undefined") {
|
|
415
|
-
if (option.args?.length && !option.args?.[optionArgsIndex].optional) {
|
|
416
|
-
throw new MissingOptionValueError(option.name);
|
|
417
|
-
}
|
|
418
|
-
else if ((option.default !== undefined &&
|
|
419
|
-
(option.type || option.value || option.args?.length)) ||
|
|
420
|
-
option.args?.some((arg) => arg.default !== undefined && (arg.type || arg.value))) {
|
|
421
|
-
ctx.flags[propName] = getDefaultValue(option);
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
setFlagValue(true);
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
// TODO: decuple option and option.args so we can have a value handle for
|
|
428
|
-
// each arg separately and one additionally for all args.
|
|
429
|
-
if (option.args?.some((arg) => arg.value) &&
|
|
430
|
-
(option.args.length > 1 || !option.value)) {
|
|
431
|
-
if (option.args.length === 1) {
|
|
432
|
-
const arg = option.args[0];
|
|
433
|
-
if (typeof arg.value === "function") {
|
|
434
|
-
ctx.flags[propName] = arg.value(ctx.flags[propName]);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
else {
|
|
438
|
-
for (const [index, arg] of option.args.entries()) {
|
|
439
|
-
if (typeof arg.value === "function") {
|
|
440
|
-
ctx.flags[propName][index] = arg.value(ctx.flags[propName][index]);
|
|
441
|
-
// setFlagValue(ctx.flags[propName]);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
if (option.value) {
|
|
447
|
-
const value = option.value(ctx.flags[propName], previous);
|
|
448
|
-
setFlagValue(value);
|
|
449
|
-
}
|
|
450
|
-
else if (option.collect) {
|
|
451
|
-
const value = typeof previous !== "undefined"
|
|
452
|
-
? (Array.isArray(previous) ? previous : [previous])
|
|
453
|
-
: [];
|
|
454
|
-
value.push(ctx.flags[propName]);
|
|
455
|
-
setFlagValue(value);
|
|
456
|
-
}
|
|
457
|
-
optionsMap.set(propName, option);
|
|
458
|
-
opts.option?.(option, ctx.flags[propName]);
|
|
459
|
-
/** Parse next argument for current option. */
|
|
460
|
-
// deno-lint-ignore no-inner-declarations
|
|
461
|
-
function parseNext(option) {
|
|
462
|
-
let skipOptionArgument = false;
|
|
463
|
-
if (negate) {
|
|
464
|
-
setFlagValue(false);
|
|
465
|
-
return;
|
|
466
|
-
}
|
|
467
|
-
else if (!option.args?.length) {
|
|
468
|
-
setFlagValue(undefined);
|
|
469
|
-
return;
|
|
470
|
-
}
|
|
471
|
-
const arg = option.args[optionArgsIndex];
|
|
472
|
-
if (!arg) {
|
|
473
|
-
const flag = next();
|
|
474
|
-
throw new UnknownOptionError(flag, opts.flags ?? []);
|
|
475
|
-
}
|
|
476
|
-
if (!arg.type) {
|
|
477
|
-
arg.type = "boolean";
|
|
478
|
-
}
|
|
479
|
-
// make boolean values optional by default
|
|
480
|
-
// if (
|
|
481
|
-
// !option.args?.length &&
|
|
482
|
-
// arg.type === "boolean" &&
|
|
483
|
-
// arg.optional === undefined
|
|
484
|
-
// ) {
|
|
485
|
-
// arg.optional = true;
|
|
486
|
-
// }
|
|
487
|
-
if (arg.optional) {
|
|
488
|
-
inOptionalArg = true;
|
|
489
|
-
}
|
|
490
|
-
else if (inOptionalArg) {
|
|
491
|
-
throw new UnexpectedRequiredArgumentError(option.name);
|
|
492
|
-
}
|
|
493
|
-
let result;
|
|
494
|
-
let increase = false;
|
|
495
|
-
if (hasNext(arg) && (!option.required || arg.optional) && next() === "") {
|
|
496
|
-
// if the value is empty and the argument is optional,
|
|
497
|
-
// we can skip the argument.
|
|
498
|
-
if (arg.variadic) {
|
|
499
|
-
skipOptionArgument = true;
|
|
500
|
-
}
|
|
501
|
-
else if (option.args?.length === 1) {
|
|
502
|
-
skipArgument = true;
|
|
503
|
-
}
|
|
504
|
-
else {
|
|
505
|
-
// will be mapped to undefined later.
|
|
506
|
-
result = "";
|
|
507
|
-
}
|
|
508
|
-
increase = true;
|
|
509
|
-
}
|
|
510
|
-
else if (arg.list && hasNext(arg)) {
|
|
511
|
-
const parsed = parseListValue(opts, {
|
|
512
|
-
label: "Option",
|
|
513
|
-
name: `--${option.name}`,
|
|
514
|
-
type: arg.type || "string",
|
|
515
|
-
value: next(),
|
|
516
|
-
separator: arg.separator,
|
|
517
|
-
});
|
|
518
|
-
if (parsed?.length) {
|
|
519
|
-
result = parsed;
|
|
520
|
-
}
|
|
521
|
-
increase = true;
|
|
522
|
-
}
|
|
523
|
-
else {
|
|
524
|
-
if (hasNext(arg)) {
|
|
525
|
-
result = parseValue(opts, {
|
|
526
|
-
label: "Option",
|
|
527
|
-
name: `--${option.name}`,
|
|
528
|
-
type: arg.type || "string",
|
|
529
|
-
value: next(),
|
|
530
|
-
});
|
|
531
|
-
if (typeof result !== "undefined") {
|
|
532
|
-
increase = true;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
else if (arg.optional && arg.type === "boolean") {
|
|
536
|
-
result = true;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
if (increase && typeof currentValue === "undefined") {
|
|
540
|
-
ctx.parsedFlags.push(args[argsIndex + 1]);
|
|
541
|
-
argsIndex++;
|
|
542
|
-
if (!arg.variadic) {
|
|
543
|
-
optionArgsIndex++;
|
|
544
|
-
}
|
|
545
|
-
else if (option.args[optionArgsIndex + 1]) {
|
|
546
|
-
throw new UnexpectedArgumentAfterVariadicArgumentError(next());
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
if (skipOptionArgument) {
|
|
550
|
-
if (hasNext(arg)) {
|
|
551
|
-
parseNext(option);
|
|
552
|
-
}
|
|
553
|
-
return;
|
|
554
|
-
}
|
|
555
|
-
if (skipArgument) {
|
|
556
|
-
return;
|
|
557
|
-
}
|
|
558
|
-
if (typeof result !== "undefined" &&
|
|
559
|
-
(option.args.length > 1 || arg.variadic)) {
|
|
560
|
-
if (!ctx.flags[propName]) {
|
|
561
|
-
setFlagValue([]);
|
|
562
|
-
}
|
|
563
|
-
if (result === "") {
|
|
564
|
-
result = undefined;
|
|
565
|
-
}
|
|
566
|
-
ctx.flags[propName].push(result);
|
|
567
|
-
if (hasNext(arg)) {
|
|
568
|
-
parseNext(option);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
else {
|
|
572
|
-
setFlagValue(result);
|
|
573
|
-
}
|
|
574
|
-
/** Check if current option should have an argument. */
|
|
575
|
-
function hasNext(arg) {
|
|
576
|
-
if (!option.args?.length) {
|
|
577
|
-
return false;
|
|
578
|
-
}
|
|
579
|
-
const nextValue = next();
|
|
580
|
-
if (nextValue === undefined) {
|
|
581
|
-
return false;
|
|
582
|
-
}
|
|
583
|
-
if (option.args.length > 1 && optionArgsIndex >= option.args.length) {
|
|
584
|
-
return false;
|
|
585
|
-
}
|
|
586
|
-
let nextOption;
|
|
587
|
-
if (!arg.optional &&
|
|
588
|
-
(!arg.variadic ||
|
|
589
|
-
!(nextOption = getOption(opts.flags ?? [], nextValue)))) {
|
|
590
|
-
return true;
|
|
591
|
-
}
|
|
592
|
-
// require optional values to be called with an equal sign: foo=bar
|
|
593
|
-
if (option.equalsSign && arg.optional && !arg.variadic &&
|
|
594
|
-
typeof currentValue === "undefined") {
|
|
595
|
-
return false;
|
|
596
|
-
}
|
|
597
|
-
if ((arg.optional || arg.variadic) &&
|
|
598
|
-
!(nextOption ?? getOption(opts.flags ?? [], nextValue))) {
|
|
599
|
-
return nextValue[0] !== "-" ||
|
|
600
|
-
typeof currentValue !== "undefined" ||
|
|
601
|
-
(arg.type === "number" && !isNaN(Number(nextValue)));
|
|
602
|
-
}
|
|
603
|
-
return false;
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
// deno-lint-ignore no-inner-declarations
|
|
607
|
-
function setFlagValue(value) {
|
|
608
|
-
ctx.flags[propName] = value;
|
|
609
|
-
if (ctx.defaults[propName]) {
|
|
610
|
-
delete ctx.defaults[propName];
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
return optionsMap;
|
|
615
|
-
}
|
|
616
|
-
function parseDottedOptions(ctx) {
|
|
617
|
-
// convert dotted option keys into nested objects
|
|
618
|
-
ctx.flags = Object.keys(ctx.flags).reduce((result, key) => {
|
|
619
|
-
if (~key.indexOf(".")) {
|
|
620
|
-
key.split(".").reduce((
|
|
621
|
-
// deno-lint-ignore no-explicit-any
|
|
622
|
-
result, subKey, index, parts) => {
|
|
623
|
-
if (index === parts.length - 1) {
|
|
624
|
-
result[subKey] = ctx.flags[key];
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
result[subKey] = result[subKey] ?? {};
|
|
628
|
-
}
|
|
629
|
-
return result[subKey];
|
|
630
|
-
}, result);
|
|
631
|
-
}
|
|
632
|
-
else {
|
|
633
|
-
result[key] = ctx.flags[key];
|
|
634
|
-
}
|
|
635
|
-
return result;
|
|
636
|
-
}, {});
|
|
637
|
-
}
|
|
638
|
-
function splitFlags(flag) {
|
|
639
|
-
flag = flag.slice(1);
|
|
640
|
-
const normalized = [];
|
|
641
|
-
const index = flag.indexOf("=");
|
|
642
|
-
const flags = (index !== -1 ? flag.slice(0, index) : flag).split("");
|
|
643
|
-
if (isNaN(Number(flag[flag.length - 1]))) {
|
|
644
|
-
flags.forEach((val) => normalized.push(`-${val}`));
|
|
645
|
-
}
|
|
646
|
-
else {
|
|
647
|
-
normalized.push(`-${flags.shift()}`);
|
|
648
|
-
if (flags.length) {
|
|
649
|
-
normalized.push(flags.join(""));
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
if (index !== -1) {
|
|
653
|
-
normalized[normalized.length - 1] += flag.slice(index);
|
|
654
|
-
}
|
|
655
|
-
return normalized;
|
|
656
|
-
}
|
|
657
|
-
/** Parse argument value. */
|
|
658
|
-
function parseValue(opts, options) {
|
|
659
|
-
return opts.parse ? opts.parse(options) : parseDefaultType(options);
|
|
660
|
-
}
|
|
661
|
-
function parseListValue(opts, options) {
|
|
662
|
-
return options.value
|
|
663
|
-
.split(options.separator || ",")
|
|
664
|
-
.map((nextValue) => {
|
|
665
|
-
const value = parseValue(opts, {
|
|
666
|
-
...options,
|
|
667
|
-
value: nextValue,
|
|
668
|
-
});
|
|
669
|
-
if (typeof value === "undefined") {
|
|
670
|
-
throw new InvalidOptionValueError(options.name, options.type || "?", nextValue);
|
|
671
|
-
}
|
|
672
|
-
return value;
|
|
673
|
-
});
|
|
674
|
-
}
|
|
675
|
-
function parseDefaultType({ label, name, type, value, }) {
|
|
676
|
-
const parseType = DefaultTypes[type];
|
|
677
|
-
if (!parseType) {
|
|
678
|
-
throw new UnknownTypeError(type, Object.keys(DefaultTypes));
|
|
679
|
-
}
|
|
680
|
-
return parseType({
|
|
681
|
-
label,
|
|
682
|
-
type,
|
|
683
|
-
name,
|
|
684
|
-
value,
|
|
685
|
-
});
|
|
686
|
-
}
|
|
687
|
-
function validateArguments(ctx, opts, options = new Map()) {
|
|
688
|
-
if (!opts.args?.length) {
|
|
689
|
-
return;
|
|
690
|
-
}
|
|
691
|
-
const hasDefaults = opts.args.some((arg) => arg.default !== undefined);
|
|
692
|
-
if (!ctx.args?.length && !hasDefaults) {
|
|
693
|
-
const required = opts.args
|
|
694
|
-
.filter((expectedArg) => !expectedArg.optional)
|
|
695
|
-
.map((expectedArg) => expectedArg.name ?? `arg[${opts.args?.indexOf(expectedArg)}]`);
|
|
696
|
-
if (required.length) {
|
|
697
|
-
const hasStandaloneOption = [...options.keys()].some((name) => opts.flags && getOption(opts.flags, name)?.standalone);
|
|
698
|
-
if (!hasStandaloneOption) {
|
|
699
|
-
throw new MissingArgumentsError(required);
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
else {
|
|
704
|
-
ctx.args ??= [];
|
|
705
|
-
for (const [index, expectedArg] of opts.args?.entries() ?? []) {
|
|
706
|
-
const mapArgValue = (parsed) => {
|
|
707
|
-
return expectedArg.value ? expectedArg.value(parsed) : parsed;
|
|
708
|
-
};
|
|
709
|
-
if (typeof ctx.args[index] === "undefined") {
|
|
710
|
-
if (expectedArg.default !== undefined) {
|
|
711
|
-
const defaultValue = typeof expectedArg.default === "function"
|
|
712
|
-
? expectedArg.default()
|
|
713
|
-
: expectedArg.default;
|
|
714
|
-
const mappedValue = mapArgValue(defaultValue);
|
|
715
|
-
if (expectedArg.variadic && Array.isArray(mappedValue)) {
|
|
716
|
-
ctx.args.splice(index, 0, ...mappedValue);
|
|
717
|
-
continue;
|
|
718
|
-
}
|
|
719
|
-
else {
|
|
720
|
-
ctx.args[index] = mappedValue;
|
|
721
|
-
continue;
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
if (expectedArg.optional) {
|
|
725
|
-
continue;
|
|
726
|
-
}
|
|
727
|
-
throw new MissingArgumentError(expectedArg.name ?? `arg[${index}]`);
|
|
728
|
-
}
|
|
729
|
-
let mappedValue;
|
|
730
|
-
if (expectedArg.variadic) {
|
|
731
|
-
mappedValue = mapArgValue(ctx.args.splice(index));
|
|
732
|
-
}
|
|
733
|
-
else {
|
|
734
|
-
mappedValue = mapArgValue(ctx.args[index]);
|
|
735
|
-
}
|
|
736
|
-
if (typeof mappedValue !== "undefined" ||
|
|
737
|
-
typeof ctx.args[index] !== "undefined") {
|
|
738
|
-
if (expectedArg.variadic && Array.isArray(mappedValue)) {
|
|
739
|
-
ctx.args.splice(index, 0, ...mappedValue);
|
|
740
|
-
}
|
|
741
|
-
else if (typeof mappedValue !== "undefined") {
|
|
742
|
-
ctx.args[index] = mappedValue;
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
}
|
|
746
|
-
if (ctx.unknown.length) {
|
|
747
|
-
throw new TooManyArgumentsError(ctx.unknown);
|
|
748
|
-
}
|
|
749
|
-
}
|
|
750
|
-
}
|