ninedeploy 0.10.6 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +1 -0
  3. package/dist/client.d.ts +34 -0
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +81 -22
  6. package/dist/client.js.map +1 -1
  7. package/dist/commands/backupPolicy.d.ts +29 -0
  8. package/dist/commands/backupPolicy.d.ts.map +1 -0
  9. package/dist/commands/backupPolicy.js +111 -0
  10. package/dist/commands/backupPolicy.js.map +1 -0
  11. package/dist/commands/certificates.d.ts +18 -7
  12. package/dist/commands/certificates.d.ts.map +1 -1
  13. package/dist/commands/certificates.js +121 -1
  14. package/dist/commands/certificates.js.map +1 -1
  15. package/dist/commands/databaseAccess.d.ts +37 -0
  16. package/dist/commands/databaseAccess.d.ts.map +1 -0
  17. package/dist/commands/databaseAccess.js +306 -0
  18. package/dist/commands/databaseAccess.js.map +1 -0
  19. package/dist/commands/deploy.d.ts.map +1 -1
  20. package/dist/commands/deploy.js +28 -7
  21. package/dist/commands/deploy.js.map +1 -1
  22. package/dist/commands/githubApps.d.ts +40 -0
  23. package/dist/commands/githubApps.d.ts.map +1 -0
  24. package/dist/commands/githubApps.js +278 -0
  25. package/dist/commands/githubApps.js.map +1 -0
  26. package/dist/commands/housekeeping.d.ts +7 -0
  27. package/dist/commands/housekeeping.d.ts.map +1 -1
  28. package/dist/commands/housekeeping.js +16 -0
  29. package/dist/commands/housekeeping.js.map +1 -1
  30. package/dist/commands/logs.d.ts.map +1 -1
  31. package/dist/commands/logs.js +17 -2
  32. package/dist/commands/logs.js.map +1 -1
  33. package/dist/commands/manage.d.ts +26 -10
  34. package/dist/commands/manage.d.ts.map +1 -1
  35. package/dist/commands/manage.js +219 -65
  36. package/dist/commands/manage.js.map +1 -1
  37. package/dist/commands/manifest.d.ts.map +1 -1
  38. package/dist/commands/manifest.js +9 -1
  39. package/dist/commands/manifest.js.map +1 -1
  40. package/dist/commands/misc.d.ts +4 -2
  41. package/dist/commands/misc.d.ts.map +1 -1
  42. package/dist/commands/misc.js +25 -11
  43. package/dist/commands/misc.js.map +1 -1
  44. package/dist/commands/multiNode.d.ts +55 -0
  45. package/dist/commands/multiNode.d.ts.map +1 -0
  46. package/dist/commands/multiNode.js +438 -0
  47. package/dist/commands/multiNode.js.map +1 -0
  48. package/dist/commands/notifications.d.ts +1 -1
  49. package/dist/commands/operations.d.ts +89 -0
  50. package/dist/commands/operations.d.ts.map +1 -0
  51. package/dist/commands/operations.js +468 -0
  52. package/dist/commands/operations.js.map +1 -0
  53. package/dist/commands/panelBackup.d.ts +28 -0
  54. package/dist/commands/panelBackup.d.ts.map +1 -0
  55. package/dist/commands/panelBackup.js +153 -0
  56. package/dist/commands/panelBackup.js.map +1 -0
  57. package/dist/commands/plugins.d.ts +1 -1
  58. package/dist/commands/plugins.d.ts.map +1 -1
  59. package/dist/commands/plugins.js +7 -3
  60. package/dist/commands/plugins.js.map +1 -1
  61. package/dist/commands/proxyConfig.d.ts +16 -0
  62. package/dist/commands/proxyConfig.d.ts.map +1 -0
  63. package/dist/commands/proxyConfig.js +122 -0
  64. package/dist/commands/proxyConfig.js.map +1 -0
  65. package/dist/commands/secretProviders.d.ts +59 -0
  66. package/dist/commands/secretProviders.d.ts.map +1 -0
  67. package/dist/commands/secretProviders.js +212 -0
  68. package/dist/commands/secretProviders.js.map +1 -0
  69. package/dist/commands/services.d.ts.map +1 -1
  70. package/dist/commands/services.js +3 -5
  71. package/dist/commands/services.js.map +1 -1
  72. package/dist/commands/setup.d.ts +3 -1
  73. package/dist/commands/setup.d.ts.map +1 -1
  74. package/dist/commands/setup.js +19 -3
  75. package/dist/commands/setup.js.map +1 -1
  76. package/dist/commands/sources.d.ts +10 -3
  77. package/dist/commands/sources.d.ts.map +1 -1
  78. package/dist/commands/sources.js +116 -18
  79. package/dist/commands/sources.js.map +1 -1
  80. package/dist/commands/templates.d.ts.map +1 -1
  81. package/dist/commands/templates.js +8 -1
  82. package/dist/commands/templates.js.map +1 -1
  83. package/dist/config.d.ts.map +1 -1
  84. package/dist/config.js +2 -1
  85. package/dist/config.js.map +1 -1
  86. package/dist/index.js +427 -23
  87. package/dist/index.js.map +1 -1
  88. package/dist/lib/format.d.ts.map +1 -1
  89. package/dist/lib/format.js +5 -4
  90. package/dist/lib/format.js.map +1 -1
  91. package/dist/lib/panelBackupFile.d.ts +3 -0
  92. package/dist/lib/panelBackupFile.d.ts.map +1 -0
  93. package/dist/lib/panelBackupFile.js +71 -0
  94. package/dist/lib/panelBackupFile.js.map +1 -0
  95. package/dist/lib/serverRunner.d.ts +6 -0
  96. package/dist/lib/serverRunner.d.ts.map +1 -1
  97. package/dist/lib/serverRunner.js +18 -3
  98. package/dist/lib/serverRunner.js.map +1 -1
  99. package/dist/prompts.d.ts.map +1 -1
  100. package/dist/prompts.js +9 -2
  101. package/dist/prompts.js.map +1 -1
  102. package/package.json +6 -5
  103. package/src/client.ts +137 -0
  104. package/src/commands/backupPolicy.ts +123 -0
  105. package/src/commands/branding.ts +83 -0
  106. package/src/commands/buildCache.ts +72 -0
  107. package/src/commands/certificates.ts +208 -0
  108. package/src/commands/communityTemplates.ts +97 -0
  109. package/src/commands/configCenter.ts +71 -0
  110. package/src/commands/configPresets.ts +215 -0
  111. package/src/commands/databaseAccess.ts +333 -0
  112. package/src/commands/demo.ts +22 -0
  113. package/src/commands/deploy.ts +284 -0
  114. package/src/commands/doctor.ts +170 -0
  115. package/src/commands/domains.ts +170 -0
  116. package/src/commands/egress.ts +135 -0
  117. package/src/commands/emailTemplates.ts +112 -0
  118. package/src/commands/firewall.ts +82 -0
  119. package/src/commands/githubApps.ts +292 -0
  120. package/src/commands/housekeeping.ts +106 -0
  121. package/src/commands/login.ts +58 -0
  122. package/src/commands/logs.ts +91 -0
  123. package/src/commands/manage.ts +714 -0
  124. package/src/commands/manifest.ts +314 -0
  125. package/src/commands/metrics.ts +69 -0
  126. package/src/commands/misc.ts +307 -0
  127. package/src/commands/multiNode.ts +442 -0
  128. package/src/commands/notifications.ts +174 -0
  129. package/src/commands/operations.ts +519 -0
  130. package/src/commands/panelBackup.ts +167 -0
  131. package/src/commands/pgbouncer.ts +65 -0
  132. package/src/commands/plugins.ts +123 -0
  133. package/src/commands/proxyConfig.ts +117 -0
  134. package/src/commands/secretProviders.ts +228 -0
  135. package/src/commands/server.ts +126 -0
  136. package/src/commands/services.ts +249 -0
  137. package/src/commands/setup.ts +94 -0
  138. package/src/commands/sources.ts +317 -0
  139. package/src/commands/sso.ts +106 -0
  140. package/src/commands/templates.ts +158 -0
  141. package/src/commands/token.ts +66 -0
  142. package/src/commands/webhooks.ts +93 -0
  143. package/src/commands/workspaces.ts +63 -0
  144. package/src/config.ts +53 -0
  145. package/src/index.ts +1273 -0
  146. package/src/lib/format.ts +182 -0
  147. package/src/lib/panelBackupFile.ts +67 -0
  148. package/src/lib/serverRunner.ts +223 -0
  149. package/src/prompts.ts +238 -0
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 NineDeploy
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NineDeploy
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -135,6 +135,7 @@ ninedeploy env list <serviceId> # List environment variables
135
135
  ninedeploy env set <serviceId> KEY VALUE # Set encrypted secret
