UNPKG

kubricate

Version:

A TypeScript framework for building reusable, type-safe Kubernetes infrastructure — without the YAML mess.

87 lines (86 loc) 3.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MetadataInjector = void 0; var _nodeCrypto = /*#__PURE__*/require("node:crypto"); var _lodashEs = /*#__PURE__*/require("lodash-es"); var _constants = /*#__PURE__*/require("./constants.js"); class MetadataInjector { options; constructor(options) { this.options = options; } inject(resource) { if (typeof resource !== 'object' || resource == null) { return resource; } const metadata = this.ensureMetadata(resource); metadata.labels ??= {}; metadata.annotations ??= {}; metadata.labels[_constants.LABELS.kubricate] = 'true'; if (this.options.type === 'stack') { metadata.labels[_constants.LABELS.stackId] = this.options.stackId; metadata.annotations[_constants.LABELS.stackName] = this.options.stackName; metadata.labels[_constants.LABELS.resourceId] = this.options.resourceId; } else if (this.options.type === 'secret') { metadata.labels[_constants.LABELS.secretManagerId] = this.options.secretManagerId; metadata.annotations[_constants.LABELS.secretManagerName] = this.options.secretManagerName; } if (this.options.inject?.version) { metadata.annotations[_constants.LABELS.version] = this.options.kubricateVersion; } if (this.options.inject?.resourceHash) { metadata.annotations[_constants.LABELS.resourceHash] = this.calculateHash(resource); } if (this.options.inject?.managedAt) { metadata.annotations[_constants.LABELS.managedAt] = this.options.managedAt ?? new Date().toISOString(); } return resource; } ensureMetadata(resource) { if (!('metadata' in resource)) { resource.metadata = {}; } // eslint-disable-next-line @typescript-eslint/no-explicit-any const metadata = resource.metadata; metadata.labels ??= {}; metadata.annotations ??= {}; return metadata; } calculateHash(resource) { const cleaned = this.cleanForHash(resource); const sorted = this.sortKeysRecursively(cleaned); const serialized = JSON.stringify(sorted); return (0, _nodeCrypto.createHash)('sha256').update(serialized).digest('hex'); } cleanForHash(resource) { const clone = (0, _lodashEs.cloneDeep)(resource); if (clone.metadata && typeof clone.metadata === 'object') { const metadata = clone.metadata; delete metadata.creationTimestamp; delete metadata.resourceVersion; delete metadata.uid; delete metadata.selfLink; delete metadata.generation; delete metadata.managedFields; } return clone; } sortKeysRecursively(obj) { if (Array.isArray(obj)) { return obj.map(item => this.sortKeysRecursively(item)); } if (obj && typeof obj === 'object') { return Object.keys(obj).sort().reduce((acc, key) => { // eslint-disable-next-line @typescript-eslint/no-explicit-any acc[key] = this.sortKeysRecursively(obj[key]); return acc; // eslint-disable-next-line @typescript-eslint/no-explicit-any }, {}); } return obj; } } exports.MetadataInjector = MetadataInjector; //# sourceMappingURL=MetadataInjector.js.map