@synteq/cli 0.1.5 → 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/bin/run.js +61 -2
- package/dist/api/client.d.ts +29 -37
- package/dist/api/client.js +42 -49
- package/dist/api/client.js.map +1 -1
- package/dist/api/factory.d.ts +3 -0
- package/dist/api/factory.js +1 -1
- package/dist/api/factory.js.map +1 -1
- package/dist/api/types.d.ts +14 -23
- package/dist/auth/scope.d.ts +19 -0
- package/dist/auth/scope.js +65 -0
- package/dist/auth/scope.js.map +1 -0
- package/dist/base/command.d.ts +1 -1
- package/dist/base/command.js +49 -0
- package/dist/base/command.js.map +1 -1
- package/dist/commands/account/index.d.ts +1 -0
- package/dist/commands/account/index.js +1 -0
- package/dist/commands/account/index.js.map +1 -1
- package/dist/commands/account/show.d.ts +1 -0
- package/dist/commands/account/show.js +1 -0
- package/dist/commands/account/show.js.map +1 -1
- package/dist/commands/api.d.ts +1 -0
- package/dist/commands/api.js +5 -4
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/catalog.d.ts +1 -0
- package/dist/commands/catalog.js +6 -1
- package/dist/commands/catalog.js.map +1 -1
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.js +1 -0
- package/dist/commands/config/index.js.map +1 -1
- package/dist/commands/config/set-api-url.d.ts +1 -0
- package/dist/commands/config/set-api-url.js +38 -2
- package/dist/commands/config/set-api-url.js.map +1 -1
- package/dist/commands/config/show.d.ts +1 -0
- package/dist/commands/config/show.js +1 -0
- package/dist/commands/config/show.js.map +1 -1
- package/dist/commands/credits/add.d.ts +1 -0
- package/dist/commands/credits/add.js +1 -0
- package/dist/commands/credits/add.js.map +1 -1
- package/dist/commands/credits/index.d.ts +1 -0
- package/dist/commands/credits/index.js +1 -0
- package/dist/commands/credits/index.js.map +1 -1
- package/dist/commands/credits/list.d.ts +1 -0
- package/dist/commands/credits/list.js +1 -0
- package/dist/commands/credits/list.js.map +1 -1
- package/dist/commands/gpu/activity.d.ts +2 -0
- package/dist/commands/gpu/activity.js +7 -0
- package/dist/commands/gpu/activity.js.map +1 -1
- package/dist/commands/gpu/bandwidth.d.ts +2 -0
- package/dist/commands/gpu/bandwidth.js +5 -0
- package/dist/commands/gpu/bandwidth.js.map +1 -1
- package/dist/commands/gpu/boot-order.d.ts +2 -0
- package/dist/commands/gpu/boot-order.js +6 -0
- package/dist/commands/gpu/boot-order.js.map +1 -1
- package/dist/commands/gpu/console.d.ts +2 -0
- package/dist/commands/gpu/console.js +6 -0
- package/dist/commands/gpu/console.js.map +1 -1
- package/dist/commands/gpu/details.d.ts +3 -0
- package/dist/commands/gpu/details.js +10 -0
- package/dist/commands/gpu/details.js.map +1 -1
- package/dist/commands/gpu/index.d.ts +1 -0
- package/dist/commands/gpu/index.js +1 -0
- package/dist/commands/gpu/index.js.map +1 -1
- package/dist/commands/gpu/ip/add.d.ts +2 -0
- package/dist/commands/gpu/ip/add.js +7 -0
- package/dist/commands/gpu/ip/add.js.map +1 -1
- package/dist/commands/gpu/ip/list.d.ts +2 -0
- package/dist/commands/gpu/ip/list.js +5 -0
- package/dist/commands/gpu/ip/list.js.map +1 -1
- package/dist/commands/gpu/list.d.ts +1 -0
- package/dist/commands/gpu/list.js +1 -0
- package/dist/commands/gpu/list.js.map +1 -1
- package/dist/commands/gpu/order.d.ts +1 -0
- package/dist/commands/gpu/order.js +3 -0
- package/dist/commands/gpu/order.js.map +1 -1
- package/dist/commands/gpu/power.d.ts +2 -0
- package/dist/commands/gpu/power.js +7 -0
- package/dist/commands/gpu/power.js.map +1 -1
- package/dist/commands/gpu/reinstall.d.ts +2 -0
- package/dist/commands/gpu/reinstall.js +8 -0
- package/dist/commands/gpu/reinstall.js.map +1 -1
- package/dist/commands/gpu/resize.d.ts +2 -0
- package/dist/commands/gpu/resize.js +7 -0
- package/dist/commands/gpu/resize.js.map +1 -1
- package/dist/commands/gpu/stats.d.ts +2 -0
- package/dist/commands/gpu/stats.js +6 -0
- package/dist/commands/gpu/stats.js.map +1 -1
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.js +5 -0
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/instant-metal/activity.d.ts +2 -0
- package/dist/commands/instant-metal/activity.js +7 -0
- package/dist/commands/instant-metal/activity.js.map +1 -1
- package/dist/commands/instant-metal/bandwidth.d.ts +2 -0
- package/dist/commands/instant-metal/bandwidth.js +5 -0
- package/dist/commands/instant-metal/bandwidth.js.map +1 -1
- package/dist/commands/instant-metal/boot-order.d.ts +2 -0
- package/dist/commands/instant-metal/boot-order.js +6 -0
- package/dist/commands/instant-metal/boot-order.js.map +1 -1
- package/dist/commands/instant-metal/console.d.ts +2 -0
- package/dist/commands/instant-metal/console.js +6 -0
- package/dist/commands/instant-metal/console.js.map +1 -1
- package/dist/commands/instant-metal/details.d.ts +3 -0
- package/dist/commands/instant-metal/details.js +10 -0
- package/dist/commands/instant-metal/details.js.map +1 -1
- package/dist/commands/instant-metal/index.d.ts +1 -0
- package/dist/commands/instant-metal/index.js +1 -0
- package/dist/commands/instant-metal/index.js.map +1 -1
- package/dist/commands/instant-metal/ip/add.d.ts +2 -0
- package/dist/commands/instant-metal/ip/add.js +7 -0
- package/dist/commands/instant-metal/ip/add.js.map +1 -1
- package/dist/commands/instant-metal/ip/list.d.ts +2 -0
- package/dist/commands/instant-metal/ip/list.js +5 -0
- package/dist/commands/instant-metal/ip/list.js.map +1 -1
- package/dist/commands/instant-metal/list.d.ts +1 -0
- package/dist/commands/instant-metal/list.js +1 -0
- package/dist/commands/instant-metal/list.js.map +1 -1
- package/dist/commands/instant-metal/order.d.ts +1 -0
- package/dist/commands/instant-metal/order.js +3 -0
- package/dist/commands/instant-metal/order.js.map +1 -1
- package/dist/commands/instant-metal/power.d.ts +2 -0
- package/dist/commands/instant-metal/power.js +7 -0
- package/dist/commands/instant-metal/power.js.map +1 -1
- package/dist/commands/instant-metal/reinstall.d.ts +2 -0
- package/dist/commands/instant-metal/reinstall.js +8 -0
- package/dist/commands/instant-metal/reinstall.js.map +1 -1
- package/dist/commands/instant-metal/resize.d.ts +2 -0
- package/dist/commands/instant-metal/resize.js +7 -0
- package/dist/commands/instant-metal/resize.js.map +1 -1
- package/dist/commands/instant-metal/stats.d.ts +2 -0
- package/dist/commands/instant-metal/stats.js +6 -0
- package/dist/commands/instant-metal/stats.js.map +1 -1
- package/dist/commands/login.d.ts +1 -0
- package/dist/commands/login.js +1 -0
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +1 -0
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/order/gpu.d.ts +1 -0
- package/dist/commands/order/gpu.js +3 -0
- package/dist/commands/order/gpu.js.map +1 -1
- package/dist/commands/order/instant-metal.d.ts +1 -0
- package/dist/commands/order/instant-metal.js +3 -0
- package/dist/commands/order/instant-metal.js.map +1 -1
- package/dist/commands/order/storage.d.ts +1 -0
- package/dist/commands/order/storage.js +2 -1
- package/dist/commands/order/storage.js.map +1 -1
- package/dist/commands/order/vps.d.ts +1 -0
- package/dist/commands/order/vps.js +3 -0
- package/dist/commands/order/vps.js.map +1 -1
- package/dist/commands/order.d.ts +1 -0
- package/dist/commands/order.js +1 -0
- package/dist/commands/order.js.map +1 -1
- package/dist/commands/os-images.d.ts +1 -0
- package/dist/commands/os-images.js +4 -1
- package/dist/commands/os-images.js.map +1 -1
- package/dist/commands/payments/index.d.ts +1 -0
- package/dist/commands/payments/index.js +1 -0
- package/dist/commands/payments/index.js.map +1 -1
- package/dist/commands/payments/methods/add.d.ts +1 -0
- package/dist/commands/payments/methods/add.js +1 -0
- package/dist/commands/payments/methods/add.js.map +1 -1
- package/dist/commands/payments/methods/delete.d.ts +1 -0
- package/dist/commands/payments/methods/delete.js +1 -0
- package/dist/commands/payments/methods/delete.js.map +1 -1
- package/dist/commands/payments/methods/index.d.ts +1 -0
- package/dist/commands/payments/methods/index.js +1 -0
- package/dist/commands/payments/methods/index.js.map +1 -1
- package/dist/commands/payments/methods/list.d.ts +1 -0
- package/dist/commands/payments/methods/list.js +1 -0
- package/dist/commands/payments/methods/list.js.map +1 -1
- package/dist/commands/payments/methods/set-default.d.ts +1 -0
- package/dist/commands/payments/methods/set-default.js +1 -0
- package/dist/commands/payments/methods/set-default.js.map +1 -1
- package/dist/commands/projects/index.d.ts +1 -0
- package/dist/commands/projects/index.js +1 -0
- package/dist/commands/projects/index.js.map +1 -1
- package/dist/commands/projects/list.d.ts +1 -0
- package/dist/commands/projects/list.js +1 -0
- package/dist/commands/projects/list.js.map +1 -1
- package/dist/commands/resources.d.ts +1 -0
- package/dist/commands/resources.js +33 -21
- package/dist/commands/resources.js.map +1 -1
- package/dist/commands/settings/index.d.ts +1 -0
- package/dist/commands/settings/index.js +1 -0
- package/dist/commands/settings/index.js.map +1 -1
- package/dist/commands/settings/render-mode.d.ts +1 -0
- package/dist/commands/settings/render-mode.js +1 -0
- package/dist/commands/settings/render-mode.js.map +1 -1
- package/dist/commands/ssh-key/add.d.ts +1 -0
- package/dist/commands/ssh-key/add.js +1 -0
- package/dist/commands/ssh-key/add.js.map +1 -1
- package/dist/commands/ssh-key/delete.d.ts +1 -0
- package/dist/commands/ssh-key/delete.js +1 -0
- package/dist/commands/ssh-key/delete.js.map +1 -1
- package/dist/commands/ssh-key/list.d.ts +1 -0
- package/dist/commands/ssh-key/list.js +1 -0
- package/dist/commands/ssh-key/list.js.map +1 -1
- package/dist/commands/storage/attach.d.ts +2 -1
- package/dist/commands/storage/attach.js +12 -11
- package/dist/commands/storage/attach.js.map +1 -1
- package/dist/commands/storage/detach.d.ts +1 -0
- package/dist/commands/storage/detach.js +3 -2
- package/dist/commands/storage/detach.js.map +1 -1
- package/dist/commands/storage/list.d.ts +1 -0
- package/dist/commands/storage/list.js +2 -1
- package/dist/commands/storage/list.js.map +1 -1
- package/dist/commands/storage/order.d.ts +2 -1
- package/dist/commands/storage/order.js +11 -10
- package/dist/commands/storage/order.js.map +1 -1
- package/dist/commands/storage/resize.d.ts +1 -0
- package/dist/commands/storage/resize.js +1 -0
- package/dist/commands/storage/resize.js.map +1 -1
- package/dist/commands/team/details.d.ts +1 -0
- package/dist/commands/team/details.js +1 -0
- package/dist/commands/team/details.js.map +1 -1
- package/dist/commands/team/invite.d.ts +1 -0
- package/dist/commands/team/invite.js +1 -0
- package/dist/commands/team/invite.js.map +1 -1
- package/dist/commands/team.d.ts +1 -0
- package/dist/commands/team.js +1 -0
- package/dist/commands/team.js.map +1 -1
- package/dist/commands/tickets/close.d.ts +1 -0
- package/dist/commands/tickets/close.js +1 -0
- package/dist/commands/tickets/close.js.map +1 -1
- package/dist/commands/tickets/create.d.ts +1 -0
- package/dist/commands/tickets/create.js +1 -0
- package/dist/commands/tickets/create.js.map +1 -1
- package/dist/commands/tickets/departments.d.ts +1 -0
- package/dist/commands/tickets/departments.js +1 -0
- package/dist/commands/tickets/departments.js.map +1 -1
- package/dist/commands/tickets/list.d.ts +1 -0
- package/dist/commands/tickets/list.js +1 -0
- package/dist/commands/tickets/list.js.map +1 -1
- package/dist/commands/tickets/open.d.ts +1 -0
- package/dist/commands/tickets/open.js +1 -0
- package/dist/commands/tickets/open.js.map +1 -1
- package/dist/commands/tickets/reopen.d.ts +11 -0
- package/dist/commands/tickets/reopen.js +34 -0
- package/dist/commands/tickets/reopen.js.map +1 -0
- package/dist/commands/tickets/reply.d.ts +1 -0
- package/dist/commands/tickets/reply.js +1 -0
- package/dist/commands/tickets/reply.js.map +1 -1
- package/dist/commands/transit.d.ts +1 -0
- package/dist/commands/transit.js +1 -0
- package/dist/commands/transit.js.map +1 -1
- package/dist/commands/tui/index.d.ts +1 -0
- package/dist/commands/tui/index.js +21 -0
- package/dist/commands/tui/index.js.map +1 -1
- package/dist/commands/vds/activity.d.ts +2 -0
- package/dist/commands/vds/activity.js +7 -0
- package/dist/commands/vds/activity.js.map +1 -1
- package/dist/commands/vds/bandwidth.d.ts +2 -0
- package/dist/commands/vds/bandwidth.js +5 -0
- package/dist/commands/vds/bandwidth.js.map +1 -1
- package/dist/commands/vds/boot-order.d.ts +2 -0
- package/dist/commands/vds/boot-order.js +6 -0
- package/dist/commands/vds/boot-order.js.map +1 -1
- package/dist/commands/vds/console.d.ts +2 -0
- package/dist/commands/vds/console.js +6 -0
- package/dist/commands/vds/console.js.map +1 -1
- package/dist/commands/vds/details.d.ts +3 -0
- package/dist/commands/vds/details.js +10 -0
- package/dist/commands/vds/details.js.map +1 -1
- package/dist/commands/vds/index.d.ts +1 -0
- package/dist/commands/vds/index.js +1 -0
- package/dist/commands/vds/index.js.map +1 -1
- package/dist/commands/vds/ip/add.d.ts +2 -0
- package/dist/commands/vds/ip/add.js +7 -0
- package/dist/commands/vds/ip/add.js.map +1 -1
- package/dist/commands/vds/ip/list.d.ts +2 -0
- package/dist/commands/vds/ip/list.js +5 -0
- package/dist/commands/vds/ip/list.js.map +1 -1
- package/dist/commands/vds/list.d.ts +1 -0
- package/dist/commands/vds/list.js +1 -0
- package/dist/commands/vds/list.js.map +1 -1
- package/dist/commands/vds/order.d.ts +2 -0
- package/dist/commands/vds/order.js +12 -3
- package/dist/commands/vds/order.js.map +1 -1
- package/dist/commands/vds/power.d.ts +2 -0
- package/dist/commands/vds/power.js +7 -0
- package/dist/commands/vds/power.js.map +1 -1
- package/dist/commands/vds/reinstall.d.ts +2 -0
- package/dist/commands/vds/reinstall.js +8 -0
- package/dist/commands/vds/reinstall.js.map +1 -1
- package/dist/commands/vds/resize.d.ts +2 -0
- package/dist/commands/vds/resize.js +7 -0
- package/dist/commands/vds/resize.js.map +1 -1
- package/dist/commands/vds/stats.d.ts +2 -0
- package/dist/commands/vds/stats.js +6 -0
- package/dist/commands/vds/stats.js.map +1 -1
- package/dist/commands/vps/activity.d.ts +1 -0
- package/dist/commands/vps/activity.js +5 -4
- package/dist/commands/vps/activity.js.map +1 -1
- package/dist/commands/vps/bandwidth.d.ts +1 -0
- package/dist/commands/vps/bandwidth.js +6 -5
- package/dist/commands/vps/bandwidth.js.map +1 -1
- package/dist/commands/vps/boot-order.d.ts +1 -0
- package/dist/commands/vps/boot-order.js +6 -5
- package/dist/commands/vps/boot-order.js.map +1 -1
- package/dist/commands/vps/console.d.ts +1 -0
- package/dist/commands/vps/console.js +10 -9
- package/dist/commands/vps/console.js.map +1 -1
- package/dist/commands/vps/details.d.ts +5 -0
- package/dist/commands/vps/details.js +21 -9
- package/dist/commands/vps/details.js.map +1 -1
- package/dist/commands/vps/ip/add.d.ts +1 -0
- package/dist/commands/vps/ip/add.js +11 -9
- package/dist/commands/vps/ip/add.js.map +1 -1
- package/dist/commands/vps/ip/list.d.ts +1 -0
- package/dist/commands/vps/ip/list.js +7 -6
- package/dist/commands/vps/ip/list.js.map +1 -1
- package/dist/commands/vps/list.d.ts +1 -0
- package/dist/commands/vps/list.js +5 -4
- package/dist/commands/vps/list.js.map +1 -1
- package/dist/commands/vps/order.d.ts +4 -2
- package/dist/commands/vps/order.js +26 -16
- package/dist/commands/vps/order.js.map +1 -1
- package/dist/commands/vps/power.d.ts +1 -0
- package/dist/commands/vps/power.js +15 -13
- package/dist/commands/vps/power.js.map +1 -1
- package/dist/commands/vps/reinstall.d.ts +1 -0
- package/dist/commands/vps/reinstall.js +15 -14
- package/dist/commands/vps/reinstall.js.map +1 -1
- package/dist/commands/vps/resize.d.ts +1 -0
- package/dist/commands/vps/resize.js +11 -9
- package/dist/commands/vps/resize.js.map +1 -1
- package/dist/commands/vps/stats.d.ts +1 -0
- package/dist/commands/vps/stats.js +8 -7
- package/dist/commands/vps/stats.js.map +1 -1
- package/dist/commands/whoami.d.ts +1 -0
- package/dist/commands/whoami.js +1 -0
- package/dist/commands/whoami.js.map +1 -1
- package/dist/help/help-filter.d.ts +10 -0
- package/dist/help/help-filter.js +9 -0
- package/dist/help/help-filter.js.map +1 -0
- package/dist/help/scope-aware-help.d.ts +30 -0
- package/dist/help/scope-aware-help.js +71 -0
- package/dist/help/scope-aware-help.js.map +1 -0
- package/dist/help.js +0 -1
- package/dist/help.js.map +1 -1
- package/dist/tui/App.js +1 -1
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/NumberInput.js +1 -1
- package/dist/tui/components/Sparkline.js +1 -1
- package/dist/tui/screens/Billing.js +10 -10
- package/dist/tui/screens/Billing.js.map +1 -1
- package/dist/tui/screens/Dashboard.js +1 -1
- package/dist/tui/screens/Dashboard.js.map +1 -1
- package/dist/tui/screens/Order.js +328 -99
- package/dist/tui/screens/Order.js.map +1 -1
- package/dist/tui/screens/Resources.js +35 -64
- package/dist/tui/screens/Resources.js.map +1 -1
- package/dist/tui/screens/Tickets.js +31 -22
- package/dist/tui/screens/Tickets.js.map +1 -1
- package/dist/ui/image-resolve.js +1 -1
- package/dist/ui/image-resolve.js.map +1 -1
- package/dist/ui/payment.d.ts +1 -1
- package/dist/ui/resource-detail.d.ts +3 -0
- package/dist/ui/{vps-detail.js → resource-detail.js} +8 -8
- package/dist/ui/resource-detail.js.map +1 -0
- package/dist/ui/resource-resolve.d.ts +4 -0
- package/dist/ui/resource-resolve.js +24 -0
- package/dist/ui/resource-resolve.js.map +1 -0
- package/dist/ui/wait.d.ts +1 -1
- package/dist/ui/wait.js +4 -4
- package/dist/ui/wait.js.map +1 -1
- package/dist/version-check-bin.d.ts +35 -0
- package/dist/version-check-bin.js +123 -0
- package/dist/version-check-bin.js.map +1 -0
- package/dist/version-check.d.ts +39 -0
- package/dist/version-check.js +148 -0
- package/dist/version-check.js.map +1 -0
- package/package.json +11 -6
- package/dist/commands/bare-metal/index.d.ts +0 -4
- package/dist/commands/bare-metal/index.js +0 -5
- package/dist/commands/bare-metal/index.js.map +0 -1
- package/dist/commands/bare-metal/list.d.ts +0 -9
- package/dist/commands/bare-metal/list.js +0 -38
- package/dist/commands/bare-metal/list.js.map +0 -1
- package/dist/commands/bare-metal/order.d.ts +0 -6
- package/dist/commands/bare-metal/order.js +0 -27
- package/dist/commands/bare-metal/order.js.map +0 -1
- package/dist/ui/vps-detail.d.ts +0 -3
- package/dist/ui/vps-detail.js.map +0 -1
- package/dist/ui/vps-resolve.d.ts +0 -4
- package/dist/ui/vps-resolve.js +0 -24
- package/dist/ui/vps-resolve.js.map +0 -1
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Shared shim consumed by bin/run.js (compiled to dist/version-check-bin.js).
|
|
2
|
+
//
|
|
3
|
+
// bin/run.js needs to answer "is this invocation outdated?" from the
|
|
4
|
+
// cache file alone, synchronously, BEFORE oclif boots — no network call,
|
|
5
|
+
// no command-class introspection. That's a materially different job than
|
|
6
|
+
// version-check.ts's guardCliVersion() (which runs inside a live command
|
|
7
|
+
// with a resolved ApiClient and cmdId). This module exists so the bin-level
|
|
8
|
+
// answer reuses the SAME exempt set, comparator, cache-path resolver, and
|
|
9
|
+
// skip-env check as the module — no second copy to drift out of sync.
|
|
10
|
+
//
|
|
11
|
+
// bin/run.js can safely import from dist/ because package.json's
|
|
12
|
+
// oclif.commands / oclif.helpClass already point at ./dist/*, meaning
|
|
13
|
+
// dist/ must exist for the CLI to run at all in production. The separate
|
|
14
|
+
// bin/dev.js (ts-node) path never touches this file.
|
|
15
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import * as semver from "semver";
|
|
18
|
+
import { CLI_VERSION } from "./api/client.js";
|
|
19
|
+
import { configDir } from "./config/paths.js";
|
|
20
|
+
import { VERSION_CHECK_EXEMPT, stripControlChars } from "./version-check.js";
|
|
21
|
+
export { VERSION_CHECK_EXEMPT, CLI_VERSION };
|
|
22
|
+
export function minVersionCachePath() {
|
|
23
|
+
return join(configDir(), "min-version.json");
|
|
24
|
+
}
|
|
25
|
+
/** True when SYNTEQ_SKIP_VERSION_CHECK=1 — mirrors the check in
|
|
26
|
+
* version-check.ts's loadOrFetchMinVersion (F2a). */
|
|
27
|
+
export function isSkipEnvSet() {
|
|
28
|
+
return process.env.SYNTEQ_SKIP_VERSION_CHECK === "1";
|
|
29
|
+
}
|
|
30
|
+
/** Does this argv invocation resolve to a VERSION_CHECK_EXEMPT command?
|
|
31
|
+
* (F2b/F2c)
|
|
32
|
+
*
|
|
33
|
+
* Two drift bugs this fixes relative to the old inline bin logic:
|
|
34
|
+
* - F2b (colon form): oclif accepts both `settings render-mode` and
|
|
35
|
+
* `settings:render-mode`. VERSION_CHECK_EXEMPT already lists both the
|
|
36
|
+
* bare topic ("settings") and the colon form ("settings:render-mode"),
|
|
37
|
+
* so testing each token both as-is AND split on ":" (topic-only) covers
|
|
38
|
+
* `settings`, `settings:render-mode`, and `settings render-mode` (two
|
|
39
|
+
* separate tokens, "settings" alone already matches).
|
|
40
|
+
* - F2c (flag-value false match): the old code took "the first non-flag
|
|
41
|
+
* token" as THE command, so `synteq -o json login` saw "json" first and
|
|
42
|
+
* never reached "login". Scanning ALL non-flag tokens for ANY exempt
|
|
43
|
+
* match is simpler and robust — login/logout/settings are commands here,
|
|
44
|
+
* never legitimate flag values in this CLI's grammar, so a false
|
|
45
|
+
* positive would require a flag value that's literally the string
|
|
46
|
+
* "login"/"logout"/"settings" — an acceptable, documented trade-off
|
|
47
|
+
* favoring "recovery command wrongly let through" over "recovery
|
|
48
|
+
* command wrongly blocked".
|
|
49
|
+
*/
|
|
50
|
+
export function isExemptFromVersionCheck(argv) {
|
|
51
|
+
for (let i = 2; i < argv.length; i++) {
|
|
52
|
+
const arg = argv[i];
|
|
53
|
+
if (!arg || arg.startsWith("-"))
|
|
54
|
+
continue;
|
|
55
|
+
if (VERSION_CHECK_EXEMPT.has(arg))
|
|
56
|
+
return true;
|
|
57
|
+
const topic = arg.split(":")[0];
|
|
58
|
+
if (topic && VERSION_CHECK_EXEMPT.has(topic))
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/** Read + validate the on-disk cache. Fails open (returns null) on any
|
|
64
|
+
* parse error, missing/wrong-typed fields, staleness, clock skew, or
|
|
65
|
+
* invalid semver in min_version (F5-cli) — never throws. */
|
|
66
|
+
function readMinVersionCacheForBin(cachePath) {
|
|
67
|
+
if (!existsSync(cachePath))
|
|
68
|
+
return null;
|
|
69
|
+
try {
|
|
70
|
+
const parsed = JSON.parse(readFileSync(cachePath, "utf8"));
|
|
71
|
+
if (typeof parsed?.min_version !== "string" || typeof parsed?.fetched_at !== "number")
|
|
72
|
+
return null;
|
|
73
|
+
if (!semver.valid(parsed.min_version))
|
|
74
|
+
return null; // corrupt/overflowed → fail open
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
if (now - parsed.fetched_at > 6 * 60 * 60 * 1000)
|
|
77
|
+
return null; // stale (6h TTL)
|
|
78
|
+
if (now - parsed.fetched_at < 0)
|
|
79
|
+
return null; // clock went backward
|
|
80
|
+
return {
|
|
81
|
+
min: parsed.min_version,
|
|
82
|
+
msg: typeof parsed.deprecated_message === "string" ? parsed.deprecated_message : null,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function buildOutdatedMessage(min, deprecatedMessage) {
|
|
90
|
+
const lines = [
|
|
91
|
+
`synteq: this CLI (v${CLI_VERSION}) is older than the portal's required minimum (v${min}).`,
|
|
92
|
+
`Upgrade with: npm i -g @synteq/cli`,
|
|
93
|
+
];
|
|
94
|
+
if (deprecatedMessage) {
|
|
95
|
+
lines.push("");
|
|
96
|
+
lines.push(stripControlChars(deprecatedMessage));
|
|
97
|
+
}
|
|
98
|
+
return lines.join("\n");
|
|
99
|
+
}
|
|
100
|
+
/** The single entry point bin/run.js calls. Returns the upgrade message to
|
|
101
|
+
* print (caller writes to stderr + exit 4), or null to proceed normally.
|
|
102
|
+
* Never throws — every failure mode (skip-env, exempt command, missing/
|
|
103
|
+
* corrupt/stale cache, invalid semver) resolves to null, i.e. fail-open,
|
|
104
|
+
* except the one case that's supposed to block: a validly-cached,
|
|
105
|
+
* unexpired min_version that's genuinely newer than CLI_VERSION. */
|
|
106
|
+
export function checkOutdatedFromCacheForBin(argv) {
|
|
107
|
+
if (isSkipEnvSet())
|
|
108
|
+
return null;
|
|
109
|
+
if (isExemptFromVersionCheck(argv))
|
|
110
|
+
return null;
|
|
111
|
+
const cache = readMinVersionCacheForBin(minVersionCachePath());
|
|
112
|
+
if (!cache)
|
|
113
|
+
return null;
|
|
114
|
+
try {
|
|
115
|
+
if (!semver.lt(CLI_VERSION, cache.min))
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null; // fail open on any comparator surprise (F5-cli)
|
|
120
|
+
}
|
|
121
|
+
return buildOutdatedMessage(cache.min, cache.msg);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=version-check-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check-bin.js","sourceRoot":"","sources":["../src/version-check-bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ApiClient } from "./api/client.js";
|
|
2
|
+
export declare const VERSION_CHECK_CACHE_TTL_MS: number;
|
|
3
|
+
/** Commands that MUST work even when the local CLI is outdated. Keep tight:
|
|
4
|
+
* login/logout so users can complete a re-auth if upgrade requires it;
|
|
5
|
+
* settings so users can inspect the state they're stuck in. Nothing else. */
|
|
6
|
+
export declare const VERSION_CHECK_EXEMPT: ReadonlySet<string>;
|
|
7
|
+
export interface MinVersionInfo {
|
|
8
|
+
minVersion: string;
|
|
9
|
+
deprecatedMessage: string | null;
|
|
10
|
+
fetchedAt: number;
|
|
11
|
+
}
|
|
12
|
+
/** Fetch the min-version record. Returns null when we couldn't get one AND
|
|
13
|
+
* had no stale cache to fall back on — the caller MUST treat null as
|
|
14
|
+
* "unknown, allow through" per the spec's fail-open error handling. */
|
|
15
|
+
export declare function loadOrFetchMinVersion(api: Pick<ApiClient, "auth"> | {
|
|
16
|
+
auth: {
|
|
17
|
+
minCliVersion: () => Promise<{
|
|
18
|
+
min_cli_version: string;
|
|
19
|
+
deprecated_message: string | null;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
}, cacheFilePath?: string): Promise<MinVersionInfo | null>;
|
|
23
|
+
export declare function isCliOutdated(current: string, min: string): boolean;
|
|
24
|
+
/** Strip C0/C1 control characters (except newline) and bidi-override
|
|
25
|
+
* codepoints from a string. Defence-in-depth for `deprecatedMessage`,
|
|
26
|
+
* which originates as unauthenticated, admin-free-text server input
|
|
27
|
+
* (`GET /auth/device/version`) and is printed raw to the user's terminal.
|
|
28
|
+
* The backend sanitizes on write (see `text_sanitize.py`); this is a
|
|
29
|
+
* second, independent line of defence on the print path in case that
|
|
30
|
+
* ever regresses or a stale cache from before the backend fix lingers
|
|
31
|
+
* on disk. Shared by `formatUpgradeMessage` here and the bin-level shim
|
|
32
|
+
* (`version-check-bin.ts`) so both print paths agree. */
|
|
33
|
+
export declare function stripControlChars(s: string): string;
|
|
34
|
+
export declare function formatUpgradeMessage(current: string, min: string, deprecatedMessage: string | null, binName: string): string;
|
|
35
|
+
export interface GuardResult {
|
|
36
|
+
outdated: boolean;
|
|
37
|
+
message?: string;
|
|
38
|
+
}
|
|
39
|
+
export declare function guardCliVersion(api: Pick<ApiClient, "auth">, cmdId: string, binName: string, cacheFilePath?: string): Promise<GuardResult>;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, chmodSync } from "node:fs";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { dirname, join } from "node:path";
|
|
4
|
+
import * as semver from "semver";
|
|
5
|
+
import { CLI_VERSION } from "./api/client.js";
|
|
6
|
+
import { configDir } from "./config/paths.js";
|
|
7
|
+
export const VERSION_CHECK_CACHE_TTL_MS = 6 * 60 * 60 * 1000;
|
|
8
|
+
/** Commands that MUST work even when the local CLI is outdated. Keep tight:
|
|
9
|
+
* login/logout so users can complete a re-auth if upgrade requires it;
|
|
10
|
+
* settings so users can inspect the state they're stuck in. Nothing else. */
|
|
11
|
+
export const VERSION_CHECK_EXEMPT = new Set([
|
|
12
|
+
"login",
|
|
13
|
+
"logout",
|
|
14
|
+
"settings",
|
|
15
|
+
"settings:render-mode",
|
|
16
|
+
"settings:index", // topic index
|
|
17
|
+
]);
|
|
18
|
+
function defaultCacheFile() {
|
|
19
|
+
return join(configDir(), "min-version.json");
|
|
20
|
+
}
|
|
21
|
+
function readCache(cacheFilePath) {
|
|
22
|
+
if (!existsSync(cacheFilePath))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
const parsed = JSON.parse(readFileSync(cacheFilePath, "utf8"));
|
|
26
|
+
if (typeof parsed?.min_version !== "string" || typeof parsed?.fetched_at !== "number")
|
|
27
|
+
return null;
|
|
28
|
+
// F5: the backend's regex + max_length historically admitted values
|
|
29
|
+
// semver.lt() throws on (e.g. overflowing MAX_SAFE_INTEGER), and a
|
|
30
|
+
// hand-edited or older-format cache file can carry a non-semver string
|
|
31
|
+
// ("1.0"). Drop the entry rather than let a corrupt/overflowed cache
|
|
32
|
+
// crash the guard later — fail open, same as a missing cache.
|
|
33
|
+
if (!semver.valid(parsed.min_version))
|
|
34
|
+
return null;
|
|
35
|
+
return {
|
|
36
|
+
minVersion: parsed.min_version,
|
|
37
|
+
deprecatedMessage: typeof parsed.deprecated_message === "string" ? parsed.deprecated_message : null,
|
|
38
|
+
fetchedAt: parsed.fetched_at,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function writeCacheAtomic(cacheFilePath, info) {
|
|
46
|
+
const dir = dirname(cacheFilePath);
|
|
47
|
+
if (!existsSync(dir))
|
|
48
|
+
mkdirSync(dir, { recursive: true });
|
|
49
|
+
// randomUUID suffix (in addition to pid) avoids a collision if the pid is
|
|
50
|
+
// reused (common in containers) while a prior write's tmp file lingers.
|
|
51
|
+
const tmp = `${cacheFilePath}.tmp.${process.pid}.${randomUUID()}`;
|
|
52
|
+
writeFileSync(tmp, JSON.stringify({
|
|
53
|
+
min_version: info.minVersion,
|
|
54
|
+
deprecated_message: info.deprecatedMessage,
|
|
55
|
+
fetched_at: info.fetchedAt,
|
|
56
|
+
}), { mode: 0o600 });
|
|
57
|
+
// Match TokenStore's belt-and-suspenders pattern (src/auth/tokens.ts) —
|
|
58
|
+
// explicit chmod in case the platform/umask ignored the writeFileSync mode.
|
|
59
|
+
chmodSync(tmp, 0o600);
|
|
60
|
+
renameSync(tmp, cacheFilePath);
|
|
61
|
+
}
|
|
62
|
+
/** Fetch the min-version record. Returns null when we couldn't get one AND
|
|
63
|
+
* had no stale cache to fall back on — the caller MUST treat null as
|
|
64
|
+
* "unknown, allow through" per the spec's fail-open error handling. */
|
|
65
|
+
export async function loadOrFetchMinVersion(api, cacheFilePath = defaultCacheFile()) {
|
|
66
|
+
if (process.env.SYNTEQ_SKIP_VERSION_CHECK === "1")
|
|
67
|
+
return null;
|
|
68
|
+
const cached = readCache(cacheFilePath);
|
|
69
|
+
const now = Date.now();
|
|
70
|
+
if (cached && now - cached.fetchedAt < VERSION_CHECK_CACHE_TTL_MS && now - cached.fetchedAt >= 0) {
|
|
71
|
+
return cached;
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
const resp = await api.auth.minCliVersion();
|
|
75
|
+
const info = {
|
|
76
|
+
minVersion: resp.min_cli_version,
|
|
77
|
+
deprecatedMessage: resp.deprecated_message ?? null,
|
|
78
|
+
fetchedAt: now,
|
|
79
|
+
};
|
|
80
|
+
writeCacheAtomic(cacheFilePath, info);
|
|
81
|
+
return info;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Network / non-2xx / parse failure. Stale cache beats blocking the user.
|
|
85
|
+
return cached ?? null;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export function isCliOutdated(current, min) {
|
|
89
|
+
return semver.lt(current, min);
|
|
90
|
+
}
|
|
91
|
+
/** Strip C0/C1 control characters (except newline) and bidi-override
|
|
92
|
+
* codepoints from a string. Defence-in-depth for `deprecatedMessage`,
|
|
93
|
+
* which originates as unauthenticated, admin-free-text server input
|
|
94
|
+
* (`GET /auth/device/version`) and is printed raw to the user's terminal.
|
|
95
|
+
* The backend sanitizes on write (see `text_sanitize.py`); this is a
|
|
96
|
+
* second, independent line of defence on the print path in case that
|
|
97
|
+
* ever regresses or a stale cache from before the backend fix lingers
|
|
98
|
+
* on disk. Shared by `formatUpgradeMessage` here and the bin-level shim
|
|
99
|
+
* (`version-check-bin.ts`) so both print paths agree. */
|
|
100
|
+
export function stripControlChars(s) {
|
|
101
|
+
// C0 controls (\x00-\x1F) except \n (\x0A), plus DEL (\x7F), plus C1
|
|
102
|
+
// controls (\x80-\x9F), plus Unicode bidi override/embedding/isolate
|
|
103
|
+
// control codepoints (U+200E-U+200F, U+202A-U+202E, U+2066-U+2069).
|
|
104
|
+
// eslint-disable-next-line no-control-regex
|
|
105
|
+
return s.replace(/[\x00-\x09\x0B-\x1F\x7F-\x9F\u200e\u200f\u202a-\u202e\u2066-\u2069]/g, "");
|
|
106
|
+
}
|
|
107
|
+
export function formatUpgradeMessage(current, min, deprecatedMessage, binName) {
|
|
108
|
+
const lines = [
|
|
109
|
+
`${binName}: this CLI (v${current}) is older than the portal's required minimum (v${min}).`,
|
|
110
|
+
`Upgrade with: npm i -g @synteq/cli`,
|
|
111
|
+
];
|
|
112
|
+
if (deprecatedMessage) {
|
|
113
|
+
lines.push("");
|
|
114
|
+
lines.push(stripControlChars(deprecatedMessage));
|
|
115
|
+
}
|
|
116
|
+
// Deliberately NOT advertising SYNTEQ_SKIP_VERSION_CHECK here: telling every
|
|
117
|
+
// blocked user to bypass the gate defeats it and produces broken requests
|
|
118
|
+
// against a portal their CLI no longer matches. The env var still works and
|
|
119
|
+
// is documented for tests/support in cli/CLAUDE.md — it just isn't surfaced
|
|
120
|
+
// in the user-facing block. Keep this in sync with buildOutdatedMessage in
|
|
121
|
+
// version-check-bin.ts (which likewise omits it).
|
|
122
|
+
return lines.join("\n");
|
|
123
|
+
}
|
|
124
|
+
export async function guardCliVersion(api, cmdId, binName, cacheFilePath) {
|
|
125
|
+
if (VERSION_CHECK_EXEMPT.has(cmdId))
|
|
126
|
+
return { outdated: false };
|
|
127
|
+
const info = await loadOrFetchMinVersion(api, cacheFilePath);
|
|
128
|
+
if (!info)
|
|
129
|
+
return { outdated: false }; // fail-open per spec
|
|
130
|
+
let outdated;
|
|
131
|
+
try {
|
|
132
|
+
outdated = isCliOutdated(CLI_VERSION, info.minVersion);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
// F5: readCache already drops non-semver min_version values, and the
|
|
136
|
+
// network path's response is a live fetch (not free-form), but this
|
|
137
|
+
// guard is deliberately unconditional — a comparator surprise must
|
|
138
|
+
// never crash the command, only fail open.
|
|
139
|
+
return { outdated: false };
|
|
140
|
+
}
|
|
141
|
+
if (!outdated)
|
|
142
|
+
return { outdated: false };
|
|
143
|
+
return {
|
|
144
|
+
outdated: true,
|
|
145
|
+
message: formatUpgradeMessage(CLI_VERSION, info.minVersion, info.deprecatedMessage, binName),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=version-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-check.js","sourceRoot":"","sources":["../src/version-check.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@synteq/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Synteq Cloud command-line client",
|
|
5
5
|
"bin": {
|
|
6
6
|
"synteq": "bin/run.js"
|
|
@@ -19,13 +19,17 @@
|
|
|
19
19
|
"dev": "node ./bin/dev.js",
|
|
20
20
|
"test": "vitest run",
|
|
21
21
|
"test:watch": "vitest",
|
|
22
|
+
"test:scope": "tsx --test test/scope.test.ts",
|
|
23
|
+
"test:help-filter": "tsx --test test/help-filter.test.ts",
|
|
24
|
+
"test:scope-coverage": "tsx --test test/scope-coverage.test.ts",
|
|
25
|
+
"test:version-check": "tsx --test test/version-check.test.ts",
|
|
22
26
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
23
27
|
},
|
|
24
28
|
"oclif": {
|
|
25
29
|
"bin": "synteq",
|
|
26
30
|
"dirname": "synteq",
|
|
27
31
|
"commands": "./dist/commands",
|
|
28
|
-
"helpClass": "./dist/help",
|
|
32
|
+
"helpClass": "./dist/help/scope-aware-help.js",
|
|
29
33
|
"topicSeparator": " ",
|
|
30
34
|
"topics": {
|
|
31
35
|
"order": {
|
|
@@ -93,12 +97,10 @@
|
|
|
93
97
|
},
|
|
94
98
|
"instant-metal:ip": {
|
|
95
99
|
"description": "An Instant Metal server's IPs (list, add)."
|
|
96
|
-
},
|
|
97
|
-
"bare-metal": {
|
|
98
|
-
"description": "Bare metal — coming soon. List existing servers; ordering isn't available yet (`bare-metal order`)."
|
|
99
100
|
}
|
|
100
101
|
},
|
|
101
102
|
"exitCodes": {
|
|
103
|
+
"4": "Outdated client — CLI version is below the portal's minimum. Run the update command shown in the error.",
|
|
102
104
|
"default": 1,
|
|
103
105
|
"failedFlagParsing": 1,
|
|
104
106
|
"failedFlagValidation": 1,
|
|
@@ -125,14 +127,17 @@
|
|
|
125
127
|
"ink-text-input": "^6.0.0",
|
|
126
128
|
"log-update": "^8.0.0",
|
|
127
129
|
"open": "^10.1.0",
|
|
128
|
-
"react": "^19.2.7"
|
|
130
|
+
"react": "^19.2.7",
|
|
131
|
+
"semver": "^7.8.5"
|
|
129
132
|
},
|
|
130
133
|
"optionalDependencies": {
|
|
131
134
|
"keytar": "^7.9.0"
|
|
132
135
|
},
|
|
133
136
|
"devDependencies": {
|
|
134
137
|
"@types/node": "^20.11.0",
|
|
138
|
+
"@types/semver": "^7.7.1",
|
|
135
139
|
"ts-node": "^10.9.2",
|
|
140
|
+
"tsx": "^4.23.1",
|
|
136
141
|
"typescript": "^5.4.0",
|
|
137
142
|
"vitest": "^1.6.0"
|
|
138
143
|
},
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import BareMetalList from "./list.js";
|
|
2
|
-
export default class BareMetalDefault extends BareMetalList {
|
|
3
|
-
static description = "Bare metal (coming soon) — list any existing servers; ordering isn't available yet (`bare-metal order`). Bare `synteq bare-metal` lists them.";
|
|
4
|
-
}
|
|
5
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/bare-metal/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,WAAW,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,aAAa;IACzD,MAAM,CAAC,WAAW,GAChB,+IAA+I,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from "../../base/command.js";
|
|
2
|
-
export default class BareMetalList extends BaseCommand {
|
|
3
|
-
static description: string;
|
|
4
|
-
static examples: string[];
|
|
5
|
-
static flags: {
|
|
6
|
-
project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
7
|
-
};
|
|
8
|
-
run(): Promise<void>;
|
|
9
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Flags } from "@oclif/core";
|
|
2
|
-
import { BaseCommand } from "../../base/command.js";
|
|
3
|
-
import { renderTable, shortId } from "../../ui/table.js";
|
|
4
|
-
import { statusColor } from "../../ui/glyphs.js";
|
|
5
|
-
export default class BareMetalList extends BaseCommand {
|
|
6
|
-
static description = "List your physical bare-metal servers. (Bare metal is coming soon — ordering isn't available yet; see `synteq bare-metal order`.)";
|
|
7
|
-
static examples = [
|
|
8
|
-
"<%= config.bin %> bare-metal list",
|
|
9
|
-
"<%= config.bin %> bare-metal list -o json",
|
|
10
|
-
];
|
|
11
|
-
static flags = {
|
|
12
|
-
project: Flags.string({ description: "Scope to a project id." }),
|
|
13
|
-
};
|
|
14
|
-
async run() {
|
|
15
|
-
await this.initClients();
|
|
16
|
-
const { flags } = await this.parse(BareMetalList);
|
|
17
|
-
try {
|
|
18
|
-
const services = await this.clients.api.baremetal.list(flags.project);
|
|
19
|
-
this.emit(services, () => {
|
|
20
|
-
if (services.length === 0) {
|
|
21
|
-
this.log("No bare-metal servers.");
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
this.log(renderTable(["ID", "HOSTNAME", "STATUS", "IP", "LOCATION"], services.map((s) => [
|
|
25
|
-
shortId(s.id),
|
|
26
|
-
s.hostname ?? s.reference,
|
|
27
|
-
statusColor(s.is_active ? "active" : "inactive"),
|
|
28
|
-
s.primary_ipv4 ?? "",
|
|
29
|
-
s.location_city ?? s.location_name ?? "",
|
|
30
|
-
])));
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
this.fail(err);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=list.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/bare-metal/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,GAChB,mIAAmI,CAAC;IACtI,MAAM,CAAC,QAAQ,GAAG;QAChB,mCAAmC;QACnC,2CAA2C;KAC5C,CAAC;IACF,MAAM,CAAC,KAAK,GAAG;QACb,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;KACjE,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACvB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC1B,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,GAAG,CACN,WAAW,CACT,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,EAC9C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBAClB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBACb,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS;oBACzB,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;oBAChD,CAAC,CAAC,YAAY,IAAI,EAAE;oBACpB,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,IAAI,EAAE;iBACzC,CAAC,CACH,CACF,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { BaseCommand } from "../../base/command.js";
|
|
2
|
-
export default class BareMetalOrder extends BaseCommand {
|
|
3
|
-
static description = "Bare metal is coming soon (not yet orderable). Shows how to register interest.";
|
|
4
|
-
static examples = [
|
|
5
|
-
"<%= config.bin %> bare-metal order",
|
|
6
|
-
];
|
|
7
|
-
async run() {
|
|
8
|
-
await this.initClients();
|
|
9
|
-
const lines = [
|
|
10
|
-
"Bare metal is coming soon — it's not available to order yet.",
|
|
11
|
-
"",
|
|
12
|
-
"Want to be notified when it launches? Register your interest:",
|
|
13
|
-
' synteq ticket create --department sales \\',
|
|
14
|
-
' --subject "Bare metal — notify me at launch" \\',
|
|
15
|
-
' --message "The specs / location / timeline you’re after"',
|
|
16
|
-
"",
|
|
17
|
-
"Need a dedicated server today? Instant Metal is self-serve and deploys",
|
|
18
|
-
"in minutes:",
|
|
19
|
-
" synteq instant-metal order",
|
|
20
|
-
];
|
|
21
|
-
this.emit({ orderable: false, status: "coming_soon", register_interest: "ticket", department: "sales" }, () => {
|
|
22
|
-
for (const l of lines)
|
|
23
|
-
this.log(l);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=order.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"order.js","sourceRoot":"","sources":["../../../src/commands/bare-metal/order.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAC,WAAW,GAChB,gFAAgF,CAAC;IACnF,MAAM,CAAC,QAAQ,GAAG;QAChB,oCAAoC;KACrC,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG;YACZ,8DAA8D;YAC9D,EAAE;YACF,+DAA+D;YAC/D,8CAA8C;YAC9C,qDAAqD;YACrD,8DAA8D;YAC9D,EAAE;YACF,wEAAwE;YACxE,aAAa;YACb,8BAA8B;SAC/B,CAAC;QACF,IAAI,CAAC,IAAI,CACP,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,EAC7F,GAAG,EAAE;YACH,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;IACJ,CAAC"}
|
package/dist/ui/vps-detail.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vps-detail.js","sourceRoot":"","sources":["../../src/ui/vps-detail.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/vps-resolve.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { ApiClient } from "../api/client.js";
|
|
2
|
-
import type { Resource } from "../api/types.js";
|
|
3
|
-
export declare function resolveVpsRef(api: ApiClient, query: string, projectId?: string): Promise<Resource>;
|
|
4
|
-
export declare function resolveVpsId(api: ApiClient, query: string, projectId?: string): Promise<string>;
|
package/dist/ui/vps-resolve.js
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { resolveVps } from "./vps-detail.js";
|
|
2
|
-
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
|
-
export async function resolveVpsRef(api, query, projectId) {
|
|
4
|
-
const q = query.trim();
|
|
5
|
-
if (UUID_RE.test(q)) {
|
|
6
|
-
return api.vps.get(q);
|
|
7
|
-
}
|
|
8
|
-
const list = await api.vps.list(projectId);
|
|
9
|
-
const hits = resolveVps(list, q);
|
|
10
|
-
if (hits.length === 1)
|
|
11
|
-
return hits[0];
|
|
12
|
-
if (hits.length === 0) {
|
|
13
|
-
throw new Error(`No Resource matches "${query}". Run \`synteq vps list\` to see ids / hostnames.`);
|
|
14
|
-
}
|
|
15
|
-
const preview = hits
|
|
16
|
-
.slice(0, 5)
|
|
17
|
-
.map((v) => `${v.id.slice(0, 8)} ${v.hostname}`)
|
|
18
|
-
.join(", ");
|
|
19
|
-
throw new Error(`"${query}" matches ${hits.length} VPSes (${preview}${hits.length > 5 ? ", …" : ""}). Use a longer id or the full hostname.`);
|
|
20
|
-
}
|
|
21
|
-
export async function resolveVpsId(api, query, projectId) {
|
|
22
|
-
return (await resolveVpsRef(api, query, projectId)).id;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=vps-resolve.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vps-resolve.js","sourceRoot":"","sources":["../../src/ui/vps-resolve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,OAAO,GACX,iEAAiE,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,GAAc,EACd,KAAa,EACb,SAAkB;IAElB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAEvB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,wBAAwB,KAAK,oDAAoD,CAClF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI;SACjB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;SAC/C,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,IAAI,KAAK,CACb,IAAI,KAAK,aAAa,IAAI,CAAC,MAAM,WAAW,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,0CAA0C,CAC7H,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAc,EACd,KAAa,EACb,SAAkB;IAElB,OAAO,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,CAAC"}
|