es5编译目标
This commit is contained in:
parent
f297f75fc1
commit
f07760a7c0
|
|
@ -1,11 +1,29 @@
|
|||
"use strict";
|
||||
var __extends = (this && this.__extends) || (function () {
|
||||
var extendStatics = function (d, b) {
|
||||
extendStatics = Object.setPrototypeOf ||
|
||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||||
return extendStatics(d, b);
|
||||
};
|
||||
return function (d, b) {
|
||||
if (typeof b !== "function" && b !== null)
|
||||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||||
extendStatics(d, b);
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.OakError = void 0;
|
||||
class OakError extends Error {
|
||||
constructor(level, def, message) {
|
||||
super(message ? message : def && def[1]);
|
||||
this.$$level = level;
|
||||
this.$$code = def && def[0];
|
||||
var OakError = /** @class */ (function (_super) {
|
||||
__extends(OakError, _super);
|
||||
function OakError(level, def, message) {
|
||||
var _this = _super.call(this, message ? message : def && def[1]) || this;
|
||||
_this.$$level = level;
|
||||
_this.$$code = def && def[0];
|
||||
return _this;
|
||||
}
|
||||
}
|
||||
return OakError;
|
||||
}(Error));
|
||||
exports.OakError = OakError;
|
||||
|
|
|
|||
|
|
@ -2,11 +2,11 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.makeAbleActionDef = exports.genericActions = void 0;
|
||||
exports.genericActions = ['create', 'update', 'remove', 'count', 'stat', 'download', 'select'];
|
||||
const makeAbleActionDef = (initialState) => ({
|
||||
var makeAbleActionDef = function (initialState) { return ({
|
||||
stm: {
|
||||
enable: ['disabled', 'enabled'],
|
||||
disable: ['enabled', 'disabled'],
|
||||
},
|
||||
is: initialState,
|
||||
});
|
||||
}); };
|
||||
exports.makeAbleActionDef = makeAbleActionDef;
|
||||
|
|
|
|||
|
|
@ -2,20 +2,20 @@
|
|||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.INT_LITERL_DEFAULT_WIDTH = exports.NUMERICAL_LITERL_DEFAULT_SCALE = exports.NUMERICAL_LITERL_DEFAULT_PRECISION = exports.STRING_LITERAL_MAX_LENGTH = exports.RESERVED_ENTITIES = exports.ACTION_CONSTANT_IN_OAK_DOMAIN = exports.TYPE_PATH_IN_OAK_DOMAIN = exports.ENTITY_PATH_IN_OAK_GENERAL_BUSINESS = exports.ROOT_PATH_IN_OAK_DOMAIN = exports.LIB_OAK_DOMAIN = void 0;
|
||||
exports.LIB_OAK_DOMAIN = 'oak-domain';
|
||||
const LIB_OAK_GENERAL_BUSINESS = 'oak-general-business';
|
||||
const ROOT_PATH_IN_OAK_DOMAIN = () => 'lib';
|
||||
var LIB_OAK_GENERAL_BUSINESS = 'oak-general-business';
|
||||
var ROOT_PATH_IN_OAK_DOMAIN = function () { return 'lib'; };
|
||||
exports.ROOT_PATH_IN_OAK_DOMAIN = ROOT_PATH_IN_OAK_DOMAIN;
|
||||
const LEVEL_PREFIX = ['.', '..', '../..', '../../..', '../../../..'];
|
||||
const ENTITY_PATH_IN_OAK_GENERAL_BUSINESS = () => {
|
||||
return `${LIB_OAK_GENERAL_BUSINESS}/${(0, exports.ROOT_PATH_IN_OAK_DOMAIN)()}/entities/`;
|
||||
var LEVEL_PREFIX = ['.', '..', '../..', '../../..', '../../../..'];
|
||||
var ENTITY_PATH_IN_OAK_GENERAL_BUSINESS = function () {
|
||||
return "".concat(LIB_OAK_GENERAL_BUSINESS, "/").concat((0, exports.ROOT_PATH_IN_OAK_DOMAIN)(), "/entities/");
|
||||
};
|
||||
exports.ENTITY_PATH_IN_OAK_GENERAL_BUSINESS = ENTITY_PATH_IN_OAK_GENERAL_BUSINESS;
|
||||
const TYPE_PATH_IN_OAK_DOMAIN = () => {
|
||||
return `${exports.LIB_OAK_DOMAIN}/${(0, exports.ROOT_PATH_IN_OAK_DOMAIN)()}/types/`;
|
||||
var TYPE_PATH_IN_OAK_DOMAIN = function () {
|
||||
return "".concat(exports.LIB_OAK_DOMAIN, "/").concat((0, exports.ROOT_PATH_IN_OAK_DOMAIN)(), "/types/");
|
||||
};
|
||||
exports.TYPE_PATH_IN_OAK_DOMAIN = TYPE_PATH_IN_OAK_DOMAIN;
|
||||
const ACTION_CONSTANT_IN_OAK_DOMAIN = () => {
|
||||
return `${exports.LIB_OAK_DOMAIN}/${(0, exports.ROOT_PATH_IN_OAK_DOMAIN)()}/actions/action`;
|
||||
var ACTION_CONSTANT_IN_OAK_DOMAIN = function () {
|
||||
return "".concat(exports.LIB_OAK_DOMAIN, "/").concat((0, exports.ROOT_PATH_IN_OAK_DOMAIN)(), "/actions/action");
|
||||
};
|
||||
exports.ACTION_CONSTANT_IN_OAK_DOMAIN = ACTION_CONSTANT_IN_OAK_DOMAIN;
|
||||
// export const OUTPUT_PATH = 'app-domain/entities';
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -1,13 +1,86 @@
|
|||
"use strict";
|
||||
var __extends = (this && this.__extends) || (function () {
|
||||
var extendStatics = function (d, b) {
|
||||
extendStatics = Object.setPrototypeOf ||
|
||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||||
return extendStatics(d, b);
|
||||
};
|
||||
return function (d, b) {
|
||||
if (typeof b !== "function" && b !== null)
|
||||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||||
extendStatics(d, b);
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
})();
|
||||
var __assign = (this && this.__assign) || function () {
|
||||
__assign = Object.assign || function(t) {
|
||||
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||||
s = arguments[i];
|
||||
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||||
t[p] = s[p];
|
||||
}
|
||||
return t;
|
||||
};
|
||||
return __assign.apply(this, arguments);
|
||||
};
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
while (_) try {
|
||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0: case 1: t = op; break;
|
||||
case 4: _.label++; return { value: op[1], done: false };
|
||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||
if (t[2]) _.ops.pop();
|
||||
_.trys.pop(); continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
};
|
||||
var __values = (this && this.__values) || function(o) {
|
||||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
||||
if (m) return m.call(o);
|
||||
if (o && typeof o.length === "number") return {
|
||||
next: function () {
|
||||
if (o && i >= o.length) o = void 0;
|
||||
return { value: o && o[i++], done: !o };
|
||||
}
|
||||
};
|
||||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.TriggerExecutor = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
const lodash_1 = require("../utils/lodash");
|
||||
const filter_1 = require("../store/filter");
|
||||
const Trigger_1 = require("../types/Trigger");
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
var lodash_1 = require("../utils/lodash");
|
||||
var filter_1 = require("../store/filter");
|
||||
var Trigger_1 = require("../types/Trigger");
|
||||
/**
|
||||
* update可能会传入多种不同的action,此时都需要检查update trigger
|
||||
*/
|
||||
|
|
@ -19,240 +92,458 @@ const Trigger_1 = require("../types/Trigger");
|
|||
'count': 'select',
|
||||
'stat': 'select',
|
||||
}; */
|
||||
class TriggerExecutor extends Trigger_1.Executor {
|
||||
counter;
|
||||
triggerMap;
|
||||
triggerNameMap;
|
||||
volatileEntities;
|
||||
logger;
|
||||
contextBuilder;
|
||||
constructor(contextBuilder, logger = console) {
|
||||
super();
|
||||
this.contextBuilder = contextBuilder;
|
||||
this.logger = logger;
|
||||
this.triggerMap = {};
|
||||
this.triggerNameMap = {};
|
||||
this.volatileEntities = [];
|
||||
this.counter = 0;
|
||||
var TriggerExecutor = /** @class */ (function (_super) {
|
||||
__extends(TriggerExecutor, _super);
|
||||
function TriggerExecutor(contextBuilder, logger) {
|
||||
if (logger === void 0) { logger = console; }
|
||||
var _this = _super.call(this) || this;
|
||||
_this.contextBuilder = contextBuilder;
|
||||
_this.logger = logger;
|
||||
_this.triggerMap = {};
|
||||
_this.triggerNameMap = {};
|
||||
_this.volatileEntities = [];
|
||||
_this.counter = 0;
|
||||
return _this;
|
||||
}
|
||||
registerChecker(checker) {
|
||||
const { entity, action, checker: checkFn, type } = checker;
|
||||
const triggerName = `${entity}${action}权限检查-${this.counter++}`;
|
||||
const trigger = {
|
||||
TriggerExecutor.prototype.registerChecker = function (checker) {
|
||||
var entity = checker.entity, action = checker.action, checkFn = checker.checker, type = checker.type;
|
||||
var triggerName = "".concat(entity).concat(action, "\u6743\u9650\u68C0\u67E5-").concat(this.counter++);
|
||||
var trigger = {
|
||||
checkerType: type,
|
||||
name: triggerName,
|
||||
entity,
|
||||
action,
|
||||
entity: entity,
|
||||
action: action,
|
||||
fn: checkFn,
|
||||
when: 'before',
|
||||
};
|
||||
this.registerTrigger(trigger);
|
||||
}
|
||||
registerTrigger(trigger) {
|
||||
};
|
||||
TriggerExecutor.prototype.registerTrigger = function (trigger) {
|
||||
var _a;
|
||||
var _this = this;
|
||||
// trigger的两种访问方式: by name, by entity/action
|
||||
if (this.triggerNameMap.hasOwnProperty(trigger.name)) {
|
||||
throw new Error(`不可有同名的触发器「${trigger.name}」`);
|
||||
throw new Error("\u4E0D\u53EF\u6709\u540C\u540D\u7684\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D"));
|
||||
}
|
||||
Object.assign(this.triggerNameMap, {
|
||||
[trigger.name]: trigger,
|
||||
});
|
||||
const addTrigger = (action) => {
|
||||
const triggers = this.triggerMap[trigger.entity] && this.triggerMap[trigger.entity][action];
|
||||
Object.assign(this.triggerNameMap, (_a = {},
|
||||
_a[trigger.name] = trigger,
|
||||
_a));
|
||||
var addTrigger = function (action) {
|
||||
var _a, _b, _c;
|
||||
var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
|
||||
if (triggers) {
|
||||
triggers.push(trigger);
|
||||
}
|
||||
else if (this.triggerMap[trigger.entity]) {
|
||||
Object.assign(this.triggerMap[trigger.entity], {
|
||||
[action]: [trigger],
|
||||
});
|
||||
else if (_this.triggerMap[trigger.entity]) {
|
||||
Object.assign(_this.triggerMap[trigger.entity], (_a = {},
|
||||
_a[action] = [trigger],
|
||||
_a));
|
||||
}
|
||||
else {
|
||||
Object.assign(this.triggerMap, {
|
||||
[trigger.entity]: {
|
||||
[action]: [trigger],
|
||||
}
|
||||
});
|
||||
Object.assign(_this.triggerMap, (_b = {},
|
||||
_b[trigger.entity] = (_c = {},
|
||||
_c[action] = [trigger],
|
||||
_c),
|
||||
_b));
|
||||
}
|
||||
};
|
||||
if (typeof trigger.action === 'string') {
|
||||
addTrigger(trigger.action);
|
||||
}
|
||||
else {
|
||||
trigger.action.forEach(ele => addTrigger(ele));
|
||||
trigger.action.forEach(function (ele) { return addTrigger(ele); });
|
||||
}
|
||||
if (trigger.when === 'commit' && trigger.strict === 'makeSure') {
|
||||
if (this.volatileEntities.indexOf(trigger.entity) === -1) {
|
||||
this.volatileEntities.push(trigger.entity);
|
||||
}
|
||||
}
|
||||
}
|
||||
unregisterTrigger(trigger) {
|
||||
};
|
||||
TriggerExecutor.prototype.unregisterTrigger = function (trigger) {
|
||||
var _this = this;
|
||||
(0, assert_1.default)(trigger.when !== 'commit' || trigger.strict !== 'makeSure', 'could not remove strict volatile triggers');
|
||||
const removeTrigger = (action) => {
|
||||
const triggers = this.triggerMap[trigger.entity] && this.triggerMap[trigger.entity][action];
|
||||
var removeTrigger = function (action) {
|
||||
var triggers = _this.triggerMap[trigger.entity] && _this.triggerMap[trigger.entity][action];
|
||||
if (triggers) {
|
||||
(0, lodash_1.pull)(triggers, trigger);
|
||||
(0, lodash_1.unset)(this.triggerNameMap, trigger.name);
|
||||
(0, lodash_1.unset)(_this.triggerNameMap, trigger.name);
|
||||
}
|
||||
};
|
||||
if (typeof trigger.action === 'string') {
|
||||
removeTrigger(trigger.action);
|
||||
}
|
||||
else {
|
||||
trigger.action.forEach(ele => removeTrigger(ele));
|
||||
trigger.action.forEach(function (ele) { return removeTrigger(ele); });
|
||||
}
|
||||
}
|
||||
async preCommitTrigger(entity, operation, trigger, context, params) {
|
||||
(0, assert_1.default)(trigger.action !== 'select');
|
||||
if (trigger.strict === 'makeSure') {
|
||||
switch (operation.action) {
|
||||
case 'create': {
|
||||
if (operation.data.hasOwnProperty(Trigger_1.Executor.dataAttr) || operation.data.hasOwnProperty(Trigger_1.Executor.timestampAttr)) {
|
||||
throw new Error('同一行数据上不能存在两个跨事务约束');
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
const { filter } = operation;
|
||||
// 此时要保证更新或者删除的行上没有跨事务约束
|
||||
const filter2 = (0, filter_1.addFilterSegment)({
|
||||
$or: [
|
||||
{
|
||||
$$triggerData$$: {
|
||||
$exists: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$$triggerTimestamp$$: {
|
||||
$exists: true,
|
||||
},
|
||||
}
|
||||
],
|
||||
}, filter);
|
||||
const { rowStore } = context;
|
||||
const count = await rowStore.count(entity, {
|
||||
filter: filter2
|
||||
}, context);
|
||||
if (count > 0) {
|
||||
throw new Error(`对象${entity}的行「${JSON.stringify(operation)}」上已经存在未完成的跨事务约束`);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
Object.assign(operation.data, {
|
||||
[Trigger_1.Executor.dataAttr]: {
|
||||
name: trigger.name,
|
||||
operation,
|
||||
cxtStr: await context.toString(),
|
||||
params,
|
||||
},
|
||||
[Trigger_1.Executor.timestampAttr]: Date.now(),
|
||||
});
|
||||
}
|
||||
}
|
||||
async preOperation(entity, operation, context, params) {
|
||||
const { action } = operation;
|
||||
const triggers = this.triggerMap[entity] && this.triggerMap[entity][action]?.filter(trigger => typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action));
|
||||
if (triggers) {
|
||||
const preTriggers = triggers.filter(ele => ele.when === 'before' && (!ele.check || ele.check(operation)));
|
||||
for (const trigger of preTriggers) {
|
||||
const number = await trigger.fn({ operation: operation }, context, params);
|
||||
if (number > 0) {
|
||||
this.logger.info(`触发器「${trigger.name}」成功触发了「${number}」行数据更改`);
|
||||
}
|
||||
}
|
||||
const commitTriggers = triggers.filter(ele => ele.when === 'commit' && (!ele.check || ele.check(operation)));
|
||||
for (const trigger of commitTriggers) {
|
||||
await this.preCommitTrigger(entity, operation, trigger, context, params);
|
||||
}
|
||||
}
|
||||
}
|
||||
onCommit(trigger, operation, cxtStr, params) {
|
||||
return async () => {
|
||||
const context = await this.contextBuilder(cxtStr);
|
||||
await context.begin();
|
||||
const number = await trigger.fn({
|
||||
operation: operation,
|
||||
}, context, params);
|
||||
const { rowStore } = context;
|
||||
if (trigger.strict === 'makeSure') {
|
||||
// 如果是必须完成的trigger,在完成成功后要把trigger相关的属性置null;
|
||||
let filter = {};
|
||||
if (operation.action === 'create') {
|
||||
filter = operation.data instanceof Array ? {
|
||||
filter: {
|
||||
id: {
|
||||
$in: operation.data.map(ele => ele.id),
|
||||
},
|
||||
},
|
||||
} : {
|
||||
filter: {
|
||||
id: operation.data.id,
|
||||
};
|
||||
TriggerExecutor.prototype.preCommitTrigger = function (entity, operation, trigger, context, params) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var _a, filter, filter2, rowStore, count, _b, _c, _d, _e;
|
||||
var _f, _g;
|
||||
return __generator(this, function (_h) {
|
||||
switch (_h.label) {
|
||||
case 0:
|
||||
(0, assert_1.default)(trigger.action !== 'select');
|
||||
if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 6];
|
||||
_a = operation.action;
|
||||
switch (_a) {
|
||||
case 'create': return [3 /*break*/, 1];
|
||||
}
|
||||
};
|
||||
return [3 /*break*/, 2];
|
||||
case 1:
|
||||
{
|
||||
if (operation.data.hasOwnProperty(Trigger_1.Executor.dataAttr) || operation.data.hasOwnProperty(Trigger_1.Executor.timestampAttr)) {
|
||||
throw new Error('同一行数据上不能存在两个跨事务约束');
|
||||
}
|
||||
return [3 /*break*/, 4];
|
||||
}
|
||||
_h.label = 2;
|
||||
case 2:
|
||||
filter = operation.filter;
|
||||
filter2 = (0, filter_1.addFilterSegment)({
|
||||
$or: [
|
||||
{
|
||||
$$triggerData$$: {
|
||||
$exists: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
$$triggerTimestamp$$: {
|
||||
$exists: true,
|
||||
},
|
||||
}
|
||||
],
|
||||
}, filter);
|
||||
rowStore = context.rowStore;
|
||||
return [4 /*yield*/, rowStore.count(entity, {
|
||||
filter: filter2
|
||||
}, context)];
|
||||
case 3:
|
||||
count = _h.sent();
|
||||
if (count > 0) {
|
||||
throw new Error("\u5BF9\u8C61".concat(entity, "\u7684\u884C\u300C").concat(JSON.stringify(operation), "\u300D\u4E0A\u5DF2\u7ECF\u5B58\u5728\u672A\u5B8C\u6210\u7684\u8DE8\u4E8B\u52A1\u7EA6\u675F"));
|
||||
}
|
||||
return [3 /*break*/, 4];
|
||||
case 4:
|
||||
_c = (_b = Object).assign;
|
||||
_d = [operation.data];
|
||||
_f = {};
|
||||
_e = Trigger_1.Executor.dataAttr;
|
||||
_g = {
|
||||
name: trigger.name,
|
||||
operation: operation
|
||||
};
|
||||
return [4 /*yield*/, context.toString()];
|
||||
case 5:
|
||||
_c.apply(_b, _d.concat([(_f[_e] = (_g.cxtStr = _h.sent(),
|
||||
_g.params = params,
|
||||
_g),
|
||||
_f[Trigger_1.Executor.timestampAttr] = Date.now(),
|
||||
_f)]));
|
||||
_h.label = 6;
|
||||
case 6: return [2 /*return*/];
|
||||
}
|
||||
else if (operation.filter) {
|
||||
Object.assign(filter, { filter: operation.filter });
|
||||
});
|
||||
});
|
||||
};
|
||||
TriggerExecutor.prototype.preOperation = function (entity, operation, context, params) {
|
||||
var _a;
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var action, triggers, preTriggers, preTriggers_1, preTriggers_1_1, trigger, number, e_1_1, commitTriggers, commitTriggers_1, commitTriggers_1_1, trigger, e_2_1;
|
||||
var e_1, _b, e_2, _c;
|
||||
return __generator(this, function (_d) {
|
||||
switch (_d.label) {
|
||||
case 0:
|
||||
action = operation.action;
|
||||
triggers = this.triggerMap[entity] && ((_a = this.triggerMap[entity][action]) === null || _a === void 0 ? void 0 : _a.filter(function (trigger) { return typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action); }));
|
||||
if (!triggers) return [3 /*break*/, 16];
|
||||
preTriggers = triggers.filter(function (ele) { return ele.when === 'before' && (!ele.check || ele.check(operation)); });
|
||||
_d.label = 1;
|
||||
case 1:
|
||||
_d.trys.push([1, 6, 7, 8]);
|
||||
preTriggers_1 = __values(preTriggers), preTriggers_1_1 = preTriggers_1.next();
|
||||
_d.label = 2;
|
||||
case 2:
|
||||
if (!!preTriggers_1_1.done) return [3 /*break*/, 5];
|
||||
trigger = preTriggers_1_1.value;
|
||||
return [4 /*yield*/, trigger.fn({ operation: operation }, context, params)];
|
||||
case 3:
|
||||
number = _d.sent();
|
||||
if (number > 0) {
|
||||
this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
|
||||
}
|
||||
_d.label = 4;
|
||||
case 4:
|
||||
preTriggers_1_1 = preTriggers_1.next();
|
||||
return [3 /*break*/, 2];
|
||||
case 5: return [3 /*break*/, 8];
|
||||
case 6:
|
||||
e_1_1 = _d.sent();
|
||||
e_1 = { error: e_1_1 };
|
||||
return [3 /*break*/, 8];
|
||||
case 7:
|
||||
try {
|
||||
if (preTriggers_1_1 && !preTriggers_1_1.done && (_b = preTriggers_1.return)) _b.call(preTriggers_1);
|
||||
}
|
||||
finally { if (e_1) throw e_1.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 8:
|
||||
commitTriggers = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
|
||||
_d.label = 9;
|
||||
case 9:
|
||||
_d.trys.push([9, 14, 15, 16]);
|
||||
commitTriggers_1 = __values(commitTriggers), commitTriggers_1_1 = commitTriggers_1.next();
|
||||
_d.label = 10;
|
||||
case 10:
|
||||
if (!!commitTriggers_1_1.done) return [3 /*break*/, 13];
|
||||
trigger = commitTriggers_1_1.value;
|
||||
return [4 /*yield*/, this.preCommitTrigger(entity, operation, trigger, context, params)];
|
||||
case 11:
|
||||
_d.sent();
|
||||
_d.label = 12;
|
||||
case 12:
|
||||
commitTriggers_1_1 = commitTriggers_1.next();
|
||||
return [3 /*break*/, 10];
|
||||
case 13: return [3 /*break*/, 16];
|
||||
case 14:
|
||||
e_2_1 = _d.sent();
|
||||
e_2 = { error: e_2_1 };
|
||||
return [3 /*break*/, 16];
|
||||
case 15:
|
||||
try {
|
||||
if (commitTriggers_1_1 && !commitTriggers_1_1.done && (_c = commitTriggers_1.return)) _c.call(commitTriggers_1);
|
||||
}
|
||||
finally { if (e_2) throw e_2.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 16: return [2 /*return*/];
|
||||
}
|
||||
await rowStore.operate(trigger.entity, {
|
||||
action: 'update',
|
||||
data: {
|
||||
$$triggerTimestamp$$: null,
|
||||
$$triggerData$$: null,
|
||||
},
|
||||
...filter /** as Filter<'update', DeduceFilter<ED[T]['Schema']>> */,
|
||||
}, context);
|
||||
}
|
||||
await context.commit();
|
||||
return;
|
||||
};
|
||||
}
|
||||
async postCommitTrigger(operation, trigger, context, params) {
|
||||
context.on('commit', this.onCommit(trigger, operation, await context.toString(), params));
|
||||
}
|
||||
async postOperation(entity, operation, context, params, result) {
|
||||
const { action } = operation;
|
||||
const triggers = this.triggerMap[entity] && this.triggerMap[entity][action]?.filter(trigger => typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action));
|
||||
if (triggers) {
|
||||
const postTriggers = triggers.filter(ele => ele.when === 'after' && (!ele.check || ele.check(operation)));
|
||||
for (const trigger of postTriggers) {
|
||||
const number = await trigger.fn({
|
||||
operation: operation,
|
||||
result: result,
|
||||
}, context, params);
|
||||
if (number > 0) {
|
||||
this.logger.info(`触发器「${trigger.name}」成功触发了「${number}」行数据更改`);
|
||||
});
|
||||
});
|
||||
};
|
||||
TriggerExecutor.prototype.onCommit = function (trigger, operation, cxtStr, params) {
|
||||
var _this = this;
|
||||
return function () { return __awaiter(_this, void 0, void 0, function () {
|
||||
var context, number, rowStore, filter;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0: return [4 /*yield*/, this.contextBuilder(cxtStr)];
|
||||
case 1:
|
||||
context = _a.sent();
|
||||
return [4 /*yield*/, context.begin()];
|
||||
case 2:
|
||||
_a.sent();
|
||||
return [4 /*yield*/, trigger.fn({
|
||||
operation: operation,
|
||||
}, context, params)];
|
||||
case 3:
|
||||
number = _a.sent();
|
||||
rowStore = context.rowStore;
|
||||
if (!(trigger.strict === 'makeSure')) return [3 /*break*/, 5];
|
||||
filter = {};
|
||||
if (operation.action === 'create') {
|
||||
filter = operation.data instanceof Array ? {
|
||||
filter: {
|
||||
id: {
|
||||
$in: operation.data.map(function (ele) { return ele.id; }),
|
||||
},
|
||||
},
|
||||
} : {
|
||||
filter: {
|
||||
id: operation.data.id,
|
||||
}
|
||||
};
|
||||
}
|
||||
else if (operation.filter) {
|
||||
Object.assign(filter, { filter: operation.filter });
|
||||
}
|
||||
return [4 /*yield*/, rowStore.operate(trigger.entity, __assign({ action: 'update', data: {
|
||||
$$triggerTimestamp$$: null,
|
||||
$$triggerData$$: null,
|
||||
} }, filter /** as Filter<'update', DeduceFilter<ED[T]['Schema']>> */), context)];
|
||||
case 4:
|
||||
_a.sent();
|
||||
_a.label = 5;
|
||||
case 5: return [4 /*yield*/, context.commit()];
|
||||
case 6:
|
||||
_a.sent();
|
||||
return [2 /*return*/];
|
||||
}
|
||||
}
|
||||
const commitTriggers = triggers.filter(ele => ele.when === 'commit' && (!ele.check || ele.check(operation)));
|
||||
for (const trigger of commitTriggers) {
|
||||
await this.postCommitTrigger(operation, trigger, context, params);
|
||||
}
|
||||
}
|
||||
}
|
||||
async checkpoint(context, timestamp) {
|
||||
let result = 0;
|
||||
const { rowStore } = context;
|
||||
for (const entity of this.volatileEntities) {
|
||||
const { result: rows } = await rowStore.select(entity, {
|
||||
data: {
|
||||
id: 1,
|
||||
$$triggerData$$: 1,
|
||||
},
|
||||
filter: {
|
||||
$$triggerTimestamp$$: {
|
||||
$gt: timestamp,
|
||||
}
|
||||
},
|
||||
}, context);
|
||||
for (const row of rows) {
|
||||
const { $$triggerData$$ } = row;
|
||||
const { name, operation, cxtStr, params } = $$triggerData$$;
|
||||
const trigger = this.triggerNameMap[name];
|
||||
await this.onCommit(trigger, operation, cxtStr, params)();
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
});
|
||||
}); };
|
||||
};
|
||||
TriggerExecutor.prototype.postCommitTrigger = function (operation, trigger, context, params) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var _a, _b, _c, _d, _e;
|
||||
return __generator(this, function (_f) {
|
||||
switch (_f.label) {
|
||||
case 0:
|
||||
_b = (_a = context).on;
|
||||
_c = ['commit'];
|
||||
_d = this.onCommit;
|
||||
_e = [trigger, operation];
|
||||
return [4 /*yield*/, context.toString()];
|
||||
case 1:
|
||||
_b.apply(_a, _c.concat([_d.apply(this, _e.concat([_f.sent(), params]))]));
|
||||
return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
TriggerExecutor.prototype.postOperation = function (entity, operation, context, params, result) {
|
||||
var _a;
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var action, triggers, postTriggers, postTriggers_1, postTriggers_1_1, trigger, number, e_3_1, commitTriggers, commitTriggers_2, commitTriggers_2_1, trigger, e_4_1;
|
||||
var e_3, _b, e_4, _c;
|
||||
return __generator(this, function (_d) {
|
||||
switch (_d.label) {
|
||||
case 0:
|
||||
action = operation.action;
|
||||
triggers = this.triggerMap[entity] && ((_a = this.triggerMap[entity][action]) === null || _a === void 0 ? void 0 : _a.filter(function (trigger) { return typeof trigger.action === 'string' && trigger.action === operation.action || (trigger.action).includes(operation.action); }));
|
||||
if (!triggers) return [3 /*break*/, 16];
|
||||
postTriggers = triggers.filter(function (ele) { return ele.when === 'after' && (!ele.check || ele.check(operation)); });
|
||||
_d.label = 1;
|
||||
case 1:
|
||||
_d.trys.push([1, 6, 7, 8]);
|
||||
postTriggers_1 = __values(postTriggers), postTriggers_1_1 = postTriggers_1.next();
|
||||
_d.label = 2;
|
||||
case 2:
|
||||
if (!!postTriggers_1_1.done) return [3 /*break*/, 5];
|
||||
trigger = postTriggers_1_1.value;
|
||||
return [4 /*yield*/, trigger.fn({
|
||||
operation: operation,
|
||||
result: result,
|
||||
}, context, params)];
|
||||
case 3:
|
||||
number = _d.sent();
|
||||
if (number > 0) {
|
||||
this.logger.info("\u89E6\u53D1\u5668\u300C".concat(trigger.name, "\u300D\u6210\u529F\u89E6\u53D1\u4E86\u300C").concat(number, "\u300D\u884C\u6570\u636E\u66F4\u6539"));
|
||||
}
|
||||
_d.label = 4;
|
||||
case 4:
|
||||
postTriggers_1_1 = postTriggers_1.next();
|
||||
return [3 /*break*/, 2];
|
||||
case 5: return [3 /*break*/, 8];
|
||||
case 6:
|
||||
e_3_1 = _d.sent();
|
||||
e_3 = { error: e_3_1 };
|
||||
return [3 /*break*/, 8];
|
||||
case 7:
|
||||
try {
|
||||
if (postTriggers_1_1 && !postTriggers_1_1.done && (_b = postTriggers_1.return)) _b.call(postTriggers_1);
|
||||
}
|
||||
finally { if (e_3) throw e_3.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 8:
|
||||
commitTriggers = triggers.filter(function (ele) { return ele.when === 'commit' && (!ele.check || ele.check(operation)); });
|
||||
_d.label = 9;
|
||||
case 9:
|
||||
_d.trys.push([9, 14, 15, 16]);
|
||||
commitTriggers_2 = __values(commitTriggers), commitTriggers_2_1 = commitTriggers_2.next();
|
||||
_d.label = 10;
|
||||
case 10:
|
||||
if (!!commitTriggers_2_1.done) return [3 /*break*/, 13];
|
||||
trigger = commitTriggers_2_1.value;
|
||||
return [4 /*yield*/, this.postCommitTrigger(operation, trigger, context, params)];
|
||||
case 11:
|
||||
_d.sent();
|
||||
_d.label = 12;
|
||||
case 12:
|
||||
commitTriggers_2_1 = commitTriggers_2.next();
|
||||
return [3 /*break*/, 10];
|
||||
case 13: return [3 /*break*/, 16];
|
||||
case 14:
|
||||
e_4_1 = _d.sent();
|
||||
e_4 = { error: e_4_1 };
|
||||
return [3 /*break*/, 16];
|
||||
case 15:
|
||||
try {
|
||||
if (commitTriggers_2_1 && !commitTriggers_2_1.done && (_c = commitTriggers_2.return)) _c.call(commitTriggers_2);
|
||||
}
|
||||
finally { if (e_4) throw e_4.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 16: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
TriggerExecutor.prototype.checkpoint = function (context, timestamp) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var result, rowStore, _a, _b, entity, rows, rows_1, rows_1_1, row, $$triggerData$$, _c, name_1, operation, cxtStr, params, trigger, e_5_1, e_6_1;
|
||||
var e_6, _d, e_5, _e;
|
||||
return __generator(this, function (_f) {
|
||||
switch (_f.label) {
|
||||
case 0:
|
||||
result = 0;
|
||||
rowStore = context.rowStore;
|
||||
_f.label = 1;
|
||||
case 1:
|
||||
_f.trys.push([1, 13, 14, 15]);
|
||||
_a = __values(this.volatileEntities), _b = _a.next();
|
||||
_f.label = 2;
|
||||
case 2:
|
||||
if (!!_b.done) return [3 /*break*/, 12];
|
||||
entity = _b.value;
|
||||
return [4 /*yield*/, rowStore.select(entity, {
|
||||
data: {
|
||||
id: 1,
|
||||
$$triggerData$$: 1,
|
||||
},
|
||||
filter: {
|
||||
$$triggerTimestamp$$: {
|
||||
$gt: timestamp,
|
||||
}
|
||||
},
|
||||
}, context)];
|
||||
case 3:
|
||||
rows = (_f.sent()).result;
|
||||
_f.label = 4;
|
||||
case 4:
|
||||
_f.trys.push([4, 9, 10, 11]);
|
||||
rows_1 = (e_5 = void 0, __values(rows)), rows_1_1 = rows_1.next();
|
||||
_f.label = 5;
|
||||
case 5:
|
||||
if (!!rows_1_1.done) return [3 /*break*/, 8];
|
||||
row = rows_1_1.value;
|
||||
$$triggerData$$ = row.$$triggerData$$;
|
||||
_c = $$triggerData$$, name_1 = _c.name, operation = _c.operation, cxtStr = _c.cxtStr, params = _c.params;
|
||||
trigger = this.triggerNameMap[name_1];
|
||||
return [4 /*yield*/, this.onCommit(trigger, operation, cxtStr, params)()];
|
||||
case 6:
|
||||
_f.sent();
|
||||
_f.label = 7;
|
||||
case 7:
|
||||
rows_1_1 = rows_1.next();
|
||||
return [3 /*break*/, 5];
|
||||
case 8: return [3 /*break*/, 11];
|
||||
case 9:
|
||||
e_5_1 = _f.sent();
|
||||
e_5 = { error: e_5_1 };
|
||||
return [3 /*break*/, 11];
|
||||
case 10:
|
||||
try {
|
||||
if (rows_1_1 && !rows_1_1.done && (_e = rows_1.return)) _e.call(rows_1);
|
||||
}
|
||||
finally { if (e_5) throw e_5.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 11:
|
||||
_b = _a.next();
|
||||
return [3 /*break*/, 2];
|
||||
case 12: return [3 /*break*/, 15];
|
||||
case 13:
|
||||
e_6_1 = _f.sent();
|
||||
e_6 = { error: e_6_1 };
|
||||
return [3 /*break*/, 15];
|
||||
case 14:
|
||||
try {
|
||||
if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
|
||||
}
|
||||
finally { if (e_6) throw e_6.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 15: return [2 /*return*/, result];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
return TriggerExecutor;
|
||||
}(Trigger_1.Executor));
|
||||
exports.TriggerExecutor = TriggerExecutor;
|
||||
|
|
|
|||
|
|
@ -1,19 +1,60 @@
|
|||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
while (_) try {
|
||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0: case 1: t = op; break;
|
||||
case 4: _.label++; return { value: op[1], done: false };
|
||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||
if (t[2]) _.ops.pop();
|
||||
_.trys.pop(); continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
};
|
||||
var __values = (this && this.__values) || function(o) {
|
||||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
||||
if (m) return m.call(o);
|
||||
if (o && typeof o.length === "number") return {
|
||||
next: function () {
|
||||
if (o && i >= o.length) o = void 0;
|
||||
return { value: o && o[i++], done: !o };
|
||||
}
|
||||
};
|
||||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.UniversalContext = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
const concurrent_1 = require("../utils/concurrent");
|
||||
class UniversalContext {
|
||||
rowStore;
|
||||
uuid;
|
||||
opRecords;
|
||||
scene;
|
||||
rwLock;
|
||||
events;
|
||||
constructor(store) {
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
var concurrent_1 = require("../utils/concurrent");
|
||||
var UniversalContext = /** @class */ (function () {
|
||||
function UniversalContext(store) {
|
||||
this.rowStore = store;
|
||||
this.opRecords = [];
|
||||
this.rwLock = new concurrent_1.RWLock();
|
||||
|
|
@ -22,61 +63,146 @@ class UniversalContext {
|
|||
rollback: [],
|
||||
};
|
||||
}
|
||||
getScene() {
|
||||
UniversalContext.prototype.getScene = function () {
|
||||
return this.scene;
|
||||
}
|
||||
setScene(scene) {
|
||||
};
|
||||
UniversalContext.prototype.setScene = function (scene) {
|
||||
this.scene = scene;
|
||||
}
|
||||
resetEvents() {
|
||||
};
|
||||
UniversalContext.prototype.resetEvents = function () {
|
||||
this.events = {
|
||||
commit: [],
|
||||
rollback: [],
|
||||
};
|
||||
}
|
||||
on(event, callback) {
|
||||
};
|
||||
UniversalContext.prototype.on = function (event, callback) {
|
||||
this.uuid && this.events[event].push(callback);
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 一个context中不应该有并发的事务,这里将事务串行化,使用的时候千万要注意不要自己等自己
|
||||
* @param options
|
||||
*/
|
||||
async begin(options) {
|
||||
await this.rwLock.acquire('X');
|
||||
if (!this.uuid) {
|
||||
this.uuid = await this.rowStore.begin(options);
|
||||
// console.log('begin', this.uuid);
|
||||
}
|
||||
else {
|
||||
(0, assert_1.default)(false);
|
||||
}
|
||||
}
|
||||
async commit() {
|
||||
if (this.uuid) {
|
||||
await this.rowStore.commit(this.uuid);
|
||||
// console.log('commit', this.uuid);
|
||||
this.uuid = undefined;
|
||||
this.rwLock.release();
|
||||
for (const e of this.events.commit) {
|
||||
await e();
|
||||
}
|
||||
this.resetEvents();
|
||||
}
|
||||
}
|
||||
async rollback() {
|
||||
if (this.uuid) {
|
||||
await this.rowStore.rollback(this.uuid);
|
||||
// console.log('rollback', this.uuid);
|
||||
this.uuid = undefined;
|
||||
this.rwLock.release();
|
||||
for (const e of this.events.rollback) {
|
||||
await e();
|
||||
}
|
||||
this.resetEvents();
|
||||
}
|
||||
}
|
||||
getCurrentTxnId() {
|
||||
UniversalContext.prototype.begin = function (options) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var _a;
|
||||
return __generator(this, function (_b) {
|
||||
switch (_b.label) {
|
||||
case 0: return [4 /*yield*/, this.rwLock.acquire('X')];
|
||||
case 1:
|
||||
_b.sent();
|
||||
if (!!this.uuid) return [3 /*break*/, 3];
|
||||
_a = this;
|
||||
return [4 /*yield*/, this.rowStore.begin(options)];
|
||||
case 2:
|
||||
_a.uuid = _b.sent();
|
||||
return [3 /*break*/, 4];
|
||||
case 3:
|
||||
(0, assert_1.default)(false);
|
||||
_b.label = 4;
|
||||
case 4: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
UniversalContext.prototype.commit = function () {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var _a, _b, e, e_1_1;
|
||||
var e_1, _c;
|
||||
return __generator(this, function (_d) {
|
||||
switch (_d.label) {
|
||||
case 0:
|
||||
if (!this.uuid) return [3 /*break*/, 10];
|
||||
return [4 /*yield*/, this.rowStore.commit(this.uuid)];
|
||||
case 1:
|
||||
_d.sent();
|
||||
// console.log('commit', this.uuid);
|
||||
this.uuid = undefined;
|
||||
this.rwLock.release();
|
||||
_d.label = 2;
|
||||
case 2:
|
||||
_d.trys.push([2, 7, 8, 9]);
|
||||
_a = __values(this.events.commit), _b = _a.next();
|
||||
_d.label = 3;
|
||||
case 3:
|
||||
if (!!_b.done) return [3 /*break*/, 6];
|
||||
e = _b.value;
|
||||
return [4 /*yield*/, e()];
|
||||
case 4:
|
||||
_d.sent();
|
||||
_d.label = 5;
|
||||
case 5:
|
||||
_b = _a.next();
|
||||
return [3 /*break*/, 3];
|
||||
case 6: return [3 /*break*/, 9];
|
||||
case 7:
|
||||
e_1_1 = _d.sent();
|
||||
e_1 = { error: e_1_1 };
|
||||
return [3 /*break*/, 9];
|
||||
case 8:
|
||||
try {
|
||||
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
||||
}
|
||||
finally { if (e_1) throw e_1.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 9:
|
||||
this.resetEvents();
|
||||
_d.label = 10;
|
||||
case 10: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
UniversalContext.prototype.rollback = function () {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var _a, _b, e, e_2_1;
|
||||
var e_2, _c;
|
||||
return __generator(this, function (_d) {
|
||||
switch (_d.label) {
|
||||
case 0:
|
||||
if (!this.uuid) return [3 /*break*/, 10];
|
||||
return [4 /*yield*/, this.rowStore.rollback(this.uuid)];
|
||||
case 1:
|
||||
_d.sent();
|
||||
// console.log('rollback', this.uuid);
|
||||
this.uuid = undefined;
|
||||
this.rwLock.release();
|
||||
_d.label = 2;
|
||||
case 2:
|
||||
_d.trys.push([2, 7, 8, 9]);
|
||||
_a = __values(this.events.rollback), _b = _a.next();
|
||||
_d.label = 3;
|
||||
case 3:
|
||||
if (!!_b.done) return [3 /*break*/, 6];
|
||||
e = _b.value;
|
||||
return [4 /*yield*/, e()];
|
||||
case 4:
|
||||
_d.sent();
|
||||
_d.label = 5;
|
||||
case 5:
|
||||
_b = _a.next();
|
||||
return [3 /*break*/, 3];
|
||||
case 6: return [3 /*break*/, 9];
|
||||
case 7:
|
||||
e_2_1 = _d.sent();
|
||||
e_2 = { error: e_2_1 };
|
||||
return [3 /*break*/, 9];
|
||||
case 8:
|
||||
try {
|
||||
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
||||
}
|
||||
finally { if (e_2) throw e_2.error; }
|
||||
return [7 /*endfinally*/];
|
||||
case 9:
|
||||
this.resetEvents();
|
||||
_d.label = 10;
|
||||
case 10: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
UniversalContext.prototype.getCurrentTxnId = function () {
|
||||
return this.uuid;
|
||||
}
|
||||
}
|
||||
};
|
||||
return UniversalContext;
|
||||
}());
|
||||
exports.UniversalContext = UniversalContext;
|
||||
|
|
|
|||
|
|
@ -1,145 +1,240 @@
|
|||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
while (_) try {
|
||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0: case 1: t = op; break;
|
||||
case 4: _.label++; return { value: op[1], done: false };
|
||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||
if (t[2]) _.ops.pop();
|
||||
_.trys.pop(); continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.analyzeActionDefDict = exports.checkFilterContains = exports.getFullProjection = void 0;
|
||||
const filter_1 = require("./filter");
|
||||
const types_1 = require("../types");
|
||||
var filter_1 = require("./filter");
|
||||
var types_1 = require("../types");
|
||||
function getFullProjection(entity, schema) {
|
||||
const { attributes } = schema[entity];
|
||||
const projection = {
|
||||
var attributes = schema[entity].attributes;
|
||||
var projection = {
|
||||
id: 1,
|
||||
$$createAt$$: 1,
|
||||
$$updateAt$$: 1,
|
||||
$$deleteAt$$: 1,
|
||||
};
|
||||
Object.keys(attributes).forEach((k) => Object.assign(projection, {
|
||||
[k]: 1,
|
||||
}));
|
||||
Object.keys(attributes).forEach(function (k) {
|
||||
var _a;
|
||||
return Object.assign(projection, (_a = {},
|
||||
_a[k] = 1,
|
||||
_a));
|
||||
});
|
||||
return projection;
|
||||
}
|
||||
exports.getFullProjection = getFullProjection;
|
||||
async function checkFilterContains(entity, schema, contained, context, filter) {
|
||||
if (!filter) {
|
||||
throw new types_1.OakRowInconsistencyException();
|
||||
}
|
||||
// 优先判断两个条件是否相容
|
||||
if ((0, filter_1.contains)(entity, schema, filter, contained)) {
|
||||
return;
|
||||
}
|
||||
// 再判断加上了conditionalFilter后取得的行数是否缩减
|
||||
const { rowStore } = context;
|
||||
const filter2 = (0, filter_1.combineFilters)([filter, {
|
||||
$not: contained,
|
||||
}]);
|
||||
const { result } = await rowStore.select(entity, {
|
||||
data: getFullProjection(entity, schema),
|
||||
filter: filter2,
|
||||
indexFrom: 0,
|
||||
count: 10,
|
||||
}, context);
|
||||
if (result.length > 0) {
|
||||
const data = {};
|
||||
result.forEach(ele => Object.assign(data, {
|
||||
[ele.id]: ele,
|
||||
}));
|
||||
throw new types_1.OakRowInconsistencyException({
|
||||
a: 's',
|
||||
d: {
|
||||
[entity]: data,
|
||||
function checkFilterContains(entity, schema, contained, context, filter) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var rowStore, filter2, result, data_1;
|
||||
var _a;
|
||||
return __generator(this, function (_b) {
|
||||
switch (_b.label) {
|
||||
case 0:
|
||||
if (!filter) {
|
||||
throw new types_1.OakRowInconsistencyException();
|
||||
}
|
||||
// 优先判断两个条件是否相容
|
||||
if ((0, filter_1.contains)(entity, schema, filter, contained)) {
|
||||
return [2 /*return*/];
|
||||
}
|
||||
rowStore = context.rowStore;
|
||||
filter2 = (0, filter_1.combineFilters)([filter, {
|
||||
$not: contained,
|
||||
}]);
|
||||
return [4 /*yield*/, rowStore.select(entity, {
|
||||
data: getFullProjection(entity, schema),
|
||||
filter: filter2,
|
||||
indexFrom: 0,
|
||||
count: 10,
|
||||
}, context)];
|
||||
case 1:
|
||||
result = (_b.sent()).result;
|
||||
if (result.length > 0) {
|
||||
data_1 = {};
|
||||
result.forEach(function (ele) {
|
||||
var _a;
|
||||
return Object.assign(data_1, (_a = {},
|
||||
_a[ele.id] = ele,
|
||||
_a));
|
||||
});
|
||||
throw new types_1.OakRowInconsistencyException({
|
||||
a: 's',
|
||||
d: (_a = {},
|
||||
_a[entity] = data_1,
|
||||
_a)
|
||||
});
|
||||
}
|
||||
return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.checkFilterContains = checkFilterContains;
|
||||
function makeIntrinsicWatchers(schema) {
|
||||
const watchers = [];
|
||||
for (const entity in schema) {
|
||||
const { attributes } = schema[entity];
|
||||
const now = Date.now();
|
||||
const { expiresAt, expired } = attributes;
|
||||
var _this = this;
|
||||
var watchers = [];
|
||||
var _loop_1 = function (entity) {
|
||||
var attributes = schema[entity].attributes;
|
||||
var now = Date.now();
|
||||
var expiresAt = attributes.expiresAt, expired = attributes.expired;
|
||||
if (expiresAt && expiresAt.type === 'datetime' && expired && expired.type === 'boolean') {
|
||||
// 如果有定义expiresAt和expired,则自动生成一个检查的watcher
|
||||
watchers.push({
|
||||
entity,
|
||||
name: `对象${entity}上的过期自动watcher`,
|
||||
filter: async () => {
|
||||
return {
|
||||
expired: false,
|
||||
expiresAt: {
|
||||
$lte: now,
|
||||
},
|
||||
};
|
||||
},
|
||||
entity: entity,
|
||||
name: "\u5BF9\u8C61".concat(entity, "\u4E0A\u7684\u8FC7\u671F\u81EA\u52A8watcher"),
|
||||
filter: function () { return __awaiter(_this, void 0, void 0, function () {
|
||||
return __generator(this, function (_a) {
|
||||
return [2 /*return*/, {
|
||||
expired: false,
|
||||
expiresAt: {
|
||||
$lte: now,
|
||||
},
|
||||
}];
|
||||
});
|
||||
}); },
|
||||
action: 'update',
|
||||
actionData: {
|
||||
expired: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
};
|
||||
for (var entity in schema) {
|
||||
_loop_1(entity);
|
||||
}
|
||||
return watchers;
|
||||
}
|
||||
function analyzeActionDefDict(schema, actionDefDict) {
|
||||
const checkers = [];
|
||||
const triggers = [];
|
||||
for (const entity in actionDefDict) {
|
||||
for (const attr in actionDefDict[entity]) {
|
||||
const def = actionDefDict[entity][attr];
|
||||
const { stm, is } = def;
|
||||
for (const action in stm) {
|
||||
const actionStm = stm[action];
|
||||
var _this = this;
|
||||
var checkers = [];
|
||||
var triggers = [];
|
||||
var _loop_2 = function (entity) {
|
||||
var _loop_3 = function (attr) {
|
||||
var def = actionDefDict[entity][attr];
|
||||
var _a = def, stm = _a.stm, is = _a.is;
|
||||
var _loop_4 = function (action) {
|
||||
var actionStm = stm[action];
|
||||
checkers.push({
|
||||
action: action,
|
||||
type: 'row',
|
||||
entity,
|
||||
checker: async ({ operation }, context) => {
|
||||
const { filter } = operation;
|
||||
const conditionalFilter = typeof actionStm[0] === 'string' ? {
|
||||
[attr]: actionStm[0],
|
||||
} : {
|
||||
[attr]: {
|
||||
$in: actionStm[0],
|
||||
},
|
||||
};
|
||||
await checkFilterContains(entity, schema, conditionalFilter, context, filter);
|
||||
return 0;
|
||||
entity: entity,
|
||||
checker: function (_a, context) {
|
||||
var operation = _a.operation;
|
||||
return __awaiter(_this, void 0, void 0, function () {
|
||||
var filter, conditionalFilter;
|
||||
var _b, _c;
|
||||
return __generator(this, function (_d) {
|
||||
switch (_d.label) {
|
||||
case 0:
|
||||
filter = operation.filter;
|
||||
conditionalFilter = typeof actionStm[0] === 'string' ? (_b = {},
|
||||
_b[attr] = actionStm[0],
|
||||
_b) : (_c = {},
|
||||
_c[attr] = {
|
||||
$in: actionStm[0],
|
||||
},
|
||||
_c);
|
||||
return [4 /*yield*/, checkFilterContains(entity, schema, conditionalFilter, context, filter)];
|
||||
case 1:
|
||||
_d.sent();
|
||||
return [2 /*return*/, 0];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
triggers.push({
|
||||
name: `set next state of ${attr} for ${entity} on action ${action}`,
|
||||
name: "set next state of ".concat(attr, " for ").concat(entity, " on action ").concat(action),
|
||||
action: action,
|
||||
entity,
|
||||
entity: entity,
|
||||
when: 'before',
|
||||
fn: async ({ operation }) => {
|
||||
const { data = {} } = operation;
|
||||
Object.assign(operation, {
|
||||
data: Object.assign(data, {
|
||||
[attr]: stm[action][1],
|
||||
}),
|
||||
fn: function (_a) {
|
||||
var operation = _a.operation;
|
||||
return __awaiter(_this, void 0, void 0, function () {
|
||||
var _b, data;
|
||||
var _c;
|
||||
return __generator(this, function (_d) {
|
||||
_b = operation.data, data = _b === void 0 ? {} : _b;
|
||||
Object.assign(operation, {
|
||||
data: Object.assign(data, (_c = {},
|
||||
_c[attr] = stm[action][1],
|
||||
_c)),
|
||||
});
|
||||
return [2 /*return*/, 1];
|
||||
});
|
||||
});
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
};
|
||||
for (var action in stm) {
|
||||
_loop_4(action);
|
||||
}
|
||||
if (is) {
|
||||
triggers.push({
|
||||
name: `set initial state of ${attr} for ${entity} on create`,
|
||||
name: "set initial state of ".concat(attr, " for ").concat(entity, " on create"),
|
||||
action: 'create',
|
||||
entity,
|
||||
entity: entity,
|
||||
when: 'before',
|
||||
fn: async ({ operation }) => {
|
||||
const { data } = operation;
|
||||
Object.assign(data, {
|
||||
[attr]: is,
|
||||
fn: function (_a) {
|
||||
var operation = _a.operation;
|
||||
return __awaiter(_this, void 0, void 0, function () {
|
||||
var data;
|
||||
var _b;
|
||||
return __generator(this, function (_c) {
|
||||
data = operation.data;
|
||||
Object.assign(data, (_b = {},
|
||||
_b[attr] = is,
|
||||
_b));
|
||||
return [2 /*return*/, 1];
|
||||
});
|
||||
});
|
||||
return 1;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
for (var attr in actionDefDict[entity]) {
|
||||
_loop_3(attr);
|
||||
}
|
||||
};
|
||||
for (var entity in actionDefDict) {
|
||||
_loop_2(entity);
|
||||
}
|
||||
return {
|
||||
triggers,
|
||||
checkers,
|
||||
triggers: triggers,
|
||||
checkers: checkers,
|
||||
watchers: makeIntrinsicWatchers(schema),
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,14 +1,44 @@
|
|||
"use strict";
|
||||
var __read = (this && this.__read) || function (o, n) {
|
||||
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||||
if (!m) return o;
|
||||
var i = m.call(o), r, ar = [], e;
|
||||
try {
|
||||
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
||||
}
|
||||
catch (error) { e = { error: error }; }
|
||||
finally {
|
||||
try {
|
||||
if (r && !r.done && (m = i["return"])) m.call(i);
|
||||
}
|
||||
finally { if (e) throw e.error; }
|
||||
}
|
||||
return ar;
|
||||
};
|
||||
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
||||
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
||||
if (ar || !(i in from)) {
|
||||
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
||||
ar[i] = from[i];
|
||||
}
|
||||
}
|
||||
return to.concat(ar || Array.prototype.slice.call(from));
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.repel = exports.contains = exports.combineFilters = exports.addFilterSegment = void 0;
|
||||
function addFilterSegment(...filters) {
|
||||
const filter = {};
|
||||
filters.forEach(ele => {
|
||||
function addFilterSegment() {
|
||||
var filters = [];
|
||||
for (var _i = 0; _i < arguments.length; _i++) {
|
||||
filters[_i] = arguments[_i];
|
||||
}
|
||||
var filter = {};
|
||||
filters.forEach(function (ele) {
|
||||
var _a, _b, _c, _d;
|
||||
if (ele) {
|
||||
for (const k in ele) {
|
||||
for (var k in ele) {
|
||||
if (k === '$and') {
|
||||
if (filter.$and) {
|
||||
filter.$and.push(...ele[k]);
|
||||
(_a = filter.$and).push.apply(_a, __spreadArray([], __read(ele[k]), false));
|
||||
}
|
||||
else {
|
||||
filter.$and = ele[k];
|
||||
|
|
@ -16,7 +46,7 @@ function addFilterSegment(...filters) {
|
|||
}
|
||||
else if (k === '$or') {
|
||||
if (filter.$or) {
|
||||
filter.$or.push(...ele[k]);
|
||||
(_b = filter.$or).push.apply(_b, __spreadArray([], __read(ele[k]), false));
|
||||
}
|
||||
else {
|
||||
filter.$or = ele[k];
|
||||
|
|
@ -24,15 +54,15 @@ function addFilterSegment(...filters) {
|
|||
}
|
||||
else if (filter.hasOwnProperty(k)) {
|
||||
if (filter.$and) {
|
||||
filter.$and.push({
|
||||
[k]: ele[k],
|
||||
});
|
||||
filter.$and.push((_c = {},
|
||||
_c[k] = ele[k],
|
||||
_c));
|
||||
}
|
||||
else {
|
||||
filter.$and = [
|
||||
{
|
||||
[k]: ele[k],
|
||||
}
|
||||
(_d = {},
|
||||
_d[k] = ele[k],
|
||||
_d)
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -43,7 +73,7 @@ function addFilterSegment(...filters) {
|
|||
}
|
||||
exports.addFilterSegment = addFilterSegment;
|
||||
function combineFilters(filters) {
|
||||
return addFilterSegment(...filters);
|
||||
return addFilterSegment.apply(void 0, __spreadArray([], __read(filters), false));
|
||||
}
|
||||
exports.combineFilters = combineFilters;
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.judgeRelation = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
const Demand_1 = require("../types/Demand");
|
||||
const Entity_1 = require("../types/Entity");
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
var Demand_1 = require("../types/Demand");
|
||||
var Entity_1 = require("../types/Entity");
|
||||
/**
|
||||
* 判断对象和属性之间的关系
|
||||
* @param schema
|
||||
|
|
@ -16,7 +16,7 @@ const Entity_1 = require("../types/Entity");
|
|||
* @returns
|
||||
*/
|
||||
function judgeRelation(schema, entity, attr) {
|
||||
const { [entity]: { attributes } } = schema;
|
||||
var _a = schema, _b = entity, attributes = _a[_b].attributes;
|
||||
if (attr.startsWith(Demand_1.EXPRESSION_PREFIX) || attr.startsWith('#')) {
|
||||
// 表达式属性或者metadata
|
||||
return 0;
|
||||
|
|
@ -26,27 +26,27 @@ function judgeRelation(schema, entity, attr) {
|
|||
return 1;
|
||||
}
|
||||
if (attr.includes('$')) {
|
||||
const entity2 = attr.slice(0, attr.indexOf('$'));
|
||||
var entity2 = attr.slice(0, attr.indexOf('$'));
|
||||
(0, assert_1.default)(schema.hasOwnProperty(entity2));
|
||||
const foreignKey = attr.slice(attr.indexOf('$') + 1);
|
||||
const { [entity2]: { attributes: attributes2 } } = schema;
|
||||
var foreignKey = attr.slice(attr.indexOf('$') + 1);
|
||||
var _c = schema, _d = entity2, attributes2 = _c[_d].attributes;
|
||||
if (foreignKey === 'entity') {
|
||||
// 基于反指对象的反向关联
|
||||
return [entity2];
|
||||
}
|
||||
else if (attributes2.hasOwnProperty(`${foreignKey}Id`)
|
||||
&& attributes2[`${foreignKey}Id`].type === 'ref'
|
||||
&& attributes2[`${foreignKey}Id`].ref === entity) {
|
||||
else if (attributes2.hasOwnProperty("".concat(foreignKey, "Id"))
|
||||
&& attributes2["".concat(foreignKey, "Id")].type === 'ref'
|
||||
&& attributes2["".concat(foreignKey, "Id")].ref === entity) {
|
||||
// 基于外键的反向关联
|
||||
return [entity2, `${foreignKey}Id`];
|
||||
return [entity2, "".concat(foreignKey, "Id")];
|
||||
}
|
||||
else {
|
||||
// 这种情况应该不会跑到
|
||||
(0, assert_1.default)(false);
|
||||
}
|
||||
}
|
||||
else if ((attributes.hasOwnProperty(`${attr}Id`))) {
|
||||
const { type, ref } = attributes[`${attr}Id`];
|
||||
else if ((attributes.hasOwnProperty("".concat(attr, "Id")))) {
|
||||
var _e = attributes["".concat(attr, "Id")], type = _e.type, ref = _e.ref;
|
||||
(0, assert_1.default)(type === 'ref');
|
||||
return ref;
|
||||
}
|
||||
|
|
@ -57,7 +57,7 @@ function judgeRelation(schema, entity, attr) {
|
|||
return 2;
|
||||
}
|
||||
else {
|
||||
(0, assert_1.default)(Entity_1.initinctiveAttributes.includes(attr), `${attr}属性找不到`);
|
||||
(0, assert_1.default)(Entity_1.initinctiveAttributes.includes(attr), "".concat(attr, "\u5C5E\u6027\u627E\u4E0D\u5230"));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.AppLoader = void 0;
|
||||
class AppLoader {
|
||||
path;
|
||||
constructor(path) {
|
||||
var AppLoader = /** @class */ (function () {
|
||||
function AppLoader(path) {
|
||||
this.path = path;
|
||||
}
|
||||
}
|
||||
return AppLoader;
|
||||
}());
|
||||
exports.AppLoader = AppLoader;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Connector = void 0;
|
||||
class Connector {
|
||||
}
|
||||
var Connector = /** @class */ (function () {
|
||||
function Connector() {
|
||||
}
|
||||
return Connector;
|
||||
}());
|
||||
exports.Connector = Connector;
|
||||
|
|
|
|||
|
|
@ -1,20 +1,50 @@
|
|||
"use strict";
|
||||
var __extends = (this && this.__extends) || (function () {
|
||||
var extendStatics = function (d, b) {
|
||||
extendStatics = Object.setPrototypeOf ||
|
||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||||
return extendStatics(d, b);
|
||||
};
|
||||
return function (d, b) {
|
||||
if (typeof b !== "function" && b !== null)
|
||||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||||
extendStatics(d, b);
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
})();
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.makeException = exports.OakCongruentRowExists = exports.OakUserUnpermittedException = exports.OakInputIllegalException = exports.OakRowInconsistencyException = exports.OakUserException = exports.OakExternalException = exports.OakException = void 0;
|
||||
class OakException extends Error {
|
||||
toString() {
|
||||
var OakException = /** @class */ (function (_super) {
|
||||
__extends(OakException, _super);
|
||||
function OakException() {
|
||||
return _super !== null && _super.apply(this, arguments) || this;
|
||||
}
|
||||
OakException.prototype.toString = function () {
|
||||
return JSON.stringify({
|
||||
name: this.constructor.name,
|
||||
message: this.message,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
return OakException;
|
||||
}(Error));
|
||||
exports.OakException = OakException;
|
||||
class OakExternalException extends Error {
|
||||
}
|
||||
var OakExternalException = /** @class */ (function (_super) {
|
||||
__extends(OakExternalException, _super);
|
||||
function OakExternalException() {
|
||||
return _super !== null && _super.apply(this, arguments) || this;
|
||||
}
|
||||
return OakExternalException;
|
||||
}(Error));
|
||||
exports.OakExternalException = OakExternalException;
|
||||
class OakUserException extends OakException {
|
||||
}
|
||||
var OakUserException = /** @class */ (function (_super) {
|
||||
__extends(OakUserException, _super);
|
||||
function OakUserException() {
|
||||
return _super !== null && _super.apply(this, arguments) || this;
|
||||
}
|
||||
return OakUserException;
|
||||
}(OakException));
|
||||
exports.OakUserException = OakUserException;
|
||||
;
|
||||
// 在系统更新数据时,以下三个异常应按规范依次抛出。
|
||||
|
|
@ -22,80 +52,91 @@ exports.OakUserException = OakUserException;
|
|||
* 数据不一致异常,系统认为现有的数据不允许相应的动作时抛此异常
|
||||
*
|
||||
*/
|
||||
class OakRowInconsistencyException extends OakUserException {
|
||||
data;
|
||||
constructor(data, message) {
|
||||
super(message);
|
||||
this.data = data;
|
||||
var OakRowInconsistencyException = /** @class */ (function (_super) {
|
||||
__extends(OakRowInconsistencyException, _super);
|
||||
function OakRowInconsistencyException(data, message) {
|
||||
var _this = _super.call(this, message) || this;
|
||||
_this.data = data;
|
||||
return _this;
|
||||
}
|
||||
getData() {
|
||||
OakRowInconsistencyException.prototype.getData = function () {
|
||||
return this.data;
|
||||
}
|
||||
toString() {
|
||||
};
|
||||
OakRowInconsistencyException.prototype.toString = function () {
|
||||
return JSON.stringify({
|
||||
name: this.constructor.name,
|
||||
message: this.message,
|
||||
data: this.data,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
return OakRowInconsistencyException;
|
||||
}(OakUserException));
|
||||
exports.OakRowInconsistencyException = OakRowInconsistencyException;
|
||||
;
|
||||
/**
|
||||
* 当输入的数据非法时抛此异常,attributes表示非法的属性
|
||||
*/
|
||||
class OakInputIllegalException extends OakUserException {
|
||||
attributes;
|
||||
constructor(attributes, message) {
|
||||
super(message);
|
||||
this.attributes = attributes;
|
||||
var OakInputIllegalException = /** @class */ (function (_super) {
|
||||
__extends(OakInputIllegalException, _super);
|
||||
function OakInputIllegalException(attributes, message) {
|
||||
var _this = _super.call(this, message) || this;
|
||||
_this.attributes = attributes;
|
||||
return _this;
|
||||
}
|
||||
getAttributes() {
|
||||
OakInputIllegalException.prototype.getAttributes = function () {
|
||||
return this.attributes;
|
||||
}
|
||||
addAttributesPrefix(prefix) {
|
||||
this.attributes = this.attributes.map(ele => `${prefix}.${ele}`);
|
||||
}
|
||||
toString() {
|
||||
};
|
||||
OakInputIllegalException.prototype.addAttributesPrefix = function (prefix) {
|
||||
this.attributes = this.attributes.map(function (ele) { return "".concat(prefix, ".").concat(ele); });
|
||||
};
|
||||
OakInputIllegalException.prototype.toString = function () {
|
||||
return JSON.stringify({
|
||||
name: this.constructor.name,
|
||||
message: this.message,
|
||||
attributes: this.attributes,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
return OakInputIllegalException;
|
||||
}(OakUserException));
|
||||
exports.OakInputIllegalException = OakInputIllegalException;
|
||||
;
|
||||
/**
|
||||
* 用户权限不够时抛的异常
|
||||
*/
|
||||
class OakUserUnpermittedException extends OakUserException {
|
||||
}
|
||||
var OakUserUnpermittedException = /** @class */ (function (_super) {
|
||||
__extends(OakUserUnpermittedException, _super);
|
||||
function OakUserUnpermittedException() {
|
||||
return _super !== null && _super.apply(this, arguments) || this;
|
||||
}
|
||||
return OakUserUnpermittedException;
|
||||
}(OakUserException));
|
||||
exports.OakUserUnpermittedException = OakUserUnpermittedException;
|
||||
;
|
||||
/**
|
||||
* 要插入行时,发现已经有相同的行数据
|
||||
*/
|
||||
class OakCongruentRowExists extends OakUserException {
|
||||
data;
|
||||
constructor(data, message) {
|
||||
super(message);
|
||||
this.data = data;
|
||||
var OakCongruentRowExists = /** @class */ (function (_super) {
|
||||
__extends(OakCongruentRowExists, _super);
|
||||
function OakCongruentRowExists(data, message) {
|
||||
var _this = _super.call(this, message) || this;
|
||||
_this.data = data;
|
||||
return _this;
|
||||
}
|
||||
getData() {
|
||||
OakCongruentRowExists.prototype.getData = function () {
|
||||
return this.data;
|
||||
}
|
||||
toString() {
|
||||
};
|
||||
OakCongruentRowExists.prototype.toString = function () {
|
||||
return JSON.stringify({
|
||||
name: this.constructor.name,
|
||||
message: this.message,
|
||||
data: this.data,
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
return OakCongruentRowExists;
|
||||
}(OakUserException));
|
||||
exports.OakCongruentRowExists = OakCongruentRowExists;
|
||||
function makeException(data) {
|
||||
const { name } = data;
|
||||
var name = data.name;
|
||||
switch (name) {
|
||||
case OakException.name: {
|
||||
return new OakException(data.message);
|
||||
|
|
|
|||
|
|
@ -1,14 +1,41 @@
|
|||
"use strict";
|
||||
var __values = (this && this.__values) || function(o) {
|
||||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
||||
if (m) return m.call(o);
|
||||
if (o && typeof o.length === "number") return {
|
||||
next: function () {
|
||||
if (o && i >= o.length) o = void 0;
|
||||
return { value: o && o[i++], done: !o };
|
||||
}
|
||||
};
|
||||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||||
};
|
||||
var __read = (this && this.__read) || function (o, n) {
|
||||
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||||
if (!m) return o;
|
||||
var i = m.call(o), r, ar = [], e;
|
||||
try {
|
||||
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
||||
}
|
||||
catch (error) { e = { error: error }; }
|
||||
finally {
|
||||
try {
|
||||
if (r && !r.done && (m = i["return"])) m.call(i);
|
||||
}
|
||||
finally { if (e) throw e.error; }
|
||||
}
|
||||
return ar;
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.execOp = exports.opMultipleParams = exports.isExpression = exports.isMathExpression = exports.isCompareExpression = exports.isBoolExpression = exports.isLogicExpression = exports.isDateExpression = exports.isGeoExpression = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
const dayjs_1 = __importDefault(require("dayjs"));
|
||||
const weekOfYear_1 = __importDefault(require("dayjs/plugin/weekOfYear"));
|
||||
const dayOfYear_1 = __importDefault(require("dayjs/plugin/dayOfYear"));
|
||||
const geo_1 = require("../utils/geo");
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
var dayjs_1 = __importDefault(require("dayjs"));
|
||||
var weekOfYear_1 = __importDefault(require("dayjs/plugin/weekOfYear"));
|
||||
var dayOfYear_1 = __importDefault(require("dayjs/plugin/dayOfYear"));
|
||||
var geo_1 = require("../utils/geo");
|
||||
dayjs_1.default.extend(weekOfYear_1.default);
|
||||
dayjs_1.default.extend(dayOfYear_1.default);
|
||||
;
|
||||
|
|
@ -46,7 +73,7 @@ dayjs_1.default.extend(dayOfYear_1.default);
|
|||
;
|
||||
function isGeoExpression(expression) {
|
||||
if (Object.keys(expression).length == 1) {
|
||||
const op = Object.keys(expression)[0];
|
||||
var op = Object.keys(expression)[0];
|
||||
if (['$contains', '$distance'].includes(op)) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -56,7 +83,7 @@ function isGeoExpression(expression) {
|
|||
exports.isGeoExpression = isGeoExpression;
|
||||
function isDateExpression(expression) {
|
||||
if (Object.keys(expression).length == 1) {
|
||||
const op = Object.keys(expression)[0];
|
||||
var op = Object.keys(expression)[0];
|
||||
if (['$year', '$month', '$weekday', '$weekOfYear', '$day', '$dayOfMonth',
|
||||
'$dayOfWeek', '$dayOfYear', '$dateDiff', '$dateCeil', '$dateFloor'].includes(op)) {
|
||||
return true;
|
||||
|
|
@ -67,7 +94,7 @@ function isDateExpression(expression) {
|
|||
exports.isDateExpression = isDateExpression;
|
||||
function isLogicExpression(expression) {
|
||||
if (Object.keys(expression).length == 1) {
|
||||
const op = Object.keys(expression)[0];
|
||||
var op = Object.keys(expression)[0];
|
||||
if (['$and', '$or', '$not'].includes(op)) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -77,7 +104,7 @@ function isLogicExpression(expression) {
|
|||
exports.isLogicExpression = isLogicExpression;
|
||||
function isBoolExpression(expression) {
|
||||
if (Object.keys(expression).length == 1) {
|
||||
const op = Object.keys(expression)[0];
|
||||
var op = Object.keys(expression)[0];
|
||||
if (['$true', '$false'].includes(op)) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -87,7 +114,7 @@ function isBoolExpression(expression) {
|
|||
exports.isBoolExpression = isBoolExpression;
|
||||
function isCompareExpression(expression) {
|
||||
if (Object.keys(expression).length == 1) {
|
||||
const op = Object.keys(expression)[0];
|
||||
var op = Object.keys(expression)[0];
|
||||
if (['$gt', '$lt', '$gte', '$lte', '$eq', '$ne',
|
||||
'$startsWith', '$endsWith', '$includes'].includes(op)) {
|
||||
return true;
|
||||
|
|
@ -98,7 +125,7 @@ function isCompareExpression(expression) {
|
|||
exports.isCompareExpression = isCompareExpression;
|
||||
function isMathExpression(expression) {
|
||||
if (Object.keys(expression).length == 1) {
|
||||
const op = Object.keys(expression)[0];
|
||||
var op = Object.keys(expression)[0];
|
||||
if (['$add', '$subtract', '$multiply', '$divide', '$abs', '$pow',
|
||||
'$round', '$floor', '$ceil'].includes(op)) {
|
||||
return true;
|
||||
|
|
@ -117,6 +144,7 @@ function opMultipleParams(op) {
|
|||
}
|
||||
exports.opMultipleParams = opMultipleParams;
|
||||
function execOp(op, params, obscure) {
|
||||
var e_1, _a, e_2, _b;
|
||||
if (obscure && (params === undefined || params.includes(undefined))) {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -150,23 +178,23 @@ function execOp(op, params, obscure) {
|
|||
}
|
||||
case '$add': {
|
||||
if (typeof params[0] === 'number') {
|
||||
let result = 0;
|
||||
params.forEach((ele) => result += ele);
|
||||
return result;
|
||||
var result_1 = 0;
|
||||
params.forEach(function (ele) { return result_1 += ele; });
|
||||
return result_1;
|
||||
}
|
||||
else {
|
||||
let result = '';
|
||||
params.forEach((ele) => result += ele);
|
||||
return result;
|
||||
var result_2 = '';
|
||||
params.forEach(function (ele) { return result_2 += ele; });
|
||||
return result_2;
|
||||
}
|
||||
}
|
||||
case '$subtract': {
|
||||
return params[0] - params[1];
|
||||
}
|
||||
case '$multiply': {
|
||||
let result = 1;
|
||||
params.forEach((ele) => result = result * ele);
|
||||
return result;
|
||||
var result_3 = 1;
|
||||
params.forEach(function (ele) { return result_3 = result_3 * ele; });
|
||||
return result_3;
|
||||
}
|
||||
case '$divide': {
|
||||
return params[0] / params[1];
|
||||
|
|
@ -197,53 +225,73 @@ function execOp(op, params, obscure) {
|
|||
return !params;
|
||||
}
|
||||
case '$and': {
|
||||
for (const p of params) {
|
||||
if (!p) {
|
||||
return false;
|
||||
try {
|
||||
for (var params_1 = __values(params), params_1_1 = params_1.next(); !params_1_1.done; params_1_1 = params_1.next()) {
|
||||
var p = params_1_1.value;
|
||||
if (!p) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||||
finally {
|
||||
try {
|
||||
if (params_1_1 && !params_1_1.done && (_a = params_1.return)) _a.call(params_1);
|
||||
}
|
||||
finally { if (e_1) throw e_1.error; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case '$or': {
|
||||
for (const p of params) {
|
||||
if (!!p) {
|
||||
return true;
|
||||
try {
|
||||
for (var params_2 = __values(params), params_2_1 = params_2.next(); !params_2_1.done; params_2_1 = params_2.next()) {
|
||||
var p = params_2_1.value;
|
||||
if (!!p) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
||||
finally {
|
||||
try {
|
||||
if (params_2_1 && !params_2_1.done && (_b = params_2.return)) _b.call(params_2);
|
||||
}
|
||||
finally { if (e_2) throw e_2.error; }
|
||||
}
|
||||
return false;
|
||||
}
|
||||
case '$year': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.year();
|
||||
}
|
||||
case '$month': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.month();
|
||||
}
|
||||
case '$weekday': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.day(); // 0~6
|
||||
}
|
||||
case '$weekOfYear': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.week();
|
||||
}
|
||||
case '$day':
|
||||
case '$dayOfMonth': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.date();
|
||||
}
|
||||
case '$dayOfWeek': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.day(); // 0~6
|
||||
}
|
||||
case '$dayOfYear': {
|
||||
const value = (0, dayjs_1.default)(params);
|
||||
var value = (0, dayjs_1.default)(params);
|
||||
return value.dayOfYear(); // 0~6
|
||||
}
|
||||
case '$dateDiff': {
|
||||
const value1 = (0, dayjs_1.default)(params[0]);
|
||||
const value2 = (0, dayjs_1.default)(params[1]);
|
||||
var value1 = (0, dayjs_1.default)(params[0]);
|
||||
var value2 = (0, dayjs_1.default)(params[1]);
|
||||
switch (params[2]) {
|
||||
case 'y':
|
||||
case 'M':
|
||||
|
|
@ -259,7 +307,7 @@ function execOp(op, params, obscure) {
|
|||
}
|
||||
}
|
||||
case '$dateCeil': {
|
||||
const value = (0, dayjs_1.default)(params[0]);
|
||||
var value = (0, dayjs_1.default)(params[0]);
|
||||
switch (params[1]) {
|
||||
case 'y': {
|
||||
return value.startOf('year').millisecond();
|
||||
|
|
@ -285,7 +333,7 @@ function execOp(op, params, obscure) {
|
|||
}
|
||||
}
|
||||
case '$dateFloor': {
|
||||
const value = (0, dayjs_1.default)(params[0]);
|
||||
var value = (0, dayjs_1.default)(params[0]);
|
||||
switch (params[1]) {
|
||||
case 'y': {
|
||||
return value.endOf('year').millisecond();
|
||||
|
|
@ -311,9 +359,9 @@ function execOp(op, params, obscure) {
|
|||
}
|
||||
}
|
||||
case '$distance': {
|
||||
const [geo1, geo2] = params;
|
||||
const { type: type1, coordinate: coordinate1 } = geo1;
|
||||
const { type: type2, coordinate: coordinate2 } = geo2;
|
||||
var _c = __read(params, 2), geo1 = _c[0], geo2 = _c[1];
|
||||
var type1 = geo1.type, coordinate1 = geo1.coordinate;
|
||||
var type2 = geo2.type, coordinate2 = geo2.coordinate;
|
||||
if (type1 !== 'point' || type2 !== 'point') {
|
||||
throw new Error('目前只支持point类型的距离运算');
|
||||
}
|
||||
|
|
@ -323,7 +371,7 @@ function execOp(op, params, obscure) {
|
|||
throw new Error('$contains类型未实现');
|
||||
}
|
||||
default: {
|
||||
(0, assert_1.default)(false, `不能识别的expression运算符:${op}`);
|
||||
(0, assert_1.default)(false, "\u4E0D\u80FD\u8BC6\u522B\u7684expression\u8FD0\u7B97\u7B26\uFF1A".concat(op));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,33 +1,33 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.RowStore = void 0;
|
||||
const lodash_1 = require("../utils/lodash");
|
||||
class RowStore {
|
||||
static $$LEVEL = 'store';
|
||||
static $$CODES = {
|
||||
var lodash_1 = require("../utils/lodash");
|
||||
var RowStore = /** @class */ (function () {
|
||||
function RowStore(storageSchema) {
|
||||
this.storageSchema = storageSchema;
|
||||
}
|
||||
RowStore.prototype.getSchema = function () {
|
||||
return this.storageSchema;
|
||||
};
|
||||
RowStore.prototype.mergeOperationResult = function (result, toBeMerged) {
|
||||
for (var entity in toBeMerged) {
|
||||
for (var action in toBeMerged[entity]) {
|
||||
var value = (0, lodash_1.get)(result, "".concat(entity, ".").concat(action));
|
||||
if (typeof value === 'number') {
|
||||
(0, lodash_1.set)(result, "".concat(entity, ".").concat(action), value + toBeMerged[entity][action]);
|
||||
}
|
||||
else {
|
||||
(0, lodash_1.set)(result, "".concat(entity, ".").concat(action), toBeMerged[entity][action]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
RowStore.$$LEVEL = 'store';
|
||||
RowStore.$$CODES = {
|
||||
primaryKeyConfilict: [1, '主键重复'],
|
||||
expressionUnresolved: [2, '表达式无法计算完成'],
|
||||
nodeIdRepeated: [3, '查询或投影中的nodeId重复'],
|
||||
};
|
||||
storageSchema;
|
||||
constructor(storageSchema) {
|
||||
this.storageSchema = storageSchema;
|
||||
}
|
||||
getSchema() {
|
||||
return this.storageSchema;
|
||||
}
|
||||
mergeOperationResult(result, toBeMerged) {
|
||||
for (const entity in toBeMerged) {
|
||||
for (const action in toBeMerged[entity]) {
|
||||
const value = (0, lodash_1.get)(result, `${entity}.${action}`);
|
||||
if (typeof value === 'number') {
|
||||
(0, lodash_1.set)(result, `${entity}.${action}`, value + toBeMerged[entity][action]);
|
||||
}
|
||||
else {
|
||||
(0, lodash_1.set)(result, `${entity}.${action}`, toBeMerged[entity][action]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return RowStore;
|
||||
}());
|
||||
exports.RowStore = RowStore;
|
||||
|
|
|
|||
|
|
@ -14,8 +14,11 @@ exports.Executor = void 0;
|
|||
;
|
||||
;
|
||||
;
|
||||
class Executor {
|
||||
static dataAttr = '$$triggerData$$';
|
||||
static timestampAttr = '$$triggerTimestamp$$';
|
||||
}
|
||||
var Executor = /** @class */ (function () {
|
||||
function Executor() {
|
||||
}
|
||||
Executor.dataAttr = '$$triggerData$$';
|
||||
Executor.timestampAttr = '$$triggerTimestamp$$';
|
||||
return Executor;
|
||||
}());
|
||||
exports.Executor = Executor;
|
||||
|
|
|
|||
|
|
@ -1,82 +1,145 @@
|
|||
"use strict";
|
||||
var __extends = (this && this.__extends) || (function () {
|
||||
var extendStatics = function (d, b) {
|
||||
extendStatics = Object.setPrototypeOf ||
|
||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||||
return extendStatics(d, b);
|
||||
};
|
||||
return function (d, b) {
|
||||
if (typeof b !== "function" && b !== null)
|
||||
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||||
extendStatics(d, b);
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
})();
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
while (_) try {
|
||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0: case 1: t = op; break;
|
||||
case 4: _.label++; return { value: op[1], done: false };
|
||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||
if (t[2]) _.ops.pop();
|
||||
_.trys.pop(); continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.SimpleConnector = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
const types_1 = require("../types");
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
var types_1 = require("../types");
|
||||
function makeContentTypeAndBody(data) {
|
||||
return {
|
||||
contentType: 'application/json',
|
||||
body: JSON.stringify(data),
|
||||
};
|
||||
}
|
||||
class SimpleConnector extends types_1.Connector {
|
||||
static ROUTER = '/aspect';
|
||||
serverUrl;
|
||||
makeException;
|
||||
contextBuilder;
|
||||
constructor(serverUrl, makeException, contextBuilder) {
|
||||
super();
|
||||
this.serverUrl = `${serverUrl}${SimpleConnector.ROUTER}`;
|
||||
this.makeException = makeException;
|
||||
this.contextBuilder = contextBuilder;
|
||||
var SimpleConnector = /** @class */ (function (_super) {
|
||||
__extends(SimpleConnector, _super);
|
||||
function SimpleConnector(serverUrl, makeException, contextBuilder) {
|
||||
var _this = _super.call(this) || this;
|
||||
_this.serverUrl = "".concat(serverUrl).concat(SimpleConnector.ROUTER);
|
||||
_this.makeException = makeException;
|
||||
_this.contextBuilder = contextBuilder;
|
||||
return _this;
|
||||
}
|
||||
async callAspect(name, params, context) {
|
||||
const cxtStr = await context.toString();
|
||||
const { contentType, body } = makeContentTypeAndBody(params);
|
||||
const response = await global.fetch(this.serverUrl, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': contentType,
|
||||
'oak-cxt': cxtStr,
|
||||
'oak-aspect': name,
|
||||
},
|
||||
body,
|
||||
SimpleConnector.prototype.callAspect = function (name, params, context) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var cxtStr, _a, contentType, body, response, err, _b, exception, result, opRecords;
|
||||
return __generator(this, function (_c) {
|
||||
switch (_c.label) {
|
||||
case 0: return [4 /*yield*/, context.toString()];
|
||||
case 1:
|
||||
cxtStr = _c.sent();
|
||||
_a = makeContentTypeAndBody(params), contentType = _a.contentType, body = _a.body;
|
||||
return [4 /*yield*/, global.fetch(this.serverUrl, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': contentType,
|
||||
'oak-cxt': cxtStr,
|
||||
'oak-aspect': name,
|
||||
},
|
||||
body: body,
|
||||
})];
|
||||
case 2:
|
||||
response = _c.sent();
|
||||
if (response.status > 299) {
|
||||
err = new types_1.OakExternalException("\u7F51\u7EDC\u8BF7\u6C42\u8FD4\u56DE\u5F02\u5E38\uFF0Cstatus\u662F".concat(response.status));
|
||||
throw err;
|
||||
}
|
||||
return [4 /*yield*/, response.json()];
|
||||
case 3:
|
||||
_b = _c.sent(), exception = _b.exception, result = _b.result, opRecords = _b.opRecords;
|
||||
if (exception) {
|
||||
throw this.makeException(exception);
|
||||
}
|
||||
return [2 /*return*/, {
|
||||
result: result,
|
||||
opRecords: opRecords,
|
||||
}];
|
||||
}
|
||||
});
|
||||
});
|
||||
if (response.status > 299) {
|
||||
const err = new types_1.OakExternalException(`网络请求返回异常,status是${response.status}`);
|
||||
throw err;
|
||||
}
|
||||
// todo 处理各种返回的格式
|
||||
const { exception, result, opRecords } = await response.json();
|
||||
if (exception) {
|
||||
throw this.makeException(exception);
|
||||
}
|
||||
return {
|
||||
result,
|
||||
opRecords,
|
||||
};
|
||||
}
|
||||
getRouter() {
|
||||
};
|
||||
SimpleConnector.prototype.getRouter = function () {
|
||||
return SimpleConnector.ROUTER;
|
||||
}
|
||||
parseRequest(headers, body, store) {
|
||||
const { 'oak-cxt': oakCxtStr, 'oak-aspect': aspectName } = headers;
|
||||
};
|
||||
SimpleConnector.prototype.parseRequest = function (headers, body, store) {
|
||||
var oakCxtStr = headers["oak-cxt"], aspectName = headers["oak-aspect"];
|
||||
(0, assert_1.default)(typeof oakCxtStr === 'string' || oakCxtStr === undefined);
|
||||
(0, assert_1.default)(typeof aspectName === 'string');
|
||||
const context = this.contextBuilder(oakCxtStr)(store);
|
||||
var context = this.contextBuilder(oakCxtStr)(store);
|
||||
return {
|
||||
name: aspectName,
|
||||
params: body,
|
||||
context,
|
||||
context: context,
|
||||
};
|
||||
}
|
||||
serializeResult(result, context, headers, body) {
|
||||
};
|
||||
SimpleConnector.prototype.serializeResult = function (result, context, headers, body) {
|
||||
return {
|
||||
body: {
|
||||
result,
|
||||
result: result,
|
||||
opRecords: context.opRecords,
|
||||
},
|
||||
};
|
||||
}
|
||||
serializeException(exception, headers, body) {
|
||||
};
|
||||
SimpleConnector.prototype.serializeException = function (exception, headers, body) {
|
||||
return {
|
||||
body: {
|
||||
exception: exception.toString(),
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
SimpleConnector.ROUTER = '/aspect';
|
||||
return SimpleConnector;
|
||||
}(types_1.Connector));
|
||||
exports.SimpleConnector = SimpleConnector;
|
||||
|
|
|
|||
|
|
@ -7,5 +7,5 @@ exports.assert = void 0;
|
|||
/**
|
||||
* 防止assert打包体积过大,从这里引用
|
||||
*/
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
exports.assert = assert_1.default;
|
||||
|
|
|
|||
|
|
@ -1,53 +1,125 @@
|
|||
"use strict";
|
||||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||||
return new (P || (P = Promise))(function (resolve, reject) {
|
||||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||||
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||||
});
|
||||
};
|
||||
var __generator = (this && this.__generator) || function (thisArg, body) {
|
||||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||||
function verb(n) { return function (v) { return step([n, v]); }; }
|
||||
function step(op) {
|
||||
if (f) throw new TypeError("Generator is already executing.");
|
||||
while (_) try {
|
||||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||||
if (y = 0, t) op = [op[0] & 2, t.value];
|
||||
switch (op[0]) {
|
||||
case 0: case 1: t = op; break;
|
||||
case 4: _.label++; return { value: op[1], done: false };
|
||||
case 5: _.label++; y = op[1]; op = [0]; continue;
|
||||
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||||
default:
|
||||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||||
if (t[2]) _.ops.pop();
|
||||
_.trys.pop(); continue;
|
||||
}
|
||||
op = body.call(thisArg, _);
|
||||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||||
}
|
||||
};
|
||||
var __values = (this && this.__values) || function(o) {
|
||||
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
||||
if (m) return m.call(o);
|
||||
if (o && typeof o.length === "number") return {
|
||||
next: function () {
|
||||
if (o && i >= o.length) o = void 0;
|
||||
return { value: o && o[i++], done: !o };
|
||||
}
|
||||
};
|
||||
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||||
};
|
||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.RWLock = void 0;
|
||||
const assert_1 = __importDefault(require("assert"));
|
||||
var assert_1 = __importDefault(require("assert"));
|
||||
/**
|
||||
* 模拟一个读写锁,用于同步。
|
||||
* 注意,千万不要发生自己等自己
|
||||
*/
|
||||
class RWLock {
|
||||
readNumber;
|
||||
writeNumber;
|
||||
readWaiter;
|
||||
writeWaiter;
|
||||
constructor() {
|
||||
var RWLock = /** @class */ (function () {
|
||||
function RWLock() {
|
||||
this.readNumber = 0;
|
||||
this.writeNumber = 0;
|
||||
this.readWaiter = [];
|
||||
this.writeWaiter = [];
|
||||
}
|
||||
async acquire(mode) {
|
||||
if (mode === 'S') {
|
||||
while (this.writeNumber > 0) {
|
||||
const p = new Promise((resolve) => this.readWaiter.push(resolve));
|
||||
await p;
|
||||
}
|
||||
this.readNumber++;
|
||||
}
|
||||
else {
|
||||
while (this.writeNumber || this.readNumber) {
|
||||
const p = new Promise((resolve) => this.writeWaiter.push(resolve));
|
||||
await p;
|
||||
}
|
||||
this.writeNumber++;
|
||||
}
|
||||
}
|
||||
release() {
|
||||
RWLock.prototype.acquire = function (mode) {
|
||||
return __awaiter(this, void 0, void 0, function () {
|
||||
var p, p;
|
||||
var _this = this;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0:
|
||||
if (!(mode === 'S')) return [3 /*break*/, 4];
|
||||
_a.label = 1;
|
||||
case 1:
|
||||
if (!(this.writeNumber > 0)) return [3 /*break*/, 3];
|
||||
p = new Promise(function (resolve) { return _this.readWaiter.push(resolve); });
|
||||
return [4 /*yield*/, p];
|
||||
case 2:
|
||||
_a.sent();
|
||||
return [3 /*break*/, 1];
|
||||
case 3:
|
||||
this.readNumber++;
|
||||
return [3 /*break*/, 7];
|
||||
case 4:
|
||||
if (!(this.writeNumber || this.readNumber)) return [3 /*break*/, 6];
|
||||
p = new Promise(function (resolve) { return _this.writeWaiter.push(resolve); });
|
||||
return [4 /*yield*/, p];
|
||||
case 5:
|
||||
_a.sent();
|
||||
return [3 /*break*/, 4];
|
||||
case 6:
|
||||
this.writeNumber++;
|
||||
_a.label = 7;
|
||||
case 7: return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
RWLock.prototype.release = function () {
|
||||
var e_1, _a;
|
||||
if (this.writeNumber) {
|
||||
(0, assert_1.default)(this.writeNumber === 1);
|
||||
this.writeNumber = 0;
|
||||
if (this.readWaiter.length > 0) {
|
||||
for (const f of this.readWaiter) {
|
||||
f(undefined);
|
||||
try {
|
||||
for (var _b = __values(this.readWaiter), _c = _b.next(); !_c.done; _c = _b.next()) {
|
||||
var f = _c.value;
|
||||
f(undefined);
|
||||
}
|
||||
}
|
||||
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
||||
finally {
|
||||
try {
|
||||
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
||||
}
|
||||
finally { if (e_1) throw e_1.error; }
|
||||
}
|
||||
this.readWaiter = [];
|
||||
}
|
||||
else if (this.writeWaiter.length > 0) {
|
||||
const f = this.writeWaiter.pop();
|
||||
var f = this.writeWaiter.pop();
|
||||
f(undefined);
|
||||
}
|
||||
}
|
||||
|
|
@ -56,10 +128,11 @@ class RWLock {
|
|||
(0, assert_1.default)(this.readWaiter.length === 0);
|
||||
this.readNumber--;
|
||||
if (this.readNumber === 0) {
|
||||
const f = this.writeWaiter.pop();
|
||||
var f = this.writeWaiter.pop();
|
||||
f && f(undefined);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
return RWLock;
|
||||
}());
|
||||
exports.RWLock = RWLock;
|
||||
|
|
|
|||
|
|
@ -9,16 +9,16 @@ function getDistanceBetweenPoints(lat1, lon1, lat2, lon2) {
|
|||
function toRadians(d) {
|
||||
return d * Math.PI / 180;
|
||||
}
|
||||
const R = 6378137; // 地球长半径
|
||||
const φ1 = toRadians(lat1);
|
||||
const φ2 = toRadians(lat2);
|
||||
const Δφ = toRadians(lat2 - lat1);
|
||||
const Δλ = toRadians(lon2 - lon1);
|
||||
const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
|
||||
var R = 6378137; // 地球长半径
|
||||
var φ1 = toRadians(lat1);
|
||||
var φ2 = toRadians(lat2);
|
||||
var Δφ = toRadians(lat2 - lat1);
|
||||
var Δλ = toRadians(lon2 - lon1);
|
||||
var a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) +
|
||||
Math.cos(φ1) * Math.cos(φ2) *
|
||||
Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
|
||||
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||
const d = R * c;
|
||||
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
||||
var d = R * c;
|
||||
return d * 1000;
|
||||
}
|
||||
exports.getDistanceBetweenPoints = getDistanceBetweenPoints;
|
||||
|
|
|
|||
|
|
@ -8,25 +8,25 @@ exports.isEqual = exports.pick = exports.cloneDeep = exports.merge = exports.omi
|
|||
* 避免lodash打包体积过大
|
||||
* 像assign, keys尽量使用Object的函数
|
||||
*/
|
||||
const unset_1 = __importDefault(require("lodash/unset"));
|
||||
var unset_1 = __importDefault(require("lodash/unset"));
|
||||
exports.unset = unset_1.default;
|
||||
const pull_1 = __importDefault(require("lodash/pull"));
|
||||
var pull_1 = __importDefault(require("lodash/pull"));
|
||||
exports.pull = pull_1.default;
|
||||
const uniq_1 = __importDefault(require("lodash/uniq"));
|
||||
var uniq_1 = __importDefault(require("lodash/uniq"));
|
||||
exports.uniq = uniq_1.default;
|
||||
const get_1 = __importDefault(require("lodash/get"));
|
||||
var get_1 = __importDefault(require("lodash/get"));
|
||||
exports.get = get_1.default;
|
||||
const set_1 = __importDefault(require("lodash/set"));
|
||||
var set_1 = __importDefault(require("lodash/set"));
|
||||
exports.set = set_1.default;
|
||||
const intersection_1 = __importDefault(require("lodash/intersection"));
|
||||
var intersection_1 = __importDefault(require("lodash/intersection"));
|
||||
exports.intersection = intersection_1.default;
|
||||
const omit_1 = __importDefault(require("lodash/omit"));
|
||||
var omit_1 = __importDefault(require("lodash/omit"));
|
||||
exports.omit = omit_1.default;
|
||||
const merge_1 = __importDefault(require("lodash/merge"));
|
||||
var merge_1 = __importDefault(require("lodash/merge"));
|
||||
exports.merge = merge_1.default;
|
||||
const cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
|
||||
var cloneDeep_1 = __importDefault(require("lodash/cloneDeep"));
|
||||
exports.cloneDeep = cloneDeep_1.default;
|
||||
const pick_1 = __importDefault(require("lodash/pick"));
|
||||
var pick_1 = __importDefault(require("lodash/pick"));
|
||||
exports.pick = pick_1.default;
|
||||
const isEqual_1 = __importDefault(require("lodash/isEqual"));
|
||||
var isEqual_1 = __importDefault(require("lodash/isEqual"));
|
||||
exports.isEqual = isEqual_1.default;
|
||||
|
|
|
|||
|
|
@ -6,6 +6,6 @@ function shrinkUuidTo32Bytes(uuid) {
|
|||
}
|
||||
exports.shrinkUuidTo32Bytes = shrinkUuidTo32Bytes;
|
||||
function expandUuidTo36Bytes(uuidShrinked) {
|
||||
return `${uuidShrinked.slice(0, 8)}-${uuidShrinked.slice(8, 12)}-${uuidShrinked.slice(12, 16)}-${uuidShrinked.slice(16, 20)}-${uuidShrinked.slice(20)}`;
|
||||
return "".concat(uuidShrinked.slice(0, 8), "-").concat(uuidShrinked.slice(8, 12), "-").concat(uuidShrinked.slice(12, 16), "-").concat(uuidShrinked.slice(16, 20), "-").concat(uuidShrinked.slice(20));
|
||||
}
|
||||
exports.expandUuidTo36Bytes = expandUuidTo36Bytes;
|
||||
|
|
|
|||
|
|
@ -4,86 +4,86 @@
|
|||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.checkAttributesScope = exports.checkAttributesNotNull = exports.isVehicleNumber = exports.isMoney = exports.isNumber = exports.isPhone = exports.isDigital = exports.isSizedCaptcha = exports.isNickname = exports.isUrl = exports.isSoldierNumber = exports.isBirthNumber = exports.isTwCardNumber = exports.isAmCardNumber = exports.isHkCardNumber = exports.isPassportNumber = exports.isIdCardNumber = exports.isCaptcha = exports.isPassword = exports.isMobile = void 0;
|
||||
const types_1 = require("../types");
|
||||
const isMobile = (text) => {
|
||||
var types_1 = require("../types");
|
||||
var isMobile = function (text) {
|
||||
return ((text) && (typeof text === "string") && ((/^1[3|4|5|6|7|8|9]\d{9}$/.test(text))));
|
||||
};
|
||||
exports.isMobile = isMobile;
|
||||
const isPassword = (text) => {
|
||||
var isPassword = function (text) {
|
||||
return ((text) && (typeof text === "string") && (/^[a-zA-Z0-9!.@]{8,16}$/.test(text)));
|
||||
};
|
||||
exports.isPassword = isPassword;
|
||||
const isCaptcha = (text) => {
|
||||
var isCaptcha = function (text) {
|
||||
return ((text) && (typeof text === "string") && (/^\d{4}$/.test(text)));
|
||||
};
|
||||
exports.isCaptcha = isCaptcha;
|
||||
const isIdCardNumber = (text) => {
|
||||
var isIdCardNumber = function (text) {
|
||||
return ((typeof text === "string") && text.length === 18 && (/^\d{6}(18|19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(text)));
|
||||
};
|
||||
exports.isIdCardNumber = isIdCardNumber;
|
||||
const isPassportNumber = (text) => {
|
||||
var isPassportNumber = function (text) {
|
||||
// 护照
|
||||
// 规则: 14/15开头 + 7位数字, G + 8位数字, P + 7位数字, S/D + 7或8位数字,等
|
||||
// 样本: 141234567, G12345678, P1234567
|
||||
return typeof text === 'string' && /^([a-zA-z]|[0-9]){5,17}$/.test(text);
|
||||
};
|
||||
exports.isPassportNumber = isPassportNumber;
|
||||
const isHkCardNumber = (text) => {
|
||||
var isHkCardNumber = function (text) {
|
||||
// 港澳居民来往内地通行证
|
||||
// 规则: H/M + 10位或6位数字
|
||||
// 样本: H1234567890
|
||||
return typeof text === 'string' && /^([A-Z]\d{6,10}(\(\w{1}\))?)$/.test(text);
|
||||
};
|
||||
exports.isHkCardNumber = isHkCardNumber;
|
||||
const isAmCardNumber = (text) => {
|
||||
var isAmCardNumber = function (text) {
|
||||
return typeof text === 'string' && /^([A-Z]\d{6,10}(\(\w{1}\))?)$/.test(text);
|
||||
};
|
||||
exports.isAmCardNumber = isAmCardNumber;
|
||||
const isTwCardNumber = (text) => {
|
||||
var isTwCardNumber = function (text) {
|
||||
// 台湾居民来往大陆通行证
|
||||
// 规则: 新版8位或18位数字, 旧版10位数字 + 英文字母
|
||||
// 样本: 12345678 或 1234567890B
|
||||
return typeof text === 'string' && /^\d{8}|^[a-zA-Z0-9]{10}|^\d{18}$/.test(text);
|
||||
};
|
||||
exports.isTwCardNumber = isTwCardNumber;
|
||||
const isBirthNumber = (text) => {
|
||||
var isBirthNumber = function (text) {
|
||||
return typeof text === 'string' && /^[a-zA-Z0-9]{5,21}$/.test(text);
|
||||
};
|
||||
exports.isBirthNumber = isBirthNumber;
|
||||
const isSoldierNumber = (text) => {
|
||||
var isSoldierNumber = function (text) {
|
||||
// 军官证
|
||||
// 规则: 军/兵/士/文/职/广/(其他中文) + "字第" + 4到8位字母或数字 + "号"
|
||||
// 样本: 军字第2001988号, 士字第P011816X号
|
||||
return typeof text === 'string' && /^[\u4E00-\u9FA5](字第)([0-9a-zA-Z]{4,8})(号?)$/.test(text);
|
||||
};
|
||||
exports.isSoldierNumber = isSoldierNumber;
|
||||
const isUrl = (str) => {
|
||||
const regex = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
||||
var isUrl = function (str) {
|
||||
var regex = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
||||
return typeof str === "string" && regex.test(str);
|
||||
};
|
||||
exports.isUrl = isUrl;
|
||||
const isNickname = (str) => {
|
||||
var isNickname = function (str) {
|
||||
return str && typeof str === "string" && str.trim().length > 0 && str.length < 16;
|
||||
};
|
||||
exports.isNickname = isNickname;
|
||||
const isSizedCaptcha = (text, size) => {
|
||||
var isSizedCaptcha = function (text, size) {
|
||||
return typeof text === 'string' && text.length === size && !isNaN(parseInt(text, 10));
|
||||
};
|
||||
exports.isSizedCaptcha = isSizedCaptcha;
|
||||
const isDigital = (digital) => {
|
||||
var isDigital = function (digital) {
|
||||
return /^\d{6,12}$/.test(digital);
|
||||
};
|
||||
exports.isDigital = isDigital;
|
||||
const isPhone = (phone) => {
|
||||
var isPhone = function (phone) {
|
||||
// return /^((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)/.test(phone);
|
||||
return /^(\(\d{3,4}\)|\d{3,4}-)?\d{7,8}$/.test(phone);
|
||||
};
|
||||
exports.isPhone = isPhone;
|
||||
const isNumber = (str) => {
|
||||
var isNumber = function (str) {
|
||||
return /^[0-9]*$/.test(str);
|
||||
};
|
||||
exports.isNumber = isNumber;
|
||||
const isMoney = (str, zero) => {
|
||||
var isMoney = function (str, zero) {
|
||||
// zero为true包含零
|
||||
if (zero) {
|
||||
// 金额,最多可以有两位小数
|
||||
|
|
@ -92,15 +92,15 @@ const isMoney = (str, zero) => {
|
|||
return /(^[1-9](\d+)?(\.\d{1,2})?$)|(^\d\.\d{1,2}$)/.test(str);
|
||||
};
|
||||
exports.isMoney = isMoney;
|
||||
const isVehicleNumber = (str) => {
|
||||
var isVehicleNumber = function (str) {
|
||||
// const xreg=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
|
||||
// const creg=/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
|
||||
const reg = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/;
|
||||
var reg = /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/;
|
||||
return reg.test(str);
|
||||
};
|
||||
exports.isVehicleNumber = isVehicleNumber;
|
||||
function checkAttributesNotNull(data, attributes, allowEmpty) {
|
||||
const attrs = attributes.filter((attr) => {
|
||||
var attrs = attributes.filter(function (attr) {
|
||||
if (data[attr] === null || data[attr] === '') {
|
||||
return true;
|
||||
}
|
||||
|
|
@ -115,7 +115,7 @@ function checkAttributesNotNull(data, attributes, allowEmpty) {
|
|||
exports.checkAttributesNotNull = checkAttributesNotNull;
|
||||
;
|
||||
function checkAttributesScope(data, attributes) {
|
||||
const attrs = attributes.filter(attr => !data.hasOwnProperty(attr));
|
||||
var attrs = attributes.filter(function (attr) { return !data.hasOwnProperty(attr); });
|
||||
if (attrs.length > 0) {
|
||||
throw new types_1.OakInputIllegalException(attrs, '多余的属性');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
"jsx": "preserve",
|
||||
/* Basic Options */
|
||||
// "incremental": true, /* Enable incremental compilation */
|
||||
"target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||
"target": "ES5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
|
||||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
|
||||
"lib": [
|
||||
"dom",
|
||||
|
|
|
|||
Loading…
Reference in New Issue