UNPKG

k8ts

Version:

Powerful framework for building Kubernetes manifests in TypeScript.

78 lines 3.06 kB
"use strict"; 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