136
136
  ninedeploy env set <serviceId> KEY VALUE --public # Set public env variable
137
137
  ninedeploy env rm <serviceId> KEY # Remove variable
138
+ ninedeploy env set <serviceId> KEY VALUE --preview # Value only this service's PR previews receive (also: list/rm --preview)
138
139
  ```
139
140
 
140
141
  ### 🌐 Domains & Routing
package/dist/client.d.ts CHANGED
@@ -6,8 +6,42 @@ export type { NineDeployClient };
6
6
  * r193: every `/auth/` path used to be skipped, so the authenticated ones
7
7
  * (`/auth/me`, `/auth/tokens`, `/auth/sessions`, 2FA, passkey registration)
8
8
  * failed permanently once the 15-minute access token expired.
9
+ * Keep byte-identical to apps/web/src/lib/api.ts — the web copy also exempts
10
+ * `oidc/<slug>/link` (an authenticated route); this copy had drifted and
11
+ * would have re-inherited the r193 failure the moment a CLI command wired
12
+ * auth.oidc.link().
9
13
  */
10
14
  export declare const NO_REFRESH_PATH: RegExp;
15
+ /**
16
+ * r550: join the configured base URL and an API path by string concatenation.
17
+ * `new URL('/v1/…', base)` resolves the path against the ORIGIN, silently
18
+ * dropping a sub-path prefix (`https://host/ninedeploy` → `https://host/v1/…`)
19
+ * — a panel published behind a path prefix answered every raw call with the
20
+ * front proxy's 404. The SDK has always concatenated; this keeps the raw
21
+ * paths (exports, imports, the log WebSocket) in line with it.
22
+ */
23
+ export declare function apiUrl(path: string, baseUrl?: string): string;
24
+ /**
25
+ * Mint a fresh access token from the saved refresh token (single-flight,
26
+ * persisted). Resolves false when there is no refresh token or the server
27
+ * refused it — the caller then surfaces its original 401.
28
+ */
29
+ export declare function refreshAccessToken(baseUrl?: string): Promise<boolean>;
30
+ /**
31
+ * r550: authenticated raw fetch for the endpoints the SDK cannot model
32
+ * (binary exports, the octet-stream import). These used to call fetch()
33
+ * directly with the saved bearer and no refresh: once the 15-minute access
34
+ * token expired, `system export` / `system import` / `services export` failed
35
+ * with a bare 401 while every SDK-backed command kept working. Same base-URL
36
+ * join and refresh-and-retry as getClient().
37
+ */
38
+ export declare function authedFetch(path: string, init?: RequestInit): Promise<Response>;
39
+ /**
40
+ * True when `token` is a JWT whose `exp` falls within `skewMs` from now.
41
+ * Opaque API tokens (and anything undecodable) report false — they carry no
42
+ * client-visible expiry, so the server's answer is the only authority.
43
+ */
44
+ export declare function tokenExpiresSoon(token: string | undefined, skewMs?: number, now?: number): boolean;
11
45
  /**
12
46
  * Build an SDK client configured from the saved CLI config.
13
47
  *
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AASjC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QACyH,CAAC;AAqBtJ;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAwB5C"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGtE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AASjC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,QAC6I,CAAC;AAE1K;;;;;;;GAOG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,MAA6B,GAAG,MAAM,CAEnF;AAqBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,MAA6B,GAAG,OAAO,CAAC,OAAO,CAAC,CAOjG;AAcD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAKzF;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,SAAS,EAAE,GAAG,SAAa,GAAG,OAAO,CAUtG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,IAAI,gBAAgB,CAU5C"}
package/dist/client.js CHANGED
@@ -12,11 +12,26 @@ let refreshInflight = null;
12
12
  * r193: every `/auth/` path used to be skipped, so the authenticated ones
13
13
  * (`/auth/me`, `/auth/tokens`, `/auth/sessions`, 2FA, passkey registration)
14
14
  * failed permanently once the 15-minute access token expired.
15
+ * Keep byte-identical to apps/web/src/lib/api.ts — the web copy also exempts
16
+ * `oidc/<slug>/link` (an authenticated route); this copy had drifted and
17
+ * would have re-inherited the r193 failure the moment a CLI command wired
18
+ * auth.oidc.link().
15
19
  */
