@drayman/core 2.9.0 → 3.0.0

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/dist/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.componentInstances = exports.onDestroyComponentInstance = exports.onDisconnect = exports.onInitializeComponentInstance = exports.saveComponent = exports.handleEventHubEvent = exports.onHandleBrowserCallback = exports.onUpdateComponentInstanceProps = exports.getElementsScriptPaths = exports.handleComponentEvent = void 0;
6
+ exports.onDestroyComponentInstance = exports.onDisconnect = exports.onInitializeComponentInstance = exports.saveComponent = exports.handleEventHubEvent = exports.onHandleBrowserCallback = exports.onUpdateComponentInstanceProps = exports.getElementsScriptPaths = exports.handleComponentEvent = exports.componentInstances = void 0;
7
7
  const fs_extra_1 = __importDefault(require("fs-extra"));
8
8
  const path_1 = __importDefault(require("path"));
9
9
  const shortid_1 = __importDefault(require("shortid"));
@@ -17,24 +17,169 @@ const getNpmPackages = (nodeModulesPath) => {
17
17
  });
18
18
  });
19
19
  };
20
- const handleComponentEvent = ({ componentInstanceId, eventName, options, files, onSuccess, onError }) => {
21
- options = options || {};
22
- if (typeof options === 'string') {
23
- options = JSON.parse(options);
20
+ const delay = (ms) => {
21
+ return new Promise(r => setTimeout(r, ms));
22
+ };
23
+ const toMB = (x) => {
24
+ return Math.round((x / 1048576) * 10) / 10;
25
+ };
26
+ const getPct = (num, den) => {
27
+ return Math.min(100, Math.round((den > 0 ? (num / den) : 0) * 100));
28
+ };
29
+ const withTimeout = async (p, ms) => {
30
+ return Promise.race([
31
+ p,
32
+ (async () => {
33
+ await delay(ms);
34
+ throw new Error(`Timed out after ${ms} ms`);
35
+ })()
36
+ ]);
37
+ };
38
+ const safeParse = (value) => {
39
+ if (typeof value !== 'string') {
40
+ return value;
41
+ }
42
+ try {
43
+ return JSON.parse(value);
44
+ }
45
+ catch {
46
+ return {};
47
+ }
48
+ };
49
+ const garbage = {
50
+ connections: new Set(),
51
+ componentInstances: new Map(),
52
+ };
53
+ const markConnectionGarbage = (connectionId) => {
54
+ garbage.connections.add(connectionId);
55
+ clearGarbage();
56
+ };
57
+ const markComponentGarbage = (componentInstanceId, opts = {}) => {
58
+ const prev = garbage.componentInstances.get(componentInstanceId) || {};
59
+ garbage.componentInstances.set(componentInstanceId, {
60
+ skipOnDestroy: Boolean(prev.skipOnDestroy || opts.skipOnDestroy),
61
+ });
62
+ clearGarbage();
63
+ };
64
+ const clearGarbage = () => {
65
+ const aliveIds = Object.keys(exports.componentInstances);
66
+ const fromConnections = new Map();
67
+ for (const id of aliveIds) {
68
+ const instance = exports.componentInstances[id];
69
+ if (instance && garbage.connections.has(instance.connectionId)) {
70
+ fromConnections.set(id, { skipOnDestroy: false });
71
+ }
72
+ }
73
+ const explicit = new Map(garbage.componentInstances);
74
+ const toTerminate = new Map();
75
+ for (const [id, opts] of fromConnections) {
76
+ toTerminate.set(id, { skipOnDestroy: Boolean(opts.skipOnDestroy) });
77
+ }
78
+ for (const [id, opts] of explicit) {
79
+ const prev = toTerminate.get(id) || { skipOnDestroy: false };
80
+ toTerminate.set(id, { skipOnDestroy: Boolean(prev.skipOnDestroy || opts.skipOnDestroy) });
81
+ }
82
+ for (const [id, opts] of toTerminate) {
83
+ const instance = exports.componentInstances[id];
84
+ if (!instance || instance.terminatingPromise) {
85
+ continue;
86
+ }
87
+ terminateComponentInstance(id, Boolean(opts.skipOnDestroy));
88
+ }
89
+ garbage.componentInstances.clear();
90
+ garbage.connections.clear();
91
+ };
92
+ async function terminateComponentInstance(componentInstanceId, skipOnDestroy = false) {
93
+ const instance = exports.componentInstances[componentInstanceId];
94
+ if (!instance) {
95
+ return;
24
96
  }
97
+ if (instance.terminatingPromise) {
98
+ return instance.terminatingPromise;
99
+ }
100
+ instance.terminatingPromise = (async () => {
101
+ for (const requestId of Object.keys(instance.eventRequests)) {
102
+ try {
103
+ instance.eventRequests[requestId].onError({ err: `Component instance was destroyed` });
104
+ }
105
+ catch { }
106
+ }
107
+ if (!skipOnDestroy) {
108
+ try {
109
+ await withTimeout(instance.worker.handleDestroyComponentInstance(), 3000);
110
+ }
111
+ catch (e) {
112
+ console.warn(`Handle destroy component instance failed for ${componentInstanceId} (${instance.component})`, e);
113
+ }
114
+ }
115
+ try {
116
+ await withTimeout(threads_1.Thread.terminate(instance.worker), 1000);
117
+ }
118
+ catch (e) {
119
+ console.warn(`Thread.terminate failed for ${componentInstanceId} (${instance.component})`, e);
120
+ }
121
+ try {
122
+ instance.eventsSub?.unsubscribe?.();
123
+ }
124
+ catch (e) {
125
+ console.warn(`Failed to unsubscribe events for ${componentInstanceId} (${instance.component})`, e);
126
+ }
127
+ delete exports.componentInstances[componentInstanceId];
128
+ try {
129
+ instance?.emit?.({
130
+ type: 'componentInstanceDestroyed',
131
+ payload: {},
132
+ componentInstanceId,
133
+ });
134
+ }
135
+ catch (e) {
136
+ console.warn(`Failed to emit componentInstanceDestroyed for ${componentInstanceId} (${instance.component})`, e);
137
+ }
138
+ })();
139
+ return instance.terminatingPromise;
140
+ }
141
+ setInterval(() => {
142
+ const now = Date.now();
143
+ for (const [id, instance] of Object.entries(exports.componentInstances)) {
144
+ if (!instance || instance.terminatingPromise) {
145
+ continue;
146
+ }
147
+ const limit = instance.heartbeatLimitMs;
148
+ if (now - instance.lastHeartbeat > limit) {
149
+ console.warn(`Heartbeat limit reached (${limit} ms) — stopping ${id} (${instance.component})`);
150
+ markComponentGarbage(id, { skipOnDestroy: true });
151
+ }
152
+ }
153
+ }, 1000);
154
+ exports.componentInstances = {};
155
+ const handleComponentEvent = ({ componentInstanceId, eventName, options, files, onSuccess, onError }) => {
156
+ options = safeParse(options);
25
157
  const requestId = shortid_1.default.generate();
26
- if (Object.keys(exports.componentInstances).includes(componentInstanceId)) {
27
- exports.componentInstances[componentInstanceId].eventRequests[requestId] = { onSuccess, onError };
28
- exports.componentInstances[componentInstanceId].worker.handleComponentEvent({ eventName, requestId, options, files, });
158
+ const instance = exports.componentInstances[componentInstanceId];
159
+ if (instance) {
160
+ instance.eventRequests[requestId] = { onSuccess, onError, canceled: false };
161
+ instance.worker.handleComponentEvent({ eventName, requestId, options, files });
29
162
  }
30
163
  else {
31
- onError({ err: `Component instance was not found.` });
164
+ onError({ err: 'Component instance was not found.' });
32
165
  }
33
166
  return {
34
167
  requestId,
35
168
  cancel: () => {
36
- if (Object.keys(exports.componentInstances).includes(componentInstanceId)) {
37
- exports.componentInstances[componentInstanceId].worker.cancelComponentEvent({ requestId, });
169
+ const current = exports.componentInstances[componentInstanceId];
170
+ if (!current) {
171
+ return;
172
+ }
173
+ const req = current.eventRequests[requestId];
174
+ if (!req) {
175
+ return;
176
+ }
177
+ req.canceled = true;
178
+ try {
179
+ current.worker.cancelComponentEvent({ requestId });
180
+ }
181
+ catch {
182
+ console.warn(`Failed to cancel component event ${eventName} (${requestId}) for ${componentInstanceId} (${instance.component})`);
38
183
  }
39
184
  }
40
185
  };
@@ -55,23 +200,44 @@ async function getElementsScriptPaths({ nodeModulesPath = null }) {
55
200
  return paths;
56
201
  }
57
202
  exports.getElementsScriptPaths = getElementsScriptPaths;
58
- const onUpdateComponentInstanceProps = ({ componentInstanceId, options, }) => {
59
- if (typeof options === 'string') {
60
- options = JSON.parse(options);
203
+ const onUpdateComponentInstanceProps = ({ componentInstanceId, options }) => {
204
+ options = safeParse(options);
205
+ const instance = exports.componentInstances[componentInstanceId];
206
+ if (!instance || instance.terminatingPromise) {
207
+ return;
208
+ }
209
+ try {
210
+ instance.worker.updateComponentInstanceProps({ options });
211
+ }
212
+ catch {
213
+ console.warn(`Failed to update props for component instance ${componentInstanceId} (${instance.component})`);
61
214
  }
62
- exports.componentInstances[componentInstanceId].worker.updateComponentInstanceProps({ options, });
63
215
  };
64
216
  exports.onUpdateComponentInstanceProps = onUpdateComponentInstanceProps;
65
- const onHandleBrowserCallback = ({ callbackId, data, }) => {
66
- for (const key of Object.keys(exports.componentInstances)) {
67
- exports.componentInstances[key].worker.handleBrowserCallback({ callbackId, data, });
217
+ const onHandleBrowserCallback = ({ callbackId, data }) => {
218
+ for (const [componentInstanceId, instance] of Object.entries(exports.componentInstances)) {
219
+ if (!instance || instance.terminatingPromise) {
220
+ continue;
221
+ }
222
+ try {
223
+ instance.worker.handleBrowserCallback({ callbackId, data });
224
+ }
225
+ catch {
226
+ console.warn(`Failed to handle browser callback ${callbackId} for component instance ${componentInstanceId} (${instance.component})`);
227
+ }
68
228
  }
69
229
  };
70
230
  exports.onHandleBrowserCallback = onHandleBrowserCallback;
71
231
  const handleEventHubEvent = async ({ data, groupId = null, type, namespaceId = null }) => {
72
- for (const key of Object.keys(exports.componentInstances)) {
73
- if (exports.componentInstances[key].namespaceId === namespaceId) {
74
- exports.componentInstances[key].worker.handleEventHubEvent({ type, data, groupId });
232
+ for (const [componentInstanceId, instance] of Object.entries(exports.componentInstances)) {
233
+ if (!instance || instance.terminatingPromise || instance.namespaceId !== namespaceId) {
234
+ continue;
235
+ }
236
+ try {
237
+ instance.worker.handleEventHubEvent({ type, data, groupId });
238
+ }
239
+ catch {
240
+ console.warn(`Failed to handle event hub event ${type} for component instance ${componentInstanceId} (${instance.component})`);
75
241
  }
76
242
  }
77
243
  };
@@ -89,21 +255,31 @@ const saveComponent = async ({ script, outputFile, scriptPath }) => {
89
255
  await fs_extra_1.default.outputFile(outputFile, transpiledComponentScript.outputText);
90
256
  };
91
257
  exports.saveComponent = saveComponent;
92
- const onInitializeComponentInstance = async ({ namespaceId = null, extensionsPath = null, extensionsOptions = null, componentNamePrefix = '', componentName, componentRootDir, componentInstanceId, componentOptions, connectionId, emit, onComponentInstanceConsole, browserCommands, serverCommands, onEventHubEvent = null, }) => {
93
- if (componentOptions && typeof componentOptions === 'string') {
94
- componentOptions = JSON.parse(componentOptions);
95
- }
96
- const worker = await threads_1.spawn(new threads_1.Worker(`./component-processor.js`));
258
+ const onInitializeComponentInstance = async ({ namespaceId = null, extensionsPath = null, extensionsOptions = null, componentNamePrefix = '', componentName, componentRootDir, componentInstanceId, componentOptions, connectionId, emit, onComponentInstanceConsole, browserCommands, serverCommands, onEventHubEvent = null, heapLimit = 512, externalLimit = 512, heartbeatLimitMs = 3 * 1000, meta = null, }) => {
259
+ componentOptions = safeParse(componentOptions);
260
+ const internalWorker = new threads_1.Worker(`./component-processor.js`, {
261
+ resourceLimits: {
262
+ maxOldGenerationSizeMb: heapLimit,
263
+ }
264
+ });
265
+ internalWorker.addEventListener('error', (err) => {
266
+ markComponentGarbage(componentInstanceId, { skipOnDestroy: true });
267
+ });
268
+ const worker = await threads_1.spawn(internalWorker);
97
269
  exports.componentInstances[componentInstanceId] = {
270
+ heartbeatLimitMs,
271
+ heapLimit,
272
+ externalLimit,
273
+ componentName,
98
274
  worker,
99
- terminate: async () => {
100
- for (const requestId of Object.keys(exports.componentInstances[componentInstanceId].eventRequests)) {
101
- exports.componentInstances[componentInstanceId].eventRequests[requestId].onError({ err: `Component instance was destroyed.` });
102
- }
103
- delete exports.componentInstances[componentInstanceId];
104
- await threads_1.Thread.terminate(worker);
105
- emit({ type: 'componentInstanceDestroyed', payload: {}, componentInstanceId });
106
- },
275
+ emit,
276
+ lastHeartbeat: Date.now(),
277
+ heapUsed: 0,
278
+ externalUsed: 0,
279
+ terminatingPromise: null,
280
+ component: `${componentNamePrefix}${componentName}`,
281
+ startDate: new Date(),
282
+ meta,
107
283
  /**
108
284
  * Used to store user event requests (on button click, on input, etc.).
109
285
  */
@@ -111,68 +287,98 @@ const onInitializeComponentInstance = async ({ namespaceId = null, extensionsPat
111
287
  connectionId,
112
288
  namespaceId,
113
289
  };
114
- worker.events().subscribe(({ type, payload }) => {
115
- /**
116
- * When there is a response to user event request.
117
- */
118
- if (type === 'response') {
119
- const { requestId, result, err } = payload;
120
- if (err) {
121
- exports.componentInstances[componentInstanceId].eventRequests[requestId].onError({ err });
290
+ const subscription = worker.events().subscribe({
291
+ next: ({ type, payload }) => {
292
+ /**
293
+ * When there is a response to user event request.
294
+ */
295
+ if (type === 'response') {
296
+ const { requestId, result, err } = payload;
297
+ const req = exports.componentInstances[componentInstanceId]?.eventRequests?.[requestId];
298
+ if (req) {
299
+ try {
300
+ if (!req.canceled) {
301
+ err ? req.onError({ err }) : req.onSuccess({ result });
302
+ }
303
+ }
304
+ catch {
305
+ console.warn(`Failed to process response for request ${requestId} in component instance ${componentInstanceId} (${exports.componentInstances[componentInstanceId].component})`);
306
+ }
307
+ finally {
308
+ delete exports.componentInstances[componentInstanceId].eventRequests[requestId];
309
+ }
310
+ }
311
+ return;
312
+ }
313
+ else if (type === 'eventHubEvent') {
314
+ const { eventPayload, groupId, type: eventType } = payload;
315
+ exports.handleEventHubEvent({ data: eventPayload, groupId, type: eventType, namespaceId });
316
+ onEventHubEvent?.({ data: eventPayload, groupId, type: eventType, namespaceId });
317
+ }
318
+ else if (type === 'console') {
319
+ const { text } = payload;
320
+ onComponentInstanceConsole?.({ text });
321
+ }
322
+ else if (type === 'heartbeat') {
323
+ const instance = exports.componentInstances[componentInstanceId];
324
+ if (!instance || instance.terminatingPromise) {
325
+ return;
326
+ }
327
+ const { heapStatistics } = payload;
328
+ const heapUsedMB = toMB(heapStatistics.used_heap_size);
329
+ const extUsedMB = toMB(heapStatistics.external_memory);
330
+ const heapExceeded = heapUsedMB >= instance.heapLimit;
331
+ const extExceeded = extUsedMB >= instance.externalLimit;
332
+ instance.heapUsed = heapUsedMB;
333
+ instance.externalUsed = extUsedMB;
334
+ instance.lastHeartbeat = Date.now();
335
+ if (heapExceeded || extExceeded) {
336
+ console.warn(`Memory limit exceeded (heap: ${heapExceeded} ${heapUsedMB}/${instance.heapLimit}, external: ${extExceeded} ${extUsedMB}/${instance.externalLimit}) — stopping ${componentInstanceId} (${instance.component})`);
337
+ markComponentGarbage(componentInstanceId, { skipOnDestroy: true });
338
+ }
122
339
  }
123
340
  else {
124
- exports.componentInstances[componentInstanceId].eventRequests[requestId].onSuccess({ result });
341
+ try {
342
+ emit({ type, payload, componentInstanceId });
343
+ }
344
+ catch (e) {
345
+ console.warn(`Failed to emit event ${type} for ${componentInstanceId} (${exports.componentInstances[componentInstanceId].component})`, e);
346
+ }
125
347
  }
126
- delete exports.componentInstances[componentInstanceId].eventRequests[requestId];
127
- }
128
- else if (type === 'eventHubEvent') {
129
- const { eventPayload, groupId, type } = payload;
130
- exports.handleEventHubEvent({ data: eventPayload, groupId, type, namespaceId });
131
- onEventHubEvent?.({ data: eventPayload, groupId, type, namespaceId });
132
- }
133
- else if (type === 'console') {
134
- const { text } = payload;
135
- onComponentInstanceConsole?.({ text });
136
- }
137
- else {
138
- emit({ type, payload, componentInstanceId });
139
- }
348
+ },
349
+ error: (err) => {
350
+ markComponentGarbage(componentInstanceId, { skipOnDestroy: true });
351
+ },
352
+ complete: () => {
353
+ markComponentGarbage(componentInstanceId, { skipOnDestroy: true });
354
+ },
140
355
  });
141
- worker.initializeComponentInstance({ browserCommands, serverCommands, componentNamePrefix, componentName, componentRootDir, componentOptions, componentInstanceId, extensionsPath, extensionsOptions });
142
- await clearGarbage();
356
+ exports.componentInstances[componentInstanceId].eventsSub = subscription;
357
+ try {
358
+ worker.initializeComponentInstance({
359
+ browserCommands,
360
+ serverCommands,
361
+ componentNamePrefix,
362
+ componentName,
363
+ componentRootDir,
364
+ componentOptions,
365
+ componentInstanceId,
366
+ extensionsPath,
367
+ extensionsOptions,
368
+ });
369
+ }
370
+ catch {
371
+ markComponentGarbage(componentInstanceId, { skipOnDestroy: true });
372
+ }
373
+ clearGarbage();
143
374
  };
144
375
  exports.onInitializeComponentInstance = onInitializeComponentInstance;
145
376
  const onDisconnect = async ({ connectionId }) => {
146
- garbage.connections.push(connectionId);
147
- await clearGarbage();
377
+ markConnectionGarbage(connectionId);
148
378
  };
149
379
  exports.onDisconnect = onDisconnect;
150
- const garbage = {
151
- connections: [],
152
- componentInstances: [],
153
- };
154
380
  const onDestroyComponentInstance = async ({ componentInstanceId }) => {
155
- garbage.componentInstances.push(componentInstanceId);
156
- await clearGarbage();
381
+ markComponentGarbage(componentInstanceId, { skipOnDestroy: false });
157
382
  };
158
383
  exports.onDestroyComponentInstance = onDestroyComponentInstance;
159
- exports.componentInstances = {};
160
- const clearGarbage = async () => {
161
- const aliveComponentInstances = Object.keys(exports.componentInstances);
162
- const garbageComponentInstanceIds = [
163
- ...aliveComponentInstances.filter(x => garbage.connections.includes(exports.componentInstances[x].connectionId)),
164
- ...garbage.componentInstances,
165
- ];
166
- for (const componentInstanceId of garbageComponentInstanceIds) {
167
- if (exports.componentInstances[componentInstanceId]) {
168
- try {
169
- await exports.componentInstances[componentInstanceId].worker.handleDestroyComponentInstance();
170
- }
171
- catch (err) {
172
- console.warn(err);
173
- }
174
- exports.componentInstances[componentInstanceId].terminate();
175
- }
176
- }
177
- };
178
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQTBCO0FBQzFCLGdEQUF3QjtBQUN4QixzREFBOEI7QUFDOUIsNERBQTRCO0FBQzVCLHFDQUFnRDtBQUNoRCxpREFBcUM7QUFFckMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRTtJQUN2QyxPQUFPLElBQUksT0FBTyxDQUFXLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDckMsb0JBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsZUFBZSxHQUFHLEVBQUUsVUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07WUFDM0UsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxjQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUE7QUFFTSxNQUFNLG9CQUFvQixHQUFHLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRTtJQUMzRyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUN4QixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNqQztJQUNELE1BQU0sU0FBUyxHQUFHLGlCQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDckMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUFrQixDQUFD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
384
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0RBQTBCO0FBQzFCLGdEQUF3QjtBQUN4QixzREFBOEI7QUFDOUIsNERBQTRCO0FBQzVCLHFDQUFnRDtBQUNoRCxpREFBcUM7QUErQnJDLE1BQU0sY0FBYyxHQUFHLENBQUMsZUFBZSxFQUFFLEVBQUU7SUFDdkMsT0FBTyxJQUFJLE9BQU8sQ0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3JDLG9CQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsR0FBRyxFQUFFLGVBQWUsR0FBRyxFQUFFLFVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQzNFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFBO0FBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFVLEVBQUUsRUFBRTtJQUN6QixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUMsQ0FBQztBQUVGLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBUyxFQUFFLEVBQUU7SUFDdkIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMvQyxDQUFDLENBQUE7QUFFRCxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQVcsRUFBRSxH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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drayman/core",
3
- "version": "2.9.0",
3
+ "version": "3.0.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -22,8 +22,9 @@
22
22
  "@babel/preset-env": "^7.13.15",
23
23
  "@babel/preset-react": "^7.13.13",
24
24
  "@babel/preset-typescript": "^7.13.0",
25
- "@drayman/types": "^2.9.0",
25
+ "@drayman/types": "^3.0.0",
26
26
  "@types/jest": "^26.0.22",
27
+ "@types/lodash": "^4.17.0",
27
28
  "@types/node": "^14.14.39",
28
29
  "babel-jest": "^26.6.3",
29
30
  "jest": "^26.6.3"
@@ -33,6 +34,7 @@
33
34
  "consola": "^2.15.3",
34
35
  "fast-json-patch": "^3.0.0-1",
35
36
  "fs-extra": "^9.1.0",
37
+ "lodash": "^4.17.21",
36
38
  "node-find": "^0.7.2",
37
39
  "shortid": "^2.2.16",
38
40
  "source-map-support": "^0.5.21",
@@ -40,5 +42,5 @@
40
42
  "ts-node": "^9.1.1",
41
43
  "typescript": "~4.1.5"
42
44
  },
43
- "gitHead": "df1629bc8a46ac3ca17d9ff94eba5134c6c46ed1"
45
+ "gitHead": "381df692bc47e7ae87ec30c332ace3a7cfe1096d"
44
46
  }