@starship-ci/generator
Version:
Kubernetes manifest generator for Starship deployments
110 lines (109 loc) • 4.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BuilderManager = void 0;
const fs = __importStar(require("fs"));
const yaml = __importStar(require("js-yaml"));
const path = __importStar(require("path"));
const defaults_1 = require("../defaults");
const chains_1 = require("./chains");
const explorer_1 = require("./explorer");
const frontend_1 = require("./frontend");
const ingress_1 = require("./ingress");
const monitoring_1 = require("./monitoring");
const registry_1 = require("./registry");
const relayers_1 = require("./relayers");
class BuilderManager {
config;
constructor(config) {
this.config = (0, defaults_1.applyDefaults)(config);
}
getManifestOutputPath(manifest, baseDir) {
const labels = manifest.metadata?.labels || {};
const component = labels['app.kubernetes.io/component'];
const partOf = labels['app.kubernetes.io/part-of'];
const role = labels['app.kubernetes.io/role'];
const kind = manifest.kind.toLowerCase();
const name = manifest.metadata.name;
if (component === 'chain') {
// Chain-specific resources: outputs/<chain-name>/<role>-<kind>.yaml
// For StatefulSets, use the special chain-name label, otherwise use app.kubernetes.io/name
const chainName = labels['starship.io/chain-name'] || labels['app.kubernetes.io/name'];
const roleType = role || 'default'; // genesis, validator, setup-scripts, genesis-patch, ics-proposal
return path.join(baseDir, chainName, `${roleType}-${kind}.yaml`);
}
else if (partOf === 'global') {
// Global configmaps: outputs/configmaps/<clean-name>.yaml (remove redundant suffixes)
const cleanName = name.replace(/-?configmap$/, ''); // Remove -configmap or configmap suffix
return path.join(baseDir, 'configmaps', `${cleanName}.yaml`);
}
else if (component) {
// Component resources: outputs/<component>/<clean-kind>.yaml (remove redundant prefixes)
const cleanName = name.replace(new RegExp(`^${component}-?`), ''); // Remove component prefix
const fileName = cleanName ? `${cleanName}-${kind}.yaml` : `${kind}.yaml`;
return path.join(baseDir, component, fileName);
}
else {
// Fallback: outputs/<name>-<kind>.yaml
return path.join(baseDir, `${name}-${kind}.yaml`);
}
}
writeManifestToPath(manifest, filePath) {
// Ensure directory exists
const dir = path.dirname(filePath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
// Write YAML file
fs.writeFileSync(filePath, yaml.dump(manifest));
}
writeManifests(manifests, outputDir) {
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
manifests.forEach((manifest) => {
const outputPath = this.getManifestOutputPath(manifest, outputDir);
this.writeManifestToPath(manifest, outputPath);
});
}
build(outputDir) {
const builders = [
new chains_1.ChainBuilder(this.config),
new registry_1.RegistryBuilder(this.config),
new explorer_1.ExplorerBuilder(this.config),
new frontend_1.FrontendBuilder(this.config),
new relayers_1.RelayerBuilder(this.config),
new ingress_1.IngressBuilder(this.config),
new monitoring_1.MonitoringBuilder(this.config)
];
let allManifests = [];
builders.forEach((builder) => {
allManifests = allManifests.concat(builder.generate());
});
this.writeManifests(allManifests, outputDir);
return allManifests;
}
}
exports.BuilderManager = BuilderManager;