k8ts
Version:
Powerful framework for building Kubernetes manifests in TypeScript.
78 lines • 3.06 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ResourceLoader = void 0;
const instruments_1 = require("@k8ts/instruments");
const emittery_1 = __importDefault(require("emittery"));
const error_1 = require("../../error");
class ResourceLoader extends emittery_1.default {
_options;
constructor(_options) {
super();
this._options = _options;
}
_checkNames(resources) {
let names = new Map();
const nameRegexp = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;
for (const resource of resources) {
const name = [resource.kind.name, resource.namespace, resource.name]
.filter(Boolean)
.join("/");
const existing = names.get(name);
if (existing) {
throw new error_1.MakeError(`Duplicate resource designation ${name}. Existing: ${existing.format("source")}, new: ${resource.format("source")}`);
}
if (!nameRegexp.test(resource.name)) {
throw new error_1.MakeError(`Invalid resource name ${resource.name}. Must match ${nameRegexp}`);
}
names.set(name, resource);
}
}
async load(input) {
// TODO: Handle ORIGINS that are referenced but not passed to the runner
let resources = [];
const addResource = async (res) => {
if (!(res instanceof instruments_1.Resource_Node)) {
throw new Error(`Expected ResourceNode, got ${res.constructor.name}`);
}
if (resources.some(r => r.equals(res))) {
return;
}
if (!res.isRoot) {
return;
}
const origin = res.origin;
if (!origin.isChildOf(input)) {
return;
}
const event = {
isExported: res.meta.has(`#k8ts.org/is-exported`),
resource: res
};
await this.emit("load", event);
const resourceOriginMetas = res.origin.inheritedMeta;
res.meta.add(resourceOriginMetas);
origin.entity["__emit__"]("resource/loaded", {
origin: origin.entity,
resource: res.entity
});
resources.push(res);
};
for (const resource of input.resources) {
await addResource(resource.node);
}
// Some resources might appear as dependencies to sub-resources that
// haven't loaded. We can acquire them by getting all the needed resources
for (const resource of resources) {
for (const relation of resource.recursiveRelationsSubtree) {
await addResource(relation.needed);
}
}
this._checkNames(resources);
return [...resources];
}
}
exports.ResourceLoader = ResourceLoader;
//# sourceMappingURL=loader.js.map