UNPKG

@eggjs/dal-runtime

Version:
114 lines 7.87 kB
"use strict"; 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 () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.NunjucksUtils = void 0; const nunjucks_1 = __importStar(require("nunjucks")); const sqlstring_1 = __importDefault(require("sqlstring")); const NunjucksConverter_1 = require("./NunjucksConverter"); const SqlUtil_1 = require("./SqlUtil"); const compiler = nunjucks_1.default.compiler; const envs = {}; const ROOT_RENDER_FUNC = Symbol('rootRenderFunc'); const RUNTIME = Object.assign({}, nunjucks_1.default.runtime, { escapeSQL: function escapeSQL(key, value) { // 如果是预定义 block 则不转义 if (this.env.globals[key]) return value; return sqlstring_1.default.escape(value, true, this.env.timezone); }, }); function _replaceCodeWithSQLFeature(source) { const funcs = [ 'convertNormalVariableCode', // 普通变量 'convertTernaryCode', // 三目运算 'convertNestedObjectCode', // 对象中的变量,如 `user.id` 'convertValueInsideFor', // for 中的值需要转义 ]; return funcs.reduce((source, func) => NunjucksConverter_1.NunjucksConverter[func](source), source); } /** * compile the string into function * @see https://github.com/mozilla/nunjucks/blob/2fd547f/src/environment.js#L571-L592 */ function _compile() { let source = compiler.compile(this.tmplStr, this.env.asyncFilters, this.env.extensionsList, this.path, this.env.opts); /** * 将一些 Nunjucks 的 HTML 转义的代码转换成 SQL 防注入的代码 */ source = _replaceCodeWithSQLFeature(source); // eslint-disable-next-line const props = (new Function(source))(); this.blocks = this._getBlocks(props); this[ROOT_RENDER_FUNC] = props.root; this.rootRenderFunc = function (env, context, frame, _runtime, cb) { /** * 1. 将 runtime 遗弃,用新的 * 2. 移除 SQL 语句中多余空白符 */ return this[ROOT_RENDER_FUNC](env, context, frame, RUNTIME, function (err, ret) { // istanbul ignore if if (err) return cb(err, ret); return cb(err, SqlUtil_1.SqlUtil.minify(ret || '')); }); }; this.compiled = true; } class NunjucksUtils { static createEnv(modelName) { if (envs[modelName]) return envs[modelName]; const env = envs[modelName] = nunjucks_1.default.configure({ autoescape: false, }); return env; } static compile(modelName, sqlName, sql) { // istanbul ignore if if (!envs[modelName]) { throw new Error(`you should create an Environment for ${modelName} first.`); } const template = new nunjucks_1.Template(sql, envs[modelName], `egg-dal:MySQL:${modelName}:${sqlName}`, false); // 做一些 hack,使得支持 MySQL 的一些 Escape template._compile = _compile; template.compile(); return template; } } exports.NunjucksUtils = NunjucksUtils; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTnVuanVja3NVdGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL051bmp1Y2tzVXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxxREFBZ0U7QUFDaEUsMERBQWtDO0FBQ2xDLDJEQUF3RDtBQUN4RCx1Q0FBb0M7QUFFcEMsTUFBTSxRQUFRLEdBQUksa0JBQWdCLENBQUMsUUFBUSxDQUFDO0FBQzVDLE1BQU0sSUFBSSxHQUFnQyxFQUFFLENBQUM7QUFFN0MsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNsRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxrQkFBUSxDQUFDLE9BQU8sRUFBRTtJQUNsRCxTQUFTLEVBQUUsU0FBUyxTQUFTLENBQVksR0FBRyxFQUFFLEtBQUs7UUFDakQsb0JBQW9CO1FBQ3BCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEMsT0FBTyxtQkFBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILFNBQVMsMEJBQTBCLENBQUMsTUFBTTtJQUN4QyxNQUFNLEtBQUssR0FBRztRQUNaLDJCQUEyQixFQUFFLE9BQU87UUFDcEMsb0JBQW9CLEVBQUUsT0FBTztRQUM3Qix5QkFBeUIsRUFBRSxxQkFBcUI7UUFDaEQsdUJBQXVCLEVBQUUsY0FBYztLQUN4QyxDQUFDO0lBRUYsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMscUNBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFD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