oak-domain 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -361,7 +361,7 @@ function getAttrRefInExpression(expression) {
361
361
  _a['#current'] = [],
362
362
  _a);
363
363
  var check = function (node) {
364
- var _a;
364
+ var _a, e_3, _b;
365
365
  if (node['#attr']) {
366
366
  result['#current'].push(node['#attr']);
367
367
  }
@@ -375,9 +375,24 @@ function getAttrRefInExpression(expression) {
375
375
  _a));
376
376
  }
377
377
  }
378
- else {
379
- for (var attr in expression) {
380
- check(expression[attr]);
378
+ else if (node instanceof Array) {
379
+ try {
380
+ for (var node_1 = tslib_1.__values(node), node_1_1 = node_1.next(); !node_1_1.done; node_1_1 = node_1.next()) {
381
+ var subNode = node_1_1.value;
382
+ check(subNode);
383
+ }
384
+ }
385
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
386
+ finally {
387
+ try {
388
+ if (node_1_1 && !node_1_1.done && (_b = node_1.return)) _b.call(node_1);
389
+ }
390
+ finally { if (e_3) throw e_3.error; }
391
+ }
392
+ }
393
+ else if (typeof node === 'object') {
394
+ for (var attr in node) {
395
+ check(node[attr]);
381
396
  }
382
397
  }
383
398
  };
@@ -1,5 +1,5 @@
1
1
  import { ActionType } from '.';
2
- import { EntityDict, EntityShape, InstinctiveAttributes } from './Entity';
2
+ import { EntityDict, EntityShape, InstinctiveAttributes, RelationHierarchy } from './Entity';
3
3
  import { DataType, DataTypeParams } from './schema/DataTypes';
4
4
  export declare type Ref = 'ref';
5
5
  export interface Column<SH extends EntityShape> {
@@ -36,7 +36,7 @@ export declare type UniqConstraint<SH extends EntityShape> = {
36
36
  attributes: Array<keyof SH>;
37
37
  type?: string;
38
38
  };
39
- export interface StorageDesc<SH extends EntityShape> {
39
+ export interface StorageDesc<SH extends EntityShape, Relation extends string = ''> {
40
40
  storageName?: string;
41
41
  comment?: string;
42
42
  attributes: Attributes<SH>;
@@ -48,8 +48,9 @@ export interface StorageDesc<SH extends EntityShape> {
48
48
  static?: true;
49
49
  actions: string[];
50
50
  actionType: ActionType;
51
+ relationHierarchy?: RelationHierarchy<Relation>;
51
52
  view?: true;
52
53
  }
53
54
  export declare type StorageSchema<ED extends EntityDict> = {
54
- [K in keyof ED]: StorageDesc<ED[K]['OpSchema']>;
55
+ [K in keyof ED]: StorageDesc<ED[K]['OpSchema'], any>;
55
56
  };
@@ -1,4 +1,3 @@
1
- import { RecurrenceRule, RecurrenceSpecDateRange, RecurrenceSpecObjLit } from 'node-schedule';
2
1
  import { EntityDict } from './Entity';
3
2
  import { AsyncContext } from "../store/AsyncRowStore";
4
3
  declare type RoutineFn<ED extends EntityDict, Cxt extends AsyncContext<ED>> = (context: Cxt) => Promise<string>;
@@ -8,7 +7,7 @@ export declare type Routine<ED extends EntityDict, Cxt extends AsyncContext<ED>>
8
7
  };
9
8
  export declare type Timer<ED extends EntityDict, Cxt extends AsyncContext<ED>> = {
10
9
  name: string;
11
- cron: RecurrenceRule | RecurrenceSpecDateRange | RecurrenceSpecObjLit | Date | string | number;
10
+ cron: string;
12
11
  fn: RoutineFn<ED, Cxt>;
13
12
  };
14
13
  export {};
@@ -25,6 +25,11 @@ export interface CreateTriggerCrossTxn<ED extends EntityDict, T extends keyof ED
25
25
  strict?: 'takeEasy' | 'makeSure';
26
26
  }
27
27
  export declare type CreateTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = CreateTriggerInTxn<ED, T, Cxt> | CreateTriggerCrossTxn<ED, T, Cxt>;
28
+ /**
29
+ * update trigger如果带有filter,说明只对存在限定条件的行起作用。此时系统在进行相应动作时,
30
+ * 会判定当前动作的filter条件和trigger所定义的filter是否有交集(即有同时满足两个条件的行)
31
+ * 只要有,就会触发trigger。要注意的是这个条件是exists而不是all
32
+ */
28
33
  export interface UpdateTriggerBase<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
29
34
  action: Exclude<ED[T]['Action'], GenericAction> | 'update' | Array<Exclude<ED[T]['Action'], GenericAction> | 'update'>;
30
35
  attributes?: keyof ED[T]['OpSchema'] | Array<keyof ED[T]['OpSchema']>;
@@ -32,6 +37,7 @@ export interface UpdateTriggerBase<ED extends EntityDict, T extends keyof ED, Cx
32
37
  fn: (event: {
33
38
  operation: ED[T]['Update'];
34
39
  }, context: Cxt, option: OperateOption) => Promise<number> | number;
40
+ filter?: ED[T]['Update']['filter'] | ((operation: ED[T]['Update'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter']);
35
41
  }
36
42
  export interface UpdateTriggerInTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends UpdateTriggerBase<ED, T, Cxt> {
37
43
  when: 'before' | 'after';
@@ -41,12 +47,18 @@ export interface UpdateTriggerCrossTxn<ED extends EntityDict, T extends keyof ED
41
47
  strict?: 'takeEasy' | 'makeSure';
42
48
  }
43
49
  export declare type UpdateTrigger<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = UpdateTriggerInTxn<ED, T, Cxt> | UpdateTriggerCrossTxn<ED, T, Cxt>;
50
+ /**
51
+ * 同update trigger一样,remove trigger如果带有filter,说明只对存在限定条件的行起作用。此时系统在进行相应动作时,
52
+ * 会判定当前动作的filter条件和trigger所定义的filter是否有交集(即有同时满足两个条件的行)
53
+ * 只要有,就会触发trigger。要注意的是这个条件是exists而不是all
54
+ */
44
55
  export interface RemoveTriggerBase<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends TriggerBase<ED, T> {
45
56
  action: 'remove';
46
57
  check?: (operation: ED[T]['Remove']) => boolean;
47
58
  fn: (event: {
48
59
  operation: ED[T]['Remove'];
49
60
  }, context: Cxt, option: OperateOption) => Promise<number> | number;
61
+ filter?: ED[T]['Remove']['filter'] | ((operation: ED[T]['Remove'], context: Cxt, option: OperateOption) => ED[T]['Remove']['filter']);
50
62
  }
51
63
  export interface RemoveTriggerInTxn<ED extends EntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> extends RemoveTriggerBase<ED, T, Cxt> {
52
64
  when: 'before' | 'after';
@@ -3,8 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SimpleConnector = void 0;
4
4
  var tslib_1 = require("tslib");
5
5
  var assert_1 = tslib_1.__importDefault(require("assert"));
6
+ var stream_1 = require("stream");
6
7
  var types_1 = require("../types");
7
8
  function makeContentTypeAndBody(data) {
9
+ //
10
+ if (process.env.OAK_PLATFORM !== 'wechatMp') {
11
+ if (data instanceof FormData) {
12
+ return {
13
+ contentType: 'multipart/form-data',
14
+ body: data,
15
+ };
16
+ }
17
+ }
8
18
  return {
9
19
  contentType: 'application/json',
10
20
  body: JSON.stringify(data),
@@ -82,6 +92,11 @@ var SimpleConnector = /** @class */ (function (_super) {
82
92
  });
83
93
  };
84
94
  SimpleConnector.prototype.serializeResult = function (result, context, headers, body) {
95
+ if (result instanceof stream_1.Stream) {
96
+ return {
97
+ body: result,
98
+ };
99
+ }
85
100
  return {
86
101
  body: {
87
102
  result: result,
@@ -0,0 +1 @@
1
+ export declare function schedule(cron: string, fn: (date: Date) => any): void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.schedule = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var cronjs_matcher_1 = require("@datasert/cronjs-matcher");
6
+ var dayjs_1 = tslib_1.__importDefault(require("dayjs"));
7
+ function schedule(cron, fn) {
8
+ var futureMatches = (0, cronjs_matcher_1.getFutureMatches)(cron, {
9
+ matchCount: 1,
10
+ });
11
+ var date = (0, dayjs_1.default)(futureMatches[0]);
12
+ var interval = date.diff((0, dayjs_1.default)(), 'ms');
13
+ setTimeout(function () {
14
+ fn(new Date());
15
+ schedule(cron, fn);
16
+ }, interval);
17
+ }
18
+ exports.schedule = schedule;
@@ -2,4 +2,19 @@
2
2
  * 避免lodash打包体积过大
3
3
  * 像assign, keys尽量使用Object的函数
4
4
  */
5
- export { unset, pull, uniq, uniqBy, get, set, intersection, omit, merge, cloneDeep, pick, isEqual, union, difference, groupBy, } from 'lodash';
5
+ import unset from 'lodash/unset';
6
+ import uniqBy from 'lodash/uniqBy';
7
+ import pull from 'lodash/pull';
8
+ import uniq from 'lodash/uniq';
9
+ import get from 'lodash/get';
10
+ import set from 'lodash/set';
11
+ import intersection from 'lodash/intersection';
12
+ import omit from 'lodash/omit';
13
+ import merge from 'lodash/merge';
14
+ import cloneDeep from 'lodash/cloneDeep';
15
+ import pick from 'lodash/pick';
16
+ import isEqual from 'lodash/isEqual';
17
+ import union from 'lodash/union';
18
+ import difference from 'lodash/difference';
19
+ import groupBy from 'lodash/groupBy';
20
+ export { unset, pull, uniq, uniqBy, get, set, intersection, omit, merge, cloneDeep, pick, isEqual, union, difference, groupBy, };
@@ -1,38 +1,55 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.groupBy = exports.difference = exports.union = exports.isEqual = exports.pick = exports.cloneDeep = exports.merge = exports.omit = exports.intersection = exports.set = exports.get = exports.uniqBy = exports.uniq = exports.pull = exports.unset = void 0;
4
+ var tslib_1 = require("tslib");
4
5
  /**
5
6
  * 避免lodash打包体积过大
6
7
  * 像assign, keys尽量使用Object的函数
7
8
  */
8
- /* import unset from 'lodash/unset';
9
- import uniqBy from 'lodash/uniqBy';
10
- import pull from 'lodash/pull';
11
- import uniq from 'lodash/uniq';
12
- import get from 'lodash/get';
13
- import set from 'lodash/set';
14
- import intersection from 'lodash/intersection';
15
- import omit from 'lodash/omit';
16
- import merge from 'lodash/merge';
17
- import cloneDeep from 'lodash/cloneDeep';
18
- import pick from 'lodash/pick';
19
- import isEqual from 'lodash/isEqual';
20
- import union from 'lodash/union';
21
- import difference from 'lodash/difference';
22
- import groupBy from 'lodash/groupBy'; */
23
- var lodash_1 = require("lodash");
24
- Object.defineProperty(exports, "unset", { enumerable: true, get: function () { return lodash_1.unset; } });
25
- Object.defineProperty(exports, "pull", { enumerable: true, get: function () { return lodash_1.pull; } });
26
- Object.defineProperty(exports, "uniq", { enumerable: true, get: function () { return lodash_1.uniq; } });
27
- Object.defineProperty(exports, "uniqBy", { enumerable: true, get: function () { return lodash_1.uniqBy; } });
28
- Object.defineProperty(exports, "get", { enumerable: true, get: function () { return lodash_1.get; } });
29
- Object.defineProperty(exports, "set", { enumerable: true, get: function () { return lodash_1.set; } });
30
- Object.defineProperty(exports, "intersection", { enumerable: true, get: function () { return lodash_1.intersection; } });
31
- Object.defineProperty(exports, "omit", { enumerable: true, get: function () { return lodash_1.omit; } });
32
- Object.defineProperty(exports, "merge", { enumerable: true, get: function () { return lodash_1.merge; } });
33
- Object.defineProperty(exports, "cloneDeep", { enumerable: true, get: function () { return lodash_1.cloneDeep; } });
34
- Object.defineProperty(exports, "pick", { enumerable: true, get: function () { return lodash_1.pick; } });
35
- Object.defineProperty(exports, "isEqual", { enumerable: true, get: function () { return lodash_1.isEqual; } });
36
- Object.defineProperty(exports, "union", { enumerable: true, get: function () { return lodash_1.union; } });
37
- Object.defineProperty(exports, "difference", { enumerable: true, get: function () { return lodash_1.difference; } });
38
- Object.defineProperty(exports, "groupBy", { enumerable: true, get: function () { return lodash_1.groupBy; } });
9
+ var unset_1 = tslib_1.__importDefault(require("lodash/unset"));
10
+ exports.unset = unset_1.default;
11
+ var uniqBy_1 = tslib_1.__importDefault(require("lodash/uniqBy"));
12
+ exports.uniqBy = uniqBy_1.default;
13
+ var pull_1 = tslib_1.__importDefault(require("lodash/pull"));
14
+ exports.pull = pull_1.default;
15
+ var uniq_1 = tslib_1.__importDefault(require("lodash/uniq"));
16
+ exports.uniq = uniq_1.default;
17
+ var get_1 = tslib_1.__importDefault(require("lodash/get"));
18
+ exports.get = get_1.default;
19
+ var set_1 = tslib_1.__importDefault(require("lodash/set"));
20
+ exports.set = set_1.default;
21
+ var intersection_1 = tslib_1.__importDefault(require("lodash/intersection"));
22
+ exports.intersection = intersection_1.default;
23
+ var omit_1 = tslib_1.__importDefault(require("lodash/omit"));
24
+ exports.omit = omit_1.default;
25
+ var merge_1 = tslib_1.__importDefault(require("lodash/merge"));
26
+ exports.merge = merge_1.default;
27
+ var cloneDeep_1 = tslib_1.__importDefault(require("lodash/cloneDeep"));
28
+ exports.cloneDeep = cloneDeep_1.default;
29
+ var pick_1 = tslib_1.__importDefault(require("lodash/pick"));
30
+ exports.pick = pick_1.default;
31
+ var isEqual_1 = tslib_1.__importDefault(require("lodash/isEqual"));
32
+ exports.isEqual = isEqual_1.default;
33
+ var union_1 = tslib_1.__importDefault(require("lodash/union"));
34
+ exports.union = union_1.default;
35
+ var difference_1 = tslib_1.__importDefault(require("lodash/difference"));
36
+ exports.difference = difference_1.default;
37
+ var groupBy_1 = tslib_1.__importDefault(require("lodash/groupBy"));
38
+ exports.groupBy = groupBy_1.default;
39
+ // export {
40
+ // unset,
41
+ // pull,
42
+ // uniq,
43
+ // uniqBy,
44
+ // get,
45
+ // set,
46
+ // intersection,
47
+ // omit,
48
+ // merge,
49
+ // cloneDeep,
50
+ // pick,
51
+ // isEqual,
52
+ // union,
53
+ // difference,
54
+ // groupBy,
55
+ // } from 'lodash';
package/lib/utils/uuid.js CHANGED
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateNewId = exports.setGenerateIdOption = exports.produceIds = exports.generateNewIdAsync = exports.expandUuidTo36Bytes = exports.shrinkUuidTo32Bytes = exports.sequentialUuid = void 0;
4
4
  var tslib_1 = require("tslib");
5
- var assert_1 = tslib_1.__importDefault(require("assert"));
6
5
  var uuid_1 = require("uuid");
7
6
  var random_1 = require("./random/random");
8
7
  var _nodeId;
@@ -172,11 +171,24 @@ function setGenerateIdOption(option) {
172
171
  }
173
172
  exports.setGenerateIdOption = setGenerateIdOption;
174
173
  function generateNewId() {
175
- (0, assert_1.default)(ID_BUFFER.length > 0, '缓存的id已经用完,请提前调用produceIds以确保缓冲池中有足够的预分配id');
176
- var id = ID_BUFFER.pop();
177
- if (ID_BUFFER.length < 64) {
178
- produceIds();
174
+ if (ID_BUFFER.length > 0) {
175
+ var id = ID_BUFFER.pop();
176
+ if (ID_BUFFER.length < 64) {
177
+ produceIds();
178
+ }
179
+ return id;
180
+ }
181
+ else {
182
+ // 如果没来的及填满缓冲池,这里用一个简单的算法产生同步id(在小程序环境下跑出来过)
183
+ var random = new Uint8Array(16);
184
+ var iter = 0;
185
+ do {
186
+ random[iter] = Math.ceil(Math.random() * 1000) % 128;
187
+ } while (++iter < 16);
188
+ if ((ID_OPTION === null || ID_OPTION === void 0 ? void 0 : ID_OPTION.shuffle) || process.env.NODE_ENV === 'development') {
189
+ return (0, uuid_1.v4)({ random: random });
190
+ }
191
+ return sequentialUuid({ random: random });
179
192
  }
180
- return id;
181
193
  }
182
194
  exports.generateNewId = generateNewId;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oak-domain",
3
- "version": "2.2.0",
3
+ "version": "2.3.1",
4
4
  "author": {
5
5
  "name": "XuChang"
6
6
  },
@@ -27,7 +27,6 @@
27
27
  "@types/luxon": "^2.0.9",
28
28
  "@types/mocha": "^8.2.0",
29
29
  "@types/node": "^14.14.25",
30
- "@types/node-schedule": "^2.1.0",
31
30
  "@types/react": "^17.0.2",
32
31
  "@types/uuid": "^8.3.0",
33
32
  "@types/wechat-miniprogram": "^3.4.1",
@@ -41,6 +40,7 @@
41
40
  "typescript": "~4.7.4"
42
41
  },
43
42
  "dependencies": {
43
+ "@datasert/cronjs-matcher": "^1.2.0",
44
44
  "dayjs": "^1.11.5",
45
45
  "lodash": "^4.17.21",
46
46
  "uuid": "^9.0.0"