@ninedeploy/schemas 0.2.7 → 0.3.4
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/dist/auth.d.ts +19 -14
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +18 -4
- package/dist/auth.js.map +1 -1
- package/dist/common.d.ts +18 -0
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +47 -0
- package/dist/common.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/insights.d.ts +110 -0
- package/dist/insights.d.ts.map +1 -0
- package/dist/insights.js +64 -0
- package/dist/insights.js.map +1 -0
- package/dist/labels.d.ts +108 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +70 -0
- package/dist/labels.js.map +1 -0
- package/dist/management.d.ts +36 -7
- package/dist/management.d.ts.map +1 -1
- package/dist/management.js +58 -9
- package/dist/management.js.map +1 -1
- package/dist/ninedeployManifest.d.ts +292 -0
- package/dist/ninedeployManifest.d.ts.map +1 -0
- package/dist/ninedeployManifest.js +284 -0
- package/dist/ninedeployManifest.js.map +1 -0
- package/dist/project.d.ts +4 -2
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +2 -2
- package/dist/project.js.map +1 -1
- package/dist/runtimeVersions.d.ts +102 -0
- package/dist/runtimeVersions.d.ts.map +1 -0
- package/dist/runtimeVersions.js +153 -0
- package/dist/runtimeVersions.js.map +1 -0
- package/dist/secretScan.d.ts +52 -0
- package/dist/secretScan.d.ts.map +1 -0
- package/dist/secretScan.js +125 -0
- package/dist/secretScan.js.map +1 -0
- package/dist/service.d.ts +121 -4
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +151 -11
- package/dist/service.js.map +1 -1
- package/dist/workspaces.d.ts +49 -0
- package/dist/workspaces.d.ts.map +1 -1
- package/dist/workspaces.js +9 -0
- package/dist/workspaces.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { envVarName, httpPath, repoBaseDir, slug } from './common.js';
|
|
3
|
+
/**
|
|
4
|
+
* `.ninedeploy` manifest schema — project-side declarative config for how
|
|
5
|
+
* NineDeploy should build, run and route a service. Committed to the repo,
|
|
6
|
+
* so it must NEVER carry secrets, tokens or connection strings; the loader
|
|
7
|
+
* enforces that with a regex scan (see apps/server/src/lib/secretScan.ts).
|
|
8
|
+
*
|
|
9
|
+
* Merge precedence at apply time: panel/DB > manifest > auto-detect. The
|
|
10
|
+
* manifest fills empty panel fields; an operator who explicitly set something
|
|
11
|
+
* in the panel wins.
|
|
12
|
+
*/
|
|
13
|
+
// ── Runtime ────────────────────────────────────────────────────────────────
|
|
14
|
+
export const runtimeType = z.enum([
|
|
15
|
+
'auto',
|
|
16
|
+
'node',
|
|
17
|
+
'python',
|
|
18
|
+
'go',
|
|
19
|
+
'ruby',
|
|
20
|
+
'php',
|
|
21
|
+
'java',
|
|
22
|
+
'rust',
|
|
23
|
+
'static',
|
|
24
|
+
]);
|
|
25
|
+
export const runtime = z
|
|
26
|
+
.object({
|
|
27
|
+
type: runtimeType.default('auto'),
|
|
28
|
+
/**
|
|
29
|
+
* Pinned language version. Format `<major>` or `<major>.<minor>` or
|
|
30
|
+
* `<major>.<minor>.<patch>`. For example `20`, `20.18`, `3.12`.
|
|
31
|
+
*/
|
|
32
|
+
version: z
|
|
33
|
+
.string()
|
|
34
|
+
.regex(/^\d+(?:\.\d+){0,2}$/, 'must be a numeric version like 20 or 3.12')
|
|
35
|
+
.max(20)
|
|
36
|
+
.optional(),
|
|
37
|
+
})
|
|
38
|
+
.strict();
|
|
39
|
+
// ── Build ──────────────────────────────────────────────────────────────────
|
|
40
|
+
export const build = z
|
|
41
|
+
.object({
|
|
42
|
+
install: z.string().min(1).max(500).optional(),
|
|
43
|
+
build: z.string().min(1).max(500).optional(),
|
|
44
|
+
start: z.string().min(1).max(500).optional(),
|
|
45
|
+
baseDir: repoBaseDir.optional(),
|
|
46
|
+
dockerfile: z.string().min(1).max(200).optional(),
|
|
47
|
+
})
|
|
48
|
+
.strict();
|
|
49
|
+
// ── Run ────────────────────────────────────────────────────────────────────
|
|
50
|
+
export const restartPolicy = z
|
|
51
|
+
.union([
|
|
52
|
+
z.enum(['no', 'always', 'unless-stopped']),
|
|
53
|
+
z
|
|
54
|
+
.string()
|
|
55
|
+
.regex(/^on-failure(?::[1-9]\d{0,2})?$/, 'must be on-failure or on-failure:N (1-999, no leading zero)'),
|
|
56
|
+
])
|
|
57
|
+
.optional();
|
|
58
|
+
export const run = z
|
|
59
|
+
.object({
|
|
60
|
+
port: z.number().int().min(1).max(65535).optional(),
|
|
61
|
+
healthcheck: httpPath.optional(),
|
|
62
|
+
restart: restartPolicy,
|
|
63
|
+
})
|
|
64
|
+
.strict();
|
|
65
|
+
// ── Static ─────────────────────────────────────────────────────────────────
|
|
66
|
+
const noTraversalSegments = (value) => !value.split('/').some((segment) => segment === '..' || segment === '.');
|
|
67
|
+
const isRelativePath = (value) => !value.startsWith('/');
|
|
68
|
+
export const staticConfig = z
|
|
69
|
+
.object({
|
|
70
|
+
spa: z.boolean().default(false),
|
|
71
|
+
root: z
|
|
72
|
+
.string()
|
|
73
|
+
.min(1)
|
|
74
|
+
.max(200)
|
|
75
|
+
.regex(/^[A-Za-z0-9._/-]+$/, 'must be a relative path with allowed characters')
|
|
76
|
+
.refine(noTraversalSegments, { message: 'path must not contain . or .. segments' })
|
|
77
|
+
.refine(isRelativePath, { message: 'path must be relative (no leading "/")' })
|
|
78
|
+
.optional(),
|
|
79
|
+
})
|
|
80
|
+
.strict();
|
|
81
|
+
// ── Env ────────────────────────────────────────────────────────────────────
|
|
82
|
+
export const env = z
|
|
83
|
+
.object({
|
|
84
|
+
/** Required env var names. Values stay in the panel's env vault. */
|
|
85
|
+
required: z.array(envVarName.max(100)).max(100).default([]),
|
|
86
|
+
/** Managed-DB attach alias: env-key → attachment-env-key. */
|
|
87
|
+
aliases: z.record(z.string(), envVarName).optional(),
|
|
88
|
+
})
|
|
89
|
+
.strict();
|
|
90
|
+
// ── Phases (Nixpacks ince ayar) ────────────────────────────────────────────
|
|
91
|
+
export const phases = z
|
|
92
|
+
.object({
|
|
93
|
+
setup: z
|
|
94
|
+
.object({
|
|
95
|
+
pkgs: z.array(z.string().min(1).max(100)).max(50).default([]),
|
|
96
|
+
})
|
|
97
|
+
.strict()
|
|
98
|
+
.optional(),
|
|
99
|
+
build: z
|
|
100
|
+
.object({
|
|
101
|
+
cmds: z.array(z.string().min(1).max(500)).max(20).default([]),
|
|
102
|
+
})
|
|
103
|
+
.strict()
|
|
104
|
+
.optional(),
|
|
105
|
+
})
|
|
106
|
+
.strict();
|
|
107
|
+
// ── Resources ──────────────────────────────────────────────────────────────
|
|
108
|
+
export const resources = z
|
|
109
|
+
.object({
|
|
110
|
+
cpuShares: z.number().int().min(0).max(262144).optional(),
|
|
111
|
+
memMb: z.number().int().min(0).max(1_048_576).optional(),
|
|
112
|
+
})
|
|
113
|
+
.strict();
|
|
114
|
+
// ── Hooks ──────────────────────────────────────────────────────────────────
|
|
115
|
+
export const hooks = z
|
|
116
|
+
.object({
|
|
117
|
+
preBuild: z.string().min(1).max(500).optional(),
|
|
118
|
+
postBuild: z.string().min(1).max(500).optional(),
|
|
119
|
+
preStop: z.string().min(1).max(500).optional(),
|
|
120
|
+
})
|
|
121
|
+
.strict();
|
|
122
|
+
// ── Watch (monorepo) ──────────────────────────────────────────────────────
|
|
123
|
+
export const watch = z
|
|
124
|
+
.object({
|
|
125
|
+
paths: z.array(z.string().min(1).max(200)).max(50).default([]),
|
|
126
|
+
})
|
|
127
|
+
.strict();
|
|
128
|
+
// ── Routes ─────────────────────────────────────────────────────────────────
|
|
129
|
+
export const rateLimit = z
|
|
130
|
+
.object({
|
|
131
|
+
average: z.number().int().min(0).max(100_000),
|
|
132
|
+
burst: z.number().int().min(0).max(100_000),
|
|
133
|
+
})
|
|
134
|
+
.strict();
|
|
135
|
+
export const route = z
|
|
136
|
+
.object({
|
|
137
|
+
host: z
|
|
138
|
+
.string()
|
|
139
|
+
.min(3)
|
|
140
|
+
.max(253)
|
|
141
|
+
.regex(/^(?=.{1,253}$)(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)(?:\.(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?))*$/, 'must be a valid hostname'),
|
|
142
|
+
path: z
|
|
143
|
+
.string()
|
|
144
|
+
.min(1)
|
|
145
|
+
.max(200)
|
|
146
|
+
.regex(/^\/.*$/, 'must start with "/"')
|
|
147
|
+
.default('/'),
|
|
148
|
+
ssl: z.boolean().default(true),
|
|
149
|
+
redirectWww: z.boolean().optional(),
|
|
150
|
+
headers: z.record(z.string().min(1).max(200), z.string().min(1).max(2000)).optional(),
|
|
151
|
+
ipAllowlist: z
|
|
152
|
+
.array(z
|
|
153
|
+
.string()
|
|
154
|
+
.min(1)
|
|
155
|
+
.max(64)
|
|
156
|
+
.regex(/^[\d./]+$/, 'must be a CIDR like 1.2.3.4/32'))
|
|
157
|
+
.max(50)
|
|
158
|
+
.optional(),
|
|
159
|
+
rateLimit: rateLimit.optional(),
|
|
160
|
+
})
|
|
161
|
+
.strict();
|
|
162
|
+
// ── Previews ──────────────────────────────────────────────────────────────
|
|
163
|
+
export const previews = z
|
|
164
|
+
.object({
|
|
165
|
+
enabled: z.boolean().default(false),
|
|
166
|
+
/**
|
|
167
|
+
* Hostname template. `{n}` is replaced by the PR number. Example:
|
|
168
|
+
* `pr-{n}.previews.example.com`. Must contain `{n}` when enabled.
|
|
169
|
+
*/
|
|
170
|
+
pattern: z
|
|
171
|
+
.string()
|
|
172
|
+
.min(1)
|
|
173
|
+
.max(200)
|
|
174
|
+
.regex(/^[A-Za-z0-9._/{}*-]+$/, 'must be a hostname template (letters, digits, dot, dash, underscore, slash, brace, asterisk)')
|
|
175
|
+
.refine(noTraversalSegments, { message: 'pattern must not contain . or .. segments' })
|
|
176
|
+
.optional(),
|
|
177
|
+
maxActive: z.number().int().min(1).max(50).default(5),
|
|
178
|
+
autoDestroyOnClose: z.boolean().default(true),
|
|
179
|
+
})
|
|
180
|
+
.strict()
|
|
181
|
+
.refine((p) => !p.enabled || (p.pattern != null && p.pattern.includes('{n}')), {
|
|
182
|
+
message: 'previews.pattern must contain {n} when previews.enabled is true',
|
|
183
|
+
path: ['pattern'],
|
|
184
|
+
});
|
|
185
|
+
// ── Volume ────────────────────────────────────────────────────────────────
|
|
186
|
+
export const volumeBackups = z
|
|
187
|
+
.object({
|
|
188
|
+
schedule: z
|
|
189
|
+
.string()
|
|
190
|
+
.min(1)
|
|
191
|
+
.max(100)
|
|
192
|
+
.regex(/^[\d*\/,\-A-Za-z\s]+$/, 'must look like a cron expression (digits, *, /, comma, dash, letters, space)'),
|
|
193
|
+
retention: z.number().int().min(1).max(365).default(7),
|
|
194
|
+
})
|
|
195
|
+
.strict();
|
|
196
|
+
export const volume = z
|
|
197
|
+
.object({
|
|
198
|
+
mount: z
|
|
199
|
+
.string()
|
|
200
|
+
.min(1)
|
|
201
|
+
.max(200)
|
|
202
|
+
.regex(/^[A-Za-z0-9._/-]+$/, 'must be a path inside the container')
|
|
203
|
+
.refine(noTraversalSegments, { message: 'mount must not contain . or .. segments' })
|
|
204
|
+
.optional(),
|
|
205
|
+
backups: volumeBackups.optional(),
|
|
206
|
+
})
|
|
207
|
+
.strict();
|
|
208
|
+
// ── Database (managed DB attach hint) ─────────────────────────────────────
|
|
209
|
+
export const database = z
|
|
210
|
+
.object({
|
|
211
|
+
ref: slug,
|
|
212
|
+
env: envVarName,
|
|
213
|
+
})
|
|
214
|
+
.strict();
|
|
215
|
+
// ── Network ───────────────────────────────────────────────────────────────
|
|
216
|
+
export const network = z
|
|
217
|
+
.object({
|
|
218
|
+
publishPort: z.number().int().min(1).max(65535).optional(),
|
|
219
|
+
aliases: z.array(z.string().min(1).max(100).regex(/^[A-Za-z0-9._-]+$/)).max(20).default([]),
|
|
220
|
+
})
|
|
221
|
+
.strict();
|
|
222
|
+
// ── Notifications (channel-name references) ──────────────────────────────
|
|
223
|
+
export const notifications = z
|
|
224
|
+
.object({
|
|
225
|
+
onDeploy: z.array(z.string().min(1).max(100)).max(20).default([]),
|
|
226
|
+
onFailure: z.array(z.string().min(1).max(100)).max(20).default([]),
|
|
227
|
+
onAlert: z.array(z.string().min(1).max(100)).max(20).default([]),
|
|
228
|
+
})
|
|
229
|
+
.strict();
|
|
230
|
+
// ── Alerts ────────────────────────────────────────────────────────────────
|
|
231
|
+
export const alertWhen = z.enum([
|
|
232
|
+
'deployFailed',
|
|
233
|
+
'restartLoop',
|
|
234
|
+
'highMemory',
|
|
235
|
+
'highCpu',
|
|
236
|
+
'certExpiry',
|
|
237
|
+
]);
|
|
238
|
+
export const alert = z
|
|
239
|
+
.object({
|
|
240
|
+
when: alertWhen,
|
|
241
|
+
channel: z.string().min(1).max(100),
|
|
242
|
+
thresholdPct: z.number().int().min(1).max(100).optional(),
|
|
243
|
+
})
|
|
244
|
+
.strict()
|
|
245
|
+
.refine((a) => a.when !== 'highMemory' && a.when !== 'highCpu' ? true : a.thresholdPct != null, {
|
|
246
|
+
message: 'thresholdPct is required for highMemory/highCpu alerts',
|
|
247
|
+
path: ['thresholdPct'],
|
|
248
|
+
});
|
|
249
|
+
// ── Top-level manifest ────────────────────────────────────────────────────
|
|
250
|
+
export const ninedeployManifest = z
|
|
251
|
+
.object({
|
|
252
|
+
version: z.literal('1'),
|
|
253
|
+
runtime: runtime.optional(),
|
|
254
|
+
build: build.optional(),
|
|
255
|
+
run: run.optional(),
|
|
256
|
+
static: staticConfig.optional(),
|
|
257
|
+
env: env.optional(),
|
|
258
|
+
phases: phases.optional(),
|
|
259
|
+
resources: resources.optional(),
|
|
260
|
+
hooks: hooks.optional(),
|
|
261
|
+
watch: watch.optional(),
|
|
262
|
+
routes: z.array(route).max(50).optional(),
|
|
263
|
+
previews: previews.optional(),
|
|
264
|
+
volume: volume.optional(),
|
|
265
|
+
database: database.optional(),
|
|
266
|
+
network: network.optional(),
|
|
267
|
+
notifications: notifications.optional(),
|
|
268
|
+
alerts: z.array(alert).max(20).optional(),
|
|
269
|
+
})
|
|
270
|
+
.strict();
|
|
271
|
+
/**
|
|
272
|
+
* The list of filenames the loader checks, in priority order. The first one
|
|
273
|
+
* found in the repo root is used.
|
|
274
|
+
*/
|
|
275
|
+
export const NINEDEPLOY_MANIFEST_FILENAMES = [
|
|
276
|
+
'.ninedeploy',
|
|
277
|
+
'.ninedeploy.yml',
|
|
278
|
+
'.ninedeploy.yaml',
|
|
279
|
+
'ninedeploy.yml',
|
|
280
|
+
'ninedeploy.yaml',
|
|
281
|
+
];
|
|
282
|
+
/** Maximum allowed size of a `.ninedeploy` file (bytes). Larger files are refused. */
|
|
283
|
+
export const NINEDEPLOY_MANIFEST_MAX_BYTES = 16 * 1024;
|
|
284
|
+
//# sourceMappingURL=ninedeployManifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ninedeployManifest.js","sourceRoot":"","sources":["../src/ninedeployManifest.ts"],"names":[],"mappings":"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"}
|
package/dist/project.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import { z } from 'zod';
|
|
|
7
7
|
export declare const createProject: z.ZodObject<{
|
|
8
8
|
name: z.ZodString;
|
|
9
9
|
slug: z.ZodOptional<z.ZodString>;
|
|
10
|
-
description: z.ZodOptional<z.ZodString
|
|
11
|
-
workspaceId: z.ZodOptional<z.ZodNumber
|
|
10
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
11
|
+
workspaceId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
12
12
|
}, z.core.$strip>;
|
|
13
13
|
export type CreateProject = z.infer<typeof createProject>;
|
|
14
14
|
export type CreateProjectInput = CreateProject;
|
|
@@ -23,6 +23,8 @@ export type ProjectPatchInput = ProjectPatch;
|
|
|
23
23
|
export interface ProjectEntry {
|
|
24
24
|
id: number;
|
|
25
25
|
workspaceId?: number | null;
|
|
26
|
+
/** Display name of the owning workspace. Resolved server-side. */
|
|
27
|
+
workspaceName?: string | null;
|
|
26
28
|
name: string;
|
|
27
29
|
slug: string;
|
|
28
30
|
description: string | null;
|
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +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"}
|
|
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,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,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"}
|
package/dist/project.js
CHANGED
|
@@ -8,8 +8,8 @@ import { slug } from './common.js';
|
|
|
8
8
|
export const createProject = z.object({
|
|
9
9
|
name: z.string().trim().min(2).max(63),
|
|
10
10
|
slug: slug.optional(),
|
|
11
|
-
description: z.string().trim().max(500).optional(),
|
|
12
|
-
workspaceId: z.number().int().positive().optional(),
|
|
11
|
+
description: z.string().trim().max(500).nullable().optional(),
|
|
12
|
+
workspaceId: z.number().int().positive().nullable().optional(),
|
|
13
13
|
});
|
|
14
14
|
export const projectPatch = z
|
|
15
15
|
.object({
|
package/dist/project.js.map
CHANGED
|
@@ -1 +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;
|
|
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,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,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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Curated runtime version catalog — the single source of truth for every
|
|
3
|
+
* language version NineDeploy suggests anywhere in the product (Manifest
|
|
4
|
+
* Creator presets, the CLI's `starterManifest`, the runtime version picker).
|
|
5
|
+
*
|
|
6
|
+
* Why this file exists: these versions used to be hand-written literals
|
|
7
|
+
* duplicated across `apps/web` and `packages/sdk`. Nobody owned them, so
|
|
8
|
+
* they drifted until the shipped defaults pinned runtimes that had gone
|
|
9
|
+
* end-of-life. Everything now derives from this one table.
|
|
10
|
+
*
|
|
11
|
+
* The catalog is *advisory*, never a constraint. `runtime.version` in the
|
|
12
|
+
* manifest schema stays free-form (`^\d+(?:\.\d+){0,2}$`), so an operator
|
|
13
|
+
* can pin any version their build needs — including an EOL one. What the
|
|
14
|
+
* catalog buys us is a sensible default plus an honest warning when the
|
|
15
|
+
* pinned version is no longer supported upstream.
|
|
16
|
+
*
|
|
17
|
+
* ── Maintaining this file ────────────────────────────────────────────────
|
|
18
|
+
* Bump `RUNTIME_CATALOG_REVIEWED` whenever you touch the table, and check
|
|
19
|
+
* it against upstream release schedules:
|
|
20
|
+
* Node https://nodejs.org/en/about/previous-releases
|
|
21
|
+
* Python https://devguide.python.org/versions/
|
|
22
|
+
* Go https://go.dev/doc/devel/release
|
|
23
|
+
* Ruby https://www.ruby-lang.org/en/downloads/branches/
|
|
24
|
+
* PHP https://www.php.net/supported-versions.php
|
|
25
|
+
* Java https://adoptium.net/support/
|
|
26
|
+
* Rust https://www.rust-lang.org/
|
|
27
|
+
*/
|
|
28
|
+
import type { RuntimeType } from './ninedeployManifest.js';
|
|
29
|
+
/**
|
|
30
|
+
* ISO date the table below was last checked against upstream schedules.
|
|
31
|
+
* Surfaced in the UI so a stale catalog is visible rather than silent.
|
|
32
|
+
*/
|
|
33
|
+
export declare const RUNTIME_CATALOG_REVIEWED = "2026-08-26";
|
|
34
|
+
/**
|
|
35
|
+
* Upstream support state of a version, ordered from healthiest to worst.
|
|
36
|
+
*
|
|
37
|
+
* - `current` — newest stable release; ahead of the recommended pin.
|
|
38
|
+
* - `lts` — long-term-support line; the safe production choice.
|
|
39
|
+
* - `maintenance` — still supported, but no longer the primary line.
|
|
40
|
+
* - `security` — security fixes only; no bug fixes.
|
|
41
|
+
* - `eol` — unsupported upstream. Usable, but nothing gets patched.
|
|
42
|
+
*/
|
|
43
|
+
export type RuntimeSupport = 'current' | 'lts' | 'maintenance' | 'security' | 'eol';
|
|
44
|
+
export interface RuntimeVersionOption {
|
|
45
|
+
/** Value written into `runtime.version` — matches the manifest regex. */
|
|
46
|
+
version: string;
|
|
47
|
+
/** Human label for the picker, e.g. "24 — Active LTS". */
|
|
48
|
+
label: string;
|
|
49
|
+
support: RuntimeSupport;
|
|
50
|
+
/** ISO date support ends (or ended). Omitted when upstream has not set one. */
|
|
51
|
+
eol?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface RuntimeVersionCatalogEntry {
|
|
54
|
+
/** Display name used in advisory messages, e.g. "Node.js". */
|
|
55
|
+
name: string;
|
|
56
|
+
/** The version presets and the "recommended" hint use. Must appear in `options`. */
|
|
57
|
+
recommended: string;
|
|
58
|
+
/** Newest first — the picker renders them in this order. */
|
|
59
|
+
options: readonly RuntimeVersionOption[];
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Versions offered per runtime. Only runtimes we can meaningfully pin appear
|
|
63
|
+
* here; `auto` and `static` have no version axis and are absent by design.
|
|
64
|
+
*
|
|
65
|
+
* Each list keeps a couple of EOL entries on purpose: teams migrating an
|
|
66
|
+
* existing app need to reproduce their current runtime before they can move
|
|
67
|
+
* off it, and an undocumented version they have to guess at is worse than a
|
|
68
|
+
* documented one carrying a warning.
|
|
69
|
+
*/
|
|
70
|
+
export declare const RUNTIME_VERSION_CATALOG: Partial<Record<RuntimeType, RuntimeVersionCatalogEntry>>;
|
|
71
|
+
/** Versions offered for a runtime type. Empty for types with no version axis. */
|
|
72
|
+
export declare function runtimeVersionOptions(type: RuntimeType): readonly RuntimeVersionOption[];
|
|
73
|
+
/**
|
|
74
|
+
* The version presets pin for a runtime, or `undefined` when the type has no
|
|
75
|
+
* version axis (`auto`, `static`) — in which case the manifest should omit
|
|
76
|
+
* `runtime.version` entirely and let Nixpacks decide.
|
|
77
|
+
*/
|
|
78
|
+
export declare function recommendedRuntimeVersion(type: RuntimeType): string | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Resolve an operator-typed version to its catalog entry.
|
|
81
|
+
*
|
|
82
|
+
* Matching is longest-prefix on dot boundaries, so `20.18.1` resolves to
|
|
83
|
+
* Node's `20` entry and `3.12.4` to Python's `3.12` — pinning a patch
|
|
84
|
+
* release still yields the right support status. The dot boundary is what
|
|
85
|
+
* keeps `2` from matching `20`.
|
|
86
|
+
*/
|
|
87
|
+
export declare function findRuntimeVersion(type: RuntimeType, version: string): RuntimeVersionOption | undefined;
|
|
88
|
+
/** A note to show next to the version field. `error` is not a blocker — only a warning. */
|
|
89
|
+
export interface RuntimeVersionAdvisory {
|
|
90
|
+
level: 'error' | 'warn' | 'info';
|
|
91
|
+
message: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Describe the health of a pinned version, or `null` when there is nothing
|
|
95
|
+
* worth saying (supported version, no version pinned, runtime with no
|
|
96
|
+
* version axis).
|
|
97
|
+
*
|
|
98
|
+
* Deliberately never rejects: an EOL pin is a warning, not an error, because
|
|
99
|
+
* reproducing a legacy runtime is a legitimate reason to deploy one.
|
|
100
|
+
*/
|
|
101
|
+
export declare function runtimeVersionAdvisory(type: RuntimeType, version: string | undefined): RuntimeVersionAdvisory | null;
|
|
102
|
+
//# sourceMappingURL=runtimeVersions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeVersions.d.ts","sourceRoot":"","sources":["../src/runtimeVersions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,wBAAwB,eAAe,CAAC;AAErD;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,KAAK,GAAG,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,CAAC;IACxB,+EAA+E;IAC/E,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,0BAA0B;IACzC,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;CAC1C;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,0BAA0B,CAAC,CA4E5F,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,oBAAoB,EAAE,CAExF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GACd,oBAAoB,GAAG,SAAS,CAIlC;AAED,2FAA2F;AAC3F,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,sBAAsB,GAAG,IAAI,CA+B/B"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISO date the table below was last checked against upstream schedules.
|
|
3
|
+
* Surfaced in the UI so a stale catalog is visible rather than silent.
|
|
4
|
+
*/
|
|
5
|
+
export const RUNTIME_CATALOG_REVIEWED = '2026-08-26';
|
|
6
|
+
/**
|
|
7
|
+
* Versions offered per runtime. Only runtimes we can meaningfully pin appear
|
|
8
|
+
* here; `auto` and `static` have no version axis and are absent by design.
|
|
9
|
+
*
|
|
10
|
+
* Each list keeps a couple of EOL entries on purpose: teams migrating an
|
|
11
|
+
* existing app need to reproduce their current runtime before they can move
|
|
12
|
+
* off it, and an undocumented version they have to guess at is worse than a
|
|
13
|
+
* documented one carrying a warning.
|
|
14
|
+
*/
|
|
15
|
+
export const RUNTIME_VERSION_CATALOG = {
|
|
16
|
+
node: {
|
|
17
|
+
name: 'Node.js',
|
|
18
|
+
recommended: '24',
|
|
19
|
+
options: [
|
|
20
|
+
{ version: '26', label: '26 — Current', support: 'current', eol: '2029-04-30' },
|
|
21
|
+
{ version: '24', label: '24 — Active LTS', support: 'lts', eol: '2028-04-30' },
|
|
22
|
+
{ version: '22', label: '22 — Maintenance LTS', support: 'maintenance', eol: '2027-04-30' },
|
|
23
|
+
{ version: '20', label: '20 — end-of-life', support: 'eol', eol: '2026-04-30' },
|
|
24
|
+
{ version: '18', label: '18 — end-of-life', support: 'eol', eol: '2025-04-30' },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
python: {
|
|
28
|
+
name: 'Python',
|
|
29
|
+
recommended: '3.14',
|
|
30
|
+
options: [
|
|
31
|
+
{ version: '3.14', label: '3.14 — latest stable', support: 'current', eol: '2030-10-31' },
|
|
32
|
+
{ version: '3.13', label: '3.13 — bugfix', support: 'maintenance', eol: '2029-10-31' },
|
|
33
|
+
{ version: '3.12', label: '3.12 — security fixes only', support: 'security', eol: '2028-10-31' },
|
|
34
|
+
{ version: '3.11', label: '3.11 — security fixes only', support: 'security', eol: '2027-10-31' },
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
go: {
|
|
38
|
+
name: 'Go',
|
|
39
|
+
recommended: '1.27',
|
|
40
|
+
options: [
|
|
41
|
+
{ version: '1.27', label: '1.27 — latest stable', support: 'current' },
|
|
42
|
+
{ version: '1.26', label: '1.26 — supported', support: 'maintenance' },
|
|
43
|
+
{ version: '1.25', label: '1.25 — end-of-life', support: 'eol' },
|
|
44
|
+
{ version: '1.24', label: '1.24 — end-of-life', support: 'eol' },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
ruby: {
|
|
48
|
+
name: 'Ruby',
|
|
49
|
+
recommended: '3.4',
|
|
50
|
+
options: [
|
|
51
|
+
{ version: '4.0', label: '4.0 — latest stable', support: 'current' },
|
|
52
|
+
{ version: '3.4', label: '3.4 — normal maintenance', support: 'maintenance' },
|
|
53
|
+
{ version: '3.3', label: '3.3 — security fixes only', support: 'security', eol: '2027-03-31' },
|
|
54
|
+
{ version: '3.2', label: '3.2 — end-of-life', support: 'eol', eol: '2026-04-01' },
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
php: {
|
|
58
|
+
name: 'PHP',
|
|
59
|
+
recommended: '8.4',
|
|
60
|
+
options: [
|
|
61
|
+
{ version: '8.5', label: '8.5 — active support', support: 'current', eol: '2029-12-31' },
|
|
62
|
+
{ version: '8.4', label: '8.4 — active support', support: 'maintenance', eol: '2028-12-31' },
|
|
63
|
+
{ version: '8.3', label: '8.3 — security fixes only', support: 'security', eol: '2027-12-31' },
|
|
64
|
+
{ version: '8.2', label: '8.2 — security fixes only', support: 'security', eol: '2026-12-31' },
|
|
65
|
+
{ version: '8.1', label: '8.1 — end-of-life', support: 'eol', eol: '2025-12-31' },
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
java: {
|
|
69
|
+
name: 'Java',
|
|
70
|
+
recommended: '25',
|
|
71
|
+
options: [
|
|
72
|
+
{ version: '26', label: '26 — latest feature release (non-LTS)', support: 'current' },
|
|
73
|
+
{ version: '25', label: '25 — LTS', support: 'lts', eol: '2031-09-30' },
|
|
74
|
+
{ version: '21', label: '21 — LTS', support: 'lts', eol: '2029-12-31' },
|
|
75
|
+
{ version: '17', label: '17 — LTS', support: 'maintenance', eol: '2027-10-31' },
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
rust: {
|
|
79
|
+
name: 'Rust',
|
|
80
|
+
// Rust ships a new stable every six weeks and backports nothing, so any
|
|
81
|
+
// version below the newest stable is unsupported by definition. Expect
|
|
82
|
+
// this list to need a bump more often than the others.
|
|
83
|
+
recommended: '1.98',
|
|
84
|
+
options: [
|
|
85
|
+
{ version: '1.98', label: '1.98 — latest stable', support: 'current' },
|
|
86
|
+
{ version: '1.97', label: '1.97 — superseded', support: 'eol' },
|
|
87
|
+
{ version: '1.96', label: '1.96 — superseded', support: 'eol' },
|
|
88
|
+
{ version: '1.95', label: '1.95 — superseded', support: 'eol' },
|
|
89
|
+
],
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
/** Versions offered for a runtime type. Empty for types with no version axis. */
|
|
93
|
+
export function runtimeVersionOptions(type) {
|
|
94
|
+
return RUNTIME_VERSION_CATALOG[type]?.options ?? [];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The version presets pin for a runtime, or `undefined` when the type has no
|
|
98
|
+
* version axis (`auto`, `static`) — in which case the manifest should omit
|
|
99
|
+
* `runtime.version` entirely and let Nixpacks decide.
|
|
100
|
+
*/
|
|
101
|
+
export function recommendedRuntimeVersion(type) {
|
|
102
|
+
return RUNTIME_VERSION_CATALOG[type]?.recommended;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Resolve an operator-typed version to its catalog entry.
|
|
106
|
+
*
|
|
107
|
+
* Matching is longest-prefix on dot boundaries, so `20.18.1` resolves to
|
|
108
|
+
* Node's `20` entry and `3.12.4` to Python's `3.12` — pinning a patch
|
|
109
|
+
* release still yields the right support status. The dot boundary is what
|
|
110
|
+
* keeps `2` from matching `20`.
|
|
111
|
+
*/
|
|
112
|
+
export function findRuntimeVersion(type, version) {
|
|
113
|
+
return [...runtimeVersionOptions(type)]
|
|
114
|
+
.sort((a, b) => b.version.length - a.version.length)
|
|
115
|
+
.find((o) => version === o.version || version.startsWith(`${o.version}.`));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Describe the health of a pinned version, or `null` when there is nothing
|
|
119
|
+
* worth saying (supported version, no version pinned, runtime with no
|
|
120
|
+
* version axis).
|
|
121
|
+
*
|
|
122
|
+
* Deliberately never rejects: an EOL pin is a warning, not an error, because
|
|
123
|
+
* reproducing a legacy runtime is a legitimate reason to deploy one.
|
|
124
|
+
*/
|
|
125
|
+
export function runtimeVersionAdvisory(type, version) {
|
|
126
|
+
const entry = RUNTIME_VERSION_CATALOG[type];
|
|
127
|
+
if (!entry || !version)
|
|
128
|
+
return null;
|
|
129
|
+
const match = findRuntimeVersion(type, version);
|
|
130
|
+
if (!match) {
|
|
131
|
+
return {
|
|
132
|
+
level: 'info',
|
|
133
|
+
message: `${entry.name} ${version} is not in NineDeploy's catalog (last reviewed ${RUNTIME_CATALOG_REVIEWED}). The build will still try it — Nixpacks resolves the version itself.`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// One shared clause for both levels: upstream dates are a label, not a
|
|
137
|
+
// tense, so the same wording works whether the date is past or future.
|
|
138
|
+
const support = match.eol ? ` Upstream support: ${match.eol}.` : '';
|
|
139
|
+
if (match.support === 'eol') {
|
|
140
|
+
return {
|
|
141
|
+
level: 'error',
|
|
142
|
+
message: `${entry.name} ${match.version} is end-of-life and no longer receives security patches. You can still deploy it — ${entry.recommended} is the recommended pin.${support}`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (match.support === 'security') {
|
|
146
|
+
return {
|
|
147
|
+
level: 'warn',
|
|
148
|
+
message: `${entry.name} ${match.version} receives security fixes only — no bug fixes. Recommended pin: ${entry.recommended}.${support}`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=runtimeVersions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeVersions.js","sourceRoot":"","sources":["../src/runtimeVersions.ts"],"names":[],"mappings":"AA6BA;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC;AAgCrD;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA6D;IAC/F,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;YAC/E,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;YAC9E,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE;YAC3F,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;YAC/E,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;SAChF;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;YACzF,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE;YACtF,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,4BAA4B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE;YAChG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,4BAA4B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE;SACjG;KACF;IACD,EAAE,EAAE;QACF,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,EAAE;YACtE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,aAAa,EAAE;YACtE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE;YAChE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE;SACjE;KACF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE;YACpE,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,OAAO,EAAE,aAAa,EAAE;YAC7E,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE;YAC9F,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;SAClF;KACF;IACD,GAAG,EAAE;QACH,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,KAAK;QAClB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE;YACxF,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE;YAC5F,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE;YAC9F,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,2BAA2B,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE;YAC9F,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;SAClF;KACF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,IAAI;QACjB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uCAAuC,EAAE,OAAO,EAAE,SAAS,EAAE;YACrF,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;YACvE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE;YACvE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE;SAChF;KACF;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM;QACZ,wEAAwE;QACxE,uEAAuE;QACvE,uDAAuD;QACvD,WAAW,EAAE,MAAM;QACnB,OAAO,EAAE;YACP,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,SAAS,EAAE;YACtE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE;YAC/D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE;YAC/D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE;SAChE;KACF;CACF,CAAC;AAEF,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,IAAiB;IACrD,OAAO,uBAAuB,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAiB;IACzD,OAAO,uBAAuB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC;AACpD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAiB,EACjB,OAAe;IAEf,OAAO,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;SACnD,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC;AAQD;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAiB,EACjB,OAA2B;IAE3B,MAAM,KAAK,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,OAAO,kDAAkD,wBAAwB,wEAAwE;SACpL,CAAC;IACJ,CAAC;IAED,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,sBAAsB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAEpE,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5B,OAAO;YACL,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,sFAAsF,KAAK,CAAC,WAAW,2BAA2B,OAAO,EAAE;SACnL,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACjC,OAAO;YACL,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,kEAAkE,KAAK,CAAC,WAAW,IAAI,OAAO,EAAE;SACxI,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|