@zajno/common 1.5.4 → 1.5.7
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/coverage/clover.xml +451 -366
- package/coverage/coverage-final.json +38 -37
- package/coverage/lcov-report/async/index.html +12 -7
- package/coverage/lcov-report/async/timeout.ts.html +24 -19
- package/coverage/lcov-report/block-navigation.js +8 -0
- package/coverage/lcov-report/disposer.ts.html +376 -0
- package/coverage/lcov-report/enumHelper.ts.html +454 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +59 -39
- package/coverage/lcov-report/logger/index.html +116 -0
- package/coverage/lcov-report/logger/index.ts.html +298 -0
- package/coverage/lcov-report/parallel.ts.html +388 -0
- package/coverage/lcov-report/queue/index.html +116 -0
- package/coverage/lcov-report/queue/parallel.ts.html +409 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +26 -0
- package/coverage/lcov-report/src/__tests__/helpers/index.html +8 -3
- package/coverage/lcov-report/src/__tests__/helpers/main.ts.html +8 -3
- package/coverage/lcov-report/src/async/arrays.ts.html +15 -10
- package/coverage/lcov-report/src/async/index.html +13 -8
- package/coverage/lcov-report/src/async/timeout.ts.html +24 -19
- package/coverage/lcov-report/src/cache.ts.html +15 -10
- package/coverage/lcov-report/src/dates/calc.ts.html +10 -5
- package/coverage/lcov-report/src/dates/convert.ts.html +9 -4
- package/coverage/lcov-report/src/dates/datex.ts.html +8 -3
- package/coverage/lcov-report/src/dates/format.ts.html +10 -5
- package/coverage/lcov-report/src/dates/index.html +19 -14
- package/coverage/lcov-report/src/dates/index.ts.html +8 -3
- package/coverage/lcov-report/src/dates/parse.ts.html +9 -4
- package/coverage/lcov-report/src/dates/period.ts.html +8 -3
- package/coverage/lcov-report/src/dates/shift.ts.html +9 -4
- package/coverage/lcov-report/src/dates/types.ts.html +8 -3
- package/coverage/lcov-report/src/dates/yearDate.ts.html +10 -5
- package/coverage/lcov-report/src/disposer.ts.html +65 -21
- package/coverage/lcov-report/src/enumHelper.ts.html +12 -7
- package/coverage/lcov-report/src/event.ts.html +50 -21
- package/coverage/lcov-report/src/fields/index.html +21 -16
- package/coverage/lcov-report/src/fields/update.ts.html +49 -23
- package/coverage/lcov-report/src/functions.ts.html +10 -5
- package/coverage/lcov-report/src/index.html +52 -47
- package/coverage/lcov-report/src/lazy.light.ts.html +9 -4
- package/coverage/lcov-report/src/logger/batch.ts.html +9 -4
- package/coverage/lcov-report/src/logger/console.ts.html +16 -11
- package/coverage/lcov-report/src/logger/index.html +13 -8
- package/coverage/lcov-report/src/logger/index.ts.html +38 -33
- package/coverage/lcov-report/src/logger/named.ts.html +26 -21
- package/coverage/lcov-report/src/logger/proxy.ts.html +20 -15
- package/coverage/lcov-report/src/math/arrays.ts.html +33 -28
- package/coverage/lcov-report/src/math/calc.ts.html +18 -13
- package/coverage/lcov-report/src/math/distribution.ts.html +10 -5
- package/coverage/lcov-report/src/math/index.html +16 -11
- package/coverage/lcov-report/src/math/index.ts.html +14 -9
- package/coverage/lcov-report/src/observersMap.ts.html +12 -7
- package/coverage/lcov-report/src/observingCache.ts.html +12 -7
- package/coverage/lcov-report/src/queue/index.html +116 -0
- package/coverage/lcov-report/src/queue/parallel.ts.html +499 -0
- package/coverage/lcov-report/src/tempoCache.ts.html +9 -4
- package/coverage/lcov-report/src/transitionObserver.ts.html +14 -9
- package/coverage/lcov-report/src/types.ts.html +13 -8
- package/coverage/lcov-report/src/validation/ValidationErrors.ts.html +8 -3
- package/coverage/lcov-report/src/validation/creditCard.ts.html +8 -3
- package/coverage/lcov-report/src/validation/helpers.ts.html +13 -8
- package/coverage/lcov-report/src/validation/index.html +11 -6
- package/coverage/lcov-report/src/validation/index.ts.html +8 -3
- package/coverage/lcov-report/src/validation/types.ts.html +8 -3
- package/coverage/lcov-report/src/validation/validators.ts.html +10 -5
- package/coverage/lcov-report/src/validation/wrappers.ts.html +8 -3
- package/coverage/lcov-report/src/viewModels/CommonModel.ts.html +10 -5
- package/coverage/lcov-report/src/viewModels/FlagModel.ts.html +8 -3
- package/coverage/lcov-report/src/viewModels/LoadingModel.ts.html +10 -5
- package/coverage/lcov-report/src/viewModels/MultiSelectModel.ts.html +13 -8
- package/coverage/lcov-report/src/viewModels/NumberModel.ts.html +8 -3
- package/coverage/lcov-report/src/viewModels/SelectModel.ts.html +10 -5
- package/coverage/lcov-report/src/viewModels/TextModel.ts.html +13 -8
- package/coverage/lcov-report/src/viewModels/Validatable.ts.html +12 -7
- package/coverage/lcov-report/src/viewModels/index.html +22 -17
- package/coverage/lcov-report/src/viewModels/wrappers.ts.html +8 -3
- package/coverage/lcov.info +598 -556
- package/lib/async/arrays.extend.js +4 -4
- package/lib/async/arrays.extend.js.map +1 -1
- package/lib/cache.js +6 -6
- package/lib/cache.js.map +1 -1
- package/lib/dates/calc.js +7 -7
- package/lib/dates/calc.js.map +1 -1
- package/lib/dates/convert.js +11 -11
- package/lib/dates/convert.js.map +1 -1
- package/lib/dates/format.js +6 -6
- package/lib/dates/format.js.map +1 -1
- package/lib/dates/period.js +2 -2
- package/lib/dates/period.js.map +1 -1
- package/lib/dates/shift.js +5 -5
- package/lib/dates/shift.js.map +1 -1
- package/lib/dates/yearDate.js +2 -2
- package/lib/dates/yearDate.js.map +1 -1
- package/lib/disposer.d.ts +4 -2
- package/lib/disposer.d.ts.map +1 -1
- package/lib/disposer.js +10 -5
- package/lib/disposer.js.map +1 -1
- package/lib/enumHelper.d.ts +2 -2
- package/lib/enumHelper.d.ts.map +1 -1
- package/lib/enumHelper.js.map +1 -1
- package/lib/event.d.ts.map +1 -1
- package/lib/event.js +8 -2
- package/lib/event.js.map +1 -1
- package/lib/fields/update.d.ts +5 -4
- package/lib/fields/update.d.ts.map +1 -1
- package/lib/fields/update.js +13 -7
- package/lib/fields/update.js.map +1 -1
- package/lib/lazy.js +2 -2
- package/lib/lazy.js.map +1 -1
- package/lib/logger/file.js.map +1 -1
- package/lib/logger/index.d.ts +1 -1
- package/lib/logger/index.d.ts.map +1 -1
- package/lib/logger/index.js +1 -1
- package/lib/logger/index.js.map +1 -1
- package/lib/math/arrays.js +2 -2
- package/lib/math/arrays.js.map +1 -1
- package/lib/models/EntityWithStatus.js.map +1 -1
- package/lib/observersMap.js +2 -2
- package/lib/observersMap.js.map +1 -1
- package/lib/observingCache.js +1 -1
- package/lib/observingCache.js.map +1 -1
- package/lib/pool.js +1 -1
- package/lib/pool.js.map +1 -1
- package/lib/queue/parallel.d.ts +22 -0
- package/lib/queue/parallel.d.ts.map +1 -0
- package/lib/queue/parallel.js +117 -0
- package/lib/queue/parallel.js.map +1 -0
- package/lib/services/localization/LocalizationManager.js +1 -1
- package/lib/services/localization/LocalizationManager.js.map +1 -1
- package/lib/services/storage/web/localStorage.js +1 -1
- package/lib/services/storage/web/localStorage.js.map +1 -1
- package/lib/services/storage/web/sessionStorage.js +1 -1
- package/lib/services/storage/web/sessionStorage.js.map +1 -1
- package/lib/transitionObserver.js +3 -3
- package/lib/transitionObserver.js.map +1 -1
- package/lib/validation/validators.js +1 -1
- package/lib/validation/validators.js.map +1 -1
- package/lib/validation/wrappers.js +1 -1
- package/lib/validation/wrappers.js.map +1 -1
- package/lib/viewModels/CommonModel.js +1 -1
- package/lib/viewModels/CommonModel.js.map +1 -1
- package/lib/viewModels/FlagModel.js +1 -1
- package/lib/viewModels/FlagModel.js.map +1 -1
- package/lib/viewModels/MultiSelectModel.js +5 -5
- package/lib/viewModels/MultiSelectModel.js.map +1 -1
- package/lib/viewModels/NumberModel.js +1 -1
- package/lib/viewModels/NumberModel.js.map +1 -1
- package/lib/viewModels/PromptModal.js +1 -1
- package/lib/viewModels/PromptModal.js.map +1 -1
- package/lib/viewModels/SelectModel.js +4 -4
- package/lib/viewModels/SelectModel.js.map +1 -1
- package/lib/viewModels/TextModel.js +3 -3
- package/lib/viewModels/TextModel.js.map +1 -1
- package/lib/viewModels/Validatable.js +3 -3
- package/lib/viewModels/Validatable.js.map +1 -1
- package/lib/viewModels/ValueModel.js +1 -1
- package/lib/viewModels/ValueModel.js.map +1 -1
- package/package.json +10 -11
- package/src/.DS_Store +0 -0
- package/src/disposer.ts +19 -6
- package/src/enumHelper.ts +2 -2
- package/src/event.ts +8 -0
- package/src/fields/update.ts +18 -11
- package/src/queue/__tests__/parallel.test.ts +57 -0
- package/src/queue/parallel.ts +138 -0
- package/src/services/storage/web/localStorage.ts +1 -1
- package/src/services/storage/web/sessionStorage.ts +1 -1
- package/src/validation/__tests__/validator.test.ts +12 -0
- package/src/validation/validators.ts +1 -1
- package/yarn.lock +1066 -1441
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { createLogger, ILogger } from '../logger';
|
|
2
|
+
import { Event } from '../event';
|
|
3
|
+
|
|
4
|
+
export type QueueItem = () => void | Promise<void>;
|
|
5
|
+
|
|
6
|
+
type Queue = QueueItem[];
|
|
7
|
+
|
|
8
|
+
export class ParallelQueue {
|
|
9
|
+
|
|
10
|
+
private readonly _queues: Record<number, Queue> = { };
|
|
11
|
+
|
|
12
|
+
private _inProgress: boolean = null;
|
|
13
|
+
private _currentIndex = 0;
|
|
14
|
+
private _maxIndex = 0;
|
|
15
|
+
|
|
16
|
+
private _logger: ILogger = null;
|
|
17
|
+
|
|
18
|
+
private readonly _beforePriorityRun = new Event<number>();
|
|
19
|
+
private readonly _afterPriorityRun = new Event<number>();
|
|
20
|
+
|
|
21
|
+
public get currentoPriority() { return this._currentIndex; }
|
|
22
|
+
public get inProgress() { return this._inProgress; }
|
|
23
|
+
|
|
24
|
+
public get beforePriorityRun() { return this._beforePriorityRun.expose(); }
|
|
25
|
+
public get afterPriorityRun() { return this._afterPriorityRun.expose(); }
|
|
26
|
+
|
|
27
|
+
public withLogger(name?: string) {
|
|
28
|
+
this._logger = createLogger(`[Queue:${name || '?'}]`);
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** @returns A callback that will try to cancel queued item */
|
|
33
|
+
public enqueue(cb: QueueItem, priority?: number): () => void {
|
|
34
|
+
const p = Math.round(priority || 0);
|
|
35
|
+
|
|
36
|
+
// if it's started and the priority has been processing already
|
|
37
|
+
// or it has just finished
|
|
38
|
+
if (this._inProgress && p <= this._currentIndex || this._inProgress === false) {
|
|
39
|
+
// just start the loader
|
|
40
|
+
this._executeLoader(cb, p, 1000);
|
|
41
|
+
return () => false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Enqueue for future execution
|
|
45
|
+
const q = this.getQueue(p);
|
|
46
|
+
q.push(cb);
|
|
47
|
+
this._maxIndex = Math.max(this._maxIndex, p);
|
|
48
|
+
|
|
49
|
+
// Return callback for removing the item from the queue
|
|
50
|
+
return () => {
|
|
51
|
+
// The processing has started and this queue has been passed already
|
|
52
|
+
if (this._inProgress != null && this._currentIndex >= p) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// find and remove the item
|
|
57
|
+
const i = q.findIndex(qi => qi === cb);
|
|
58
|
+
if (i >= 0) {
|
|
59
|
+
q.splice(i, 1);
|
|
60
|
+
// return true if we're sure that the item hasn't been executed yet
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public async start() {
|
|
68
|
+
if (this._inProgress) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
this._inProgress = true;
|
|
73
|
+
try {
|
|
74
|
+
await this.tryStartQueue();
|
|
75
|
+
} catch (err) {
|
|
76
|
+
this._logger?.warn('Failed to process queue:', err);
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private getQueue(priority: number = 0) {
|
|
84
|
+
let q = this._queues[priority];
|
|
85
|
+
if (!q) {
|
|
86
|
+
q = [];
|
|
87
|
+
this._queues[priority] = q;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return q;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private async tryStartQueue() {
|
|
94
|
+
let current: QueueItem[] = null;
|
|
95
|
+
let iterations = 0;
|
|
96
|
+
|
|
97
|
+
await this._beforePriorityRun.triggerAsync(this._currentIndex);
|
|
98
|
+
|
|
99
|
+
while ((current = this._queues[this._currentIndex])?.length) {
|
|
100
|
+
if (iterations++ > 5) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
this._logger?.log('Processing priority =', this._currentIndex, '; count =', current.length);
|
|
105
|
+
|
|
106
|
+
const items = current.slice();
|
|
107
|
+
current.length = 0;
|
|
108
|
+
|
|
109
|
+
await Promise.all(items.map((loader, index) => this._executeLoader(loader, this._currentIndex, index)));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (!current?.length && iterations === 0) {
|
|
113
|
+
this._logger?.log('Skipping priority =', this._currentIndex, '; no items');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
await this._afterPriorityRun.triggerAsync(this._currentIndex);
|
|
117
|
+
|
|
118
|
+
const next = this._currentIndex + 1;
|
|
119
|
+
if (next > this._maxIndex) {
|
|
120
|
+
// looks like we've finished!
|
|
121
|
+
this._inProgress = false;
|
|
122
|
+
this._logger?.log('Finished processing at index =', this._currentIndex);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
++this._currentIndex;
|
|
127
|
+
await this.tryStartQueue();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private _executeLoader = async (l: QueueItem, priority: number, index?: number) => {
|
|
131
|
+
try {
|
|
132
|
+
await l();
|
|
133
|
+
} catch (err) {
|
|
134
|
+
this._logger?.warn('Failed to process queue item at priority =', priority, ' at index =', index || '?');
|
|
135
|
+
this._logger?.error(err);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
}
|
|
@@ -92,4 +92,16 @@ describe('validation websites', () => {
|
|
|
92
92
|
it('valid website with directory path', () => {
|
|
93
93
|
expect(validation.Validators.website('http://www.regexbuddy.com/index.html?source=library')).toEqual(ValidationErrors.None);
|
|
94
94
|
});
|
|
95
|
+
|
|
96
|
+
it('valid website with many dashes', () => {
|
|
97
|
+
expect(validation.Validators.website('https://www.test-test-test-test.com')).toEqual(ValidationErrors.None);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('valid website with short domain', () => {
|
|
101
|
+
expect(validation.Validators.website('https://t.me')).toEqual(ValidationErrors.None);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('test url with few dashes in a row', () => {
|
|
105
|
+
expect(validation.Validators.website('https://dashedurl-------.com')).toEqual(ValidationErrors.Website);
|
|
106
|
+
});
|
|
95
107
|
});
|
|
@@ -22,7 +22,7 @@ export const ValidatorsRegExps = {
|
|
|
22
22
|
expiryDateCard: /^\d+$/,
|
|
23
23
|
cvv: /^\d+$/,
|
|
24
24
|
// eslint-disable-next-line no-useless-escape
|
|
25
|
-
website: /^(https?:\/\/)?([a-z0-9]+([a-z0-9
|
|
25
|
+
website: /^(https?:\/\/)?([a-z0-9]+((((-?[a-z0-9]{2,})+)?)\.))+[a-z]{2,}(:[0-9]{1,})?(\/.*)?$/i,
|
|
26
26
|
linkedin: /^(https?:\/\/)?([a-z]+\d*[a-z]*\.)?linkedin\.com\/.*$/i,
|
|
27
27
|
};
|
|
28
28
|
|