@r8s/recipes 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.
Files changed (65) hide show
  1. package/dist/app.d.ts +94 -0
  2. package/dist/app.d.ts.map +1 -0
  3. package/dist/app.js +120 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/auth/components.d.ts +163 -0
  6. package/dist/auth/components.d.ts.map +1 -0
  7. package/dist/auth/components.js +134 -0
  8. package/dist/auth/components.js.map +1 -0
  9. package/dist/auth/index.d.ts +2 -0
  10. package/dist/auth/index.d.ts.map +1 -0
  11. package/dist/auth/index.js +14 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/auth.d.ts +92 -0
  14. package/dist/auth.d.ts.map +1 -0
  15. package/dist/auth.js +302 -0
  16. package/dist/auth.js.map +1 -0
  17. package/dist/backup.d.ts +45 -0
  18. package/dist/backup.d.ts.map +1 -0
  19. package/dist/backup.js +59 -0
  20. package/dist/backup.js.map +1 -0
  21. package/dist/cert-provider.d.ts +78 -0
  22. package/dist/cert-provider.d.ts.map +1 -0
  23. package/dist/cert-provider.js +71 -0
  24. package/dist/cert-provider.js.map +1 -0
  25. package/dist/database.d.ts +49 -0
  26. package/dist/database.d.ts.map +1 -0
  27. package/dist/database.js +212 -0
  28. package/dist/database.js.map +1 -0
  29. package/dist/dns-provider.d.ts +110 -0
  30. package/dist/dns-provider.d.ts.map +1 -0
  31. package/dist/dns-provider.js +121 -0
  32. package/dist/dns-provider.js.map +1 -0
  33. package/dist/endpoint-provider.d.ts +121 -0
  34. package/dist/endpoint-provider.d.ts.map +1 -0
  35. package/dist/endpoint-provider.js +79 -0
  36. package/dist/endpoint-provider.js.map +1 -0
  37. package/dist/endpoint.d.ts +43 -0
  38. package/dist/endpoint.d.ts.map +1 -0
  39. package/dist/endpoint.js +221 -0
  40. package/dist/endpoint.js.map +1 -0
  41. package/dist/index.d.ts +14 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +49 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/monitoring.d.ts +49 -0
  46. package/dist/monitoring.d.ts.map +1 -0
  47. package/dist/monitoring.js +128 -0
  48. package/dist/monitoring.js.map +1 -0
  49. package/dist/operators.d.ts +19 -0
  50. package/dist/operators.d.ts.map +1 -0
  51. package/dist/operators.js +30 -0
  52. package/dist/operators.js.map +1 -0
  53. package/dist/platform.d.ts +116 -0
  54. package/dist/platform.d.ts.map +1 -0
  55. package/dist/platform.js +121 -0
  56. package/dist/platform.js.map +1 -0
  57. package/dist/secret-provider.d.ts +119 -0
  58. package/dist/secret-provider.d.ts.map +1 -0
  59. package/dist/secret-provider.js +125 -0
  60. package/dist/secret-provider.js.map +1 -0
  61. package/dist/web-service.d.ts +87 -0
  62. package/dist/web-service.d.ts.map +1 -0
  63. package/dist/web-service.js +171 -0
  64. package/dist/web-service.js.map +1 -0
  65. package/package.json +48 -0
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebService = WebService;
4
+ const core_1 = require("@r8s/core");
5
+ const defaults_1 = require("@r8s/core/defaults");
6
+ const operators_1 = require("./operators");
7
+ /**
8
+ * Simple web service (backend or frontend).
9
+ *
10
+ * @title Web Service
11
+ * @category Workloads
12
+ *
13
+ * Creates a Deployment + Service with health checks.
14
+ *
15
+ * @example
16
+ * import { WebService } from '@r8s/recipes'
17
+ *
18
+ * export default <WebService name="api" image="myapp/api:v1" port={3000} env={{ LOG_LEVEL: 'info' }} />
19
+ *
20
+ * @example
21
+ * import { WebService } from '@r8s/recipes'
22
+ *
23
+ * export default (
24
+ * <WebService
25
+ * name="api"
26
+ * image="myapp/api:v1"
27
+ * env={{ LOG_LEVEL: 'info' }}
28
+ * secrets={{ DATABASE_URL: 'app-secrets', API_KEY: 'app-secrets' }}
29
+ * />
30
+ * )
31
+ *
32
+ * @example
33
+ * import { WebService } from '@r8s/recipes'
34
+ *
35
+ * export default (
36
+ * <WebService
37
+ * name="api"
38
+ * image="myapp/api:v1"
39
+ * env={{ LOG_LEVEL: 'info' }}
40
+ * vault={{ DATABASE_URL: { mount: 'kv', path: 'db/credentials' } }}
41
+ * />
42
+ * )
43
+ */
44
+ function WebService(props) {
45
+ const { name, namespace = 'default', image, port = 3000, replicas = 2, env = {}, secrets = {}, vault = {}, rawEnv = [], resources, } = props;
46
+ const envVars = [];
47
+ const vaultResources = [];
48
+ // Plain env vars
49
+ for (const [key, value] of Object.entries(env)) {
50
+ envVars.push({ name: key, value });
51
+ }
52
+ // Secrets from Kubernetes Secrets
53
+ for (const [envName, ref] of Object.entries(secrets)) {
54
+ if (typeof ref === 'string') {
55
+ // Simple string: secret name, key = env name
56
+ envVars.push({
57
+ name: envName,
58
+ valueFrom: { secretKeyRef: { name: ref, key: envName } },
59
+ });
60
+ }
61
+ else {
62
+ // Object with explicit secret/key
63
+ envVars.push({
64
+ name: envName,
65
+ valueFrom: { secretKeyRef: { name: ref.secret, key: ref.key || envName } },
66
+ });
67
+ }
68
+ }
69
+ // Vault secrets — create VaultStaticSecret objects
70
+ for (const [envName, ref] of Object.entries(vault)) {
71
+ const secretName = `${name}-${envName.toLowerCase().replace(/_/g, '-')}-vault`;
72
+ // Create VaultStaticSecret
73
+ vaultResources.push((0, core_1.jsx)('VaultStaticSecret', {
74
+ apiVersion: 'secrets.hashicorp.com/v1beta1',
75
+ kind: 'VaultStaticSecret',
76
+ metadata: { name: secretName, namespace },
77
+ spec: {
78
+ vaultAuthRef: ref.vaultAuthRef || 'default',
79
+ mount: ref.mount,
80
+ type: 'kv-v2',
81
+ path: ref.path,
82
+ destination: {
83
+ create: true,
84
+ name: secretName,
85
+ },
86
+ },
87
+ }));
88
+ // Reference the generated secret
89
+ envVars.push({
90
+ name: envName,
91
+ valueFrom: { secretKeyRef: { name: secretName, key: ref.key || envName } },
92
+ });
93
+ }
94
+ // Raw env vars (advanced)
95
+ envVars.push(...rawEnv);
96
+ // Auto-wire DATABASE_URL from DatabaseContext if available
97
+ const dbContext = (0, core_1.useContext)(defaults_1.DatabaseContext);
98
+ if (dbContext && !envVars.some((e) => e.name === 'DATABASE_URL')) {
99
+ // Build DATABASE_URL from context fields instead of assuming a 'uri' key exists
100
+ const { host, port, database, username, passwordSecret } = dbContext;
101
+ // Set individual PostgreSQL env vars for flexibility
102
+ envVars.push({ name: 'PGHOST', value: host }, { name: 'PGPORT', value: String(port || 5432) }, { name: 'PGDATABASE', value: database }, { name: 'PGUSER', value: username }, {
103
+ name: 'PGPASSWORD',
104
+ valueFrom: {
105
+ secretKeyRef: {
106
+ name: passwordSecret.name,
107
+ key: passwordSecret.key || 'password',
108
+ },
109
+ },
110
+ });
111
+ // Set DATABASE_URL as a template referencing the individual vars
112
+ // Kubernetes will expand $(VAR) syntax in env var values
113
+ envVars.push({
114
+ name: 'DATABASE_URL',
115
+ value: `postgresql://$(PGUSER):$(PGPASSWORD)@$(PGHOST):$(PGPORT)/$(PGDATABASE)`,
116
+ });
117
+ }
118
+ // Declare Vault Secrets Operator if vault secrets are used
119
+ if (Object.keys(vault).length > 0) {
120
+ const sharedOperators = (0, core_1.useContext)(defaults_1.OperatorContext);
121
+ const hasVSO = sharedOperators.some((op) => op.name === 'vault-secrets-operator');
122
+ if (!hasVSO) {
123
+ vaultResources.push((0, core_1.declareOperator)((0, operators_1.vaultSecretsOperator)()));
124
+ }
125
+ }
126
+ const deployment = {
127
+ apiVersion: 'apps/v1',
128
+ kind: 'Deployment',
129
+ metadata: { name, namespace, labels: { app: name } },
130
+ spec: {
131
+ replicas,
132
+ selector: { matchLabels: { app: name } },
133
+ template: {
134
+ metadata: { labels: { app: name } },
135
+ spec: {
136
+ containers: [
137
+ {
138
+ name: 'app',
139
+ image,
140
+ ports: [{ containerPort: port }],
141
+ env: envVars,
142
+ ...(resources && { resources }),
143
+ livenessProbe: {
144
+ httpGet: { path: '/health', port },
145
+ initialDelaySeconds: 10,
146
+ periodSeconds: 10,
147
+ },
148
+ readinessProbe: {
149
+ httpGet: { path: '/ready', port },
150
+ initialDelaySeconds: 5,
151
+ periodSeconds: 5,
152
+ },
153
+ },
154
+ ],
155
+ },
156
+ },
157
+ },
158
+ };
159
+ const service = {
160
+ apiVersion: 'v1',
161
+ kind: 'Service',
162
+ metadata: { name, namespace },
163
+ spec: {
164
+ type: 'ClusterIP',
165
+ selector: { app: name },
166
+ ports: [{ port: 80, targetPort: port }],
167
+ },
168
+ };
169
+ return [...vaultResources, (0, core_1.jsx)('Deployment', deployment), (0, core_1.jsx)('Service', service)];
170
+ }
171
+ //# sourceMappingURL=web-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-service.js","sourceRoot":"","sources":["../src/web-service.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@r8s/recipes",
3
+ "version": "0.1.0",
4
+ "description": "Pre-built Kubernetes component recipes for r8s",
5
+ "license": "MIT",
6
+ "author": "Berget AI AB",
7
+ "homepage": "https://r8s.berget.ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/berget-ai/r8s.git",
11
+ "directory": "packages/recipes"
12
+ },
13
+ "bugs": "https://github.com/berget-ai/r8s/issues",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "main": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "require": "./dist/index.js"
27
+ },
28
+ "./auth": {
29
+ "types": "./dist/auth/index.d.ts",
30
+ "import": "./dist/auth/index.js",
31
+ "require": "./dist/auth/index.js"
32
+ }
33
+ },
34
+ "scripts": {
35
+ "build": "tsc --build",
36
+ "test": "vitest run",
37
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
38
+ },
39
+ "dependencies": {
40
+ "@r8s/core": "^0.1.0",
41
+ "@r8s/k8s-types": "^0.1.0",
42
+ "@r8s/crds": "^0.1.0"
43
+ },
44
+ "devDependencies": {
45
+ "typescript": "^5.3.0",
46
+ "vitest": "^1.0.0"
47
+ }
48
+ }