@pubgcorp/pk-template
Version:
p template engine for kubernetes
507 lines • 44.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createLanguageRuntime = exports.PktRuntime = exports.compilePkt = void 0;
const lazy_1 = require("../lazy");
const utils_1 = require("./utils");
const styleSheet_1 = require("./styles/styleSheet");
const jsonSchema_1 = require("./jsonSchema");
const selectors_1 = __importDefault(require("./selectors"));
const pk_yaml_1 = require("../pk-yaml");
const jslib_1 = __importDefault(require("./jslib"));
const common_1 = require("../common");
const path_1 = require("path");
const PKT_INITIAL_STATE = 'pkt:$initial';
const PKT_IMPORT_INITIAL_STATE = 'import:$initial';
// TODO: merge loadPkt in scope.ts
const compilePkt = (src, uri) => {
const yamls = (0, pk_yaml_1.parseYamlAsPkt)(src, uri);
if (yamls.length == 0) {
return { header: {}, statements: [] };
}
if (yamls[0] && (yamls[0]['/properties'] || yamls[0]['/schema'] || yamls[0]['/import'] || yamls[0]['/require'])) {
const header = yamls[0];
return { header, statements: yamls.slice(1) };
}
return { header: {}, statements: yamls };
};
exports.compilePkt = compilePkt;
class PktRuntime {
constructor() {
// style
this.expandStyle = (vm, scope, object) => scope.styleSheet.apply(vm, scope, object);
this.initialState = PKT_INITIAL_STATE;
}
buildProperties(properties, parentValues) {
const values = Object.assign({ cluster: null, env: null, namespace: null }, (properties || {}));
for (const k in parentValues) {
if (k in values)
values[k] = parentValues[k];
}
return values;
}
checkStrictCheckedValues(header, strictValues, uri) {
if (header['/properties']) {
const undefinedValue = Object.keys(strictValues)
.find(k => !(k in header['/properties']));
if (undefinedValue) {
throw new Error(`${undefinedValue} is not defined at ${uri}`);
}
}
}
executeFile(vm, scope, rpath, strictValues) {
if (rpath.toLowerCase().endsWith('.pkt')) {
const { uri, data } = scope.loadPkt(rpath);
this.checkStrictCheckedValues(data.header, strictValues, uri);
const values = strictValues ? this.evalObject(vm, scope, strictValues) : {};
scope.child2({ uri, values }, (cscope) => {
vm.execute(cscope, { uri, pkt: data }, PKT_INITIAL_STATE);
});
}
else {
const { uri, data } = scope.loadText(rpath);
const values = strictValues ? this.evalObject(vm, scope, strictValues) : {};
scope.child2({ uri, values }, (cscope) => {
vm.runtime.evalTemplateAll(vm, cscope, data)
.filter(o => o)
.forEach(o => cscope.add(o));
});
}
}
importFile(vm, scope, rpath) {
if (!rpath.toLowerCase().endsWith('.pkt') && !rpath.toLowerCase().endsWith('.pkt')) {
throw scope.error(`can not import non pkt or non yaml file ${rpath}`);
}
if (rpath.toLowerCase().endsWith('.pkt')) {
const { uri, data } = scope.loadPkt(rpath);
vm.execute(scope, { uri, pkt: data }, PKT_IMPORT_INITIAL_STATE);
}
else if (rpath.toLowerCase().endsWith('.yaml')) {
const yaml = scope.loadYaml(rpath);
scope.objects.push(yaml);
}
}
expandStyleSheet(vm, scope, object) {
this.expandStyle(vm, scope, object);
}
expandCaretPath(object) {
(0, common_1.forEachTreeObjectKey)(object, (node, key, value) => {
if (key.startsWith('^') && key.length > 1) {
delete node[key];
(0, utils_1.setValue)(node, key.substr(1), value);
}
});
}
deleteUndefined(node) {
if (node === undefined) {
return;
}
if (Array.isArray(node)) {
for (let i = node.length - 1; i >= 0; --i) {
const val = node[i];
if (val === undefined) {
node.splice(i, 1);
}
else {
this.deleteUndefined(node[i]);
}
}
}
else if (typeof node === 'object') {
if (node === null)
return node;
Object.keys(node)
.forEach((key) => {
const val = node[key];
if (val === undefined) {
delete node[key];
}
else {
this.deleteUndefined(node[key]);
}
});
}
}
evalObject(vm, scope, object) {
object = vm.evalAllCustomTags(scope, object);
this.expandCaretPath(object);
this.expandStyleSheet(vm, scope, object);
this.deleteUndefined(object);
return object;
}
// evaluater
evalTemplate(vm, scope, tpl) {
const _ = (0, lazy_1.getUnderscore)();
return _.template(tpl)(vm.sandbox(scope));
}
evalTemplateAll(vm, scope, text) {
try {
const tpl = (0, lazy_1.getUnderscore)().template(text);
const yaml = tpl(vm.sandbox(scope));
const objects = (0, pk_yaml_1.parseYamlAll)(yaml);
return objects;
}
catch (e) {
throw scope.error('failed to parse template', e);
}
}
// }
// const pktLanguage: ILanguageSpec<PktRuntime> = {
createLanguageSpec() {
const spec = {
compile: this.compile,
initialState: PKT_INITIAL_STATE,
states: {},
sandbox: this.sandbox,
};
for (const key of Object.getOwnPropertyNames(PktRuntime.prototype)) {
const item = this[key];
if (typeof item == 'function') {
const m = key.match(/^([^_]+):(\d+):([^_]+)$/);
if (m) {
const state = spec.states[m[1]] || (spec.states[m[1]] = {});
state[m[3]] = {
name: m[3],
order: Number(m[2]),
handler: this[key],
};
}
}
}
return spec;
}
compile(scope, src, uri) {
try {
return {
uri,
pkt: (0, exports.compilePkt)(src, uri),
withObject: true,
};
}
catch (e) {
throw scope.error(`failed to parse yaml ${uri}`, e);
}
}
sandbox(scope, values) {
const $ = values
? Object.assign(Object.assign(Object.assign({}, scope), (0, jslib_1.default)(scope)), values) : Object.assign(Object.assign({}, scope), (0, jslib_1.default)(scope));
const sandbox = Object.assign({ $, console, Buffer }, scope.values);
return sandbox;
}
['pkt:100:$initial'](vm, scope, stmt, next) {
if (!stmt)
return {};
if (!scope)
throw 'no parent scope';
const uri = stmt.uri;
const pkt = stmt.pkt;
const options = stmt.options;
scope.trace.into(() => {
const values = (0, utils_1.deepCloneWithFunction)(scope.values);
scope.child2({ uri, values }, cscope => {
cscope.trace.step('header');
const rst = vm.execute(cscope, pkt.header, 'decl');
if (rst.exit) {
return {};
}
for (let i = 0; i < pkt.statements.length; ++i) {
cscope.trace.step(i);
const rst = vm.execute(cscope, pkt.statements[i], 'stmt');
if (rst.exit) {
return {};
}
}
});
});
return {};
}
['import:100:$initial'](vm, scope, stmt) {
if (!stmt)
return {};
if (!scope)
throw 'no parent scope';
const uri = stmt.uri;
const pkt = stmt.pkt;
const withObject = stmt.withObject;
scope.trace.into(() => {
scope.trace.step('header');
const rst = vm.execute(scope, pkt.header, 'decl');
if (rst.exit) {
return {};
}
for (let i = 0; i < pkt.statements.length; ++i) {
scope.trace.step(i);
const rst = vm.execute(scope, pkt.statements[i], 'stmt');
if (rst.exit) {
return {};
}
}
});
return {};
}
['decl:100:/properties'](vm, scope, stmt, next) {
// 2. build properties
scope.trace.step('/properties');
if (stmt['/properties']) {
scope.values = vm.runtime.buildProperties(stmt['/properties'], scope.values);
}
return next(scope);
}
['decl:101:/schema'](vm, scope, stmt, next) {
scope.trace.step('schema');
const schema = new jsonSchema_1.JsonSchema(stmt['/schema']);
const errors = schema.validate(scope.values);
if (errors) {
throw scope.error('property validation failed', new Error(errors));
}
return next(scope);
}
['decl:102:/import'](vm, scope, stmt, next) {
scope.trace.step('/import');
let rpathes = stmt['/import'];
if (!Array.isArray(rpathes)) {
rpathes = [rpathes];
}
for (const rpath of rpathes) {
let childValues = {};
const objects = [];
scope.child2({ objects, orphan: true }, (cscope) => {
vm.runtime.importFile(vm, cscope, rpath);
childValues = cscope.values;
});
scope.objects.push(...objects);
scope.values = Object.assign(Object.assign({}, scope.values), childValues);
}
return next(scope);
}
['decl:103:/stylesheet'](vm, scope, stmt, next) {
scope.trace.step('/stylesheet');
scope.styleSheet = styleSheet_1.StyleSheet.Build(scope, stmt);
return next(scope);
}
['decl:103:/require'](vm, scope, stmt, next) {
scope.trace.step('/require');
const uri = scope.resolve(stmt['/require']);
if (!uri.endsWith('.js')) {
throw scope.error('/require only accepts *.js files');
}
if (uri) {
const obj = require(uri);
const name = (0, path_1.parse)(uri).name;
scope.values = Object.assign(Object.assign({}, scope.values), { [name]: obj });
}
return next(scope);
}
['decl:104:/values'](vm, scope, stmt, next) {
if (stmt['/values']) {
scope.trace.step('/values');
scope.values = Object.assign(Object.assign({}, scope.values), vm.runtime.evalObject(vm, scope, stmt['/values'] || {}));
}
return next(scope);
}
['decl:105:/assign'](vm, scope, stmt, next) {
if (stmt['/assign']) {
throw scope.error('header cannot have /assign statement');
// scope.trace.step('/assign');
// scope.values = {
// ...scope.values,
// ...scope.evalObject(stmt['/assign'] || {}),
// };
}
return next(scope);
}
['stmt:000:/if'](vm, scope, stmt, next) {
return vm.runtime.evalObject(vm, scope, stmt['/if']) ? next(scope) : {};
}
['stmt:001:/unless'](vm, scope, stmt, next) {
return vm.runtime.evalObject(vm, scope, stmt['/unless']) ? {} : next(scope);
}
['stmt:003:/endIf'](vm, scope, stmt, next) {
return vm.runtime.evalObject(vm, scope, stmt['/endIf']) ? { exit: true } : {};
}
['stmt:004:/end']() {
return { exit: true };
}
['stmt:010:/select'](vm, scope, stmt, next) {
const predicate = selectors_1.default.compile(stmt['/select']);
const before = scope.objects.filter(predicate);
const after = before.map(o => o);
const rst = scope.child2({ objects: after }, cscope => {
return next(cscope);
});
// add new objects
for (const obj of after) {
if (!before.includes(obj)) {
scope.objects.push(obj);
}
}
// remove deleted objects
for (const obj of before) {
if (!after.includes(obj)) {
const idx = scope.objects.indexOf(obj);
if (idx == -1) {
throw new Error('unknown error');
}
scope.objects.splice(idx, 1);
}
}
if (rst.exit) {
return rst;
}
return {};
}
['stmt:100:/foreach'](vm, scope, stmt, next) {
scope.trace.into(() => {
scope.objects.forEach((o, i) => {
scope.trace.step(i);
scope.object = o;
vm.eval(stmt['/foreach'], scope);
});
});
scope.object = null;
return {};
}
['stmt:100:/values'](vm, scope, stmt, next) {
const evaluatedValues = vm.runtime.evalObject(vm, scope, stmt['/values'] || {});
scope.defineValues(evaluatedValues);
return {};
}
['stmt:100:/assign'](vm, scope, stmt, next) {
const values = vm.runtime.evalObject(vm, scope, stmt['/assign'] || {});
for (const key of Object.keys(values)) {
if (key in scope.values) {
scope.values[key] = values[key];
}
else {
const msg = `value ${key} is not defined`;
throw (0, utils_1.pktError)(scope, new Error(msg), msg);
}
}
return {};
}
['stmt:100:/exit'](vm, scope, stmt, next) {
const value = vm.runtime.evalObject(vm, scope, stmt['/exit']);
if (value) {
return { exit: true };
}
else {
return {};
}
}
['stmt:100:/add'](vm, scope, stmt, next) {
const object = vm.runtime.evalObject(vm, scope, stmt['/add']);
scope.add(object);
return {};
}
['stmt:100:/script'](vm, scope, stmt, next) {
vm.eval(stmt['/script'], scope);
return {};
}
['stmt:100:/template'](vm, scope, stmt, next) {
const objects = vm.runtime.evalTemplateAll(vm, scope, stmt['/template']);
objects.forEach(object => scope.add(object));
return {};
}
['stmt:100:/include'](vm, scope, stmt, next) {
const rpath = stmt['/include'];
const _with = stmt['/with'] || {};
const objects = [];
scope.child2({ objects }, (cscope) => {
vm.runtime.executeFile(vm, cscope, rpath, _with);
});
scope.objects.push(...objects);
return {};
}
['stmt:100:/apply'](vm, scope, stmt, next) {
const rpath = stmt['/apply'];
const _with = stmt['/with'] || {};
vm.runtime.executeFile(vm, scope, rpath, _with);
return {};
}
['stmt:100:/jsonpath'](vm, scope, stmt, next) {
const query = stmt['/jsonpath'];
const apply = stmt['.apply'];
const merge = stmt['.merge'];
const exec = stmt['.exec'];
const jsonpath = (0, lazy_1.getJsonPath)();
scope.trace.into(() => {
scope.objects.forEach((o, i) => {
scope.trace.step(i);
const nodes = jsonpath.nodes(o, query);
nodes.forEach((node) => {
scope.child2({}, cscope => {
cscope.object = o;
cscope.value = node.value;
if (apply) {
const value = vm.runtime.evalObject(vm, scope, apply);
jsonpath.apply(o, jsonpath.stringify(node.path), () => value);
}
if (merge) {
const value = vm.runtime.evalObject(vm, scope, merge);
const merged = Object.assign(Object.assign({}, node.value), value);
jsonpath.apply(o, jsonpath.stringify(node.path), () => merged);
}
if (exec) {
vm.eval(exec, cscope);
}
});
});
});
});
return {};
}
['stmt:100:/jsonpatch'](vm, scope, stmt, next) {
const jsonpatch = (0, lazy_1.getJsonPatch)();
const patch = Array.isArray(stmt['/jsonpatch']) ? stmt['/jsonpatch'] : [stmt['/jsonpatch']];
scope.trace.into(() => {
scope.objects.forEach((o, i) => {
scope.trace.step(i);
scope.object = o;
const p = vm.runtime.evalObject(vm, scope, patch);
jsonpatch.apply(o, p);
scope.object = null;
});
});
scope.object = null;
return {};
}
['stmt:100:/routine'](vm, scope, stmt, next) {
const objects = [];
scope.child2({ objects }, scope => {
for (const cstmt of stmt['/routine']) {
const rst = vm.execute(scope, cstmt, 'stmt');
if (rst.exit) {
return rst;
}
}
});
scope.objects.push(...objects);
return {};
}
['stmt:200:/comment'](vm, scope, stmt, next) {
return {};
}
['stmt:500:$default'](vm, scope, stmt, next) {
if (!stmt) {
return {};
}
const o = {};
Object.keys(stmt)
.filter(k => k.length == 0 || k[0] !== '/')
.forEach(k => o[k] = stmt[k]);
if (Object.keys(o).length != 0) {
const object = vm.runtime.evalObject(vm, scope, o);
if (object) {
scope.add(object);
}
}
return {};
}
}
exports.PktRuntime = PktRuntime;
;
const createLanguageRuntime = () => new PktRuntime();
exports.createLanguageRuntime = createLanguageRuntime;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2VTcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BrLXRlbXBsYXRlL2xhbmd1YWdlU3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxrQ0FBbUU7QUFDbkUsbUNBQW9FO0FBQ3BFLG9EQUFpRDtBQUNqRCw2Q0FBMEM7QUFDMUMsNERBQW9DO0FBQ3BDLHdDQUF1RTtBQUN2RSxvREFBNEI7QUFDNUIsc0NBQWlEO0FBR2pELCtCQUFrRTtBQUVsRSxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUN6QyxNQUFNLHdCQUF3QixHQUFHLGlCQUFpQixDQUFDO0FBS25ELGtDQUFrQztBQUMzQixNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQVcsRUFBRSxHQUFXLEVBQVEsRUFBRTtJQUMzRCxNQUFNLEtBQUssR0FBRyxJQUFBLHdCQUFjLEVBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDO0tBQ3ZDO0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtRQUMvRyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9DO0lBQ0QsT0FBTyxFQUFF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