@ninedeploy/schemas 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.
@@ -0,0 +1,220 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Zod schemas for management/admin endpoints that previously used ad-hoc
4
+ * `as { ... }` casts. Centralising them gives consistent 400 validation errors.
5
+ */
6
+ export const rolePatch = z.object({
7
+ role: z.enum(['admin', 'member']),
8
+ });
9
+ // ── Update check (admin) ───────────────────────────────────────────────────
10
+ export const updateCheckResult = z.object({
11
+ current: z.string(),
12
+ /** null when the feed was unreachable or checks are disabled. */
13
+ latest: z.string().nullable(),
14
+ /** null = unknown; otherwise true when latest > current. */
15
+ updateAvailable: z.boolean().nullable(),
16
+ notesUrl: z.string().nullable(),
17
+ checkedAt: z.string().datetime(),
18
+ });
19
+ export const webhookCreate = z.object({
20
+ branch: z.string().max(255).optional(),
21
+ /** Newline/comma-separated globs — deploy only when a changed file matches. */
22
+ watchPaths: z.string().max(4000).optional(),
23
+ });
24
+ export const sourcePatch = z.object({
25
+ name: z.string().min(1).max(100).optional(),
26
+ token: z.string().max(4096).optional(),
27
+ deployKey: z.string().max(16384).optional(),
28
+ registryUsername: z.string().max(255).optional(),
29
+ defaultBranch: z.string().max(255).optional(),
30
+ });
31
+ export const notificationType = z.enum(['telegram', 'webhook', 'discord', 'slack', 'ntfy', 'email']);
32
+ export const notificationChannelCreate = z.object({
33
+ name: z.string().min(1).max(100),
34
+ type: notificationType,
35
+ target: z.string().min(1).max(2048),
36
+ eventFilter: z.string().max(1000).optional(),
37
+ });
38
+ export const notificationChannelPatch = z.object({
39
+ name: z.string().min(1).max(100).optional(),
40
+ target: z.string().min(1).max(2048).optional(),
41
+ eventFilter: z.string().max(1000).optional(),
42
+ active: z.boolean().optional(),
43
+ });
44
+ export const alertMetricEnum = z.enum(['cpu', 'memory', 'cert-expiry']);
45
+ export const alertOperatorEnum = z.enum(['>', '<']);
46
+ export const alertRuleCreate = z
47
+ .object({
48
+ name: z.string().min(1).max(100),
49
+ serviceId: z.number().int().positive().nullable().optional(),
50
+ metric: alertMetricEnum,
51
+ operator: alertOperatorEnum.default('>'),
52
+ threshold: z.number().int(),
53
+ durationWindows: z.number().int().min(1).max(120).default(1),
54
+ enabled: z.boolean().default(true),
55
+ })
56
+ // Certificate expiry is tracked per HOST (the collector samples the ACME
57
+ // store), so a service-scoped rule could never evaluate.
58
+ .refine((r) => r.metric !== 'cert-expiry' || !r.serviceId, {
59
+ message: 'cert-expiry rules are host-wide (omit serviceId)',
60
+ path: ['serviceId'],
61
+ });
62
+ export const alertRulePatch = z
63
+ .object({
64
+ name: z.string().min(1).max(100).optional(),
65
+ serviceId: z.number().int().positive().nullable().optional(),
66
+ metric: alertMetricEnum.optional(),
67
+ operator: alertOperatorEnum.optional(),
68
+ threshold: z.number().int().optional(),
69
+ durationWindows: z.number().int().min(1).max(120).optional(),
70
+ enabled: z.boolean().optional(),
71
+ })
72
+ .refine((r) => r.metric !== 'cert-expiry' || !r.serviceId, {
73
+ message: 'cert-expiry rules are host-wide (omit serviceId)',
74
+ path: ['serviceId'],
75
+ });
76
+ // ── Backup destinations (admin) ────────────────────────────────────────────
77
+ /**
78
+ * Blank region/prefix fall back to the documented defaults (pre-schema
79
+ * behaviour); the endpoint must be an http(s) URL.
80
+ */
81
+ export const backupDestinationCreate = z.object({
82
+ name: z.string().trim().min(1).max(100),
83
+ endpoint: z.string().trim().regex(/^https?:\/\//, 'endpoint must be an http(s) URL'),
84
+ region: z.string().trim().optional().transform((v) => v || 'us-east-1'),
85
+ bucket: z.string().trim().min(1).max(255),
86
+ prefix: z.string().trim().optional().transform((v) => v || 'ninedeploy'),
87
+ accessKeyId: z.string().trim().min(1).max(255),
88
+ secretAccessKey: z.string().min(1).max(4096),
89
+ });
90
+ /**
91
+ * All fields optional; blank strings are accepted here and skipped by the
92
+ * route (patching e.g. `name: " "` is a no-op, not an error).
93
+ */
94
+ export const backupDestinationPatch = z.object({
95
+ name: z.string().max(100).optional(),
96
+ endpoint: z.string().max(2048).optional(),
97
+ region: z.string().max(100).optional(),
98
+ bucket: z.string().max(255).optional(),
99
+ prefix: z.string().max(255).optional(),
100
+ accessKeyId: z.string().max(255).optional(),
101
+ secretAccessKey: z.string().max(4096).optional(),
102
+ active: z.boolean().optional(),
103
+ });
104
+ // ── Remote servers (admin) ─────────────────────────────────────────────────
105
+ /**
106
+ * `host` is a bare hostname (or IP) or host:port. A non-numeric port falls
107
+ * back to the default 4600 (pre-schema behaviour); an out-of-range one is
108
+ * rejected.
109
+ */
110
+ export const serverCreate = z.object({
111
+ name: z.string().trim().min(1).max(100),
112
+ host: z
113
+ .string()
114
+ .trim()
115
+ .regex(/^[A-Za-z0-9][A-Za-z0-9.-]*(:\d+)?$/, 'host must be a hostname or host:port'),
116
+ port: z
117
+ .unknown()
118
+ .optional()
119
+ .transform((v) => Number(v ?? 4600) || 4600)
120
+ .pipe(z.number().int().min(1).max(65535)),
121
+ });
122
+ export const serverAnnounce = z.object({
123
+ name: z.string().trim().min(1).max(100),
124
+ host: z
125
+ .string()
126
+ .trim()
127
+ .regex(/^[A-Za-z0-9][A-Za-z0-9.-]*(:\d+)?$/, 'host must be a hostname or host:port')
128
+ .optional(),
129
+ port: z
130
+ .unknown()
131
+ .optional()
132
+ .transform((v) => Number(v ?? 4600) || 4600)
133
+ .pipe(z.number().int().min(1).max(65535)),
134
+ token: z.string().trim().min(16).max(256),
135
+ });
136
+ export const sshAuthType = z.enum(['key', 'password']);
137
+ export const serverSshTest = z.object({
138
+ host: z.string().trim().min(1).max(255),
139
+ sshPort: z
140
+ .unknown()
141
+ .optional()
142
+ .transform((v) => Number(v ?? 22) || 22)
143
+ .pipe(z.number().int().min(1).max(65535)),
144
+ sshUser: z.string().trim().min(1).max(100).default('root'),
145
+ authType: sshAuthType.default('key'),
146
+ sshKey: z.string().optional(),
147
+ sshPassword: z.string().optional(),
148
+ });
149
+ export const serverSshBootstrap = z.object({
150
+ name: z.string().trim().min(1).max(100),
151
+ host: z.string().trim().min(1).max(255),
152
+ sshPort: z
153
+ .unknown()
154
+ .optional()
155
+ .transform((v) => Number(v ?? 22) || 22)
156
+ .pipe(z.number().int().min(1).max(65535)),
157
+ sshUser: z.string().trim().min(1).max(100).default('root'),
158
+ authType: sshAuthType.default('key'),
159
+ sshKey: z.string().optional(),
160
+ sshPassword: z.string().optional(),
161
+ installDocker: z.boolean().default(true),
162
+ agentPort: z
163
+ .unknown()
164
+ .optional()
165
+ .transform((v) => Number(v ?? 4600) || 4600)
166
+ .pipe(z.number().int().min(1).max(65535)),
167
+ });
168
+ // ── Scheduled jobs ─────────────────────────────────────────────────────────
169
+ /**
170
+ * The cron expression itself is validated with croner at the route (the
171
+ * schema package has no cron dependency); a non-string `command` is ignored
172
+ * (empty string) as before.
173
+ */
174
+ export const jobCreate = z.object({
175
+ name: z.string().trim().min(1).max(100),
176
+ cron: z.string().trim().min(1).max(120),
177
+ kind: z.enum(['deploy', 'exec']).default('deploy'),
178
+ command: z.unknown().optional().transform((v) => (typeof v === 'string' ? v.trim() : '')),
179
+ enabled: z.unknown().optional().transform((v) => v !== false),
180
+ });
181
+ /** Blank strings are accepted and treated as "no change"/cleared by the route. */
182
+ export const jobPatch = z.object({
183
+ name: z.string().optional(),
184
+ cron: z.string().optional(),
185
+ kind: z.enum(['deploy', 'exec']).optional(),
186
+ command: z.string().optional(),
187
+ enabled: z.boolean().optional(),
188
+ });
189
+ // ── Metrics query ──────────────────────────────────────────────────────────
190
+ /**
191
+ * Query params arrive as strings: any `kind` other than "memory" reads as
192
+ * "cpu", and an unusable `minutes` falls back to 60 (clamped to 1..1440).
193
+ */
194
+ export const metricQuery = z.object({
195
+ kind: z.string().optional().transform((k) => (k === 'memory' ? 'memory' : 'cpu')),
196
+ minutes: z
197
+ .unknown()
198
+ .optional()
199
+ .transform((v) => Math.min(Math.max(Number(v ?? 60) || 60, 1), 1440)),
200
+ });
201
+ export const demoSeedResult = z.object({
202
+ ok: z.boolean(),
203
+ projectId: z.number(),
204
+ projectName: z.string(),
205
+ services: z.array(z.object({
206
+ id: z.number(),
207
+ name: z.string(),
208
+ type: z.string(),
209
+ status: z.string(),
210
+ port: z.number().nullable(),
211
+ })),
212
+ database: z
213
+ .object({
214
+ id: z.number(),
215
+ name: z.string(),
216
+ engine: z.string(),
217
+ })
218
+ .nullable(),
219
+ });
220
+ //# sourceMappingURL=management.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"management.js","sourceRoot":"","sources":["../src/management.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Project contracts — the single-level grouping layer over services and
4
+ * databases (Easypanel-style). Projects own nothing directly; deleting one
5
+ * detaches its resources (projectId → null), it never cascades.
6
+ */
7
+ export declare const createProject: z.ZodObject<{
8
+ name: z.ZodString;
9
+ slug: z.ZodOptional<z.ZodString>;
10
+ description: z.ZodOptional<z.ZodString>;
11
+ workspaceId: z.ZodOptional<z.ZodNumber>;
12
+ }, z.core.$strip>;
13
+ export type CreateProject = z.infer<typeof createProject>;
14
+ export type CreateProjectInput = CreateProject;
15
+ export declare const projectPatch: z.ZodObject<{
16
+ name: z.ZodOptional<z.ZodString>;
17
+ description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ workspaceId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
19
+ }, z.core.$strip>;
20
+ export type ProjectPatch = z.infer<typeof projectPatch>;
21
+ export type ProjectPatchInput = ProjectPatch;
22
+ /** Serialized project as returned by /v1/projects. */
23
+ export interface ProjectEntry {
24
+ id: number;
25
+ workspaceId?: number | null;
26
+ name: string;
27
+ slug: string;
28
+ description: string | null;
29
+ serviceCount: number;
30
+ databaseCount: number;
31
+ createdAt: string;
32
+ updatedAt: string;
33
+ }
34
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;GAIG;AAEH,eAAO,MAAM,aAAa;;;;;iBAKxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,MAAM,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAE/C,eAAO,MAAM,YAAY;;;;iBAMoD,CAAC;AAC9E,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AACxD,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAE7C,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,21 @@
1
+ import { z } from 'zod';
2
+ import { slug } from './common.js';
3
+ /**
4
+ * Project contracts — the single-level grouping layer over services and
5
+ * databases (Easypanel-style). Projects own nothing directly; deleting one
6
+ * detaches its resources (projectId → null), it never cascades.
7
+ */
8
+ export const createProject = z.object({
9
+ name: z.string().trim().min(2).max(63),
10
+ slug: slug.optional(),
11
+ description: z.string().trim().max(500).optional(),
12
+ workspaceId: z.number().int().positive().optional(),
13
+ });
14
+ export const projectPatch = z
15
+ .object({
16
+ name: z.string().trim().min(2).max(63).optional(),
17
+ description: z.string().trim().max(500).nullable().optional(),
18
+ workspaceId: z.number().int().positive().nullable().optional(),
19
+ })
20
+ .refine((v) => Object.keys(v).length > 0, { message: 'nothing to update' });
21
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC;;;;GAIG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACtC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;IACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CACpD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACjD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC7D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;CAC/D,CAAC;KACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC"}