Skip to content

Commit 51d20ed

Browse files
committed
fix: simplify schema validation for secrets
1 parent 94d4947 commit 51d20ed

1 file changed

Lines changed: 15 additions & 32 deletions

File tree

src/cmd/validate-values.ts

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import Ajv, { ValidateFunction } from 'ajv'
2-
import { cloneDeep, unset } from 'lodash'
2+
import { cloneDeep, difference, unset } from 'lodash'
33
import { prepareEnvironment } from 'src/common/cli'
44
import { terminal } from 'src/common/debug'
55
import { env } from 'src/common/envalid'
@@ -19,44 +19,27 @@ const internalPaths: string[] = ['k8s', 'adminApps', 'teamApps']
1919
*/
2020
export function removeSecretRequirements(schema: Record<string, any>): Record<string, any> {
2121
const cleaned = cloneDeep(schema)
22-
removeSecretRequirementsInPlace(cleaned)
22+
removeSecretsInPlace(cleaned)
2323
return cleaned
2424
}
2525

26-
function removeSecretRequirementsInPlace(schema: Record<string, any>): void {
27-
if (!schema || typeof schema !== 'object') return
28-
29-
// Collect property names that have x-secret in this node
30-
const secretProps = new Set<string>()
31-
if (schema.properties) {
32-
for (const [propName, propSchema] of Object.entries(schema.properties as Record<string, any>)) {
33-
if (propSchema && typeof propSchema === 'object' && 'x-secret' in propSchema) {
34-
secretProps.add(propName)
35-
}
36-
}
37-
}
38-
39-
// Remove secret properties from required array
40-
if (Array.isArray(schema.required) && secretProps.size > 0) {
41-
const filtered = schema.required.filter((r: string) => !secretProps.has(r))
42-
if (filtered.length === 0) {
26+
function removeSecretsInPlace(node: any): void {
27+
if (!node || typeof node !== 'object') return
28+
if (node.properties && Array.isArray(node.required)) {
29+
const secretProps = Object.keys(node.properties as Record<string, any>).filter(
30+
(key) => 'x-secret' in (node.properties[key] ?? {}),
31+
)
32+
if (secretProps.length > 0) {
33+
const filtered = difference(node.required as string[], secretProps)
4334
// eslint-disable-next-line no-param-reassign
44-
delete schema.required
45-
} else {
35+
if (filtered.length === 0) delete node.required
4636
// eslint-disable-next-line no-param-reassign
47-
schema.required = filtered
37+
else node.required = filtered
4838
}
4939
}
50-
51-
// Recurse into all sub-schemas
52-
for (const value of Object.values(schema)) {
53-
if (Array.isArray(value)) {
54-
for (const item of value) {
55-
removeSecretRequirementsInPlace(item)
56-
}
57-
} else if (value && typeof value === 'object') {
58-
removeSecretRequirementsInPlace(value)
59-
}
40+
for (const value of Object.values(node as Record<string, unknown>)) {
41+
if (Array.isArray(value)) value.forEach(removeSecretsInPlace)
42+
else if (value && typeof value === 'object') removeSecretsInPlace(value)
6043
}
6144
}
6245

0 commit comments

Comments
 (0)