kubricate
Version:
A TypeScript framework for building reusable, type-safe Kubernetes infrastructure — without the YAML mess.
87 lines (86 loc) • 3.19 kB
JavaScript
;
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