@cardelli/ambit 0.1.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/esm/_dnt.polyfills.d.ts +111 -0
- package/esm/_dnt.polyfills.d.ts.map +1 -0
- package/esm/_dnt.polyfills.js +141 -0
- package/esm/_dnt.shims.d.ts +6 -0
- package/esm/_dnt.shims.d.ts.map +1 -0
- package/esm/_dnt.shims.js +61 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/_layout.d.ts +104 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/_layout.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/_layout.js +531 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/_utils.d.ts +29 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/_utils.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/_utils.js +72 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/border.d.ts +21 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/border.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/border.js +18 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/cell.d.ts +155 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/cell.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/cell.js +190 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/column.d.ts +62 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/column.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/column.js +78 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/consume_words.d.ts +30 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/consume_words.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/consume_words.js +64 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/mod.d.ts +43 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/mod.js +42 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/row.d.ts +67 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/row.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/row.js +82 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/table.d.ts +188 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/table.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/table.js +286 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/unicode_width.d.ts +40 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/unicode_width.d.ts.map +1 -0
- package/esm/deps/jsr.io/@cliffy/table/1.0.0/unicode_width.js +95 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/_data.d.ts +9 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/_data.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/_data.js +17 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/_run_length.d.ts +9 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/_run_length.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/_run_length.js +34 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/mod.d.ts +18 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/mod.js +18 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/parse_args.d.ts +343 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/parse_args.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/parse_args.js +358 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/prompt_secret.d.ts +28 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/prompt_secret.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/prompt_secret.js +109 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/unicode_width.d.ts +40 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/unicode_width.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/cli/1.0.27/unicode_width.js +74 -0
- package/esm/deps/jsr.io/@std/collections/1.1.3/_utils.d.ts +6 -0
- package/esm/deps/jsr.io/@std/collections/1.1.3/_utils.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.1.3/_utils.js +18 -0
- package/esm/deps/jsr.io/@std/collections/1.1.3/deep_merge.d.ts +322 -0
- package/esm/deps/jsr.io/@std/collections/1.1.3/deep_merge.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/collections/1.1.3/deep_merge.js +95 -0
- package/esm/deps/jsr.io/@std/fmt/1.0.9/colors.d.ts +700 -0
- package/esm/deps/jsr.io/@std/fmt/1.0.9/colors.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/fmt/1.0.9/colors.js +903 -0
- package/esm/deps/jsr.io/@std/internal/1.0.12/_os.d.ts +2 -0
- package/esm/deps/jsr.io/@std/internal/1.0.12/_os.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.12/_os.js +12 -0
- package/esm/deps/jsr.io/@std/internal/1.0.12/os.d.ts +3 -0
- package/esm/deps/jsr.io/@std/internal/1.0.12/os.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/internal/1.0.12/os.js +5 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/assert_path.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/assert_path.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/assert_path.js +7 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/basename.d.ts +4 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/basename.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/basename.js +40 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/common.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/common.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/common.js +23 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/constants.d.ts +40 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/constants.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/constants.js +46 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/dirname.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/dirname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/dirname.js +8 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/format.d.ts +4 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/format.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/format.js +19 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/from_file_url.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/from_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/from_file_url.js +9 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/glob_to_reg_exp.d.ts +35 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/glob_to_reg_exp.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/glob_to_reg_exp.js +235 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/normalize.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/normalize.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/normalize.js +8 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/normalize_string.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/normalize_string.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/normalize_string.js +77 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/relative.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/relative.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/relative.js +9 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/strip_trailing_separators.js +19 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/to_file_url.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/to_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/_common/to_file_url.js +15 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/basename.d.ts +27 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/basename.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/basename.js +35 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/common.d.ts +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/common.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/common.js +33 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/constants.d.ts +15 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/constants.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/constants.js +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/dirname.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/dirname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/dirname.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/extname.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/extname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/extname.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/format.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/format.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/format.js +27 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/from_file_url.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/from_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/from_file_url.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/glob_to_regexp.d.ts +77 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/glob_to_regexp.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/glob_to_regexp.js +83 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/is_absolute.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/is_absolute.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/is_absolute.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/is_glob.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/is_glob.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/is_glob.js +42 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/join.d.ts +23 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/join.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/join.js +29 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/join_globs.d.ts +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/join_globs.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/join_globs.js +34 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/mod.d.ts +213 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/mod.js +216 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/normalize.d.ts +26 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/normalize.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/normalize.js +32 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/normalize_glob.d.ts +29 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/normalize_glob.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/normalize_glob.js +35 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/parse.d.ts +35 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/parse.js +39 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/_util.d.ts +2 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/_util.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/_util.js +8 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/basename.d.ts +39 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/basename.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/basename.js +52 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/constants.d.ts +13 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/constants.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/constants.js +14 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/dirname.d.ts +30 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/dirname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/dirname.js +64 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/extname.d.ts +37 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/extname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/extname.js +93 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/format.d.ts +24 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/format.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/format.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/from_file_url.d.ts +16 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/from_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/from_file_url.js +21 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/glob_to_regexp.d.ts +72 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/glob_to_regexp.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/glob_to_regexp.js +82 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/is_absolute.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/is_absolute.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/is_absolute.js +23 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/join.d.ts +31 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/join.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/join.js +45 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/join_globs.d.ts +20 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/join_globs.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/join_globs.js +40 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/normalize.d.ts +37 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/normalize.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/normalize.js +58 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/normalize_glob.d.ts +20 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/normalize_glob.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/normalize_glob.js +32 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/parse.d.ts +25 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/parse.js +115 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/relative.d.ts +20 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/relative.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/relative.js +106 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/resolve.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/resolve.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/resolve.js +59 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/to_file_url.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/to_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/to_file_url.js +27 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/to_namespaced_path.d.ts +16 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/to_namespaced_path.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/posix/to_namespaced_path.js +20 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/relative.d.ts +24 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/relative.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/relative.js +30 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/resolve.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/resolve.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/resolve.js +30 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/to_file_url.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/to_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/to_file_url.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/to_namespaced_path.d.ts +21 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/to_namespaced_path.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/to_namespaced_path.js +29 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/types.d.ts +38 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/types.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/types.js +3 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/_util.d.ts +4 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/_util.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/_util.js +15 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/basename.d.ts +22 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/basename.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/basename.js +47 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/constants.d.ts +13 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/constants.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/constants.js +14 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/dirname.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/dirname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/dirname.js +113 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/extname.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/extname.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/extname.js +82 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/format.d.ts +24 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/format.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/format.js +28 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/from_file_url.d.ts +18 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/from_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/from_file_url.js +30 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/glob_to_regexp.d.ts +71 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/glob_to_regexp.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/glob_to_regexp.js +82 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/is_absolute.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/is_absolute.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/is_absolute.js +38 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/join.d.ts +18 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/join.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/join.js +77 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/join_globs.d.ts +21 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/join_globs.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/join_globs.js +41 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/normalize.d.ts +19 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/normalize.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/normalize.js +135 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/normalize_glob.d.ts +20 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/normalize_glob.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/normalize_glob.js +32 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/parse.d.ts +25 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/parse.js +176 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/relative.d.ts +23 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/relative.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/relative.js +131 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/resolve.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/resolve.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/resolve.js +154 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/to_file_url.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/to_file_url.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/to_file_url.js +34 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/to_namespaced_path.d.ts +17 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/to_namespaced_path.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/path/1.1.4/windows/to_namespaced_path.js +49 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts +93 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/_parser.js +740 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts +109 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/mod.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/mod.js +110 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts +21 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/parse.js +25 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts +35 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.d.ts.map +1 -0
- package/esm/deps/jsr.io/@std/toml/1.0.11/stringify.js +276 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/index.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/index.js +4 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/checks.d.ts +2 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/checks.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/checks.js +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/coerce.d.ts +18 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/coerce.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/coerce.js +17 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/compat.d.ts +51 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/compat.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/compat.js +31 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/errors.d.ts +31 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/errors.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/errors.js +48 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/external.d.ts +16 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/external.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/external.js +20 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/from-json-schema.d.ts +13 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/from-json-schema.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/from-json-schema.js +584 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/iso.d.ts +23 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/iso.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/iso.js +30 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/parse.d.ts +32 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/parse.js +15 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/schemas.d.ts +740 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/schemas.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/classic/schemas.js +1157 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/api.d.ts +305 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/api.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/api.js +1082 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/checks.d.ts +279 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/checks.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/checks.js +566 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/core.d.ts +71 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/core.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/core.js +75 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/doc.d.ts +15 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/doc.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/doc.js +36 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/errors.d.ts +221 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/errors.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/errors.js +181 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/index.d.ts +17 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/index.js +16 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema-generator.d.ts +66 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema-generator.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema-generator.js +96 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema-processors.d.ts +50 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema-processors.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema-processors.js +605 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema.d.ts +89 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/json-schema.js +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/parse.d.ts +50 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/parse.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/parse.js +93 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/regexes.d.ts +80 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/regexes.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/regexes.js +133 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/registries.d.ts +36 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/registries.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/registries.js +51 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/schemas.d.ts +1148 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/schemas.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/schemas.js +2092 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/standard-schema.d.ts +127 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/standard-schema.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/standard-schema.js +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/to-json-schema.d.ts +115 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/to-json-schema.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/to-json-schema.js +436 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/util.d.ts +200 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/util.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/util.js +650 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/versions.d.ts +6 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/versions.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/core/versions.js +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ar.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ar.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ar.js +106 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/az.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/az.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/az.js +105 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/be.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/be.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/be.js +156 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/bg.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/bg.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/bg.js +120 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ca.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ca.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ca.js +107 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/cs.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/cs.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/cs.js +111 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/da.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/da.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/da.js +115 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/de.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/de.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/de.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/en.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/en.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/en.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/eo.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/eo.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/eo.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/es.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/es.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/es.js +132 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fa.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fa.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fa.js +114 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fi.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fi.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fi.js +112 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fr-CA.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fr-CA.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fr-CA.js +107 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fr.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fr.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/fr.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/he.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/he.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/he.js +214 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/hu.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/hu.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/hu.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/hy.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/hy.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/hy.js +147 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/id.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/id.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/id.js +106 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/index.d.ts +50 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/index.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/index.js +49 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/is.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/is.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/is.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/it.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/it.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/it.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ja.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ja.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ja.js +107 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ka.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ka.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ka.js +112 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/kh.d.ts +6 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/kh.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/kh.js +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/km.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/km.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/km.js +110 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ko.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ko.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ko.js +111 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/lt.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/lt.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/lt.js +203 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/mk.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/mk.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/mk.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ms.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ms.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ms.js +107 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/nl.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/nl.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/nl.js +110 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/no.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/no.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/no.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ota.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ota.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ota.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/pl.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/pl.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/pl.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ps.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ps.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ps.js +114 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/pt.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/pt.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/pt.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ru.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ru.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ru.js +156 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/sl.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/sl.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/sl.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/sv.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/sv.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/sv.js +110 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ta.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ta.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ta.js +110 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/th.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/th.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/th.js +110 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/tr.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/tr.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/tr.js +105 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ua.d.ts +6 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ua.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ua.js +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/uk.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/uk.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/uk.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ur.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ur.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/ur.js +110 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/uz.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/uz.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/uz.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/vi.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/vi.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/vi.js +108 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/yo.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/yo.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/yo.js +107 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/zh-CN.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/zh-CN.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/zh-CN.js +109 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/zh-TW.d.ts +5 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/zh-TW.d.ts.map +1 -0
- package/esm/deps/jsr.io/@zod/zod/4.3.6/src/v4/locales/zh-TW.js +107 -0
- package/esm/lib/cli.d.ts +34 -0
- package/esm/lib/cli.d.ts.map +1 -0
- package/esm/lib/cli.js +176 -0
- package/esm/lib/command.d.ts +54 -0
- package/esm/lib/command.d.ts.map +1 -0
- package/esm/lib/command.js +121 -0
- package/esm/lib/output.d.ts +33 -0
- package/esm/lib/output.d.ts.map +1 -0
- package/esm/lib/output.js +114 -0
- package/esm/lib/paths.d.ts +3 -0
- package/esm/lib/paths.d.ts.map +1 -0
- package/esm/lib/paths.js +5 -0
- package/esm/main.d.ts +9 -0
- package/esm/main.d.ts.map +1 -0
- package/esm/main.js +69 -0
- package/esm/package.json +3 -0
- package/esm/src/cli/commands/create.d.ts +2 -0
- package/esm/src/cli/commands/create.d.ts.map +1 -0
- package/esm/src/cli/commands/create.js +281 -0
- package/esm/src/cli/commands/deploy.d.ts +2 -0
- package/esm/src/cli/commands/deploy.d.ts.map +1 -0
- package/esm/src/cli/commands/deploy.js +251 -0
- package/esm/src/cli/commands/destroy.d.ts +2 -0
- package/esm/src/cli/commands/destroy.d.ts.map +1 -0
- package/esm/src/cli/commands/destroy.js +133 -0
- package/esm/src/cli/commands/doctor.d.ts +2 -0
- package/esm/src/cli/commands/doctor.d.ts.map +1 -0
- package/esm/src/cli/commands/doctor.js +141 -0
- package/esm/src/cli/commands/list.d.ts +2 -0
- package/esm/src/cli/commands/list.d.ts.map +1 -0
- package/esm/src/cli/commands/list.js +94 -0
- package/esm/src/cli/commands/status.d.ts +2 -0
- package/esm/src/cli/commands/status.d.ts.map +1 -0
- package/esm/src/cli/commands/status.js +148 -0
- package/esm/src/cli/mod.d.ts +13 -0
- package/esm/src/cli/mod.d.ts.map +1 -0
- package/esm/src/cli/mod.js +93 -0
- package/esm/src/credentials.d.ts +13 -0
- package/esm/src/credentials.d.ts.map +1 -0
- package/esm/src/credentials.js +72 -0
- package/esm/src/discovery.d.ts +32 -0
- package/esm/src/discovery.d.ts.map +1 -0
- package/esm/src/discovery.js +79 -0
- package/esm/src/docker/router/Dockerfile +43 -0
- package/esm/src/docker/router/fly.toml +15 -0
- package/esm/src/docker/router/start.sh +146 -0
- package/esm/src/guard.d.ts +33 -0
- package/esm/src/guard.d.ts.map +1 -0
- package/esm/src/guard.js +148 -0
- package/esm/src/providers/fly.d.ts +60 -0
- package/esm/src/providers/fly.d.ts.map +1 -0
- package/esm/src/providers/fly.js +384 -0
- package/esm/src/providers/tailscale.d.ts +31 -0
- package/esm/src/providers/tailscale.d.ts.map +1 -0
- package/esm/src/providers/tailscale.js +195 -0
- package/esm/src/resolve.d.ts +11 -0
- package/esm/src/resolve.d.ts.map +1 -0
- package/esm/src/resolve.js +36 -0
- package/esm/src/schemas/config.d.ts +5 -0
- package/esm/src/schemas/config.d.ts.map +1 -0
- package/esm/src/schemas/config.js +22 -0
- package/esm/src/schemas/fly.d.ts +172 -0
- package/esm/src/schemas/fly.d.ts.map +1 -0
- package/esm/src/schemas/fly.js +144 -0
- package/esm/src/schemas/tailscale.d.ts +65 -0
- package/esm/src/schemas/tailscale.d.ts.map +1 -0
- package/esm/src/schemas/tailscale.js +73 -0
- package/package.json +59 -0
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Create Command - Create Tailscale Subnet Router on Fly.io Custom Network
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import { parseArgs } from "../../../deps/jsr.io/@std/cli/1.0.27/mod.js";
|
|
5
|
+
import { bold, randomId, readSecret } from "../../../lib/cli.js";
|
|
6
|
+
import { createOutput } from "../../../lib/output.js";
|
|
7
|
+
import { registerCommand } from "../mod.js";
|
|
8
|
+
import { extractSubnet, getRouterTag } from "../../schemas/config.js";
|
|
9
|
+
import { createFlyProvider, getRouterAppName } from "../../providers/fly.js";
|
|
10
|
+
import { createTailscaleProvider, enableAcceptRoutes, isAcceptRoutesEnabled, isTailscaleInstalled, waitForDevice, } from "../../providers/tailscale.js";
|
|
11
|
+
import { getCredentialStore } from "../../credentials.js";
|
|
12
|
+
import { resolveOrg } from "../../resolve.js";
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Create Command
|
|
15
|
+
// =============================================================================
|
|
16
|
+
const create = async (argv) => {
|
|
17
|
+
const args = parseArgs(argv, {
|
|
18
|
+
string: ["org", "region", "api-key", "tag"],
|
|
19
|
+
boolean: ["help", "yes", "json", "self-approve"],
|
|
20
|
+
alias: { y: "yes" },
|
|
21
|
+
});
|
|
22
|
+
if (args.help) {
|
|
23
|
+
console.log(`
|
|
24
|
+
${bold("ambit create")} - Create Tailscale Subnet Router
|
|
25
|
+
|
|
26
|
+
${bold("USAGE")}
|
|
27
|
+
ambit create <network> [options]
|
|
28
|
+
|
|
29
|
+
${bold("OPTIONS")}
|
|
30
|
+
--org <org> Fly.io organization slug
|
|
31
|
+
--region <region> Fly.io region (default: iad)
|
|
32
|
+
--api-key <key> Tailscale API access token (tskey-api-...)
|
|
33
|
+
--tag <tag> Tailscale ACL tag for the router (default: tag:ambit-<network>)
|
|
34
|
+
--self-approve Approve subnet routes via API (when autoApprovers not configured)
|
|
35
|
+
-y, --yes Skip confirmation prompts
|
|
36
|
+
--json Output as JSON
|
|
37
|
+
|
|
38
|
+
${bold("DESCRIPTION")}
|
|
39
|
+
Deploys a Tailscale subnet router onto a Fly.io custom private network.
|
|
40
|
+
The network name becomes a TLD on your tailnet:
|
|
41
|
+
|
|
42
|
+
my-app.${args._[0] || "<network>"} resolves to my-app.flycast
|
|
43
|
+
|
|
44
|
+
${bold("EXAMPLES")}
|
|
45
|
+
ambit create browsers
|
|
46
|
+
ambit create browsers --org my-org --region sea
|
|
47
|
+
ambit create browsers --self-approve
|
|
48
|
+
`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const out = createOutput(args.json);
|
|
52
|
+
const network = args._[0];
|
|
53
|
+
if (!network) {
|
|
54
|
+
return out.die("Network Name Required. Usage: ambit create <network>");
|
|
55
|
+
}
|
|
56
|
+
const tag = args.tag || getRouterTag(network);
|
|
57
|
+
const selfApprove = args["self-approve"] ?? false;
|
|
58
|
+
out.blank()
|
|
59
|
+
.header("=".repeat(50))
|
|
60
|
+
.header(` ambit Create: ${network}`)
|
|
61
|
+
.header("=".repeat(50))
|
|
62
|
+
.blank();
|
|
63
|
+
// ==========================================================================
|
|
64
|
+
// Step 1: Fly.io Authentication
|
|
65
|
+
// ==========================================================================
|
|
66
|
+
out.header("Step 1: Fly.io Configuration").blank();
|
|
67
|
+
const fly = createFlyProvider();
|
|
68
|
+
await fly.ensureInstalled();
|
|
69
|
+
const email = await fly.ensureAuth({ interactive: !args.json });
|
|
70
|
+
out.ok(`Authenticated as ${email}`);
|
|
71
|
+
const org = await resolveOrg(fly, args, out);
|
|
72
|
+
const region = args.region || "iad";
|
|
73
|
+
out.ok(`Using Region: ${region}`).blank();
|
|
74
|
+
// ==========================================================================
|
|
75
|
+
// Step 2: Tailscale Configuration
|
|
76
|
+
// ==========================================================================
|
|
77
|
+
out.header("Step 2: Tailscale Configuration").blank();
|
|
78
|
+
const credentials = getCredentialStore();
|
|
79
|
+
let apiKey = args["api-key"] || (await credentials.getTailscaleApiKey());
|
|
80
|
+
if (!apiKey) {
|
|
81
|
+
if (args.json) {
|
|
82
|
+
return out.die("--api-key Is Required in JSON Mode");
|
|
83
|
+
}
|
|
84
|
+
out.dim("ambit needs an API access token (not an auth key) to manage your tailnet.")
|
|
85
|
+
.dim("Create one at: https://login.tailscale.com/admin/settings/keys")
|
|
86
|
+
.blank();
|
|
87
|
+
apiKey = await readSecret("API access token (tskey-api-...): ");
|
|
88
|
+
if (!apiKey) {
|
|
89
|
+
return out.die("Tailscale API Access Token Required");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!apiKey.startsWith("tskey-api-")) {
|
|
93
|
+
return out.die("Invalid Token Format. Expected 'tskey-api-...' (API access token, not auth key)");
|
|
94
|
+
}
|
|
95
|
+
const tailscale = createTailscaleProvider("-", apiKey);
|
|
96
|
+
const validateSpinner = out.spinner("Validating API Access Token");
|
|
97
|
+
const isValid = await tailscale.validateApiKey();
|
|
98
|
+
if (!isValid) {
|
|
99
|
+
validateSpinner.fail("Invalid API Access Token");
|
|
100
|
+
return out.die("Failed to Validate Tailscale API Access Token");
|
|
101
|
+
}
|
|
102
|
+
validateSpinner.success("API Access Token Validated");
|
|
103
|
+
await credentials.setTailscaleApiKey(apiKey);
|
|
104
|
+
// ==========================================================================
|
|
105
|
+
// Step 2.5: Check tagOwners
|
|
106
|
+
// ==========================================================================
|
|
107
|
+
const tagOwnerSpinner = out.spinner(`Checking tagOwners for ${tag}`);
|
|
108
|
+
const hasTagOwner = await tailscale.isTagOwnerConfigured(tag);
|
|
109
|
+
if (!hasTagOwner) {
|
|
110
|
+
tagOwnerSpinner.fail(`Tag ${tag} Not Configured in tagOwners`);
|
|
111
|
+
out.blank()
|
|
112
|
+
.text(` The tag ${tag} does not exist in your Tailscale ACL tagOwners.`)
|
|
113
|
+
.text(" Tailscale will reject auth keys for undefined tags.")
|
|
114
|
+
.blank()
|
|
115
|
+
.text(" Add this tag in your Tailscale ACL settings:")
|
|
116
|
+
.dim(" https://login.tailscale.com/admin/acls/visual/tags")
|
|
117
|
+
.blank()
|
|
118
|
+
.dim(` "tagOwners": { "${tag}": ["autogroup:admin"] }`)
|
|
119
|
+
.blank();
|
|
120
|
+
return out.die(`Add ${tag} to tagOwners Before Creating Router`);
|
|
121
|
+
}
|
|
122
|
+
tagOwnerSpinner.success(`Tag ${tag} Configured in tagOwners`);
|
|
123
|
+
// ==========================================================================
|
|
124
|
+
// Step 2.6: Check autoApprovers
|
|
125
|
+
// ==========================================================================
|
|
126
|
+
if (!selfApprove) {
|
|
127
|
+
const autoApproverSpinner = out.spinner("Checking autoApprovers Configuration");
|
|
128
|
+
const hasAutoApprover = await tailscale.isAutoApproverConfigured(tag);
|
|
129
|
+
if (!hasAutoApprover) {
|
|
130
|
+
autoApproverSpinner.fail("autoApprovers Not Configured");
|
|
131
|
+
out.blank()
|
|
132
|
+
.text(` The tag ${tag} is not listed in your Tailscale ACL autoApprovers.`)
|
|
133
|
+
.text(" Routes advertised by the router will not be auto-approved.")
|
|
134
|
+
.blank()
|
|
135
|
+
.text(" Either configure autoApprovers in your Tailscale ACL policy:")
|
|
136
|
+
.dim(` "autoApprovers": { "routes": { "fdaa:X:XXXX::/48": ["${tag}"] } }`)
|
|
137
|
+
.blank()
|
|
138
|
+
.text(" Or re-run with --self-approve to approve routes via API:")
|
|
139
|
+
.dim(` ambit create ${network} --self-approve`)
|
|
140
|
+
.blank();
|
|
141
|
+
return out.die("Configure autoApprovers or Use --self-approve");
|
|
142
|
+
}
|
|
143
|
+
autoApproverSpinner.success("autoApprovers Configured");
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
out.info("Self-Approve Mode: Routes Will Be Approved via API");
|
|
147
|
+
}
|
|
148
|
+
out.blank();
|
|
149
|
+
// ==========================================================================
|
|
150
|
+
// Step 3: Deploy Router on Custom 6PN
|
|
151
|
+
// ==========================================================================
|
|
152
|
+
out.header("Step 3: Deploy Subnet Router").blank();
|
|
153
|
+
const routerAppName = getRouterAppName(network, randomId(6));
|
|
154
|
+
out.info(`Creating Router App: ${routerAppName}`)
|
|
155
|
+
.info(`Custom Network: ${network}`)
|
|
156
|
+
.info(`Router Tag: ${tag}`);
|
|
157
|
+
await fly.createApp(routerAppName, org, { network });
|
|
158
|
+
out.ok(`Created App: ${routerAppName}`);
|
|
159
|
+
await fly.setSecrets(routerAppName, {
|
|
160
|
+
TAILSCALE_API_TOKEN: apiKey,
|
|
161
|
+
NETWORK_NAME: network,
|
|
162
|
+
TAILSCALE_TAGS: tag,
|
|
163
|
+
}, { stage: true });
|
|
164
|
+
out.ok("Set Router Secrets");
|
|
165
|
+
const dockerDir = new URL("../../docker/router", globalThis[Symbol.for("import-meta-ponyfill-esmodule")](import.meta).url).pathname;
|
|
166
|
+
out.blank().dim("Deploying Router...");
|
|
167
|
+
await fly.routerDeploy(routerAppName, dockerDir, { region });
|
|
168
|
+
out.ok("Router Deployed");
|
|
169
|
+
out.blank();
|
|
170
|
+
const joinSpinner = out.spinner("Waiting for Router to Join Tailnet");
|
|
171
|
+
const device = await waitForDevice(tailscale, routerAppName, 180000);
|
|
172
|
+
joinSpinner.success(`Router Joined Tailnet: ${device.addresses[0]}`);
|
|
173
|
+
const machines = await fly.listMachines(routerAppName);
|
|
174
|
+
const routerMachine = machines.find((m) => m.private_ip);
|
|
175
|
+
const subnet = routerMachine?.private_ip
|
|
176
|
+
? extractSubnet(routerMachine.private_ip)
|
|
177
|
+
: null;
|
|
178
|
+
if (subnet) {
|
|
179
|
+
out.ok(`Subnet: ${subnet}`);
|
|
180
|
+
}
|
|
181
|
+
if (selfApprove && subnet) {
|
|
182
|
+
const approveSpinner = out.spinner("Approving Subnet Routes via API");
|
|
183
|
+
await tailscale.approveSubnetRoutes(device.id, [subnet]);
|
|
184
|
+
approveSpinner.success("Subnet Routes Approved via API");
|
|
185
|
+
}
|
|
186
|
+
if (device.advertisedRoutes && device.advertisedRoutes.length > 0) {
|
|
187
|
+
out.ok(`Routes: ${device.advertisedRoutes.join(", ")}`);
|
|
188
|
+
}
|
|
189
|
+
const dnsSpinner = out.spinner("Configuring Split DNS");
|
|
190
|
+
await tailscale.setSplitDns(network, [device.addresses[0]]);
|
|
191
|
+
dnsSpinner.success(`Split DNS Configured: *.${network} -> Router`);
|
|
192
|
+
// ==========================================================================
|
|
193
|
+
// Step 4: Local Client Configuration
|
|
194
|
+
// ==========================================================================
|
|
195
|
+
out.blank().header("Step 4: Local Client Configuration").blank();
|
|
196
|
+
if (await isTailscaleInstalled()) {
|
|
197
|
+
if (await isAcceptRoutesEnabled()) {
|
|
198
|
+
out.ok("Accept Routes Already Enabled");
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const routeSpinner = out.spinner("Enabling Accept Routes");
|
|
202
|
+
if (await enableAcceptRoutes()) {
|
|
203
|
+
routeSpinner.success("Accept Routes Enabled");
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
routeSpinner.fail("Could Not Enable Accept Routes");
|
|
207
|
+
out.blank()
|
|
208
|
+
.dim("Run Manually with Elevated Permissions:")
|
|
209
|
+
.dim(" sudo tailscale set --accept-routes");
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
out.warn("Tailscale CLI Not Found")
|
|
215
|
+
.dim(" Ensure Accept-Routes Is Enabled on This Device");
|
|
216
|
+
}
|
|
217
|
+
// ==========================================================================
|
|
218
|
+
// Done
|
|
219
|
+
// ==========================================================================
|
|
220
|
+
out.done({
|
|
221
|
+
network,
|
|
222
|
+
router: { appName: routerAppName, tailscaleIp: device.addresses[0] },
|
|
223
|
+
subnet: subnet || "unknown",
|
|
224
|
+
tag,
|
|
225
|
+
});
|
|
226
|
+
out.blank()
|
|
227
|
+
.header("=".repeat(50))
|
|
228
|
+
.header(" Router Created!")
|
|
229
|
+
.header("=".repeat(50))
|
|
230
|
+
.blank()
|
|
231
|
+
.text(`Any Flycast app on the "${network}" network is reachable as:`)
|
|
232
|
+
.text(` <app-name>.${network}`)
|
|
233
|
+
.blank()
|
|
234
|
+
.text(`SOCKS5 proxy available at:`)
|
|
235
|
+
.text(` socks5://[${routerMachine?.private_ip ?? "ROUTER_IP"}]:1080`)
|
|
236
|
+
.dim("Containers on this network can use it to reach your tailnet.")
|
|
237
|
+
.blank()
|
|
238
|
+
.dim("Deploy an app to this network:")
|
|
239
|
+
.dim(` ambit deploy my-app --network ${network}`)
|
|
240
|
+
.blank()
|
|
241
|
+
.dim("Invite people to your tailnet:")
|
|
242
|
+
.dim(" https://login.tailscale.com/admin/users")
|
|
243
|
+
.dim("Control their access:")
|
|
244
|
+
.dim(" https://login.tailscale.com/admin/acls/visual/general-access-rules")
|
|
245
|
+
.blank();
|
|
246
|
+
// Print recommended ACL policy
|
|
247
|
+
if (subnet && selfApprove) {
|
|
248
|
+
out.header("Recommended Tailscale ACL Policy:")
|
|
249
|
+
.blank()
|
|
250
|
+
.dim(" Add these to your tailnet policy file at:")
|
|
251
|
+
.dim(" https://login.tailscale.com/admin/acls/file")
|
|
252
|
+
.blank()
|
|
253
|
+
.text(` "tagOwners": { "${tag}": ["autogroup:admin"] }`)
|
|
254
|
+
.text(` "autoApprovers": { "routes": { "${subnet}": ["${tag}"] } }`)
|
|
255
|
+
.blank()
|
|
256
|
+
.dim(" To restrict access, add ACL rules:")
|
|
257
|
+
.dim(` {"action": "accept", "src": ["group:YOUR_GROUP"], "dst": ["${tag}:53"]}`)
|
|
258
|
+
.dim(` {"action": "accept", "src": ["group:YOUR_GROUP"], "dst": ["${subnet}:*"]}`)
|
|
259
|
+
.blank();
|
|
260
|
+
}
|
|
261
|
+
else if (subnet) {
|
|
262
|
+
out.header("Recommended ACL Rules:")
|
|
263
|
+
.blank()
|
|
264
|
+
.dim(" To restrict access, add ACL rules to your policy file:")
|
|
265
|
+
.dim(" https://login.tailscale.com/admin/acls/file")
|
|
266
|
+
.blank()
|
|
267
|
+
.dim(` {"action": "accept", "src": ["group:YOUR_GROUP"], "dst": ["${tag}:53"]}`)
|
|
268
|
+
.dim(` {"action": "accept", "src": ["group:YOUR_GROUP"], "dst": ["${subnet}:*"]}`)
|
|
269
|
+
.blank();
|
|
270
|
+
}
|
|
271
|
+
out.print();
|
|
272
|
+
};
|
|
273
|
+
// =============================================================================
|
|
274
|
+
// Register Command
|
|
275
|
+
// =============================================================================
|
|
276
|
+
registerCommand({
|
|
277
|
+
name: "create",
|
|
278
|
+
description: "Create a Tailscale subnet router on a Fly.io custom network",
|
|
279
|
+
usage: "ambit create <network> [--org <org>] [--region <region>]",
|
|
280
|
+
run: create,
|
|
281
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/commands/deploy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Deploy Command - Safely Deploy a Workload App on a Custom Private Network
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import * as dntShim from "../../../_dnt.shims.js";
|
|
5
|
+
import { parseArgs } from "../../../deps/jsr.io/@std/cli/1.0.27/mod.js";
|
|
6
|
+
import { bold, confirm, fileExists } from "../../../lib/cli.js";
|
|
7
|
+
import { createOutput } from "../../../lib/output.js";
|
|
8
|
+
import { registerCommand } from "../mod.js";
|
|
9
|
+
import { createFlyProvider } from "../../providers/fly.js";
|
|
10
|
+
import { findRouterApp } from "../../discovery.js";
|
|
11
|
+
import { resolveOrg } from "../../resolve.js";
|
|
12
|
+
import { assertNotRouter, auditDeploy, scanFlyToml } from "../../guard.js";
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Deploy Command
|
|
15
|
+
// =============================================================================
|
|
16
|
+
const deploy = async (argv) => {
|
|
17
|
+
const args = parseArgs(argv, {
|
|
18
|
+
string: ["network", "org", "region", "image", "config"],
|
|
19
|
+
boolean: ["help", "yes", "json"],
|
|
20
|
+
alias: { y: "yes" },
|
|
21
|
+
});
|
|
22
|
+
if (args.help) {
|
|
23
|
+
console.log(`
|
|
24
|
+
${bold("ambit deploy")} - Deploy an App Safely on a Custom Private Network
|
|
25
|
+
|
|
26
|
+
${bold("USAGE")}
|
|
27
|
+
ambit deploy <app> --network <name> [options]
|
|
28
|
+
|
|
29
|
+
${bold("MODES")}
|
|
30
|
+
Config mode (default):
|
|
31
|
+
ambit deploy <app> --network <name> Uses ./fly.toml
|
|
32
|
+
ambit deploy <app> --network <name> --config path Explicit fly.toml
|
|
33
|
+
|
|
34
|
+
Image mode:
|
|
35
|
+
ambit deploy <app> --network <name> --image <img> Docker image, no toml
|
|
36
|
+
|
|
37
|
+
${bold("OPTIONS")}
|
|
38
|
+
--network <name> Custom 6PN network to target (required)
|
|
39
|
+
--org <org> Fly.io organization slug
|
|
40
|
+
--region <region> Primary deployment region
|
|
41
|
+
--image <img> Docker image (mutually exclusive with --config)
|
|
42
|
+
--config <path> fly.toml path (mutually exclusive with --image)
|
|
43
|
+
-y, --yes Skip confirmation prompts
|
|
44
|
+
--json Output as JSON
|
|
45
|
+
|
|
46
|
+
${bold("SAFETY")}
|
|
47
|
+
Always deploys with --no-public-ips and --flycast.
|
|
48
|
+
Post-deploy audit releases any public IPs and verifies Flycast allocation.
|
|
49
|
+
Pre-flight scan rejects fly.toml with force_https or TLS on 443.
|
|
50
|
+
|
|
51
|
+
${bold("EXAMPLES")}
|
|
52
|
+
ambit deploy my-app --network browsers
|
|
53
|
+
ambit deploy my-app --network browsers --image registry/img:latest
|
|
54
|
+
ambit deploy my-app --network browsers --config ./fly.toml --region sea
|
|
55
|
+
`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const out = createOutput(args.json);
|
|
59
|
+
// ==========================================================================
|
|
60
|
+
// Phase 0: Parse & Validate
|
|
61
|
+
// ==========================================================================
|
|
62
|
+
const app = args._[0];
|
|
63
|
+
if (!app) {
|
|
64
|
+
return out.die("App Name Required. Usage: ambit deploy <app> --network <name>");
|
|
65
|
+
}
|
|
66
|
+
if (!args.network) {
|
|
67
|
+
return out.die("--network Is Required");
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
assertNotRouter(app);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
return out.die(e.message);
|
|
74
|
+
}
|
|
75
|
+
if (args.image && args.config) {
|
|
76
|
+
return out.die("--image and --config Are Mutually Exclusive");
|
|
77
|
+
}
|
|
78
|
+
const network = args.network;
|
|
79
|
+
out.blank()
|
|
80
|
+
.header("=".repeat(50))
|
|
81
|
+
.header(` ambit Deploy: ${app}`)
|
|
82
|
+
.header("=".repeat(50))
|
|
83
|
+
.blank();
|
|
84
|
+
// ==========================================================================
|
|
85
|
+
// Phase 1: Auth & Org
|
|
86
|
+
// ==========================================================================
|
|
87
|
+
out.header("Step 1: Fly.io Configuration").blank();
|
|
88
|
+
const fly = createFlyProvider();
|
|
89
|
+
await fly.ensureInstalled();
|
|
90
|
+
const email = await fly.ensureAuth({ interactive: !args.json });
|
|
91
|
+
out.ok(`Authenticated as ${email}`);
|
|
92
|
+
const org = await resolveOrg(fly, args, out);
|
|
93
|
+
out.blank();
|
|
94
|
+
// ==========================================================================
|
|
95
|
+
// Phase 2: Network Verification
|
|
96
|
+
// ==========================================================================
|
|
97
|
+
out.header("Step 2: Network Verification").blank();
|
|
98
|
+
const routerSpinner = out.spinner("Checking for Router on Network");
|
|
99
|
+
const router = await findRouterApp(fly, org, network);
|
|
100
|
+
if (!router) {
|
|
101
|
+
routerSpinner.fail("No Router Found");
|
|
102
|
+
return out.die(`No ambit router found on network '${network}'. ` +
|
|
103
|
+
`Run 'ambit create ${network}' first.`);
|
|
104
|
+
}
|
|
105
|
+
routerSpinner.success(`Router Found: ${router.appName}`);
|
|
106
|
+
out.blank();
|
|
107
|
+
// ==========================================================================
|
|
108
|
+
// Phase 3: App Creation (if needed)
|
|
109
|
+
// ==========================================================================
|
|
110
|
+
out.header("Step 3: App Setup").blank();
|
|
111
|
+
let created = false;
|
|
112
|
+
const exists = await fly.appExists(app);
|
|
113
|
+
if (exists) {
|
|
114
|
+
out.ok(`App '${app}' Exists`);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
out.info(`App '${app}' Does Not Exist — Will Create on Network '${network}'`);
|
|
118
|
+
if (!args.yes && !args.json) {
|
|
119
|
+
const confirmed = await confirm(`Create app '${app}' on network '${network}'?`);
|
|
120
|
+
if (!confirmed) {
|
|
121
|
+
out.text("Cancelled.");
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
await fly.createApp(app, org, { network });
|
|
126
|
+
out.ok(`Created App '${app}' on Network '${network}'`);
|
|
127
|
+
created = true;
|
|
128
|
+
}
|
|
129
|
+
out.blank();
|
|
130
|
+
// ==========================================================================
|
|
131
|
+
// Phase 4: Pre-flight TOML Scan
|
|
132
|
+
// ==========================================================================
|
|
133
|
+
out.header("Step 4: Pre-flight Check").blank();
|
|
134
|
+
let preflight = { scanned: false, warnings: [] };
|
|
135
|
+
// Determine config path for config mode (not image mode)
|
|
136
|
+
let configPath = args.config;
|
|
137
|
+
if (!args.image) {
|
|
138
|
+
if (!configPath) {
|
|
139
|
+
// Auto-detect ./fly.toml
|
|
140
|
+
if (await fileExists("./fly.toml")) {
|
|
141
|
+
configPath = "./fly.toml";
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (configPath) {
|
|
145
|
+
if (!(await fileExists(configPath))) {
|
|
146
|
+
return out.die(`Config File Not Found: ${configPath}`);
|
|
147
|
+
}
|
|
148
|
+
const tomlContent = await dntShim.Deno.readTextFile(configPath);
|
|
149
|
+
const scan = scanFlyToml(tomlContent);
|
|
150
|
+
preflight = { scanned: scan.scanned, warnings: scan.warnings };
|
|
151
|
+
if (scan.errors.length > 0) {
|
|
152
|
+
for (const err of scan.errors) {
|
|
153
|
+
out.err(err);
|
|
154
|
+
}
|
|
155
|
+
return out.die("Pre-flight Check Failed. Fix fly.toml Before Deploying.");
|
|
156
|
+
}
|
|
157
|
+
for (const warn of scan.warnings) {
|
|
158
|
+
out.warn(warn);
|
|
159
|
+
}
|
|
160
|
+
out.ok(`Scanned ${configPath}`);
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
out.info("No fly.toml Found — Deploying Without Config Scan");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
out.info("Image Mode — Skipping TOML Scan");
|
|
168
|
+
}
|
|
169
|
+
out.blank();
|
|
170
|
+
// ==========================================================================
|
|
171
|
+
// Phase 5: Deploy with Enforced Flags
|
|
172
|
+
// ==========================================================================
|
|
173
|
+
out.header("Step 5: Deploy").blank();
|
|
174
|
+
out.dim("Deploying with --no-public-ips --flycast ...");
|
|
175
|
+
await fly.deploySafe(app, {
|
|
176
|
+
image: args.image,
|
|
177
|
+
config: configPath,
|
|
178
|
+
region: args.region,
|
|
179
|
+
});
|
|
180
|
+
out.ok("Deploy Succeeded");
|
|
181
|
+
out.blank();
|
|
182
|
+
// ==========================================================================
|
|
183
|
+
// Phase 6: Post-flight Audit
|
|
184
|
+
// ==========================================================================
|
|
185
|
+
out.header("Step 6: Post-flight Audit").blank();
|
|
186
|
+
const auditSpinner = out.spinner("Auditing Deployment");
|
|
187
|
+
const audit = await auditDeploy(fly, app, network);
|
|
188
|
+
auditSpinner.success("Audit Complete");
|
|
189
|
+
if (audit.public_ips_released > 0) {
|
|
190
|
+
out.warn(`Released ${audit.public_ips_released} Public IP(s)`);
|
|
191
|
+
}
|
|
192
|
+
if (audit.certs_removed > 0) {
|
|
193
|
+
out.ok(`Removed ${audit.certs_removed} Public Certificate(s)`);
|
|
194
|
+
}
|
|
195
|
+
for (const alloc of audit.flycast_allocations) {
|
|
196
|
+
out.ok(`Flycast: ${alloc.address} (network: ${alloc.network})`);
|
|
197
|
+
}
|
|
198
|
+
for (const warn of audit.warnings) {
|
|
199
|
+
out.warn(warn);
|
|
200
|
+
}
|
|
201
|
+
// ==========================================================================
|
|
202
|
+
// Phase 7: Result
|
|
203
|
+
// ==========================================================================
|
|
204
|
+
const hasIssues = audit.public_ips_released > 0 || audit.warnings.length > 0;
|
|
205
|
+
if (hasIssues) {
|
|
206
|
+
out.fail("Deploy Completed with Issues", {
|
|
207
|
+
app,
|
|
208
|
+
network,
|
|
209
|
+
created,
|
|
210
|
+
audit: {
|
|
211
|
+
public_ips_released: audit.public_ips_released,
|
|
212
|
+
certs_removed: audit.certs_removed,
|
|
213
|
+
flycast_allocations: audit.flycast_allocations,
|
|
214
|
+
warnings: audit.warnings,
|
|
215
|
+
},
|
|
216
|
+
preflight,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
out.done({
|
|
221
|
+
app,
|
|
222
|
+
network,
|
|
223
|
+
created,
|
|
224
|
+
audit: {
|
|
225
|
+
public_ips_released: audit.public_ips_released,
|
|
226
|
+
certs_removed: audit.certs_removed,
|
|
227
|
+
flycast_allocations: audit.flycast_allocations,
|
|
228
|
+
warnings: audit.warnings,
|
|
229
|
+
},
|
|
230
|
+
preflight,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
out.blank()
|
|
234
|
+
.header("=".repeat(50))
|
|
235
|
+
.header(hasIssues ? " Deploy Completed (with warnings)" : " Deploy Completed!")
|
|
236
|
+
.header("=".repeat(50))
|
|
237
|
+
.blank()
|
|
238
|
+
.text(`App '${app}' Is Reachable from Your Tailnet as:`)
|
|
239
|
+
.text(` ${app}.${network}`)
|
|
240
|
+
.blank();
|
|
241
|
+
out.print();
|
|
242
|
+
};
|
|
243
|
+
// =============================================================================
|
|
244
|
+
// Register Command
|
|
245
|
+
// =============================================================================
|
|
246
|
+
registerCommand({
|
|
247
|
+
name: "deploy",
|
|
248
|
+
description: "Deploy an app safely on a custom private network",
|
|
249
|
+
usage: "ambit deploy <app> --network <name> [--image <img>] [--org <org>] [--region <region>]",
|
|
250
|
+
run: deploy,
|
|
251
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../../../src/src/cli/commands/destroy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// Destroy Command - Tear Down Router and Clean Up
|
|
3
|
+
// =============================================================================
|
|
4
|
+
import { parseArgs } from "../../../deps/jsr.io/@std/cli/1.0.27/mod.js";
|
|
5
|
+
import { bold, confirm } from "../../../lib/cli.js";
|
|
6
|
+
import { createOutput } from "../../../lib/output.js";
|
|
7
|
+
import { registerCommand } from "../mod.js";
|
|
8
|
+
import { createFlyProvider } from "../../providers/fly.js";
|
|
9
|
+
import { requireTailscaleProvider } from "../../credentials.js";
|
|
10
|
+
import { findRouterApp } from "../../discovery.js";
|
|
11
|
+
import { resolveOrg } from "../../resolve.js";
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Destroy Command
|
|
14
|
+
// =============================================================================
|
|
15
|
+
const destroy = async (argv) => {
|
|
16
|
+
const args = parseArgs(argv, {
|
|
17
|
+
string: ["network", "org"],
|
|
18
|
+
boolean: ["help", "yes", "json"],
|
|
19
|
+
alias: { y: "yes" },
|
|
20
|
+
});
|
|
21
|
+
if (args.help) {
|
|
22
|
+
console.log(`
|
|
23
|
+
${bold("ambit destroy")} - Tear Down Router
|
|
24
|
+
|
|
25
|
+
${bold("USAGE")}
|
|
26
|
+
ambit destroy --network <name> [--org <org>] [--yes] [--json]
|
|
27
|
+
|
|
28
|
+
${bold("OPTIONS")}
|
|
29
|
+
--network <name> Network of the router to destroy (required)
|
|
30
|
+
--org <org> Fly.io organization slug
|
|
31
|
+
-y, --yes Skip confirmation prompts
|
|
32
|
+
--json Output as JSON
|
|
33
|
+
`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const out = createOutput(args.json);
|
|
37
|
+
if (!args.network) {
|
|
38
|
+
return out.die("--network Is Required");
|
|
39
|
+
}
|
|
40
|
+
const fly = createFlyProvider();
|
|
41
|
+
await fly.ensureInstalled();
|
|
42
|
+
await fly.ensureAuth({ interactive: !args.json });
|
|
43
|
+
const tailscale = await requireTailscaleProvider(out);
|
|
44
|
+
const org = await resolveOrg(fly, args, out);
|
|
45
|
+
// 1. Find the router app
|
|
46
|
+
const spinner = out.spinner("Discovering Router");
|
|
47
|
+
const app = await findRouterApp(fly, org, args.network);
|
|
48
|
+
if (!app) {
|
|
49
|
+
spinner.fail("Router Not Found");
|
|
50
|
+
return out.die(`No Router Found for Network '${args.network}'`);
|
|
51
|
+
}
|
|
52
|
+
spinner.success(`Found Router: ${app.appName}`);
|
|
53
|
+
// Get tailscale device to read the actual tag
|
|
54
|
+
let tsDevice = null;
|
|
55
|
+
try {
|
|
56
|
+
tsDevice = await tailscale.getDeviceByHostname(app.appName);
|
|
57
|
+
}
|
|
58
|
+
catch { /* device may not exist */ }
|
|
59
|
+
const tag = tsDevice?.tags?.[0] ?? null;
|
|
60
|
+
out.blank()
|
|
61
|
+
.header("ambit Destroy")
|
|
62
|
+
.blank()
|
|
63
|
+
.text(` Network: ${app.network}`)
|
|
64
|
+
.text(` Router App: ${app.appName}`)
|
|
65
|
+
.text(` Tag: ${tag ?? "unknown"}`)
|
|
66
|
+
.blank();
|
|
67
|
+
if (!args.yes && !args.json) {
|
|
68
|
+
const confirmed = await confirm("Destroy this router?");
|
|
69
|
+
if (!confirmed) {
|
|
70
|
+
out.text("Cancelled.");
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
out.blank();
|
|
74
|
+
}
|
|
75
|
+
// 2. Clean up tailscale
|
|
76
|
+
const dnsSpinner = out.spinner("Clearing Split DNS");
|
|
77
|
+
try {
|
|
78
|
+
await tailscale.clearSplitDns(app.network);
|
|
79
|
+
dnsSpinner.success("Split DNS Cleared");
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
dnsSpinner.fail("Split DNS Already Cleared");
|
|
83
|
+
}
|
|
84
|
+
const deviceSpinner = out.spinner("Removing Tailscale Device");
|
|
85
|
+
try {
|
|
86
|
+
const device = await tailscale.getDeviceByHostname(app.appName);
|
|
87
|
+
if (device) {
|
|
88
|
+
await tailscale.deleteDevice(device.id);
|
|
89
|
+
deviceSpinner.success("Tailscale Device Removed");
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
deviceSpinner.success("Tailscale Device Not Found (Already Removed)");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
deviceSpinner.fail("Could Not Remove Tailscale Device");
|
|
97
|
+
}
|
|
98
|
+
// 3. Destroy Fly app
|
|
99
|
+
const appSpinner = out.spinner("Destroying Fly App");
|
|
100
|
+
try {
|
|
101
|
+
await fly.deleteApp(app.appName);
|
|
102
|
+
appSpinner.success("Fly App Destroyed");
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
appSpinner.fail("Could Not Destroy Fly App");
|
|
106
|
+
}
|
|
107
|
+
out.done({ destroyed: true, appName: app.appName });
|
|
108
|
+
out.ok("Router Destroyed");
|
|
109
|
+
if (tag) {
|
|
110
|
+
out.blank()
|
|
111
|
+
.dim("If you added ACL policy entries for this router, remember to remove:")
|
|
112
|
+
.dim(` tagOwners: ${tag}`)
|
|
113
|
+
.dim(` autoApprovers: routes for ${tag}`)
|
|
114
|
+
.dim(` acls: rules referencing ${tag}`)
|
|
115
|
+
.blank();
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
out.blank()
|
|
119
|
+
.dim("If you added ACL policy entries for this router, remember to remove")
|
|
120
|
+
.dim("the associated tag from tagOwners, autoApprovers, and acls.")
|
|
121
|
+
.blank();
|
|
122
|
+
}
|
|
123
|
+
out.print();
|
|
124
|
+
};
|
|
125
|
+
// =============================================================================
|
|
126
|
+
// Register Command
|
|
127
|
+
// =============================================================================
|
|
128
|
+
registerCommand({
|
|
129
|
+
name: "destroy",
|
|
130
|
+
description: "Tear down the router, clean up DNS and tailnet device",
|
|
131
|
+
usage: "ambit destroy --network <name> [--org <org>] [--yes] [--json]",
|
|
132
|
+
run: destroy,
|
|
133
|
+
});
|