@eggjs/dal-runtime
Version:
tegg dal decorator
114 lines • 7.87 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 () {
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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