16
- export const NO_REFRESH_PATH = /\/(?:v1\/setup|v1\/auth\/(?:login|refresh|register|logout|forgot-password|reset-password|status|oidc\/(?!providers(?:\/|$|\?))|passkey\/login\/))/;
20
+ export const NO_REFRESH_PATH = /\/(?:v1\/setup|v1\/auth\/(?:login|refresh|register|logout|forgot-password|reset-password|status|oidc\/(?!providers(?:\/|$|\?)|[^/]+\/link(?:$|\?))|passkey\/login\/))/;
21
+ /**
22
+ * r550: join the configured base URL and an API path by string concatenation.
23
+ * `new URL('/v1/…', base)` resolves the path against the ORIGIN, silently
24
+ * dropping a sub-path prefix (`https://host/ninedeploy` → `https://host/v1/…`)
25
+ * — a panel published behind a path prefix answered every raw call with the
26
+ * front proxy's 404. The SDK has always concatenated; this keeps the raw
27
+ * paths (exports, imports, the log WebSocket) in line with it.
28
+ */
29
+ export function apiUrl(path, baseUrl = loadConfig().baseUrl) {
30
+ return `${baseUrl.replace(/\/+$/, '')}${path}`;
31
+ }
17
32
  async function refreshSession(baseUrl, refreshToken) {
18
33
  try {
19
- const res = await fetch(`${baseUrl}/v1/auth/refresh`, {
34
+ const res = await fetch(apiUrl('/v1/auth/refresh', baseUrl), {
20
35
  method: 'POST',
21
36
  headers: { 'Content-Type': 'application/json' },
22
37
  body: JSON.stringify({ refreshToken }),
@@ -35,6 +50,69 @@ async function refreshSession(baseUrl, refreshToken) {
35
50
  return false;
36
51
  }
37
52
  }
53
+ /**
54
+ * Mint a fresh access token from the saved refresh token (single-flight,
55
+ * persisted). Resolves false when there is no refresh token or the server
56
+ * refused it — the caller then surfaces its original 401.
57
+ */
58
+ export async function refreshAccessToken(baseUrl = loadConfig().baseUrl) {
59
+ const refreshToken = loadConfig().refreshToken;
60
+ if (!refreshToken)
61
+ return false;
62
+ refreshInflight ??= refreshSession(baseUrl, refreshToken).finally(() => {
63
+ refreshInflight = null;
64
+ });
65
+ return refreshInflight;
66
+ }
67
+ /** fetch() with the dashboard's 401 → refresh → retry-once semantics. */
68
+ async function fetchWithRefresh(baseUrl, input, init) {
69
+ const res = await fetch(input, init);
70
+ if (res.status !== 401)
71
+ return res;
72
+ if (NO_REFRESH_PATH.test(input))
73
+ return res;
74
+ if (!(await refreshAccessToken(baseUrl)))
75
+ return res;
76
+ const headers = new Headers(init?.headers);
77
+ const fresh = loadConfig().token;
78
+ if (fresh)
79
+ headers.set('Authorization', `Bearer ${fresh}`);
80
+ return fetch(input, { ...init, headers });
81
+ }
82
+ /**
83
+ * r550: authenticated raw fetch for the endpoints the SDK cannot model
84
+ * (binary exports, the octet-stream import). These used to call fetch()
85
+ * directly with the saved bearer and no refresh: once the 15-minute access
86
+ * token expired, `system export` / `system import` / `services export` failed
87
+ * with a bare 401 while every SDK-backed command kept working. Same base-URL
88
+ * join and refresh-and-retry as getClient().
89
+ */
90
+ export async function authedFetch(path, init = {}) {
91
+ const cfg = loadConfig();
92
+ const headers = new Headers(init.headers);
93
+ if (cfg.token)
94
+ headers.set('Authorization', `Bearer ${cfg.token}`);
95
+ return fetchWithRefresh(cfg.baseUrl, apiUrl(path, cfg.baseUrl), { ...init, headers });
96
+ }
97
+ /**
98
+ * True when `token` is a JWT whose `exp` falls within `skewMs` from now.
99
+ * Opaque API tokens (and anything undecodable) report false — they carry no
100
+ * client-visible expiry, so the server's answer is the only authority.
101
+ */
102
+ export function tokenExpiresSoon(token, skewMs = 60_000, now = Date.now()) {
103
+ if (!token)
104
+ return false;
105
+ const part = token.split('.')[1];
106
+ if (!part)
107
+ return false;
108
+ try {
109
+ const payload = JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
110
+ return typeof payload.exp === 'number' && payload.exp * 1000 - skewMs <= now;
111
+ }
112
+ catch {
113
+ return false;
114
+ }
115
+ }
38
116
  /**
39
117
  * Build an SDK client configured from the saved CLI config.
40
118
  *
@@ -54,26 +132,7 @@ export function getClient() {
54
132
  // Volume-file uploads and log tailing can be slow; still bounded so a
55
133
  // stalled backend cannot hang a CI runner forever.
56
134
  timeoutMs: 120_000,
57
- fetch: async (input, init) => {
58
- const res = await fetch(input, init);
59
- if (res.status !== 401)
60
- return res;
61
- if (NO_REFRESH_PATH.test(input))
62
- return res;
63
- const refreshToken = loadConfig().refreshToken;
64
- if (!refreshToken)
65
- return res;
66
- refreshInflight ??= refreshSession(cfg.baseUrl, refreshToken).finally(() => {
67
- refreshInflight = null;
68
- });
69
- if (!(await refreshInflight))
70
- return res;
71
- const headers = new Headers(init?.headers);
72
- const fresh = loadConfig().token;
73
- if (fresh)
74
- headers.set('Authorization', `Bearer ${fresh}`);
75
- return fetch(input, { ...init, headers });
76
- },
135
+ fetch: (input, init) => fetchWithRefresh(cfg.baseUrl, input, init),
77
136
  });
78
137
  }
79
138
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIrD;;;;GAIG;AACH,IAAI,eAAe,GAA4B,IAAI,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAC1B,mJAAmJ,CAAC;AAEtJ,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,YAAoB;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,kBAAkB,EAAE;YACpD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;YACtC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAiE,CAAC;QAChG,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QAC/D,UAAU,CAAC,EAAE,GAAG,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK;QAClC,sEAAsE;QACtE,mDAAmD;QACnD,SAAS,EAAE,OAAO;QAClB,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACrC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC;YACnC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;YAC5C,MAAM,YAAY,GAAG,UAAU,EAAE,CAAC,YAAY,CAAC;YAC/C,IAAI,CAAC,YAAY;gBAAE,OAAO,GAAG,CAAC;YAC9B,eAAe,KAAK,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;gBACzE,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC;gBAAE,OAAO,GAAG,CAAC;YACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC,KAAK,CAAC;YACjC,IAAI,KAAK;gBAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;YAC3D,OAAO,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `ninedeploy databases backup-policy get|set <dbId>` — 0.12 per-database
3
+ * backup policy: cron schedule, retention and destination. A database with
4
+ * no saved policy is on the built-in schedule (daily, 7 kept, active
5
+ * destination).
6
+ */
7
+ import type { BackupPolicy, BackupPolicyInput } from '@ninedeploy/sdk';
8
+ import type { NineDeployClient } from '../client.js';
9
+ /** The presets the web card offers. */
10
+ export declare const BACKUP_CRON_PRESETS: Record<string, string>;
11
+ /** `ninedeploy databases backup-policy get <dbId>` */
12
+ export declare function backupPolicyGet(client: NineDeployClient, idStr: string): Promise<void>;
13
+ export interface BackupPolicySetOpts {
14
+ cron?: string;
15
+ preset?: string;
16
+ keep?: string;
17
+ keepRemote?: string;
18
+ destination?: string;
19
+ enable?: boolean;
20
+ disable?: boolean;
21
+ }
22
+ /**
23
+ * Build the PUT body: the current policy (or the built-in defaults) with the
24
+ * given flags applied — PUT replaces, so unset flags keep today's values.
25
+ */
26
+ export declare function mergePolicyInput(current: BackupPolicy, opts: BackupPolicySetOpts): BackupPolicyInput;
27
+ /** `ninedeploy databases backup-policy set <dbId> [--cron|--preset] [--keep] [--keep-remote] [--destination] [--enable|--disable]` */
28
+ export declare function backupPolicySet(client: NineDeployClient, idStr: string, opts: BackupPolicySetOpts): Promise<void>;
29
+ //# sourceMappingURL=backupPolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupPolicy.d.ts","sourceRoot":"","sources":["../../src/commands/backupPolicy.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAcrD,uCAAuC;AACvC,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAItD,CAAC;AAiBF,sDAAsD;AACtD,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5F;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,GAAG,iBAAiB,CAmCpG;AAED,sIAAsI;AACtI,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWvH"}
@@ -0,0 +1,111 @@
1
+ import { c, error, header, info, spinner, success } from '../lib/format.js';
2
+ /** Canonical decimal ids only — the server's `parseId` rule (F537). */
3
+ const CANONICAL_ID = /^[1-9]\d*$/;
4
+ const num = (v, usage) => {
5
+ const n = CANONICAL_ID.test(v) ? Number(v) : Number.NaN;
6
+ if (!Number.isSafeInteger(n)) {
7
+ error(usage);
8
+ throw new Error(usage);
9
+ }
10
+ return n;
11
+ };
12
+ /** The presets the web card offers. */
13
+ export const BACKUP_CRON_PRESETS = {
14
+ daily: '0 3 * * *',
15
+ '6h': '0 */6 * * *',
16
+ weekly: '0 3 * * 0',
17
+ };
18
+ function printPolicy(p) {
19
+ header('Backup policy');
20
+ if (!p.configured) {
21
+ info(`Schedule: built-in (daily, ${p.retainCount} kept, active destination)`);
22
+ info(c.dim('No policy saved — `ninedeploy databases backup-policy set` creates one.'));
23
+ return;
24
+ }
25
+ info(`Enabled: ${p.enabled ? 'yes' : c.yellow('no — no scheduled backups')}`);
26
+ info(`Cron: ${p.cron}`);
27
+ info(`Keep: ${p.retainCount} local`);
28
+ info(`Remote keep: ${p.localOnly ? '—' : (p.retainRemoteCount ?? `same as local (${p.retainCount})`)}`);
29
+ info(`Destination: ${p.localOnly ? 'local only' : p.destinationId != null ? `#${p.destinationId}` : 'active destination'}`);
30
+ if (p.nextRunAt)
31
+ info(`Next run: ${p.nextRunAt}`);
32
+ }
33
+ /** `ninedeploy databases backup-policy get <dbId>` */
34
+ export async function backupPolicyGet(client, idStr) {
35
+ const id = num(idStr, 'Usage: ninedeploy databases backup-policy get <dbId>');
36
+ try {
37
+ printPolicy(await spinner('Reading backup policy', () => client.backups.getPolicy(id)));
38
+ }
39
+ catch (err) {
40
+ error(err instanceof Error ? err.message : String(err));
41
+ }
42
+ }
43
+ const intOpt = (v, flag) => {
44
+ if (v === undefined)
45
+ return undefined;
46
+ if (!/^\d+$/.test(v))
47
+ throw new Error(`${flag} must be a whole number`);
48
+ return Number(v);
49
+ };
50
+ /**
51
+ * Build the PUT body: the current policy (or the built-in defaults) with the
52
+ * given flags applied — PUT replaces, so unset flags keep today's values.
53
+ */
54
+ export function mergePolicyInput(current, opts) {
55
+ if (opts.enable && opts.disable)
56
+ throw new Error('Use either --enable or --disable, not both');
57
+ if (opts.cron && opts.preset)
58
+ throw new Error('Use either --cron or --preset, not both');
59
+ let cron = opts.cron ?? current.cron ?? undefined;
60
+ if (opts.preset) {
61
+ cron = BACKUP_CRON_PRESETS[opts.preset];
62
+ if (!cron)
63
+ throw new Error(`--preset must be one of: ${Object.keys(BACKUP_CRON_PRESETS).join(', ')}`);
64
+ }
65
+ if (!cron)
66
+ throw new Error('No schedule yet: pass --cron "<5-field expression>" or --preset daily|6h|weekly');
67
+ let destinationId = current.destinationId;
68
+ let localOnly = current.localOnly;
69
+ if (opts.destination !== undefined) {
70
+ const d = opts.destination.trim().toLowerCase();
71
+ if (d === 'local') {
72
+ localOnly = true;
73
+ destinationId = null;
74
+ }
75
+ else if (d === 'active' || d === 'default') {
76
+ localOnly = false;
77
+ destinationId = null;
78
+ }
79
+ else if (CANONICAL_ID.test(d)) {
80
+ localOnly = false;
81
+ destinationId = Number(d);
82
+ }
83
+ else {
84
+ throw new Error('--destination must be a destination id, "active" or "local"');
85
+ }
86
+ }
87
+ const keepRemote = intOpt(opts.keepRemote, '--keep-remote');
88
+ return {
89
+ enabled: opts.disable ? false : opts.enable ? true : current.enabled,
90
+ cron,
91
+ retainCount: intOpt(opts.keep, '--keep') ?? current.retainCount,
92
+ retainRemoteCount: localOnly ? null : (keepRemote ?? current.retainRemoteCount),
93
+ destinationId,
94
+ localOnly,
95
+ };
96
+ }
97
+ /** `ninedeploy databases backup-policy set <dbId> [--cron|--preset] [--keep] [--keep-remote] [--destination] [--enable|--disable]` */
98
+ export async function backupPolicySet(client, idStr, opts) {
99
+ const id = num(idStr, 'Usage: ninedeploy databases backup-policy set <dbId> [options]');
100
+ try {
101
+ const current = await client.backups.getPolicy(id);
102
+ const input = mergePolicyInput(current, opts);
103
+ const saved = await spinner('Saving backup policy', () => client.backups.setPolicy(id, input));
104
+ success('Backup policy saved.');
105
+ printPolicy(saved);
106
+ }
107
+ catch (err) {
108
+ error(err instanceof Error ? err.message : String(err));
109
+ }
110
+ }
111
+ //# sourceMappingURL=backupPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backupPolicy.js","sourceRoot":"","sources":["../../src/commands/backupPolicy.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,3 @@
1
- /**
2
- * `ninedeploy certificates {list,expiring}` — G-15 cert
3
- * inventory CLI. The server-side surface is in
4
- * `lib/certificateInventory.ts`; the CLI is a thin
5
- * renderer around `client.traefik.{certificateInventory,
6
- * expiringCertificates}`.
7
- */
8
1
  import type { NineDeployClient } from '../client.js';
9
2
  export declare function certificatesList(client: NineDeployClient, opts?: {
10
3
  threshold?: string;
@@ -12,4 +5,22 @@ export declare function certificatesList(client: NineDeployClient, opts?: {
12
5
  export declare function certificatesExpiring(client: NineDeployClient, opts?: {
13
6
  days?: string;
14
7
  }): Promise<void>;
8
+ /** `ninedeploy certificates custom list` */
9
+ export declare function certificatesCustomList(client: NineDeployClient): Promise<void>;
10
+ /** `ninedeploy certificates custom upload --name <n> --cert <path> --key <path>` */
11
+ export declare function certificatesCustomUpload(client: NineDeployClient, opts?: {
12
+ name?: string;
13
+ cert?: string;
14
+ key?: string;
15
+ }): Promise<void>;
16
+ /** `ninedeploy certificates custom replace <id> --cert <path> --key <path> [--name <n>]` */
17
+ export declare function certificatesCustomReplace(client: NineDeployClient, idArg: string, opts?: {
18
+ name?: string;
19
+ cert?: string;
20
+ key?: string;
21
+ }): Promise<void>;
22
+ /** `ninedeploy certificates custom delete <id> [--yes]` */
23
+ export declare function certificatesCustomDelete(client: NineDeployClient, idArg: string, opts?: {
24
+ yes?: boolean;
25
+ }): Promise<void>;
15
26
  //# sourceMappingURL=certificates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"certificates.d.ts","sourceRoot":"","sources":["../../src/commands/certificates.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAmBrD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,OAAO,CAAC,IAAI,CAAC,CAqBf"}
1
+ {"version":3,"file":"certificates.d.ts","sourceRoot":"","sources":["../../src/commands/certificates.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAqBrD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAChC,OAAO,CAAC,IAAI,CAAC,CA4Bf;AAED,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3B,OAAO,CAAC,IAAI,CAAC,CAqBf;AAoCD,4CAA4C;AAC5C,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBpF;AAED,oFAAoF;AACpF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,4FAA4F;AAC5F,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,2DAA2D;AAC3D,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnI"}
@@ -1,4 +1,14 @@
1
- import { c, error, header, info, spinner, table } from '../lib/format.js';
1
+ /**
2
+ * `ninedeploy certificates {list,expiring}` — G-15 cert
3
+ * inventory CLI. The server-side surface is in
4
+ * `lib/certificateInventory.ts`; the CLI is a thin
5
+ * renderer around `client.traefik.{certificateInventory,
6
+ * expiringCertificates}`.
7
+ */
8
+ import { readFileSync } from 'node:fs';
9
+ import { prompt } from '../prompts.js';
10
+ import { c, error, header, info, kv, spinner, success, table } from '../lib/format.js';
11
+ import { plain } from './sources.js';
2
12
  const num = (v, usage) => {
3
13
  const n = Number(v);
4
14
  if (Number.isNaN(n)) {
@@ -54,4 +64,114 @@ export async function certificatesExpiring(client, opts = {}) {
54
64
  expiresAt: cert.notAfter ? new Date(cert.notAfter).toLocaleString() : c.dim('—'),
55
65
  })), ['host', 'status', 'daysToExpiry', 'expiresAt']);
56
66
  }
67
+ // ── Custom certificates (0.14) ─────────────────────────────────────────────
68
+ // `ninedeploy certificates custom list|upload|replace|delete` — operator-only
69
+ // uploaded certificates (`/v1/traefik/certificates/custom`). The PEM files are
70
+ // read from paths; no response carries a private key. Names, hostnames,
71
+ // subjects and issuers come from the certificate itself, so they go through
72
+ // the F1011 sanitiser.
73
+ const certMessage = (err) => plain(err instanceof Error ? err.message : String(err));
74
+ function certId(raw) {
75
+ const t = (raw ?? '').trim();
76
+ return /^[1-9]\d*$/.test(t) && Number.isSafeInteger(Number(t)) ? Number(t) : 0;
77
+ }
78
+ function readPemPair(opts, usage) {
79
+ if (!opts.cert || !opts.key) {
80
+ error(usage);
81
+ return null;
82
+ }
83
+ try {
84
+ return { certPem: readFileSync(opts.cert, 'utf8').trim(), keyPem: readFileSync(opts.key, 'utf8').trim() };
85
+ }
86
+ catch (err) {
87
+ error(`Could not read the PEM files: ${certMessage(err)}`);
88
+ return null;
89
+ }
90
+ }
91
+ function printSaved(cert) {
92
+ kv('Hostnames', cert.hostnames.map(plain).join(', '));
93
+ kv('Expires', new Date(cert.notAfter).toLocaleString());
94
+ kv('Covers', cert.coveredDomains.length > 0 ? cert.coveredDomains.map((d) => plain(d.hostname)).join(', ') : c.gray('no domains yet'));
95
+ for (const w of cert.warnings)
96
+ console.log(` ${c.yellow('!')} ${c.yellow(plain(w))}`);
97
+ }
98
+ /** `ninedeploy certificates custom list` */
99
+ export async function certificatesCustomList(client) {
100
+ try {
101
+ const certs = await spinner('Reading uploaded certificates', () => client.traefik.customCertificates.list());
102
+ header('Uploaded certificates');
103
+ if (certs.length === 0) {
104
+ info('No certificates uploaded. Add one with `ninedeploy certificates custom upload --name <n> --cert <path> --key <path>`.');
105
+ return;
106
+ }
107
+ table(certs.map((cert) => ({
108
+ id: cert.id,
109
+ name: plain(cert.name),
110
+ hostnames: cert.hostnames.map(plain).join(', '),
111
+ expires: cert.expired ? c.red(`expired ${new Date(cert.notAfter).toLocaleDateString()}`) : new Date(cert.notAfter).toLocaleDateString(),
112
+ issuer: cert.issuer ? plain(cert.issuer) : c.dim('—'),
113
+ covers: cert.coveredDomains.length > 0 ? cert.coveredDomains.map((d) => plain(d.hostname)).join(', ') : c.dim('—'),
114
+ })), ['id', 'name', 'hostnames', 'expires', 'issuer', 'covers']);
115
+ }
116
+ catch (err) {
117
+ error(certMessage(err));
118
+ }
119
+ }
120
+ /** `ninedeploy certificates custom upload --name <n> --cert <path> --key <path>` */
121
+ export async function certificatesCustomUpload(client, opts = {}) {
122
+ const usage = 'Usage: ninedeploy certificates custom upload --name <name> --cert <chain.pem> --key <key.pem>';
123
+ const name = opts.name?.trim();
124
+ if (!name)
125
+ return error(usage);
126
+ const pem = readPemPair(opts, usage);
127
+ if (!pem)
128
+ return;
129
+ try {
130
+ const cert = await spinner('Verifying and uploading', () => client.traefik.customCertificates.upload({ name, ...pem }));
131
+ success(`Certificate "${plain(cert.name)}" uploaded (id: ${cert.id})`);
132
+ printSaved(cert);
133
+ }
134
+ catch (err) {
135
+ error(certMessage(err));
136
+ }
137
+ }
138
+ /** `ninedeploy certificates custom replace <id> --cert <path> --key <path> [--name <n>]` */
139
+ export async function certificatesCustomReplace(client, idArg, opts = {}) {
140
+ const usage = 'Usage: ninedeploy certificates custom replace <id> --cert <chain.pem> --key <key.pem> [--name <name>]';
141
+ const id = certId(idArg);
142
+ if (!id)
143
+ return error(usage);
144
+ const pem = readPemPair(opts, usage);
145
+ if (!pem)
146
+ return;
147
+ const name = opts.name?.trim();
148
+ try {
149
+ const cert = await spinner('Verifying and replacing', () => client.traefik.customCertificates.replace(id, { ...(name ? { name } : {}), ...pem }));
150
+ success(`Certificate #${id} replaced`);
151
+ printSaved(cert);
152
+ }
153
+ catch (err) {
154
+ error(certMessage(err));
155
+ }
156
+ }
157
+ /** `ninedeploy certificates custom delete <id> [--yes]` */
158
+ export async function certificatesCustomDelete(client, idArg, opts = {}) {
159
+ const id = certId(idArg);
160
+ if (!id)
161
+ return error('Usage: ninedeploy certificates custom delete <id> [--yes]');
162
+ if (!opts.yes) {
163
+ const confirm = await prompt(`Type "delete" to remove certificate #${id} (covered domains fall back to ACME)`, '');
164
+ if (confirm.trim() !== 'delete') {
165
+ info('Aborted.');
166
+ return;
167
+ }
168
+ }
169
+ try {
170
+ await spinner('Deleting the certificate', () => client.traefik.customCertificates.delete(id));
171
+ success(`Certificate #${id} deleted`);
172
+ }
173
+ catch (err) {
174
+ error(certMessage(err));
175
+ }
176
+ }
57
177
  //# sourceMappingURL=certificates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"certificates.js","sourceRoot":"","sources":["../../src/commands/certificates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"certificates.js","sourceRoot":"","sources":["../../src/commands/certificates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { DatabaseImportOptions } from '@ninedeploy/sdk';
2
+ import type { NineDeployClient } from '../client.js';
3
+ export interface PublicAccessOptions {
4
+ enable?: boolean;
5
+ disable?: boolean;
6
+ port?: string;
7
+ allow?: string[];
8
+ tls?: string;
9
+ tlsHost?: string;
10
+ }
11
+ /** `ninedeploy databases public-access <id> [...]` — show, enable/update, or disable. */
12
+ export declare function databasePublicAccess(client: NineDeployClient, idArg: string, opts?: PublicAccessOptions): Promise<void>;
13
+ export interface ImportCliOptions {
14
+ file?: string;
15
+ fromS3?: string;
16
+ key?: string;
17
+ clean?: boolean;
18
+ /** commander `--no-single-transaction`: false only when the flag is given. */
19
+ singleTransaction?: boolean;
20
+ drop?: boolean;
21
+ confirmReplace?: boolean;
22
+ /** commander `--no-safety-backup`: false only when the flag is given. */
23
+ safetyBackup?: boolean;
24
+ resume?: string;
25
+ /** commander `--no-wait`. */
26
+ wait?: boolean;
27
+ }
28
+ /** Only the keys the user set: the server refuses keys that do not apply to the engine. */
29
+ export declare function importOptionsFrom(opts: ImportCliOptions): DatabaseImportOptions;
30
+ /** `ninedeploy databases import <id> --file <path> | --from-s3 <destId> --key <key>` */
31
+ export declare function databaseImport(client: NineDeployClient, idArg: string, opts?: ImportCliOptions): Promise<void>;
32
+ /** `ninedeploy databases imports <id> [--watch]` */
33
+ export declare function databaseImports(client: NineDeployClient, idArg: string, opts?: {
34
+ watch?: boolean;
35
+ intervalMs?: number;
36
+ }): Promise<void>;
37
+ //# sourceMappingURL=databaseAccess.d.ts.map