pk-template
Version:
p template engine for kubernetes
498 lines • 43.5 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
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
exports.compilePkt = (src, uri) => {
const yamls = 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 };
};
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')) {
throw scope.error(`can not import non pkt file ${rpath}`);
}
const { uri, data } = scope.loadPkt(rpath);
vm.execute(scope, { uri, pkt: data }, PKT_IMPORT_INITIAL_STATE);
}
expandStyleSheet(vm, scope, object) {
this.expandStyle(vm, scope, object);
}
expandCaretPath(object) {
common_1.forEachTreeObjectKey(object, (node, key, value) => {
if (key.startsWith('^') && key.length > 1) {
delete node[key];
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 _ = lazy_1.getUnderscore();
return _.template(tpl)(vm.sandbox(scope));
}
evalTemplateAll(vm, scope, text) {
try {
const tpl = lazy_1.getUnderscore().template(text);
const yaml = tpl(vm.sandbox(scope));
const objects = 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: exports.compilePkt(src, uri),
withObject: true,
};
}
catch (e) {
throw scope.error(`failed to parse yaml ${uri}`, e);
}
}
sandbox(scope, values) {
const $ = values
? Object.assign({}, scope, jslib_1.default(scope), values) : Object.assign({}, scope, 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 = 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({}, 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 = path_1.parse(uri).name;
scope.values = 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({}, 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);
});
});
delete scope.object;
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 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 = 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({}, 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 = 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);
delete scope.object;
});
});
delete scope.object;
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;
;
exports.createLanguageRuntime = () => new PktRuntime();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2VTcGVjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BrLXRlbXBsYXRlL2xhbmd1YWdlU3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLGtDQUFtRTtBQUNuRSxtQ0FBb0U7QUFDcEUsb0RBQWlEO0FBQ2pELDZDQUEwQztBQUMxQyw0REFBb0M7QUFDcEMsd0NBQXVFO0FBQ3ZFLG9EQUE0QjtBQUM1QixzQ0FBaUQ7QUFHakQsK0JBQWtFO0FBRWxFLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBQ3pDLE1BQU0sd0JBQXdCLEdBQUcsaUJBQWlCLENBQUM7QUFLbkQsa0NBQWtDO0FBQ3JCLFFBQUEsVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBUSxFQUFFO0lBQzNELE1BQU0sS0FBSyxHQUFHLHdCQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDckIsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDO0tBQ3ZDO0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRTtRQUMvRyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQy9DO0lBQ0QsT0FBTyxFQUFFLE1BQU0s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