@dereekb/util 0.0.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.
- package/README.md +7 -0
- package/package.json +10 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +6 -0
- package/src/index.js.map +1 -0
- package/src/lib/array/array.boolean.d.ts +28 -0
- package/src/lib/array/array.boolean.js +59 -0
- package/src/lib/array/array.boolean.js.map +1 -0
- package/src/lib/array/array.d.ts +60 -0
- package/src/lib/array/array.filter.d.ts +13 -0
- package/src/lib/array/array.filter.js +48 -0
- package/src/lib/array/array.filter.js.map +1 -0
- package/src/lib/array/array.js +149 -0
- package/src/lib/array/array.js.map +1 -0
- package/src/lib/array/array.limit.d.ts +13 -0
- package/src/lib/array/array.limit.js +19 -0
- package/src/lib/array/array.limit.js.map +1 -0
- package/src/lib/array/array.map.d.ts +18 -0
- package/src/lib/array/array.map.js +26 -0
- package/src/lib/array/array.map.js.map +1 -0
- package/src/lib/array/array.number.d.ts +21 -0
- package/src/lib/array/array.number.js +58 -0
- package/src/lib/array/array.number.js.map +1 -0
- package/src/lib/array/array.set.d.ts +20 -0
- package/src/lib/array/array.set.js +64 -0
- package/src/lib/array/array.set.js.map +1 -0
- package/src/lib/array/array.string.d.ts +8 -0
- package/src/lib/array/array.string.js +36 -0
- package/src/lib/array/array.string.js.map +1 -0
- package/src/lib/array/array.unique.d.ts +6 -0
- package/src/lib/array/array.unique.js +29 -0
- package/src/lib/array/array.unique.js.map +1 -0
- package/src/lib/array/array.value.d.ts +3 -0
- package/src/lib/array/array.value.js +17 -0
- package/src/lib/array/array.value.js.map +1 -0
- package/src/lib/array/index.d.ts +10 -0
- package/src/lib/array/index.js +14 -0
- package/src/lib/array/index.js.map +1 -0
- package/src/lib/assertion/assert.d.ts +15 -0
- package/src/lib/assertion/assert.error.d.ts +32 -0
- package/src/lib/assertion/assert.error.js +43 -0
- package/src/lib/assertion/assert.error.js.map +1 -0
- package/src/lib/assertion/assert.js +3 -0
- package/src/lib/assertion/assert.js.map +1 -0
- package/src/lib/assertion/assertion.d.ts +18 -0
- package/src/lib/assertion/assertion.generic.d.ts +3 -0
- package/src/lib/assertion/assertion.generic.js +10 -0
- package/src/lib/assertion/assertion.generic.js.map +1 -0
- package/src/lib/assertion/assertion.js +40 -0
- package/src/lib/assertion/assertion.js.map +1 -0
- package/src/lib/assertion/assertion.number.d.ts +3 -0
- package/src/lib/assertion/assertion.number.js +20 -0
- package/src/lib/assertion/assertion.number.js.map +1 -0
- package/src/lib/assertion/index.d.ts +5 -0
- package/src/lib/assertion/index.js +9 -0
- package/src/lib/assertion/index.js.map +1 -0
- package/src/lib/boolean.d.ts +5 -0
- package/src/lib/boolean.js +30 -0
- package/src/lib/boolean.js.map +1 -0
- package/src/lib/contact/domain.d.ts +16 -0
- package/src/lib/contact/domain.js +45 -0
- package/src/lib/contact/domain.js.map +1 -0
- package/src/lib/contact/email.d.ts +17 -0
- package/src/lib/contact/email.js +32 -0
- package/src/lib/contact/email.js.map +1 -0
- package/src/lib/contact/index.d.ts +3 -0
- package/src/lib/contact/index.js +7 -0
- package/src/lib/contact/index.js.map +1 -0
- package/src/lib/contact/phone.d.ts +8 -0
- package/src/lib/contact/phone.js +3 -0
- package/src/lib/contact/phone.js.map +1 -0
- package/src/lib/context/context.d.ts +1 -0
- package/src/lib/context/context.js +6 -0
- package/src/lib/context/context.js.map +1 -0
- package/src/lib/context/index.d.ts +0 -0
- package/src/lib/context/index.js +2 -0
- package/src/lib/context/index.js.map +1 -0
- package/src/lib/date/date.d.ts +52 -0
- package/src/lib/date/date.js +12 -0
- package/src/lib/date/date.js.map +1 -0
- package/src/lib/date/date.time.d.ts +29 -0
- package/src/lib/date/date.time.js +27 -0
- package/src/lib/date/date.time.js.map +1 -0
- package/src/lib/date/index.d.ts +2 -0
- package/src/lib/date/index.js +6 -0
- package/src/lib/date/index.js.map +1 -0
- package/src/lib/error/error.d.ts +30 -0
- package/src/lib/error/error.js +36 -0
- package/src/lib/error/error.js.map +1 -0
- package/src/lib/error/error.server.d.ts +37 -0
- package/src/lib/error/error.server.js +22 -0
- package/src/lib/error/error.server.js.map +1 -0
- package/src/lib/error/index.d.ts +2 -0
- package/src/lib/error/index.js +6 -0
- package/src/lib/error/index.js.map +1 -0
- package/src/lib/filter/filter.d.ts +5 -0
- package/src/lib/filter/filter.js +3 -0
- package/src/lib/filter/filter.js.map +1 -0
- package/src/lib/filter/index.d.ts +1 -0
- package/src/lib/filter/index.js +5 -0
- package/src/lib/filter/index.js.map +1 -0
- package/src/lib/getter.d.ts +16 -0
- package/src/lib/getter.js +19 -0
- package/src/lib/getter.js.map +1 -0
- package/src/lib/grouping.d.ts +98 -0
- package/src/lib/grouping.js +164 -0
- package/src/lib/grouping.js.map +1 -0
- package/src/lib/hash.d.ts +5 -0
- package/src/lib/hash.js +21 -0
- package/src/lib/hash.js.map +1 -0
- package/src/lib/index.d.ts +26 -0
- package/src/lib/index.js +31 -0
- package/src/lib/index.js.map +1 -0
- package/src/lib/iterate.d.ts +6 -0
- package/src/lib/iterate.js +16 -0
- package/src/lib/iterate.js.map +1 -0
- package/src/lib/key.d.ts +11 -0
- package/src/lib/key.js +3 -0
- package/src/lib/key.js.map +1 -0
- package/src/lib/lifecycle.d.ts +12 -0
- package/src/lib/lifecycle.js +3 -0
- package/src/lib/lifecycle.js.map +1 -0
- package/src/lib/map.d.ts +2 -0
- package/src/lib/map.js +3 -0
- package/src/lib/map.js.map +1 -0
- package/src/lib/model.d.ts +74 -0
- package/src/lib/model.js +138 -0
- package/src/lib/model.js.map +1 -0
- package/src/lib/number.d.ts +18 -0
- package/src/lib/number.js +29 -0
- package/src/lib/number.js.map +1 -0
- package/src/lib/object/index.d.ts +3 -0
- package/src/lib/object/index.js +7 -0
- package/src/lib/object/index.js.map +1 -0
- package/src/lib/object/object.array.d.ts +9 -0
- package/src/lib/object/object.array.js +35 -0
- package/src/lib/object/object.array.js.map +1 -0
- package/src/lib/object/object.d.ts +12 -0
- package/src/lib/object/object.equal.d.ts +4 -0
- package/src/lib/object/object.equal.js +12 -0
- package/src/lib/object/object.equal.js.map +1 -0
- package/src/lib/object/object.js +38 -0
- package/src/lib/object/object.js.map +1 -0
- package/src/lib/page/index.d.ts +3 -0
- package/src/lib/page/index.js +7 -0
- package/src/lib/page/index.js.map +1 -0
- package/src/lib/page/page.calculator.d.ts +24 -0
- package/src/lib/page/page.calculator.js +37 -0
- package/src/lib/page/page.calculator.js.map +1 -0
- package/src/lib/page/page.d.ts +28 -0
- package/src/lib/page/page.filter.d.ts +54 -0
- package/src/lib/page/page.filter.js +68 -0
- package/src/lib/page/page.filter.js.map +1 -0
- package/src/lib/page/page.js +30 -0
- package/src/lib/page/page.js.map +1 -0
- package/src/lib/promise/index.d.ts +2 -0
- package/src/lib/promise/index.js +6 -0
- package/src/lib/promise/index.js.map +1 -0
- package/src/lib/promise/promise.d.ts +42 -0
- package/src/lib/promise/promise.js +117 -0
- package/src/lib/promise/promise.js.map +1 -0
- package/src/lib/promise/promise.loop.d.ts +12 -0
- package/src/lib/promise/promise.loop.js +30 -0
- package/src/lib/promise/promise.loop.js.map +1 -0
- package/src/lib/relation/index.d.ts +1 -0
- package/src/lib/relation/index.js +5 -0
- package/src/lib/relation/index.js.map +1 -0
- package/src/lib/relation/relation.d.ts +95 -0
- package/src/lib/relation/relation.js +209 -0
- package/src/lib/relation/relation.js.map +1 -0
- package/src/lib/set.d.ts +0 -0
- package/src/lib/set.hashset.d.ts +28 -0
- package/src/lib/set.hashset.js +66 -0
- package/src/lib/set.hashset.js.map +1 -0
- package/src/lib/set.js +2 -0
- package/src/lib/set.js.map +1 -0
- package/src/lib/sort.d.ts +45 -0
- package/src/lib/sort.js +25 -0
- package/src/lib/sort.js.map +1 -0
- package/src/lib/storage/index.d.ts +4 -0
- package/src/lib/storage/index.js +8 -0
- package/src/lib/storage/index.js.map +1 -0
- package/src/lib/storage/storage.d.ts +11 -0
- package/src/lib/storage/storage.error.d.ts +12 -0
- package/src/lib/storage/storage.error.js +20 -0
- package/src/lib/storage/storage.error.js.map +1 -0
- package/src/lib/storage/storage.js +3 -0
- package/src/lib/storage/storage.js.map +1 -0
- package/src/lib/storage/storage.memory.d.ts +14 -0
- package/src/lib/storage/storage.memory.js +47 -0
- package/src/lib/storage/storage.memory.js.map +1 -0
- package/src/lib/storage/storage.object.d.ts +32 -0
- package/src/lib/storage/storage.object.js +39 -0
- package/src/lib/storage/storage.object.js.map +1 -0
- package/src/lib/string.d.ts +19 -0
- package/src/lib/string.js +27 -0
- package/src/lib/string.js.map +1 -0
- package/src/lib/type.d.ts +9 -0
- package/src/lib/type.js +3 -0
- package/src/lib/type.js.map +1 -0
- package/src/lib/value.d.ts +43 -0
- package/src/lib/value.js +28 -0
- package/src/lib/value.js.map +1 -0
- package/src/test/index.d.ts +2 -0
- package/src/test/index.js +6 -0
- package/src/test/index.js.map +1 -0
- package/src/test/jest.d.ts +80 -0
- package/src/test/jest.js +80 -0
- package/src/test/jest.js.map +1 -0
- package/src/test/jest.wrap.d.ts +61 -0
- package/src/test/jest.wrap.js +66 -0
- package/src/test/jest.wrap.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/util/src/lib/relation/index.ts"],"names":[],"mappings":";;;AAAA,0DAA2B"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export declare enum RelationChange {
|
|
2
|
+
/**
|
|
3
|
+
* Adds a model to the relation. If the model already exists in
|
|
4
|
+
* the relation, the new one is used.
|
|
5
|
+
*
|
|
6
|
+
* Use INSERT to merge the two values together.
|
|
7
|
+
*/
|
|
8
|
+
ADD = "add",
|
|
9
|
+
/**
|
|
10
|
+
* Sets the relation to be equal to the input.
|
|
11
|
+
*/
|
|
12
|
+
SET = "set",
|
|
13
|
+
/**
|
|
14
|
+
* Variation of SET that performs REMOVE on the collection, and then follows it up with INSERT.
|
|
15
|
+
*
|
|
16
|
+
* This can allow the modification function to behave selectively with the items targeted for removal.
|
|
17
|
+
*/
|
|
18
|
+
REMOVE_AND_INSERT = "remove_and_insert",
|
|
19
|
+
/**
|
|
20
|
+
* Removes a model from the relation.
|
|
21
|
+
*/
|
|
22
|
+
REMOVE = "remove",
|
|
23
|
+
/**
|
|
24
|
+
* Updates an existing relation, if it exists.
|
|
25
|
+
* The existing object is merged with the update object.
|
|
26
|
+
*/
|
|
27
|
+
UPDATE = "update",
|
|
28
|
+
/**
|
|
29
|
+
* Updates an existing relation, if it exists, or creates a new one.
|
|
30
|
+
*/
|
|
31
|
+
INSERT = "insert"
|
|
32
|
+
}
|
|
33
|
+
export declare type RelationString = string;
|
|
34
|
+
export declare type RelationObject = RelationString | object;
|
|
35
|
+
export declare type RelationModelType = string;
|
|
36
|
+
export declare type RelationKey = string;
|
|
37
|
+
export declare type ReadRelationKeyFn<T> = (model: T) => RelationKey;
|
|
38
|
+
export declare type ReadRelationModelTypeFn<T> = (model: T) => RelationModelType;
|
|
39
|
+
/**
|
|
40
|
+
* Merges the two input values. The "a" value is usually the existing/incumbent value, while "b" is the new value.
|
|
41
|
+
*/
|
|
42
|
+
export declare type MergeRelationObjectsFn<T> = (a: T, b: T) => T;
|
|
43
|
+
/**
|
|
44
|
+
* Whether or not the object is changable as part of this request.
|
|
45
|
+
*/
|
|
46
|
+
export declare type ChangeRelationObjectsMaskFn<T> = (x: T) => boolean;
|
|
47
|
+
export interface UpdateRelationConfig<T> {
|
|
48
|
+
readKey: ReadRelationKeyFn<T>;
|
|
49
|
+
merge: MergeRelationObjectsFn<T>;
|
|
50
|
+
/**
|
|
51
|
+
* Whether or not an item should be removed when remove is called.
|
|
52
|
+
*/
|
|
53
|
+
shouldRemove?: (x: T) => boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Whether or not the item should be considered when performing a change.
|
|
56
|
+
*
|
|
57
|
+
* For instance, existing items that are passed to this function and it returns false are unable to be changed,
|
|
58
|
+
* and new/target items that are passed to this function and it returns false are ignored.
|
|
59
|
+
*/
|
|
60
|
+
mask?: ChangeRelationObjectsMaskFn<T>;
|
|
61
|
+
}
|
|
62
|
+
export interface UpdateMiltiTypeRelationConfig<T> extends UpdateRelationConfig<T> {
|
|
63
|
+
readType: ReadRelationModelTypeFn<T>;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Utility class for modifying a collection of relational objects.
|
|
67
|
+
*
|
|
68
|
+
* For instance, a string collection of keys.
|
|
69
|
+
*/
|
|
70
|
+
export declare class ModelRelationUtility {
|
|
71
|
+
static modifyStringCollection(current: RelationString[], change: RelationChange, mods: RelationString[]): RelationString[];
|
|
72
|
+
static modifyCollection<T extends RelationObject>(current: T[], change: RelationChange, mods: T[], config: UpdateRelationConfig<T>): T[];
|
|
73
|
+
static modifyCollection<T extends RelationObject>(current: T[], change: RelationChange, mods: T[], config: UpdateMiltiTypeRelationConfig<T>): T[];
|
|
74
|
+
/**
|
|
75
|
+
* The mask results are merged together.
|
|
76
|
+
*
|
|
77
|
+
* Order from the "current" is retained. Anything in currentRetain overrides modifiedResults.
|
|
78
|
+
*/
|
|
79
|
+
private static _mergeMaskResults;
|
|
80
|
+
private static _modifyCollectionWithoutMask;
|
|
81
|
+
static updateCollection<T extends RelationObject>(current: T[], update: T[], { readKey, readType, merge }: UpdateMiltiTypeRelationConfig<T>): T[];
|
|
82
|
+
static insertCollection<T extends RelationObject>(current: T[], update: T[], { readKey, readType, merge }: UpdateMiltiTypeRelationConfig<T>): T[];
|
|
83
|
+
/**
|
|
84
|
+
* Used to modify a collection which may be multi-type. If readType is provided, the collection is handled as a multi-type map.
|
|
85
|
+
*/
|
|
86
|
+
private static _modifyCollection;
|
|
87
|
+
private static _modifyMultiTypeCollection;
|
|
88
|
+
private static _insertSingleTypeCollection;
|
|
89
|
+
private static _updateSingleTypeCollection;
|
|
90
|
+
static addToCollection<T extends RelationObject>(current: T[], add: T[], readKey: ReadRelationKeyFn<T>): T[];
|
|
91
|
+
static removeFromCollection<T extends RelationObject>(current: T[], remove: T[], readKey: ReadRelationKeyFn<T>, shouldRemove?: (x: T) => boolean): T[];
|
|
92
|
+
static removeKeysFromCollection<T extends RelationObject>(current: T[], keysToRemove: string[], readKey: ReadRelationKeyFn<T>): T[];
|
|
93
|
+
static removeDuplicates<T>(relations: T[], readKey: ReadRelationKeyFn<T>, additionalKeys?: string[]): T[];
|
|
94
|
+
private static _assertMergeProvided;
|
|
95
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModelRelationUtility = exports.RelationChange = void 0;
|
|
4
|
+
const array_1 = require("../array");
|
|
5
|
+
const grouping_1 = require("../grouping");
|
|
6
|
+
var RelationChange;
|
|
7
|
+
(function (RelationChange) {
|
|
8
|
+
/**
|
|
9
|
+
* Adds a model to the relation. If the model already exists in
|
|
10
|
+
* the relation, the new one is used.
|
|
11
|
+
*
|
|
12
|
+
* Use INSERT to merge the two values together.
|
|
13
|
+
*/
|
|
14
|
+
RelationChange["ADD"] = "add";
|
|
15
|
+
/**
|
|
16
|
+
* Sets the relation to be equal to the input.
|
|
17
|
+
*/
|
|
18
|
+
RelationChange["SET"] = "set";
|
|
19
|
+
/**
|
|
20
|
+
* Variation of SET that performs REMOVE on the collection, and then follows it up with INSERT.
|
|
21
|
+
*
|
|
22
|
+
* This can allow the modification function to behave selectively with the items targeted for removal.
|
|
23
|
+
*/
|
|
24
|
+
RelationChange["REMOVE_AND_INSERT"] = "remove_and_insert";
|
|
25
|
+
/**
|
|
26
|
+
* Removes a model from the relation.
|
|
27
|
+
*/
|
|
28
|
+
RelationChange["REMOVE"] = "remove";
|
|
29
|
+
/**
|
|
30
|
+
* Updates an existing relation, if it exists.
|
|
31
|
+
* The existing object is merged with the update object.
|
|
32
|
+
*/
|
|
33
|
+
RelationChange["UPDATE"] = "update";
|
|
34
|
+
/**
|
|
35
|
+
* Updates an existing relation, if it exists, or creates a new one.
|
|
36
|
+
*/
|
|
37
|
+
RelationChange["INSERT"] = "insert";
|
|
38
|
+
})(RelationChange = exports.RelationChange || (exports.RelationChange = {}));
|
|
39
|
+
;
|
|
40
|
+
/**
|
|
41
|
+
* Utility class for modifying a collection of relational objects.
|
|
42
|
+
*
|
|
43
|
+
* For instance, a string collection of keys.
|
|
44
|
+
*/
|
|
45
|
+
class ModelRelationUtility {
|
|
46
|
+
static modifyStringCollection(current, change, mods) {
|
|
47
|
+
return ModelRelationUtility.modifyCollection(current, change, mods, { readKey: (x) => x, merge: (a, b) => b });
|
|
48
|
+
}
|
|
49
|
+
static modifyCollection(current, change, mods, config) {
|
|
50
|
+
const { mask, readKey } = config;
|
|
51
|
+
if (mask) {
|
|
52
|
+
const { included: currentModify, excluded: currentRetain } = (0, grouping_1.separateValues)(current, mask);
|
|
53
|
+
const { included: modModify } = (0, grouping_1.separateValues)(mods, mask);
|
|
54
|
+
const modifiedResults = this._modifyCollectionWithoutMask(currentModify, change, modModify, config);
|
|
55
|
+
return this._mergeMaskResults(current, currentRetain, modifiedResults, readKey);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return this._modifyCollectionWithoutMask(current, change, mods, config);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The mask results are merged together.
|
|
63
|
+
*
|
|
64
|
+
* Order from the "current" is retained. Anything in currentRetain overrides modifiedResults.
|
|
65
|
+
*/
|
|
66
|
+
static _mergeMaskResults(current, currentRetain, modifiedResults, readKey) {
|
|
67
|
+
return (0, grouping_1.restoreOrderWithValues)(current, [...currentRetain, ...modifiedResults], { readKey });
|
|
68
|
+
}
|
|
69
|
+
static _modifyCollectionWithoutMask(current, change, mods, config) {
|
|
70
|
+
const { readKey, merge, shouldRemove } = config;
|
|
71
|
+
const readType = config.readType;
|
|
72
|
+
function remove(rCurrent = current, rMods = mods) {
|
|
73
|
+
return ModelRelationUtility._modifyCollection(rCurrent, rMods, (x, y) => {
|
|
74
|
+
return ModelRelationUtility.removeFromCollection(x, y, readKey, shouldRemove);
|
|
75
|
+
}, readType);
|
|
76
|
+
}
|
|
77
|
+
function performAdd() {
|
|
78
|
+
return ModelRelationUtility._modifyCollection(current, mods, (x, y) => ModelRelationUtility.addToCollection(x, y, readKey), readType);
|
|
79
|
+
}
|
|
80
|
+
function performInsert() {
|
|
81
|
+
return ModelRelationUtility.insertCollection(current, mods, { readKey, readType, merge });
|
|
82
|
+
}
|
|
83
|
+
switch (change) {
|
|
84
|
+
case RelationChange.SET:
|
|
85
|
+
current = []; // Set current before performing add.
|
|
86
|
+
return performAdd();
|
|
87
|
+
case RelationChange.ADD:
|
|
88
|
+
return performAdd();
|
|
89
|
+
case RelationChange.REMOVE:
|
|
90
|
+
return remove();
|
|
91
|
+
case RelationChange.UPDATE:
|
|
92
|
+
return ModelRelationUtility.updateCollection(current, mods, { readKey, readType, merge });
|
|
93
|
+
case RelationChange.REMOVE_AND_INSERT:
|
|
94
|
+
current = remove(current, current); // Remove all current values before performing an insert.
|
|
95
|
+
return performInsert();
|
|
96
|
+
case RelationChange.INSERT:
|
|
97
|
+
return performInsert();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
static updateCollection(current, update, { readKey, readType, merge }) {
|
|
101
|
+
ModelRelationUtility._assertMergeProvided(merge);
|
|
102
|
+
return ModelRelationUtility._modifyCollection(current, update, (x, y) => ModelRelationUtility._updateSingleTypeCollection(x, y, { readKey, merge }), readType);
|
|
103
|
+
}
|
|
104
|
+
static insertCollection(current, update, { readKey, readType, merge }) {
|
|
105
|
+
ModelRelationUtility._assertMergeProvided(merge);
|
|
106
|
+
return ModelRelationUtility._modifyCollection(current, update, (x, y) => ModelRelationUtility._insertSingleTypeCollection(x, y, { readKey, merge }), readType);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Used to modify a collection which may be multi-type. If readType is provided, the collection is handled as a multi-type map.
|
|
110
|
+
*/
|
|
111
|
+
static _modifyCollection(current, mods, modifyCollection, readType) {
|
|
112
|
+
if (readType) {
|
|
113
|
+
return ModelRelationUtility._modifyMultiTypeCollection(current, mods, readType, modifyCollection);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
return modifyCollection(current, mods);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
static _modifyMultiTypeCollection(input, mods, readType, modifyCollection) {
|
|
120
|
+
const inputMap = (0, grouping_1.makeValuesGroupMap)(input, readType);
|
|
121
|
+
const modsMap = (0, grouping_1.makeValuesGroupMap)(mods, readType);
|
|
122
|
+
const typesModified = new Set([...inputMap.keys(), ...modsMap.keys()]);
|
|
123
|
+
// Break the collections up into their individual types and process separately.
|
|
124
|
+
const modifiedSubCollections = Array.from(typesModified).map((type) => {
|
|
125
|
+
var _a, _b;
|
|
126
|
+
const values = (_a = inputMap.get(type)) !== null && _a !== void 0 ? _a : [];
|
|
127
|
+
const mods = (_b = modsMap.get(type)) !== null && _b !== void 0 ? _b : [];
|
|
128
|
+
// Only modify if they've got changes for their type.
|
|
129
|
+
if (mods.length === 0) {
|
|
130
|
+
return values; // No mods, no change to those types.
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
return modifyCollection(values, mods);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
// Rejoin all changes.
|
|
137
|
+
return modifiedSubCollections.reduce((x, y) => x.concat(y), []);
|
|
138
|
+
}
|
|
139
|
+
static _insertSingleTypeCollection(current, insert, { readKey, merge }) {
|
|
140
|
+
const currentKeys = (0, array_1.arrayToMap)(current, readKey);
|
|
141
|
+
const updateValues = [];
|
|
142
|
+
const addValues = [];
|
|
143
|
+
insert.forEach((value) => {
|
|
144
|
+
const key = readKey(value);
|
|
145
|
+
if (currentKeys.has(key)) {
|
|
146
|
+
updateValues.push(value);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
addValues.push(value);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
const added = ModelRelationUtility.addToCollection(current, addValues, readKey);
|
|
153
|
+
const results = ModelRelationUtility._updateSingleTypeCollection(added, updateValues, { readKey, merge });
|
|
154
|
+
return results;
|
|
155
|
+
}
|
|
156
|
+
static _updateSingleTypeCollection(current, update, { readKey, merge }) {
|
|
157
|
+
const keysToUpdate = (0, array_1.arrayToMap)(update, readKey);
|
|
158
|
+
const updateValues = [];
|
|
159
|
+
current.forEach((value) => {
|
|
160
|
+
const key = readKey(value);
|
|
161
|
+
const mergeWith = keysToUpdate.get(key);
|
|
162
|
+
if (mergeWith != null) {
|
|
163
|
+
updateValues.push(merge(value, mergeWith));
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Add to merge all values and remove duplicates.
|
|
167
|
+
return ModelRelationUtility.addToCollection(current, updateValues, readKey);
|
|
168
|
+
}
|
|
169
|
+
static addToCollection(current, add, readKey) {
|
|
170
|
+
current = current !== null && current !== void 0 ? current : [];
|
|
171
|
+
return (add === null || add === void 0 ? void 0 : add.length) ? ModelRelationUtility.removeDuplicates([...add, ...current], readKey) : current; // Will keep any "added" before any existing ones.
|
|
172
|
+
}
|
|
173
|
+
static removeFromCollection(current, remove, readKey, shouldRemove) {
|
|
174
|
+
if (current === null || current === void 0 ? void 0 : current.length) {
|
|
175
|
+
if (shouldRemove) {
|
|
176
|
+
const currentKeyPairs = (0, grouping_1.makeKeyPairs)(current, readKey);
|
|
177
|
+
const map = new Map(currentKeyPairs);
|
|
178
|
+
remove.forEach((x) => {
|
|
179
|
+
const key = readKey(x);
|
|
180
|
+
const removalTarget = map.get(key);
|
|
181
|
+
if (removalTarget && shouldRemove(removalTarget)) {
|
|
182
|
+
map.delete(key); // Remove from the map.
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return currentKeyPairs.filter(x => map.has(x[0])).map(x => x[1]); // Retain order, remove from map.
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
return ModelRelationUtility.removeKeysFromCollection(current, remove.map(readKey), readKey);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
static removeKeysFromCollection(current, keysToRemove, readKey) {
|
|
196
|
+
return ModelRelationUtility.removeDuplicates(current, readKey, keysToRemove);
|
|
197
|
+
}
|
|
198
|
+
static removeDuplicates(relations, readKey, additionalKeys = []) {
|
|
199
|
+
return (0, array_1.findUnique)(relations, readKey, additionalKeys);
|
|
200
|
+
}
|
|
201
|
+
// MARK: Internal Utility
|
|
202
|
+
static _assertMergeProvided(merge) {
|
|
203
|
+
if (!merge) {
|
|
204
|
+
throw new Error('Merge was not provided.');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
exports.ModelRelationUtility = ModelRelationUtility;
|
|
209
|
+
//# sourceMappingURL=relation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relation.js","sourceRoot":"","sources":["../../../../../../packages/util/src/lib/relation/relation.ts"],"names":[],"mappings":"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"}
|
package/src/lib/set.d.ts
ADDED
|
File without changes
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PrimativeKey, ReadKeyFunction } from "./key";
|
|
2
|
+
import { Maybe } from "./value";
|
|
3
|
+
export interface HashSetConfig<K extends PrimativeKey, T> {
|
|
4
|
+
readKey: ReadKeyFunction<T, K>;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Set that is implemented internally using a Map, and input values have their keys read.
|
|
8
|
+
*
|
|
9
|
+
* Useful for cases, such as Date, that are unique by a value, but not self.
|
|
10
|
+
*/
|
|
11
|
+
export declare class HashSet<K extends PrimativeKey, T> implements Set<T> {
|
|
12
|
+
readonly config: HashSetConfig<K, T>;
|
|
13
|
+
private _map;
|
|
14
|
+
constructor(config: HashSetConfig<K, T>, values?: T[]);
|
|
15
|
+
get size(): number;
|
|
16
|
+
[Symbol.iterator](): IterableIterator<T>;
|
|
17
|
+
addAll(values: Maybe<T[]>): this;
|
|
18
|
+
add(value: T): this;
|
|
19
|
+
clear(): void;
|
|
20
|
+
delete(value: T): boolean;
|
|
21
|
+
has(value: T): boolean;
|
|
22
|
+
forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;
|
|
23
|
+
entries(): IterableIterator<[T, T]>;
|
|
24
|
+
keys(): IterableIterator<T>;
|
|
25
|
+
values(): IterableIterator<T>;
|
|
26
|
+
valuesArray(): T[];
|
|
27
|
+
get [Symbol.toStringTag](): string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HashSet = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Set that is implemented internally using a Map, and input values have their keys read.
|
|
6
|
+
*
|
|
7
|
+
* Useful for cases, such as Date, that are unique by a value, but not self.
|
|
8
|
+
*/
|
|
9
|
+
class HashSet {
|
|
10
|
+
constructor(config, values) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
this._map = new Map();
|
|
13
|
+
if (values) {
|
|
14
|
+
values.forEach(x => this.add(x));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
get size() {
|
|
18
|
+
return this._map.size;
|
|
19
|
+
}
|
|
20
|
+
[Symbol.iterator]() {
|
|
21
|
+
return this._map.values();
|
|
22
|
+
}
|
|
23
|
+
addAll(values) {
|
|
24
|
+
values === null || values === void 0 ? void 0 : values.forEach(x => this.add(x));
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
add(value) {
|
|
28
|
+
const key = this.config.readKey(value);
|
|
29
|
+
this._map.set(key, value);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
clear() {
|
|
33
|
+
this._map.clear();
|
|
34
|
+
}
|
|
35
|
+
delete(value) {
|
|
36
|
+
const key = this.config.readKey(value);
|
|
37
|
+
return this._map.delete(key);
|
|
38
|
+
}
|
|
39
|
+
has(value) {
|
|
40
|
+
const key = this.config.readKey(value);
|
|
41
|
+
return this._map.has(key);
|
|
42
|
+
}
|
|
43
|
+
forEach(callbackfn, thisArg) {
|
|
44
|
+
return this._map.forEach((value, key) => {
|
|
45
|
+
callbackfn.apply(thisArg, [value, value, this]);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
entries() {
|
|
49
|
+
const result = this.valuesArray();
|
|
50
|
+
return result.map(x => [x, x]).values();
|
|
51
|
+
}
|
|
52
|
+
keys() {
|
|
53
|
+
return this.values();
|
|
54
|
+
}
|
|
55
|
+
values() {
|
|
56
|
+
return this._map.values();
|
|
57
|
+
}
|
|
58
|
+
valuesArray() {
|
|
59
|
+
return Array.from(this._map.values());
|
|
60
|
+
}
|
|
61
|
+
get [Symbol.toStringTag]() {
|
|
62
|
+
return this.valuesArray.toString();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.HashSet = HashSet;
|
|
66
|
+
//# sourceMappingURL=set.hashset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.hashset.js","sourceRoot":"","sources":["../../../../../packages/util/src/lib/set.hashset.ts"],"names":[],"mappings":";;;AAOA;;;;GAIG;AACH,MAAa,OAAO;IAIlB,YAAqB,MAA2B,EAAE,MAAY;QAAzC,WAAM,GAAN,MAAM,CAAqB;QAFxC,SAAI,GAAG,IAAI,GAAG,EAAe,CAAC;QAGpC,IAAI,MAAM,EAAE;YACV,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAClC;IACH,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;IAED,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,MAAkB;QACvB,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,KAAQ;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,KAAQ;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,UAAsD,EAAE,OAAa;QAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAW,CAAC,CAAC,MAAM,EAAE,CAAC;IACpD,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;QACT,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IACrC,CAAC;CAEF;AAtED,0BAsEC"}
|
package/src/lib/set.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../../../../packages/util/src/lib/set.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export declare enum SortingOrder {
|
|
2
|
+
ASCENDING = "asc",
|
|
3
|
+
DESCENDING = "desc"
|
|
4
|
+
}
|
|
5
|
+
export declare const SORT_VALUE_LESS_THAN: SortComparisonNumber;
|
|
6
|
+
export declare const SORT_VALUE_GREATER_THAN: SortComparisonNumber;
|
|
7
|
+
export declare const SORT_VALUE_EQUAL: SortComparisonNumber;
|
|
8
|
+
/**
|
|
9
|
+
* A number that is the result of comparison two items.
|
|
10
|
+
*
|
|
11
|
+
* In "ascending" order, a value:
|
|
12
|
+
* - smaller than another will return -1 (or less).
|
|
13
|
+
* - equal to another will return 0
|
|
14
|
+
* - greater than another will return 1 (or more).
|
|
15
|
+
*
|
|
16
|
+
* In "descending" order, this returns the opposite values as "ascending".
|
|
17
|
+
*/
|
|
18
|
+
export declare type SortComparisonNumber = number;
|
|
19
|
+
/**
|
|
20
|
+
* A comparison function that returns a SortComparisonNumber.
|
|
21
|
+
*/
|
|
22
|
+
export declare type SortCompareFunction<T> = (a: T, b: T) => SortComparisonNumber;
|
|
23
|
+
/**
|
|
24
|
+
* Comparison function that sorts in ascending order.
|
|
25
|
+
*
|
|
26
|
+
* This is the logical normal return order, where if an item is less than another, it should return SORT_VALUE_LESS_THAN (-1), etc.
|
|
27
|
+
*/
|
|
28
|
+
export declare type AscendingSortCompareFunction<T> = SortCompareFunction<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Comparison function that sorts in descending order.
|
|
31
|
+
*
|
|
32
|
+
* This is the logical normal return order, where if an item is less than another, it should return SORT_VALUE_LESS_THAN (-1), etc.
|
|
33
|
+
*/
|
|
34
|
+
export declare type SortDescendingCompareFunction<T> = SortCompareFunction<T>;
|
|
35
|
+
/**
|
|
36
|
+
* Convenience function that reverses the order of the sorted values.
|
|
37
|
+
*/
|
|
38
|
+
export declare function reverseCompareFn<T>(compareFn: AscendingSortCompareFunction<T>): SortDescendingCompareFunction<T>;
|
|
39
|
+
export declare function reverseCompareFn<T>(compareFn: SortDescendingCompareFunction<T>): AscendingSortCompareFunction<T>;
|
|
40
|
+
/**
|
|
41
|
+
* Convenience function that reverses the order of the sorted values if the order is specified descending.
|
|
42
|
+
*
|
|
43
|
+
* The input comparison function must be in ascending order.
|
|
44
|
+
*/
|
|
45
|
+
export declare function compareFnOrder<T>(ascendingCompareFn: AscendingSortCompareFunction<T>, order?: SortingOrder): SortCompareFunction<T>;
|
package/src/lib/sort.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compareFnOrder = exports.reverseCompareFn = exports.SORT_VALUE_EQUAL = exports.SORT_VALUE_GREATER_THAN = exports.SORT_VALUE_LESS_THAN = exports.SortingOrder = void 0;
|
|
4
|
+
var SortingOrder;
|
|
5
|
+
(function (SortingOrder) {
|
|
6
|
+
SortingOrder["ASCENDING"] = "asc";
|
|
7
|
+
SortingOrder["DESCENDING"] = "desc";
|
|
8
|
+
})(SortingOrder = exports.SortingOrder || (exports.SortingOrder = {}));
|
|
9
|
+
exports.SORT_VALUE_LESS_THAN = -1;
|
|
10
|
+
exports.SORT_VALUE_GREATER_THAN = 1;
|
|
11
|
+
exports.SORT_VALUE_EQUAL = 0;
|
|
12
|
+
function reverseCompareFn(compareFn) {
|
|
13
|
+
return (a, b) => compareFn(a, b) * -1;
|
|
14
|
+
}
|
|
15
|
+
exports.reverseCompareFn = reverseCompareFn;
|
|
16
|
+
/**
|
|
17
|
+
* Convenience function that reverses the order of the sorted values if the order is specified descending.
|
|
18
|
+
*
|
|
19
|
+
* The input comparison function must be in ascending order.
|
|
20
|
+
*/
|
|
21
|
+
function compareFnOrder(ascendingCompareFn, order = SortingOrder.ASCENDING) {
|
|
22
|
+
return (order === SortingOrder.ASCENDING) ? ascendingCompareFn : reverseCompareFn(ascendingCompareFn);
|
|
23
|
+
}
|
|
24
|
+
exports.compareFnOrder = compareFnOrder;
|
|
25
|
+
//# sourceMappingURL=sort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort.js","sourceRoot":"","sources":["../../../../../packages/util/src/lib/sort.ts"],"names":[],"mappings":";;;AACA,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,iCAAiB,CAAA;IACjB,mCAAmB,CAAA;AACrB,CAAC,EAHW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAGvB;AAEY,QAAA,oBAAoB,GAAyB,CAAC,CAAC,CAAC;AAChD,QAAA,uBAAuB,GAAyB,CAAC,CAAC;AAClD,QAAA,gBAAgB,GAAyB,CAAC,CAAC;AAsCxD,SAAgB,gBAAgB,CAAI,SAAiC;IACnE,OAAO,CAAC,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,CAAC;AAFD,4CAEC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAI,kBAAmD,EAAE,QAAsB,YAAY,CAAC,SAAS;IACjI,OAAO,CAAC,KAAK,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;AACxG,CAAC;AAFD,wCAEC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
(0, tslib_1.__exportStar)(require("./storage"), exports);
|
|
5
|
+
(0, tslib_1.__exportStar)(require("./storage.error"), exports);
|
|
6
|
+
(0, tslib_1.__exportStar)(require("./storage.memory"), exports);
|
|
7
|
+
(0, tslib_1.__exportStar)(require("./storage.object"), exports);
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/util/src/lib/storage/index.ts"],"names":[],"mappings":";;;AAAA,yDAA0B;AAC1B,+DAAgC;AAChC,gEAAiC;AACjC,gEAAiC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { UnixDateTimeNumber } from '@dereekb/util';
|
|
2
|
+
export declare type StoredDataString = string;
|
|
3
|
+
export declare type StoredDataStorageKey = string;
|
|
4
|
+
export interface StoredData {
|
|
5
|
+
storedAt: UnixDateTimeNumber | undefined;
|
|
6
|
+
data: StoredDataString;
|
|
7
|
+
}
|
|
8
|
+
export interface ReadStoredData<T> extends StoredData {
|
|
9
|
+
expired: boolean;
|
|
10
|
+
convertedData: T;
|
|
11
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseError } from 'make-error';
|
|
2
|
+
import { ReadStoredData } from './storage';
|
|
3
|
+
export declare class StoredDataError extends BaseError {
|
|
4
|
+
constructor(message?: string);
|
|
5
|
+
}
|
|
6
|
+
export declare class DataDoesNotExistError extends StoredDataError {
|
|
7
|
+
constructor(message?: string);
|
|
8
|
+
}
|
|
9
|
+
export declare class DataIsExpiredError<T> extends StoredDataError {
|
|
10
|
+
readonly data: ReadStoredData<T>;
|
|
11
|
+
constructor(data: ReadStoredData<T>, message?: string);
|
|
12
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DataIsExpiredError = exports.DataDoesNotExistError = exports.StoredDataError = void 0;
|
|
4
|
+
const make_error_1 = require("make-error");
|
|
5
|
+
class StoredDataError extends make_error_1.BaseError {
|
|
6
|
+
constructor(message) { super(message); }
|
|
7
|
+
}
|
|
8
|
+
exports.StoredDataError = StoredDataError;
|
|
9
|
+
class DataDoesNotExistError extends StoredDataError {
|
|
10
|
+
constructor(message) { super(message); }
|
|
11
|
+
}
|
|
12
|
+
exports.DataDoesNotExistError = DataDoesNotExistError;
|
|
13
|
+
class DataIsExpiredError extends StoredDataError {
|
|
14
|
+
constructor(data, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.data = data;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.DataIsExpiredError = DataIsExpiredError;
|
|
20
|
+
//# sourceMappingURL=storage.error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.error.js","sourceRoot":"","sources":["../../../../../../packages/util/src/lib/storage/storage.error.ts"],"names":[],"mappings":";;;AAAA,2CAAuC;AAGvC,MAAa,eAAgB,SAAQ,sBAAS;IAE5C,YAAY,OAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAElD;AAJD,0CAIC;AAED,MAAa,qBAAsB,SAAQ,eAAe;IAExD,YAAY,OAAgB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAElD;AAJD,sDAIC;AAED,MAAa,kBAAsB,SAAQ,eAAe;IAExD,YAA4B,IAAuB,EAAE,OAAgB;QAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAA5D,SAAI,GAAJ,IAAI,CAAmB;IAAsC,CAAC;CAE3F;AAJD,gDAIC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../../../packages/util/src/lib/storage/storage.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Maybe } from "../value";
|
|
2
|
+
import { StorageObject } from "./storage.object";
|
|
3
|
+
export declare class MemoryStorageInstance implements StorageObject {
|
|
4
|
+
private _length;
|
|
5
|
+
private _storage;
|
|
6
|
+
get length(): number;
|
|
7
|
+
key(index: number): string;
|
|
8
|
+
hasKey(key: string): boolean;
|
|
9
|
+
getItem(key: string): Maybe<string>;
|
|
10
|
+
setItem(key: string, item: Maybe<string>): void;
|
|
11
|
+
removeItem(key: string): void;
|
|
12
|
+
clear(): void;
|
|
13
|
+
}
|
|
14
|
+
export declare const SHARED_MEMORY_STORAGE: MemoryStorageInstance;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SHARED_MEMORY_STORAGE = exports.MemoryStorageInstance = void 0;
|
|
4
|
+
class MemoryStorageInstance {
|
|
5
|
+
constructor() {
|
|
6
|
+
this._length = 0;
|
|
7
|
+
this._storage = {};
|
|
8
|
+
}
|
|
9
|
+
get length() {
|
|
10
|
+
return this._length;
|
|
11
|
+
}
|
|
12
|
+
key(index) {
|
|
13
|
+
var _a;
|
|
14
|
+
return (_a = Object.keys(this._storage)[index]) !== null && _a !== void 0 ? _a : null;
|
|
15
|
+
}
|
|
16
|
+
hasKey(key) {
|
|
17
|
+
return this._storage.hasOwnProperty(key);
|
|
18
|
+
}
|
|
19
|
+
getItem(key) {
|
|
20
|
+
var _a;
|
|
21
|
+
return (_a = this._storage[key]) !== null && _a !== void 0 ? _a : null;
|
|
22
|
+
}
|
|
23
|
+
setItem(key, item) {
|
|
24
|
+
if (item == null) {
|
|
25
|
+
this.removeItem(key);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
if (!this.hasKey(key)) {
|
|
29
|
+
this._length = this._length + 1;
|
|
30
|
+
}
|
|
31
|
+
this._storage[key] = String(item);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
removeItem(key) {
|
|
35
|
+
if (this.hasKey(key)) {
|
|
36
|
+
delete this._storage[key]; // Remove the property
|
|
37
|
+
this._length = this._length - 1;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
clear() {
|
|
41
|
+
this._storage = {};
|
|
42
|
+
this._length = 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.MemoryStorageInstance = MemoryStorageInstance;
|
|
46
|
+
exports.SHARED_MEMORY_STORAGE = new MemoryStorageInstance();
|
|
47
|
+
//# sourceMappingURL=storage.memory.js.map
|