UNPKG

pk-template

Version:
498 lines 43.5 kB
"use strict"; 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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