@r8s/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/catalog.d.ts +33 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +716 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1001 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/renderer.d.ts +8 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +141 -0
- package/dist/renderer.js.map +1 -0
- package/package.json +40 -0
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,716 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Static catalog of r8s components, recipes, and operators.
|
|
4
|
+
*
|
|
5
|
+
* Used by `r8s list`, `r8s info <name>`, and `r8s context` so an LLM
|
|
6
|
+
* (or human) can discover what's available without reading the docs.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.operators = exports.authComponents = exports.components = void 0;
|
|
10
|
+
exports.allComponents = allComponents;
|
|
11
|
+
exports.findComponent = findComponent;
|
|
12
|
+
exports.components = [
|
|
13
|
+
{
|
|
14
|
+
name: 'App',
|
|
15
|
+
package: '@r8s/recipes',
|
|
16
|
+
category: 'Complete Solution',
|
|
17
|
+
description: 'Deployment + Service + Endpoint (Ingress or Gateway). The simplest way to deploy an app.',
|
|
18
|
+
props: [
|
|
19
|
+
{ name: 'name', type: 'string', required: true, description: 'Resource name' },
|
|
20
|
+
{ name: 'image', type: 'string', required: true, description: 'Container image' },
|
|
21
|
+
{ name: 'host', type: 'string', required: true, description: 'Domain name for routing' },
|
|
22
|
+
{
|
|
23
|
+
name: 'namespace',
|
|
24
|
+
type: 'string',
|
|
25
|
+
required: false,
|
|
26
|
+
default: "'default'",
|
|
27
|
+
description: 'Kubernetes namespace (inherits from Platform if set)',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'port',
|
|
31
|
+
type: 'number',
|
|
32
|
+
required: false,
|
|
33
|
+
default: '3000',
|
|
34
|
+
description: 'Container port',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'replicas',
|
|
38
|
+
type: 'number',
|
|
39
|
+
required: false,
|
|
40
|
+
default: '2',
|
|
41
|
+
description: 'Pod replicas',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'tls',
|
|
45
|
+
type: '{ secretName, clusterIssuer }',
|
|
46
|
+
required: false,
|
|
47
|
+
description: 'TLS certificate config',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'env',
|
|
51
|
+
type: 'Record<string, string>',
|
|
52
|
+
required: false,
|
|
53
|
+
description: 'Plain env vars',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'secrets',
|
|
57
|
+
type: 'Record<string, SecretRef>',
|
|
58
|
+
required: false,
|
|
59
|
+
description: 'Secrets from K8s Secrets',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'vault',
|
|
63
|
+
type: 'Record<string, VaultSecretRef>',
|
|
64
|
+
required: false,
|
|
65
|
+
description: 'Secrets from Vault',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: 'resources',
|
|
69
|
+
type: '{ requests, limits }',
|
|
70
|
+
required: false,
|
|
71
|
+
description: 'CPU/memory',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'cache',
|
|
75
|
+
type: 'boolean',
|
|
76
|
+
required: false,
|
|
77
|
+
default: 'false',
|
|
78
|
+
description: 'Add a Redis cache',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: 'dns',
|
|
82
|
+
type: 'boolean',
|
|
83
|
+
required: false,
|
|
84
|
+
default: 'false',
|
|
85
|
+
description: 'Create DNS record',
|
|
86
|
+
},
|
|
87
|
+
{ name: 'children', type: 'unknown', required: false, description: 'Child components' },
|
|
88
|
+
],
|
|
89
|
+
example: `import { App } from '@r8s/recipes'\n\nexport default <App name="api" image="api:v1" host="api.example.com" />`,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'Database',
|
|
93
|
+
package: '@r8s/recipes',
|
|
94
|
+
category: 'Data',
|
|
95
|
+
description: 'PostgreSQL cluster via CloudNativePG operator + credentials secret.',
|
|
96
|
+
props: [
|
|
97
|
+
{
|
|
98
|
+
name: 'name',
|
|
99
|
+
type: 'string',
|
|
100
|
+
required: true,
|
|
101
|
+
description: 'Cluster name (creates <name>-rw service)',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
name: 'namespace',
|
|
105
|
+
type: 'string',
|
|
106
|
+
required: false,
|
|
107
|
+
default: "'default'",
|
|
108
|
+
description: 'Kubernetes namespace',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'storage',
|
|
112
|
+
type: 'string',
|
|
113
|
+
required: false,
|
|
114
|
+
default: "'10Gi'",
|
|
115
|
+
description: 'Storage size',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: 'operatorVersion',
|
|
119
|
+
type: 'string',
|
|
120
|
+
required: false,
|
|
121
|
+
description: 'CNPG operator version',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'password',
|
|
125
|
+
type: 'string',
|
|
126
|
+
required: false,
|
|
127
|
+
description: 'Explicit password (else auto-generated)',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
name: 'children',
|
|
131
|
+
type: 'unknown',
|
|
132
|
+
required: false,
|
|
133
|
+
description: 'Child components (e.g. Keycloak CR)',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
example: `import { Database } from '@r8s/recipes'\n\nexport default <Database name="api-db" storage="20Gi" />`,
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: 'Endpoint',
|
|
140
|
+
package: '@r8s/recipes',
|
|
141
|
+
category: 'Networking',
|
|
142
|
+
description: 'Routing (Ingress or Gateway+HTTPRoute) + TLS cert + DNS. Used internally by App.',
|
|
143
|
+
props: [
|
|
144
|
+
{ name: 'name', type: 'string', required: true, description: 'Resource name' },
|
|
145
|
+
{ name: 'host', type: 'string', required: true, description: 'Domain name' },
|
|
146
|
+
{ name: 'serviceName', type: 'string', required: true, description: 'Backend Service name' },
|
|
147
|
+
{
|
|
148
|
+
name: 'servicePort',
|
|
149
|
+
type: 'number',
|
|
150
|
+
required: false,
|
|
151
|
+
default: '80',
|
|
152
|
+
description: 'Backend port',
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
name: 'namespace',
|
|
156
|
+
type: 'string',
|
|
157
|
+
required: false,
|
|
158
|
+
default: "'default'",
|
|
159
|
+
description: 'Namespace',
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: 'tls',
|
|
163
|
+
type: '{ secretName, clusterIssuer }',
|
|
164
|
+
required: false,
|
|
165
|
+
description: 'TLS config',
|
|
166
|
+
},
|
|
167
|
+
{ name: 'dns', type: 'boolean', required: false, description: 'Override DNS creation' },
|
|
168
|
+
],
|
|
169
|
+
example: `import { Endpoint } from '@r8s/recipes'\n\nexport default <Endpoint name="api" host="api.example.com" serviceName="api" />`,
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
name: 'Platform',
|
|
173
|
+
package: '@r8s/recipes',
|
|
174
|
+
category: 'Complete Solution',
|
|
175
|
+
description: 'Wraps children with shared contexts: namespace, routing, secrets, DNS, operators.',
|
|
176
|
+
props: [
|
|
177
|
+
{
|
|
178
|
+
name: 'namespace',
|
|
179
|
+
type: 'string',
|
|
180
|
+
required: false,
|
|
181
|
+
description: 'Default namespace (materializes Namespace resource)',
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
name: 'routing',
|
|
185
|
+
type: "'ingress' | 'gateway'",
|
|
186
|
+
required: false,
|
|
187
|
+
default: "'ingress'",
|
|
188
|
+
description: 'nginx Ingress or Envoy Gateway API',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'gatewayClassName',
|
|
192
|
+
type: 'string',
|
|
193
|
+
required: false,
|
|
194
|
+
default: "'eg'",
|
|
195
|
+
description: 'Gateway class (gateway mode)',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
name: 'secrets',
|
|
199
|
+
type: 'string | { backend, mount, path }',
|
|
200
|
+
required: false,
|
|
201
|
+
description: 'Secrets backend (openbao/vault/sealed-secrets)',
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: 'dns',
|
|
205
|
+
type: 'string | { provider, settings }',
|
|
206
|
+
required: false,
|
|
207
|
+
description: 'DNS provider (external-dns)',
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: 'operators',
|
|
211
|
+
type: 'Operator[]',
|
|
212
|
+
required: false,
|
|
213
|
+
description: 'Pre-installed operators (skip auto-declare)',
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
name: 'labels',
|
|
217
|
+
type: 'Record<string, string>',
|
|
218
|
+
required: false,
|
|
219
|
+
description: 'Default labels',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
name: 'children',
|
|
223
|
+
type: 'unknown',
|
|
224
|
+
required: true,
|
|
225
|
+
description: 'App/Database/Auth components',
|
|
226
|
+
},
|
|
227
|
+
],
|
|
228
|
+
example: `import { Platform, App } from '@r8s/recipes'\n\nexport default (\n <Platform namespace="prod" routing="gateway">\n <App name="api" image="api:v1" host="api.example.com" />\n </Platform>\n)`,
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
name: 'Auth',
|
|
232
|
+
package: '@r8s/recipes',
|
|
233
|
+
category: 'Identity',
|
|
234
|
+
description: 'Keycloak (operator CR) + database + endpoint + KeycloakRealmImport from Realm children.',
|
|
235
|
+
props: [
|
|
236
|
+
{ name: 'name', type: 'string', required: true, description: 'Keycloak CR name' },
|
|
237
|
+
{ name: 'host', type: 'string', required: true, description: 'Keycloak hostname' },
|
|
238
|
+
{
|
|
239
|
+
name: 'namespace',
|
|
240
|
+
type: 'string',
|
|
241
|
+
required: false,
|
|
242
|
+
default: "'default'",
|
|
243
|
+
description: 'Namespace',
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
name: 'instances',
|
|
247
|
+
type: 'number',
|
|
248
|
+
required: false,
|
|
249
|
+
default: '1',
|
|
250
|
+
description: 'Keycloak replicas',
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
name: 'storage',
|
|
254
|
+
type: 'string',
|
|
255
|
+
required: false,
|
|
256
|
+
default: "'10Gi'",
|
|
257
|
+
description: 'DB storage',
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
name: 'tls',
|
|
261
|
+
type: '{ secretName, clusterIssuer }',
|
|
262
|
+
required: false,
|
|
263
|
+
description: 'TLS config',
|
|
264
|
+
},
|
|
265
|
+
{ name: 'children', type: 'Realms', required: true, description: 'Realm configuration' },
|
|
266
|
+
],
|
|
267
|
+
example: `import { Auth } from '@r8s/recipes'\nimport { Realms, Realm, Clients, Client } from '@r8s/recipes/auth'\n\nexport default (\n <Auth name="auth" host="auth.example.com">\n <Realms><Realm id="myapp"><Clients><Client id="web" type="public" /></Clients></Realm></Realms>\n </Auth>\n)`,
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
name: 'Monitoring',
|
|
271
|
+
package: '@r8s/recipes',
|
|
272
|
+
category: 'Observability',
|
|
273
|
+
description: 'ServiceMonitor + Prometheus operator declaration.',
|
|
274
|
+
props: [
|
|
275
|
+
{ name: 'name', type: 'string', required: true, description: 'ServiceMonitor name' },
|
|
276
|
+
{
|
|
277
|
+
name: 'selector',
|
|
278
|
+
type: 'Record<string, string>',
|
|
279
|
+
required: true,
|
|
280
|
+
description: 'Label selector for target Services',
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
name: 'namespace',
|
|
284
|
+
type: 'string',
|
|
285
|
+
required: false,
|
|
286
|
+
default: "'default'",
|
|
287
|
+
description: 'Namespace',
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: 'port',
|
|
291
|
+
type: 'string',
|
|
292
|
+
required: false,
|
|
293
|
+
default: "'metrics'",
|
|
294
|
+
description: 'Metrics port name',
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
name: 'path',
|
|
298
|
+
type: 'string',
|
|
299
|
+
required: false,
|
|
300
|
+
default: "'/metrics'",
|
|
301
|
+
description: 'Metrics path',
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
name: 'interval',
|
|
305
|
+
type: 'string',
|
|
306
|
+
required: false,
|
|
307
|
+
default: "'30s'",
|
|
308
|
+
description: 'Scrape interval',
|
|
309
|
+
},
|
|
310
|
+
],
|
|
311
|
+
example: `import { Monitoring } from '@r8s/recipes'\n\nexport default <Monitoring name="api-mon" selector={{ app: 'api' }} />`,
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
name: 'Backup',
|
|
315
|
+
package: '@r8s/recipes',
|
|
316
|
+
category: 'Data',
|
|
317
|
+
description: 'Velero backup schedule.',
|
|
318
|
+
props: [
|
|
319
|
+
{ name: 'name', type: 'string', required: true, description: 'Schedule name' },
|
|
320
|
+
{ name: 'schedule', type: 'string', required: true, description: 'Cron expression' },
|
|
321
|
+
{
|
|
322
|
+
name: 'namespace',
|
|
323
|
+
type: 'string',
|
|
324
|
+
required: false,
|
|
325
|
+
default: "'velero'",
|
|
326
|
+
description: 'Namespace',
|
|
327
|
+
},
|
|
328
|
+
{
|
|
329
|
+
name: 'includedNamespaces',
|
|
330
|
+
type: 'string[]',
|
|
331
|
+
required: false,
|
|
332
|
+
description: 'Namespaces to back up',
|
|
333
|
+
},
|
|
334
|
+
],
|
|
335
|
+
example: `import { Backup } from '@r8s/recipes'\n\nexport default <Backup name="daily" schedule="0 2 * * *" />`,
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
name: 'Grafana',
|
|
339
|
+
package: '@r8s/grafana',
|
|
340
|
+
category: 'Observability',
|
|
341
|
+
description: 'Grafana Deployment + Service + PVC + admin Secret + datasources ConfigMap + Ingress.',
|
|
342
|
+
props: [
|
|
343
|
+
{
|
|
344
|
+
name: 'name',
|
|
345
|
+
type: 'string',
|
|
346
|
+
required: false,
|
|
347
|
+
default: "'grafana'",
|
|
348
|
+
description: 'Resource name',
|
|
349
|
+
},
|
|
350
|
+
{
|
|
351
|
+
name: 'namespace',
|
|
352
|
+
type: 'string',
|
|
353
|
+
required: false,
|
|
354
|
+
default: "'monitoring'",
|
|
355
|
+
description: 'Namespace',
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
name: 'version',
|
|
359
|
+
type: 'string',
|
|
360
|
+
required: false,
|
|
361
|
+
default: "'10.3.0'",
|
|
362
|
+
description: 'Grafana version',
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: 'admin',
|
|
366
|
+
type: '{ password?, existingSecret? }',
|
|
367
|
+
required: false,
|
|
368
|
+
description: 'Admin credentials (creates Secret by default)',
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
name: 'datasources',
|
|
372
|
+
type: 'Array<{ name, type, url }>',
|
|
373
|
+
required: false,
|
|
374
|
+
description: 'Datasource configs',
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
name: 'storage',
|
|
378
|
+
type: 'string',
|
|
379
|
+
required: false,
|
|
380
|
+
default: "'10Gi'",
|
|
381
|
+
description: 'PVC size',
|
|
382
|
+
},
|
|
383
|
+
{ name: 'host', type: 'string', required: false, description: 'Ingress host' },
|
|
384
|
+
{
|
|
385
|
+
name: 'tls',
|
|
386
|
+
type: '{ secretName, clusterIssuer }',
|
|
387
|
+
required: false,
|
|
388
|
+
description: 'TLS config',
|
|
389
|
+
},
|
|
390
|
+
],
|
|
391
|
+
example: `import { Grafana } from '@r8s/grafana'\n\nexport default <Grafana host="grafana.example.com" datasources={[{ name: 'Prom', type: 'prometheus', url: 'http://prom:9090' }]} />`,
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
name: 'Superset',
|
|
395
|
+
package: '@r8s/superset',
|
|
396
|
+
category: 'Data',
|
|
397
|
+
description: 'Apache Superset + ConfigMap + optional managed Redis cluster.',
|
|
398
|
+
props: [
|
|
399
|
+
{ name: 'host', type: 'string', required: true, description: 'Ingress host' },
|
|
400
|
+
{
|
|
401
|
+
name: 'database',
|
|
402
|
+
type: '{ host, database, user, passwordSecret }',
|
|
403
|
+
required: true,
|
|
404
|
+
description: 'DB connection',
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
name: 'redis',
|
|
408
|
+
type: '{ host } | { create: true }',
|
|
409
|
+
required: true,
|
|
410
|
+
description: 'External or managed Redis',
|
|
411
|
+
},
|
|
412
|
+
{ name: 'adminSecret', type: 'string', required: true, description: 'Admin secret name' },
|
|
413
|
+
{
|
|
414
|
+
name: 'name',
|
|
415
|
+
type: 'string',
|
|
416
|
+
required: false,
|
|
417
|
+
default: "'superset'",
|
|
418
|
+
description: 'Resource name',
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
name: 'namespace',
|
|
422
|
+
type: 'string',
|
|
423
|
+
required: false,
|
|
424
|
+
default: "'superset'",
|
|
425
|
+
description: 'Namespace',
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
name: 'tls',
|
|
429
|
+
type: '{ secretName, clusterIssuer }',
|
|
430
|
+
required: false,
|
|
431
|
+
description: 'TLS config',
|
|
432
|
+
},
|
|
433
|
+
],
|
|
434
|
+
example: `import { Superset } from '@r8s/superset'\n\nexport default <Superset host="analytics.example.com" database={{ host: 'db-rw', database: 'superset', user: 'superset', passwordSecret: 'superset-db' }} redis={{ create: true }} adminSecret="superset-admin" />`,
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
name: 'RustFS',
|
|
438
|
+
package: '@r8s/rustfs',
|
|
439
|
+
category: 'Storage',
|
|
440
|
+
description: 'S3-compatible object storage (StatefulSet + Services + root credentials Secret).',
|
|
441
|
+
props: [
|
|
442
|
+
{
|
|
443
|
+
name: 'name',
|
|
444
|
+
type: 'string',
|
|
445
|
+
required: false,
|
|
446
|
+
default: "'rustfs'",
|
|
447
|
+
description: 'Resource name',
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
name: 'namespace',
|
|
451
|
+
type: 'string',
|
|
452
|
+
required: false,
|
|
453
|
+
default: "'rustfs'",
|
|
454
|
+
description: 'Namespace',
|
|
455
|
+
},
|
|
456
|
+
{ name: 'instances', type: 'number', required: false, default: '4', description: 'Replicas' },
|
|
457
|
+
{
|
|
458
|
+
name: 'storage',
|
|
459
|
+
type: 'string',
|
|
460
|
+
required: false,
|
|
461
|
+
default: "'100Gi'",
|
|
462
|
+
description: 'Storage per instance',
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
name: 'rootCredentials',
|
|
466
|
+
type: '{ password?, existingSecret? }',
|
|
467
|
+
required: false,
|
|
468
|
+
description: 'Root credentials (creates Secret by default)',
|
|
469
|
+
},
|
|
470
|
+
{ name: 'host', type: 'string', required: false, description: 'Ingress host' },
|
|
471
|
+
{
|
|
472
|
+
name: 'tls',
|
|
473
|
+
type: '{ secretName, clusterIssuer }',
|
|
474
|
+
required: false,
|
|
475
|
+
description: 'TLS config',
|
|
476
|
+
},
|
|
477
|
+
],
|
|
478
|
+
example: `import { RustFS } from '@r8s/rustfs'\n\nexport default <RustFS name="storage" host="s3.example.com" storage="500Gi" />`,
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
name: 'WireGuard',
|
|
482
|
+
package: '@r8s/wireguard',
|
|
483
|
+
category: 'Networking',
|
|
484
|
+
description: 'WireGuard VPN server.',
|
|
485
|
+
props: [
|
|
486
|
+
{
|
|
487
|
+
name: 'name',
|
|
488
|
+
type: 'string',
|
|
489
|
+
required: false,
|
|
490
|
+
default: "'wireguard'",
|
|
491
|
+
description: 'Resource name',
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
name: 'namespace',
|
|
495
|
+
type: 'string',
|
|
496
|
+
required: false,
|
|
497
|
+
default: "'wireguard'",
|
|
498
|
+
description: 'Namespace',
|
|
499
|
+
},
|
|
500
|
+
{ name: 'host', type: 'string', required: true, description: 'VPN endpoint host' },
|
|
501
|
+
{
|
|
502
|
+
name: 'peers',
|
|
503
|
+
type: 'number',
|
|
504
|
+
required: false,
|
|
505
|
+
default: '1',
|
|
506
|
+
description: 'Number of peers',
|
|
507
|
+
},
|
|
508
|
+
],
|
|
509
|
+
example: `import { WireGuard } from '@r8s/wireguard'\n\nexport default <WireGuard host="vpn.example.com" peers={3} />`,
|
|
510
|
+
},
|
|
511
|
+
];
|
|
512
|
+
// Auth sub-components (from @r8s/recipes/auth)
|
|
513
|
+
exports.authComponents = [
|
|
514
|
+
{
|
|
515
|
+
name: 'Realms',
|
|
516
|
+
package: '@r8s/recipes/auth',
|
|
517
|
+
category: 'Auth',
|
|
518
|
+
description: 'Container for Realm components. Use as child of <Auth>.',
|
|
519
|
+
props: [
|
|
520
|
+
{
|
|
521
|
+
name: 'children',
|
|
522
|
+
type: 'Realm | Realm[]',
|
|
523
|
+
required: true,
|
|
524
|
+
description: 'Realm configurations',
|
|
525
|
+
},
|
|
526
|
+
],
|
|
527
|
+
example: `<Realms><Realm id="myapp">...</Realm></Realms>`,
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
name: 'Realm',
|
|
531
|
+
package: '@r8s/recipes/auth',
|
|
532
|
+
category: 'Auth',
|
|
533
|
+
description: 'A Keycloak realm with clients and identity providers.',
|
|
534
|
+
props: [
|
|
535
|
+
{ name: 'id', type: 'string', required: true, description: 'Realm ID' },
|
|
536
|
+
{ name: 'displayName', type: 'string', required: false, description: 'Display name' },
|
|
537
|
+
{
|
|
538
|
+
name: 'enabled',
|
|
539
|
+
type: 'boolean',
|
|
540
|
+
required: false,
|
|
541
|
+
default: 'true',
|
|
542
|
+
description: 'Realm enabled',
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
name: 'identityProviders',
|
|
546
|
+
type: 'IdentityProviderConfig[]',
|
|
547
|
+
required: false,
|
|
548
|
+
description: 'IdP configs (prop form)',
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
name: 'children',
|
|
552
|
+
type: 'Clients | Client | EntraID | Google',
|
|
553
|
+
required: false,
|
|
554
|
+
description: 'Clients and IdPs as JSX',
|
|
555
|
+
},
|
|
556
|
+
],
|
|
557
|
+
example: `<Realm id="myapp" displayName="My App"><Clients><Client id="web" type="public" /></Clients></Realm>`,
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
name: 'Clients',
|
|
561
|
+
package: '@r8s/recipes/auth',
|
|
562
|
+
category: 'Auth',
|
|
563
|
+
description: 'Container for Client components.',
|
|
564
|
+
props: [
|
|
565
|
+
{
|
|
566
|
+
name: 'children',
|
|
567
|
+
type: 'Client | Client[]',
|
|
568
|
+
required: true,
|
|
569
|
+
description: 'Client configs',
|
|
570
|
+
},
|
|
571
|
+
],
|
|
572
|
+
example: `<Clients><Client id="web" type="public" /></Clients>`,
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
name: 'Client',
|
|
576
|
+
package: '@r8s/recipes/auth',
|
|
577
|
+
category: 'Auth',
|
|
578
|
+
description: 'A Keycloak client (OAuth app).',
|
|
579
|
+
props: [
|
|
580
|
+
{ name: 'id', type: 'string', required: true, description: 'Client ID' },
|
|
581
|
+
{
|
|
582
|
+
name: 'type',
|
|
583
|
+
type: "'public' | 'confidential' | 'bearer-only'",
|
|
584
|
+
required: true,
|
|
585
|
+
description: 'Client type',
|
|
586
|
+
},
|
|
587
|
+
{ name: 'name', type: 'string', required: false, description: 'Display name' },
|
|
588
|
+
{ name: 'redirectUris', type: 'string[]', required: false, description: 'Redirect URIs' },
|
|
589
|
+
{
|
|
590
|
+
name: 'secret',
|
|
591
|
+
type: 'string',
|
|
592
|
+
required: false,
|
|
593
|
+
description: 'Client secret (confidential)',
|
|
594
|
+
},
|
|
595
|
+
],
|
|
596
|
+
example: `<Client id="web" type="public" redirectUris={['https://app.example.com/*']} />`,
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
name: 'EntraID',
|
|
600
|
+
package: '@r8s/recipes/auth',
|
|
601
|
+
category: 'Auth',
|
|
602
|
+
description: 'Microsoft Entra ID (Azure AD) identity provider. Use as child of <Realm>.',
|
|
603
|
+
props: [
|
|
604
|
+
{ name: 'tenantId', type: 'string', required: true, description: 'Entra tenant ID' },
|
|
605
|
+
{ name: 'clientId', type: 'string', required: true, description: 'Entra client ID' },
|
|
606
|
+
{ name: 'clientSecret', type: 'string', required: true, description: 'Entra client secret' },
|
|
607
|
+
{
|
|
608
|
+
name: 'displayName',
|
|
609
|
+
type: 'string',
|
|
610
|
+
required: false,
|
|
611
|
+
default: "'Entra ID'",
|
|
612
|
+
description: 'Display name',
|
|
613
|
+
},
|
|
614
|
+
],
|
|
615
|
+
example: `<EntraID tenantId="..." clientId="..." clientSecret="..." />`,
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
name: 'Google',
|
|
619
|
+
package: '@r8s/recipes/auth',
|
|
620
|
+
category: 'Auth',
|
|
621
|
+
description: 'Google identity provider. Use as child of <Realm>.',
|
|
622
|
+
props: [
|
|
623
|
+
{ name: 'clientId', type: 'string', required: true, description: 'Google client ID' },
|
|
624
|
+
{ name: 'clientSecret', type: 'string', required: true, description: 'Google client secret' },
|
|
625
|
+
{
|
|
626
|
+
name: 'displayName',
|
|
627
|
+
type: 'string',
|
|
628
|
+
required: false,
|
|
629
|
+
default: "'Google'",
|
|
630
|
+
description: 'Display name',
|
|
631
|
+
},
|
|
632
|
+
],
|
|
633
|
+
example: `<Google clientId="..." clientSecret="..." />`,
|
|
634
|
+
},
|
|
635
|
+
];
|
|
636
|
+
exports.operators = [
|
|
637
|
+
{
|
|
638
|
+
name: 'cnpg',
|
|
639
|
+
description: 'CloudNativePG PostgreSQL operator',
|
|
640
|
+
category: 'Data',
|
|
641
|
+
crds: ['clusters.postgresql.cnpg.io'],
|
|
642
|
+
},
|
|
643
|
+
{
|
|
644
|
+
name: 'cert-manager',
|
|
645
|
+
description: 'TLS certificate automation',
|
|
646
|
+
category: 'Security',
|
|
647
|
+
crds: ['certificates.cert-manager.io'],
|
|
648
|
+
},
|
|
649
|
+
{
|
|
650
|
+
name: 'envoy-gateway',
|
|
651
|
+
description: 'Envoy Gateway API implementation',
|
|
652
|
+
category: 'Networking',
|
|
653
|
+
crds: ['gateways.gateway.networking.k8s.io'],
|
|
654
|
+
},
|
|
655
|
+
{
|
|
656
|
+
name: 'external-dns',
|
|
657
|
+
description: 'Automatic DNS management',
|
|
658
|
+
category: 'Networking',
|
|
659
|
+
crds: ['dnsendpoints.externaldns.k8s.io'],
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
name: 'keycloak-operator',
|
|
663
|
+
description: 'Keycloak identity and access management',
|
|
664
|
+
category: 'Identity',
|
|
665
|
+
crds: ['keycloaks.k8s.keycloak.org'],
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
name: 'redis-operator',
|
|
669
|
+
description: 'Redis Operator by OT-Container-Kit',
|
|
670
|
+
category: 'Data',
|
|
671
|
+
crds: ['redisclusters.redis.redis.opstreelabs.in'],
|
|
672
|
+
},
|
|
673
|
+
{
|
|
674
|
+
name: 'prometheus',
|
|
675
|
+
description: 'kube-prometheus-stack monitoring',
|
|
676
|
+
category: 'Observability',
|
|
677
|
+
crds: ['prometheuses.monitoring.coreos.com'],
|
|
678
|
+
},
|
|
679
|
+
{
|
|
680
|
+
name: 'loki',
|
|
681
|
+
description: 'Grafana Loki log aggregation',
|
|
682
|
+
category: 'Observability',
|
|
683
|
+
crds: ['lokistacks.loki.grafana.com'],
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
name: 'vault-secrets-operator',
|
|
687
|
+
description: 'HashiCorp Vault Secrets Operator',
|
|
688
|
+
category: 'Security',
|
|
689
|
+
crds: ['vaultstaticsecrets.secrets.hashicorp.com'],
|
|
690
|
+
},
|
|
691
|
+
{
|
|
692
|
+
name: 'velero',
|
|
693
|
+
description: 'Backup and disaster recovery',
|
|
694
|
+
category: 'Data',
|
|
695
|
+
crds: ['schedules.velero.io'],
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
name: 'clickhouse-operator',
|
|
699
|
+
description: 'ClickHouse Operator by Altinity',
|
|
700
|
+
category: 'Data',
|
|
701
|
+
crds: ['clickhouseinstallations.clickhouse.altinity.com'],
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
name: 'logging-operator',
|
|
705
|
+
description: 'Logging Operator by Banzai Cloud',
|
|
706
|
+
category: 'Observability',
|
|
707
|
+
crds: ['flows.logging.banzaicloud.io'],
|
|
708
|
+
},
|
|
709
|
+
];
|
|
710
|
+
function allComponents() {
|
|
711
|
+
return [...exports.components, ...exports.authComponents];
|
|
712
|
+
}
|
|
713
|
+
function findComponent(name) {
|
|
714
|
+
return allComponents().find((c) => c.name.toLowerCase() === name.toLowerCase());
|
|
715
|
+
}
|
|
716
|
+
//# sourceMappingURL=catalog.js.map
|