@axiosleo/orm-mysql 0.5.6 → 0.6.2

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.
package/index.d.ts CHANGED
@@ -48,7 +48,7 @@ export interface TableOption {
48
48
  alias: string | null;
49
49
  }
50
50
 
51
- export interface QueryOperatorOptions {
51
+ export type QueryOperatorOptions = {
52
52
  conditions: WhereOptions[];
53
53
  attrs?: string[] | null;
54
54
  orders: OrderByOptions[];
@@ -199,13 +199,43 @@ export function createPool(options: PoolOptions, name?: string | null | undefine
199
199
  export function createPromiseClient(options: ConnectionOptions, name?: string | null | undefined): PromiseConnection;
200
200
 
201
201
  export declare class Hook {
202
+ /**
203
+ * pre hook for query operator
204
+ */
202
205
  static pre: (
203
206
  callback: (options: QueryOperatorOptions) => void,
204
207
  option: { table?: string, opt?: OperatorType }
205
208
  ) => string;
206
209
 
210
+ /**
211
+ * post hook for query operator
212
+ */
207
213
  static post: (
208
214
  callback: (options: QueryOperatorOptions, result: QueryResult | Error) => void,
209
215
  option: { table?: string, opt?: OperatorType }
210
216
  ) => string;
217
+
218
+ /**
219
+ * register hook
220
+ */
221
+ static register: (
222
+ callback: (options: QueryOperatorOptions) => void,
223
+ ...paths: string[]
224
+ ) => void;
225
+
226
+ /**
227
+ * listen event
228
+ */
229
+ static listen: (
230
+ options?: QueryOperatorOptions & { label?: string },
231
+ ...args: any[]
232
+ ) => void;
233
+
234
+ /**
235
+ * trigger event
236
+ */
237
+ static trigger: (
238
+ paths: string[],
239
+ ...args: any[]
240
+ ) => void
211
241
  }
package/index.js CHANGED
@@ -18,7 +18,7 @@ const {
18
18
  createPromiseClient
19
19
  } = require('./src/client');
20
20
 
21
- const { Hook } = require('./src/hook');
21
+ const Hook = require('./src/hook');
22
22
 
23
23
  module.exports = {
24
24
  Hook,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axiosleo/orm-mysql",
3
- "version": "0.5.6",
3
+ "version": "0.6.2",
4
4
  "description": "MySQL ORM tool",
5
5
  "keywords": [
6
6
  "mysql",
package/src/hook.js CHANGED
@@ -2,25 +2,35 @@
2
2
 
3
3
  const EventEmitter = require('events');
4
4
 
5
- const events = {}; // event tree
5
+ const events = new Map(); // event tree
6
6
  const hook = new EventEmitter();
7
7
 
8
- const pushEvent = ({ label, table, opt, callback }) => {
9
- label = label || '*';
10
- if (!events[label]) {
11
- events[label] = {};
12
- }
13
- table = table || '*';
14
- if (!events[label][table]) {
15
- events[label][table] = {};
16
- }
17
- opt = opt || '*';
18
- if (!events[label][table][opt]) {
19
- events[label][table][opt] = 0;
8
+ const push = (callback, trace = []) => {
9
+ let step = 0;
10
+ let curr = events;
11
+ let event_name_items = [];
12
+ while (step < trace.length) {
13
+ let curr_key = trace[step] || '*';
14
+ if (curr_key === '__proto__' || curr_key === 'constructor' || curr_key === 'prototype') {
15
+ curr_key = '*';
16
+ }
17
+ event_name_items.push(curr_key);
18
+ if (!curr.has(curr_key)) {
19
+ curr.set(curr_key, new Map());
20
+ }
21
+ curr = curr.get(curr_key);
22
+ step++;
20
23
  }
21
- events[label][table][opt]++;
22
- hook.on(`${label}::${table}::${opt}`, callback);
23
- return { label, table, opt, callback };
24
+ let event_name = event_name_items.join('::');
25
+ hook.on(event_name, callback);
26
+ return event_name;
27
+ };
28
+
29
+ const pushEvent = (options = {}) => {
30
+ const { label, table, opt, callback } = options;
31
+ const trace = [label, table, opt];
32
+ const event_name = push(callback, trace);
33
+ return { event_name, label, table, opt, callback };
24
34
  };
25
35
 
26
36
  const eventRecur = (curr, trace, step, paths, args) => {
@@ -40,28 +50,36 @@ const eventRecur = (curr, trace, step, paths, args) => {
40
50
  return;
41
51
  };
42
52
 
43
- const handleEvent = (label, table, opt, ...args) => {
44
- let curr = events;
45
- let step = 0;
46
- let trace = [label, table, opt];
47
- eventRecur(curr, trace, step, [], args);
48
- };
49
-
50
53
  class Hook {
51
- static pre(callback, { table, opt }) {
54
+ static pre(callback, options = {}) {
55
+ const { table, opt } = options;
52
56
  return pushEvent({
53
57
  label: 'pre', table, opt, callback
54
58
  });
55
59
  }
56
60
 
57
- static post(callback, { table, opt }) {
61
+ static post(callback, options = {}) {
62
+ const { table, opt } = options;
58
63
  return pushEvent({
59
64
  label: 'post', table, opt, callback
60
65
  });
61
66
  }
67
+
68
+ static register(callback, ...paths) {
69
+ push(callback, paths);
70
+ }
71
+
72
+ static listen(options = {}, ...args) {
73
+ const { label, table, opt } = options;
74
+ Hook.trigger([label, table, opt], ...args);
75
+ }
76
+
77
+ static trigger(paths = [], ...args) {
78
+ let curr = events;
79
+ let step = 0;
80
+ let trace = paths;
81
+ eventRecur(curr, trace, step, [], args);
82
+ }
62
83
  }
63
84
 
64
- module.exports = {
65
- Hook,
66
- handleEvent
67
- };
85
+ module.exports = Hook;
package/src/operator.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  const { Builder } = require('./builder');
4
4
  const Query = require('./query');
5
- const { handleEvent } = require('./hook');
5
+ const Hook = require('./hook');
6
6
 
7
7
  const query = async (conn, options, transaction) => {
8
8
  return new Promise((resolve, reject) => {
@@ -49,7 +49,7 @@ class QueryOperator extends Query {
49
49
  sql, values
50
50
  };
51
51
  const from = this.options.tables.map(t => t.tableName).join(',');
52
- handleEvent('pre', from, this.options.operator, this.options);
52
+ Hook.listen({ label: 'pre', table: from, opt: this.options.operator }, this.options);
53
53
  let res;
54
54
  try {
55
55
  switch (this.options.operator) {
@@ -66,9 +66,9 @@ class QueryOperator extends Query {
66
66
  default:
67
67
  res = await query(this.conn, options, this.options.transaction);
68
68
  }
69
- handleEvent('post', from, this.options.operator, this.options, res);
69
+ Hook.listen({ label: 'post', table: from, opt: this.options.operator }, this.options, res);
70
70
  } catch (err) {
71
- handleEvent('post', from, this.options.operator, this.options, err);
71
+ Hook.listen({ label: 'post', table: from, opt: this.options.operator }, this.options, err);
72
72
  throw err;
73
73
  }
74
74
  return res;