@r8s/core 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/context.d.ts +17 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +60 -0
- package/dist/context.js.map +1 -0
- package/dist/defaults.d.ts +205 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +117 -0
- package/dist/defaults.js.map +1 -0
- package/dist/fetch-operators.d.ts +7 -0
- package/dist/fetch-operators.d.ts.map +1 -0
- package/dist/fetch-operators.js +29 -0
- package/dist/fetch-operators.js.map +1 -0
- package/dist/guardrails.d.ts +34 -0
- package/dist/guardrails.d.ts.map +1 -0
- package/dist/guardrails.js +225 -0
- package/dist/guardrails.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/jsx-runtime.d.ts +11 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +20 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/operator.d.ts +28 -0
- package/dist/operator.d.ts.map +1 -0
- package/dist/operator.js +51 -0
- package/dist/operator.js.map +1 -0
- package/dist/renderer.d.ts +10 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +115 -0
- package/dist/renderer.js.map +1 -0
- package/dist/validate.d.ts +30 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +309 -0
- package/dist/validate.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultGuardrails = exports.noRootContainers = exports.requireTLS = exports.noPlaintextSecrets = exports.requireLabels = exports.requireResourceLimits = exports.requireNetworkPolicies = void 0;
|
|
4
|
+
exports.runGuardrails = runGuardrails;
|
|
5
|
+
/** Check that all namespaces have NetworkPolicies */
|
|
6
|
+
exports.requireNetworkPolicies = {
|
|
7
|
+
id: 'require-network-policies',
|
|
8
|
+
description: 'All namespaces must have at least one NetworkPolicy',
|
|
9
|
+
severity: 'error',
|
|
10
|
+
test: (resources) => {
|
|
11
|
+
const errors = [];
|
|
12
|
+
const namespaces = new Set();
|
|
13
|
+
const hasNetworkPolicy = new Set();
|
|
14
|
+
for (const resource of resources) {
|
|
15
|
+
if (resource.metadata?.namespace) {
|
|
16
|
+
namespaces.add(resource.metadata.namespace);
|
|
17
|
+
}
|
|
18
|
+
if (resource.kind === 'NetworkPolicy' && resource.metadata?.namespace) {
|
|
19
|
+
hasNetworkPolicy.add(resource.metadata.namespace);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
for (const ns of namespaces) {
|
|
23
|
+
if (!hasNetworkPolicy.has(ns)) {
|
|
24
|
+
errors.push({
|
|
25
|
+
code: 'MISSING_NETWORK_POLICY',
|
|
26
|
+
message: `Namespace "${ns}" is missing a NetworkPolicy`,
|
|
27
|
+
resource: 'Namespace',
|
|
28
|
+
field: 'networkPolicy',
|
|
29
|
+
suggestion: `Add a NetworkPolicy for namespace "${ns}" to control ingress/egress traffic`,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return errors;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
/** Check that all Deployments have resource limits */
|
|
37
|
+
exports.requireResourceLimits = {
|
|
38
|
+
id: 'require-resource-limits',
|
|
39
|
+
description: 'All containers must have resource requests and limits',
|
|
40
|
+
severity: 'error',
|
|
41
|
+
test: (resources) => {
|
|
42
|
+
const errors = [];
|
|
43
|
+
for (const resource of resources) {
|
|
44
|
+
if (resource.kind === 'Deployment' ||
|
|
45
|
+
resource.kind === 'StatefulSet' ||
|
|
46
|
+
resource.kind === 'DaemonSet') {
|
|
47
|
+
const containers = resource.spec?.template?.spec?.containers || [];
|
|
48
|
+
for (const container of containers) {
|
|
49
|
+
if (!container.resources?.requests) {
|
|
50
|
+
errors.push({
|
|
51
|
+
code: 'MISSING_RESOURCE_REQUESTS',
|
|
52
|
+
message: `Container "${container.name}" in ${resource.kind} "${resource.metadata?.name}" is missing resource requests`,
|
|
53
|
+
resource: resource.kind,
|
|
54
|
+
field: 'spec.template.spec.containers[].resources.requests',
|
|
55
|
+
suggestion: 'Add resource.requests with cpu and memory values',
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!container.resources?.limits) {
|
|
59
|
+
errors.push({
|
|
60
|
+
code: 'MISSING_RESOURCE_LIMITS',
|
|
61
|
+
message: `Container "${container.name}" in ${resource.kind} "${resource.metadata?.name}" is missing resource limits`,
|
|
62
|
+
resource: resource.kind,
|
|
63
|
+
field: 'spec.template.spec.containers[].resources.limits',
|
|
64
|
+
suggestion: 'Add resource.limits with cpu and memory values to prevent resource exhaustion',
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return errors;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
/** Check that all resources have required labels */
|
|
74
|
+
const requireLabels = (requiredLabels) => ({
|
|
75
|
+
id: `require-labels-${requiredLabels.sort().join('-')}`,
|
|
76
|
+
description: `All resources must have labels: ${requiredLabels.join(', ')}`,
|
|
77
|
+
severity: 'warning',
|
|
78
|
+
test: (resources) => {
|
|
79
|
+
const errors = [];
|
|
80
|
+
for (const resource of resources) {
|
|
81
|
+
const labels = resource.metadata?.labels || {};
|
|
82
|
+
for (const label of requiredLabels) {
|
|
83
|
+
if (!labels[label]) {
|
|
84
|
+
errors.push({
|
|
85
|
+
code: 'MISSING_REQUIRED_LABEL',
|
|
86
|
+
message: `${resource.kind} "${resource.metadata?.name}" is missing required label "${label}"`,
|
|
87
|
+
resource: resource.kind,
|
|
88
|
+
field: `metadata.labels.${label}`,
|
|
89
|
+
suggestion: `Add label "${label}" to ${resource.kind} "${resource.metadata?.name}"`,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return errors;
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
exports.requireLabels = requireLabels;
|
|
98
|
+
/** Check that no secrets contain plaintext passwords */
|
|
99
|
+
exports.noPlaintextSecrets = {
|
|
100
|
+
id: 'no-plaintext-secrets',
|
|
101
|
+
description: 'Secrets should not contain plaintext passwords in rendered output',
|
|
102
|
+
severity: 'error',
|
|
103
|
+
test: (resources) => {
|
|
104
|
+
const errors = [];
|
|
105
|
+
for (const resource of resources) {
|
|
106
|
+
if (resource.kind === 'Secret') {
|
|
107
|
+
const data = resource.stringData || resource.data || {};
|
|
108
|
+
for (const [key, value] of Object.entries(data)) {
|
|
109
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
110
|
+
// Check if it looks like a password (not a reference)
|
|
111
|
+
if (key.toLowerCase().includes('password') || key.toLowerCase().includes('secret')) {
|
|
112
|
+
errors.push({
|
|
113
|
+
code: 'PLAINTEXT_SECRET',
|
|
114
|
+
message: `Secret "${resource.metadata?.name}" contains plaintext value for key "${key}"`,
|
|
115
|
+
resource: 'Secret',
|
|
116
|
+
field: `stringData.${key}`,
|
|
117
|
+
suggestion: 'Use Vault, Sealed Secrets, or external secret management instead of plaintext',
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return errors;
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
/** Check that Ingresses have TLS configured */
|
|
128
|
+
exports.requireTLS = {
|
|
129
|
+
id: 'require-tls',
|
|
130
|
+
description: 'All Ingress resources must have TLS configured',
|
|
131
|
+
severity: 'warning',
|
|
132
|
+
test: (resources) => {
|
|
133
|
+
const errors = [];
|
|
134
|
+
for (const resource of resources) {
|
|
135
|
+
if (resource.kind === 'Ingress') {
|
|
136
|
+
const spec = resource.spec || {};
|
|
137
|
+
if (!spec.tls || spec.tls.length === 0) {
|
|
138
|
+
errors.push({
|
|
139
|
+
code: 'MISSING_TLS',
|
|
140
|
+
message: `Ingress "${resource.metadata?.name}" is missing TLS configuration`,
|
|
141
|
+
resource: 'Ingress',
|
|
142
|
+
field: 'spec.tls',
|
|
143
|
+
suggestion: 'Add TLS configuration with secretName and optionally cert-manager clusterIssuer',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return errors;
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
/** Check that Pods don't run as root */
|
|
152
|
+
exports.noRootContainers = {
|
|
153
|
+
id: 'no-root-containers',
|
|
154
|
+
description: 'Containers should not run as root user',
|
|
155
|
+
severity: 'error',
|
|
156
|
+
test: (resources) => {
|
|
157
|
+
const errors = [];
|
|
158
|
+
for (const resource of resources) {
|
|
159
|
+
if (resource.kind === 'Deployment' ||
|
|
160
|
+
resource.kind === 'StatefulSet' ||
|
|
161
|
+
resource.kind === 'DaemonSet' ||
|
|
162
|
+
resource.kind === 'Pod') {
|
|
163
|
+
const podSpec = resource.spec?.template?.spec || resource.spec || {};
|
|
164
|
+
const securityContext = podSpec.securityContext || {};
|
|
165
|
+
if (securityContext.runAsUser === 0 || securityContext.runAsRoot === true) {
|
|
166
|
+
errors.push({
|
|
167
|
+
code: 'CONTAINER_RUNS_AS_ROOT',
|
|
168
|
+
message: `${resource.kind} "${resource.metadata?.name}" is configured to run as root`,
|
|
169
|
+
resource: resource.kind,
|
|
170
|
+
field: 'spec.template.spec.securityContext.runAsUser',
|
|
171
|
+
suggestion: 'Set runAsUser to a non-zero UID and runAsRoot to false',
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
for (const container of podSpec.containers || []) {
|
|
175
|
+
const containerSecurity = container.securityContext || {};
|
|
176
|
+
if (containerSecurity.runAsUser === 0 || containerSecurity.runAsRoot === true) {
|
|
177
|
+
errors.push({
|
|
178
|
+
code: 'CONTAINER_RUNS_AS_ROOT',
|
|
179
|
+
message: `Container "${container.name}" in ${resource.kind} "${resource.metadata?.name}" runs as root`,
|
|
180
|
+
resource: resource.kind,
|
|
181
|
+
field: 'spec.template.spec.containers[].securityContext.runAsUser',
|
|
182
|
+
suggestion: 'Set securityContext.runAsUser to a non-zero UID',
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return errors;
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
/** Default set of guardrails for production use */
|
|
192
|
+
exports.defaultGuardrails = [
|
|
193
|
+
exports.requireNetworkPolicies,
|
|
194
|
+
exports.requireResourceLimits,
|
|
195
|
+
exports.noPlaintextSecrets,
|
|
196
|
+
exports.requireTLS,
|
|
197
|
+
exports.noRootContainers,
|
|
198
|
+
];
|
|
199
|
+
/** Run all guardrail rules against a set of resources */
|
|
200
|
+
function runGuardrails(resources, rules = exports.defaultGuardrails) {
|
|
201
|
+
const errors = [];
|
|
202
|
+
const warnings = [];
|
|
203
|
+
const info = [];
|
|
204
|
+
for (const rule of rules) {
|
|
205
|
+
const ruleErrors = rule.test(resources);
|
|
206
|
+
for (const error of ruleErrors) {
|
|
207
|
+
if (rule.severity === 'error') {
|
|
208
|
+
errors.push(error);
|
|
209
|
+
}
|
|
210
|
+
else if (rule.severity === 'warning') {
|
|
211
|
+
warnings.push(error);
|
|
212
|
+
}
|
|
213
|
+
else if (rule.severity === 'info') {
|
|
214
|
+
info.push(error);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
passed: errors.length === 0,
|
|
220
|
+
errors,
|
|
221
|
+
warnings,
|
|
222
|
+
info,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=guardrails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrails.js","sourceRoot":"","sources":["../src/guardrails.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { jsx, jsxs, jsxDEV, Fragment } from './jsx-runtime';
|
|
2
|
+
export type { r8sElement } from './jsx-runtime';
|
|
3
|
+
export { render, type RenderResult, useContext } from './renderer';
|
|
4
|
+
export { declareOperator, isOperatorDeclaration, getOperator } from './operator';
|
|
5
|
+
export { createContext } from './context';
|
|
6
|
+
export { fetchOperatorManifests } from './fetch-operators';
|
|
7
|
+
export { validateResource, validateIngress, validateService, validateDeployment, validateOperator, checkDuplicates, r8sValidationError, } from './validate';
|
|
8
|
+
export type { ValidationError } from './validate';
|
|
9
|
+
export { runGuardrails, defaultGuardrails, requireNetworkPolicies, requireResourceLimits, requireLabels, noPlaintextSecrets, requireTLS, noRootContainers, } from './guardrails';
|
|
10
|
+
export type { GuardrailRule } from './guardrails';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,gBAAgB,GACjB,MAAM,cAAc,CAAA;AACrB,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.noRootContainers = exports.requireTLS = exports.noPlaintextSecrets = exports.requireLabels = exports.requireResourceLimits = exports.requireNetworkPolicies = exports.defaultGuardrails = exports.runGuardrails = exports.r8sValidationError = exports.checkDuplicates = exports.validateOperator = exports.validateDeployment = exports.validateService = exports.validateIngress = exports.validateResource = exports.fetchOperatorManifests = exports.createContext = exports.getOperator = exports.isOperatorDeclaration = exports.declareOperator = exports.useContext = exports.render = exports.Fragment = exports.jsxDEV = exports.jsxs = exports.jsx = void 0;
|
|
4
|
+
var jsx_runtime_1 = require("./jsx-runtime");
|
|
5
|
+
Object.defineProperty(exports, "jsx", { enumerable: true, get: function () { return jsx_runtime_1.jsx; } });
|
|
6
|
+
Object.defineProperty(exports, "jsxs", { enumerable: true, get: function () { return jsx_runtime_1.jsxs; } });
|
|
7
|
+
Object.defineProperty(exports, "jsxDEV", { enumerable: true, get: function () { return jsx_runtime_1.jsxDEV; } });
|
|
8
|
+
Object.defineProperty(exports, "Fragment", { enumerable: true, get: function () { return jsx_runtime_1.Fragment; } });
|
|
9
|
+
var renderer_1 = require("./renderer");
|
|
10
|
+
Object.defineProperty(exports, "render", { enumerable: true, get: function () { return renderer_1.render; } });
|
|
11
|
+
Object.defineProperty(exports, "useContext", { enumerable: true, get: function () { return renderer_1.useContext; } });
|
|
12
|
+
var operator_1 = require("./operator");
|
|
13
|
+
Object.defineProperty(exports, "declareOperator", { enumerable: true, get: function () { return operator_1.declareOperator; } });
|
|
14
|
+
Object.defineProperty(exports, "isOperatorDeclaration", { enumerable: true, get: function () { return operator_1.isOperatorDeclaration; } });
|
|
15
|
+
Object.defineProperty(exports, "getOperator", { enumerable: true, get: function () { return operator_1.getOperator; } });
|
|
16
|
+
var context_1 = require("./context");
|
|
17
|
+
Object.defineProperty(exports, "createContext", { enumerable: true, get: function () { return context_1.createContext; } });
|
|
18
|
+
var fetch_operators_1 = require("./fetch-operators");
|
|
19
|
+
Object.defineProperty(exports, "fetchOperatorManifests", { enumerable: true, get: function () { return fetch_operators_1.fetchOperatorManifests; } });
|
|
20
|
+
var validate_1 = require("./validate");
|
|
21
|
+
Object.defineProperty(exports, "validateResource", { enumerable: true, get: function () { return validate_1.validateResource; } });
|
|
22
|
+
Object.defineProperty(exports, "validateIngress", { enumerable: true, get: function () { return validate_1.validateIngress; } });
|
|
23
|
+
Object.defineProperty(exports, "validateService", { enumerable: true, get: function () { return validate_1.validateService; } });
|
|
24
|
+
Object.defineProperty(exports, "validateDeployment", { enumerable: true, get: function () { return validate_1.validateDeployment; } });
|
|
25
|
+
Object.defineProperty(exports, "validateOperator", { enumerable: true, get: function () { return validate_1.validateOperator; } });
|
|
26
|
+
Object.defineProperty(exports, "checkDuplicates", { enumerable: true, get: function () { return validate_1.checkDuplicates; } });
|
|
27
|
+
Object.defineProperty(exports, "r8sValidationError", { enumerable: true, get: function () { return validate_1.r8sValidationError; } });
|
|
28
|
+
var guardrails_1 = require("./guardrails");
|
|
29
|
+
Object.defineProperty(exports, "runGuardrails", { enumerable: true, get: function () { return guardrails_1.runGuardrails; } });
|
|
30
|
+
Object.defineProperty(exports, "defaultGuardrails", { enumerable: true, get: function () { return guardrails_1.defaultGuardrails; } });
|
|
31
|
+
Object.defineProperty(exports, "requireNetworkPolicies", { enumerable: true, get: function () { return guardrails_1.requireNetworkPolicies; } });
|
|
32
|
+
Object.defineProperty(exports, "requireResourceLimits", { enumerable: true, get: function () { return guardrails_1.requireResourceLimits; } });
|
|
33
|
+
Object.defineProperty(exports, "requireLabels", { enumerable: true, get: function () { return guardrails_1.requireLabels; } });
|
|
34
|
+
Object.defineProperty(exports, "noPlaintextSecrets", { enumerable: true, get: function () { return guardrails_1.noPlaintextSecrets; } });
|
|
35
|
+
Object.defineProperty(exports, "requireTLS", { enumerable: true, get: function () { return guardrails_1.requireTLS; } });
|
|
36
|
+
Object.defineProperty(exports, "noRootContainers", { enumerable: true, get: function () { return guardrails_1.noRootContainers; } });
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,6CAA2D;AAAlD,kGAAA,GAAG,OAAA;AAAE,mGAAA,IAAI,OAAA;AAAE,qGAAA,MAAM,OAAA;AAAE,uGAAA,QAAQ,OAAA;AAEpC,uCAAkE;AAAzD,kGAAA,MAAM,OAAA;AAAqB,sGAAA,UAAU,OAAA;AAC9C,uCAAgF;AAAvE,2GAAA,eAAe,OAAA;AAAE,iHAAA,qBAAqB,OAAA;AAAE,uGAAA,WAAW,OAAA;AAC5D,qCAAyC;AAAhC,wGAAA,aAAa,OAAA;AACtB,qDAA0D;AAAjD,yHAAA,sBAAsB,OAAA;AAC/B,uCAQmB;AAPjB,4GAAA,gBAAgB,OAAA;AAChB,2GAAA,eAAe,OAAA;AACf,2GAAA,eAAe,OAAA;AACf,8GAAA,kBAAkB,OAAA;AAClB,4GAAA,gBAAgB,OAAA;AAChB,2GAAA,eAAe,OAAA;AACf,8GAAA,kBAAkB,OAAA;AAGpB,2CASqB;AARnB,2GAAA,aAAa,OAAA;AACb,+GAAA,iBAAiB,OAAA;AACjB,oHAAA,sBAAsB,OAAA;AACtB,mHAAA,qBAAqB,OAAA;AACrB,2GAAA,aAAa,OAAA;AACb,gHAAA,kBAAkB,OAAA;AAClB,wGAAA,UAAU,OAAA;AACV,8GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const Fragment: unique symbol;
|
|
2
|
+
export type r8sProps = Record<string, unknown>;
|
|
3
|
+
export interface r8sElement {
|
|
4
|
+
type: string | Function | symbol;
|
|
5
|
+
props: any;
|
|
6
|
+
key: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function jsx<P = any>(type: string | Function | symbol, props: P, key?: string): r8sElement;
|
|
9
|
+
export declare function jsxs<P = any>(type: string | Function | symbol, props: P, key?: string): r8sElement;
|
|
10
|
+
export { jsx as jsxDEV };
|
|
11
|
+
//# sourceMappingURL=jsx-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-runtime.d.ts","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,eAA6B,CAAA;AAElD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAE9C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IAChC,KAAK,EAAE,GAAG,CAAA;IACV,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AAED,wBAAgB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAMjG;AAED,wBAAgB,IAAI,CAAC,CAAC,GAAG,GAAG,EAC1B,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,EAChC,KAAK,EAAE,CAAC,EACR,GAAG,CAAC,EAAE,MAAM,GACX,UAAU,CAEZ;AAED,OAAO,EAAE,GAAG,IAAI,MAAM,EAAE,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// JSX Runtime for r8s
|
|
3
|
+
// Implements the react-jsx transform (v17+)
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.Fragment = void 0;
|
|
6
|
+
exports.jsx = jsx;
|
|
7
|
+
exports.jsxDEV = jsx;
|
|
8
|
+
exports.jsxs = jsxs;
|
|
9
|
+
exports.Fragment = Symbol.for('r8s.fragment');
|
|
10
|
+
function jsx(type, props, key) {
|
|
11
|
+
return {
|
|
12
|
+
type,
|
|
13
|
+
props,
|
|
14
|
+
key: key ?? null,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function jsxs(type, props, key) {
|
|
18
|
+
return jsx(type, props, key);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=jsx-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx-runtime.js","sourceRoot":"","sources":["../src/jsx-runtime.ts"],"names":[],"mappings":";AAAA,sBAAsB;AACtB,4CAA4C;;;AAY5C,kBAMC;AAUe,qBAAM;AARtB,oBAMC;AAxBY,QAAA,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAUlD,SAAgB,GAAG,CAAU,IAAgC,EAAE,KAAQ,EAAE,GAAY;IACnF,OAAO;QACL,IAAI;QACJ,KAAK;QACL,GAAG,EAAE,GAAG,IAAI,IAAI;KACjB,CAAA;AACH,CAAC;AAED,SAAgB,IAAI,CAClB,IAAgC,EAChC,KAAQ,EACR,GAAY;IAEZ,OAAO,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Operator } from '@r8s/k8s-types';
|
|
2
|
+
import { r8sElement } from './jsx-runtime';
|
|
3
|
+
/**
|
|
4
|
+
* Declare an operator dependency.
|
|
5
|
+
*
|
|
6
|
+
* Components use this to declare that they require a specific
|
|
7
|
+
* Kubernetes operator to be installed. The renderer collects
|
|
8
|
+
* all operators so the deployment pipeline can install them.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* import { declareOperator } from '@r8s/core';
|
|
13
|
+
* import { cnpgOperator } from '@r8s/recipes';
|
|
14
|
+
*
|
|
15
|
+
* function Database(props) {
|
|
16
|
+
* return [
|
|
17
|
+
* declareOperator(cnpgOperator('1.22.5')),
|
|
18
|
+
* jsx('Cluster', cluster),
|
|
19
|
+
* ];
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function declareOperator(operator: Operator): r8sElement;
|
|
24
|
+
/** Check if a value is an operator declaration */
|
|
25
|
+
export declare function isOperatorDeclaration(element: unknown): boolean;
|
|
26
|
+
/** Extract operator from declaration element */
|
|
27
|
+
export declare function getOperator(element: unknown): Operator | null;
|
|
28
|
+
//# sourceMappingURL=operator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAI1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,CAM9D;AAED,kDAAkD;AAClD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAO/D;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAK7D"}
|
package/dist/operator.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.declareOperator = declareOperator;
|
|
4
|
+
exports.isOperatorDeclaration = isOperatorDeclaration;
|
|
5
|
+
exports.getOperator = getOperator;
|
|
6
|
+
const OPERATOR_SYMBOL = Symbol.for('r8s.operator');
|
|
7
|
+
/**
|
|
8
|
+
* Declare an operator dependency.
|
|
9
|
+
*
|
|
10
|
+
* Components use this to declare that they require a specific
|
|
11
|
+
* Kubernetes operator to be installed. The renderer collects
|
|
12
|
+
* all operators so the deployment pipeline can install them.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { declareOperator } from '@r8s/core';
|
|
17
|
+
* import { cnpgOperator } from '@r8s/recipes';
|
|
18
|
+
*
|
|
19
|
+
* function Database(props) {
|
|
20
|
+
* return [
|
|
21
|
+
* declareOperator(cnpgOperator('1.22.5')),
|
|
22
|
+
* jsx('Cluster', cluster),
|
|
23
|
+
* ];
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function declareOperator(operator) {
|
|
28
|
+
return {
|
|
29
|
+
type: OPERATOR_SYMBOL,
|
|
30
|
+
props: { operator },
|
|
31
|
+
key: null,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Check if a value is an operator declaration */
|
|
35
|
+
function isOperatorDeclaration(element) {
|
|
36
|
+
if (!element || typeof element !== 'object')
|
|
37
|
+
return false;
|
|
38
|
+
return ('type' in element &&
|
|
39
|
+
typeof element.type === 'symbol' &&
|
|
40
|
+
element.type === OPERATOR_SYMBOL);
|
|
41
|
+
}
|
|
42
|
+
/** Extract operator from declaration element */
|
|
43
|
+
function getOperator(element) {
|
|
44
|
+
if (!isOperatorDeclaration(element))
|
|
45
|
+
return null;
|
|
46
|
+
const props = element.props;
|
|
47
|
+
if (!props || typeof props !== 'object')
|
|
48
|
+
return null;
|
|
49
|
+
return props.operator || null;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":";;AAyBA,0CAMC;AAGD,sDAOC;AAGD,kCAKC;AA9CD,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;AAElD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAgB,eAAe,CAAC,QAAkB;IAChD,OAAO;QACL,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,EAAE,QAAQ,EAAE;QACnB,GAAG,EAAE,IAAI;KACe,CAAA;AAC5B,CAAC;AAED,kDAAkD;AAClD,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACzD,OAAO,CACL,MAAM,IAAI,OAAO;QACjB,OAAQ,OAAmC,CAAC,IAAI,KAAK,QAAQ;QAC5D,OAAmC,CAAC,IAAI,KAAK,eAAe,CAC9D,CAAA;AACH,CAAC;AAED,gDAAgD;AAChD,SAAgB,WAAW,CAAC,OAAgB;IAC1C,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAA;IAChD,MAAM,KAAK,GAAI,OAAmC,CAAC,KAAK,CAAA;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACpD,OAAQ,KAAiC,CAAC,QAAQ,IAAI,IAAI,CAAA;AAC5D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { r8sElement } from './jsx-runtime';
|
|
2
|
+
import { KubernetesResource, Operator } from '@r8s/k8s-types';
|
|
3
|
+
import { Context } from './context';
|
|
4
|
+
export interface RenderResult {
|
|
5
|
+
resources: KubernetesResource[];
|
|
6
|
+
operators: Operator[];
|
|
7
|
+
}
|
|
8
|
+
export declare function useContext<T>(context: Context<T>): T;
|
|
9
|
+
export declare function render(element: r8sElement): RenderResult;
|
|
10
|
+
//# sourceMappingURL=renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE7D,OAAO,EACL,OAAO,EAOR,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,kBAAkB,EAAE,CAAA;IAC/B,SAAS,EAAE,QAAQ,EAAE,CAAA;CACtB;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAEpD;AAoHD,wBAAgB,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY,CA4BxD"}
|
package/dist/renderer.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useContext = useContext;
|
|
4
|
+
exports.render = render;
|
|
5
|
+
const jsx_runtime_1 = require("./jsx-runtime");
|
|
6
|
+
const operator_1 = require("./operator");
|
|
7
|
+
const context_1 = require("./context");
|
|
8
|
+
function useContext(context) {
|
|
9
|
+
return (0, context_1.getContextValue)(context);
|
|
10
|
+
}
|
|
11
|
+
function isr8sElement(value) {
|
|
12
|
+
return value !== null && typeof value === 'object' && 'type' in value && 'props' in value;
|
|
13
|
+
}
|
|
14
|
+
function flattenChildren(children) {
|
|
15
|
+
if (children === null || children === undefined || typeof children === 'boolean') {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(children)) {
|
|
19
|
+
return children.flatMap(flattenChildren);
|
|
20
|
+
}
|
|
21
|
+
return [children];
|
|
22
|
+
}
|
|
23
|
+
function renderChildren(children) {
|
|
24
|
+
const flattened = flattenChildren(children);
|
|
25
|
+
const resources = [];
|
|
26
|
+
const operators = [];
|
|
27
|
+
for (const child of flattened) {
|
|
28
|
+
if (isr8sElement(child)) {
|
|
29
|
+
const result = renderElement(child);
|
|
30
|
+
resources.push(...result.resources);
|
|
31
|
+
operators.push(...result.operators);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { resources, operators };
|
|
35
|
+
}
|
|
36
|
+
function renderElement(element) {
|
|
37
|
+
// Handle operator declarations
|
|
38
|
+
if ((0, operator_1.isOperatorDeclaration)(element)) {
|
|
39
|
+
const operator = (0, operator_1.getOperator)(element);
|
|
40
|
+
if (operator) {
|
|
41
|
+
return { resources: [], operators: [operator] };
|
|
42
|
+
}
|
|
43
|
+
return { resources: [], operators: [] };
|
|
44
|
+
}
|
|
45
|
+
// Handle Fragment - just render children
|
|
46
|
+
if (element.type === jsx_runtime_1.Fragment) {
|
|
47
|
+
return renderChildren(element.props.children);
|
|
48
|
+
}
|
|
49
|
+
// Handle context providers
|
|
50
|
+
if (element.type === Symbol.for('r8s.context.provider')) {
|
|
51
|
+
const { contextId, value, children } = element.props;
|
|
52
|
+
// Push context value
|
|
53
|
+
const hadPrevious = (0, context_1.hasContextValue)(contextId);
|
|
54
|
+
const previousValue = (0, context_1.getContextValueById)(contextId);
|
|
55
|
+
(0, context_1.setContextValue)(contextId, value);
|
|
56
|
+
// Render children with new context
|
|
57
|
+
const result = renderChildren(children);
|
|
58
|
+
// If the context value contains operators, include them
|
|
59
|
+
if (Array.isArray(value)) {
|
|
60
|
+
const ops = value.filter((v) => v && typeof v === 'object' && 'name' in v && 'source' in v);
|
|
61
|
+
result.operators.unshift(...ops);
|
|
62
|
+
}
|
|
63
|
+
// Restore previous context
|
|
64
|
+
(0, context_1.restoreContextValue)(contextId, hadPrevious, previousValue);
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
// Handle function components
|
|
68
|
+
if (typeof element.type === 'function') {
|
|
69
|
+
const componentFn = element.type;
|
|
70
|
+
const props = element.props;
|
|
71
|
+
const result = componentFn(props);
|
|
72
|
+
if (isr8sElement(result)) {
|
|
73
|
+
return renderElement(result);
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(result)) {
|
|
76
|
+
return renderChildren(result);
|
|
77
|
+
}
|
|
78
|
+
return { resources: [], operators: [] };
|
|
79
|
+
}
|
|
80
|
+
// Handle built-in Kubernetes resource components
|
|
81
|
+
if (typeof element.type === 'string' && element.props && typeof element.props === 'object') {
|
|
82
|
+
const props = element.props;
|
|
83
|
+
// If this is a raw Kubernetes resource (has apiVersion and kind)
|
|
84
|
+
if ('apiVersion' in props && 'kind' in props) {
|
|
85
|
+
return { resources: [props], operators: [] };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { resources: [], operators: [] };
|
|
89
|
+
}
|
|
90
|
+
function render(element) {
|
|
91
|
+
// Clear context stack before rendering
|
|
92
|
+
(0, context_1.clearContextStack)();
|
|
93
|
+
const { resources, operators } = renderElement(element);
|
|
94
|
+
// Deduplicate resources by kind/namespace/name, keeping the first occurrence.
|
|
95
|
+
// Components like Platform, Superset, and RustFS may all declare the same
|
|
96
|
+
// Namespace — emitting it twice produces invalid multi-doc YAML.
|
|
97
|
+
const resourceMap = new Map();
|
|
98
|
+
for (const res of resources) {
|
|
99
|
+
const meta = res.metadata ?? {};
|
|
100
|
+
const key = `${res.kind}/${meta.namespace ?? ''}/${meta.name ?? ''}`;
|
|
101
|
+
if (!resourceMap.has(key)) {
|
|
102
|
+
resourceMap.set(key, res);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Deduplicate operators by name, keeping the last version
|
|
106
|
+
const operatorMap = new Map();
|
|
107
|
+
for (const op of operators) {
|
|
108
|
+
operatorMap.set(op.name, op);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
resources: Array.from(resourceMap.values()),
|
|
112
|
+
operators: Array.from(operatorMap.values()),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { KubernetesResource } from '@r8s/k8s-types';
|
|
2
|
+
export interface ValidationError {
|
|
3
|
+
/** Error code for programmatic handling */
|
|
4
|
+
code: string;
|
|
5
|
+
/** Human-readable error message */
|
|
6
|
+
message: string;
|
|
7
|
+
/** Resource or component that caused the error */
|
|
8
|
+
resource?: string;
|
|
9
|
+
/** Field path within the resource */
|
|
10
|
+
field?: string;
|
|
11
|
+
/** Suggested fix */
|
|
12
|
+
suggestion?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class r8sValidationError extends Error {
|
|
15
|
+
errors: ValidationError[];
|
|
16
|
+
constructor(errors: ValidationError[]);
|
|
17
|
+
}
|
|
18
|
+
/** Validate a Kubernetes resource */
|
|
19
|
+
export declare function validateResource(resource: KubernetesResource): ValidationError[];
|
|
20
|
+
/** Validate an Ingress resource specifically */
|
|
21
|
+
export declare function validateIngress(resource: KubernetesResource): ValidationError[];
|
|
22
|
+
/** Validate a Service resource */
|
|
23
|
+
export declare function validateService(resource: KubernetesResource): ValidationError[];
|
|
24
|
+
/** Validate a Deployment resource */
|
|
25
|
+
export declare function validateDeployment(resource: KubernetesResource): ValidationError[];
|
|
26
|
+
/** Validate an operator declaration */
|
|
27
|
+
export declare function validateOperator(operator: any): ValidationError[];
|
|
28
|
+
/** Check for duplicate resource names in the same namespace */
|
|
29
|
+
export declare function checkDuplicates(resources: KubernetesResource[]): ValidationError[];
|
|
30
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAEnD,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,EAAE,eAAe,EAAE,CAAA;gBAEb,MAAM,EAAE,eAAe,EAAE;CAMtC;AAED,qCAAqC;AACrC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,eAAe,EAAE,CAoEhF;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,eAAe,EAAE,CAkE/E;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,eAAe,EAAE,CAwC/E;AAED,qCAAqC;AACrC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,eAAe,EAAE,CA6DlF;AAED,uCAAuC;AACvC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,GAAG,eAAe,EAAE,CAsCjE;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,eAAe,EAAE,CA2BlF"}
|