@bessemer/cornerstone 0.5.1 → 0.5.3
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/array.d.ts +57 -0
- package/dist/array.d.ts.map +1 -0
- package/dist/array.js +137 -0
- package/dist/array.js.map +1 -0
- package/dist/async.d.ts +59 -0
- package/dist/async.d.ts.map +1 -0
- package/dist/async.js +62 -0
- package/dist/async.js.map +1 -0
- package/dist/cache.d.ts +106 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +112 -0
- package/dist/cache.js.map +1 -0
- package/dist/combinable.d.ts +16 -0
- package/dist/combinable.d.ts.map +1 -0
- package/dist/combinable.js +31 -0
- package/dist/combinable.js.map +1 -0
- package/dist/comparator.d.ts +9 -0
- package/dist/comparator.d.ts.map +1 -0
- package/dist/comparator.js +76 -0
- package/dist/comparator.js.map +1 -0
- package/dist/content.d.ts +68 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +79 -0
- package/dist/content.js.map +1 -0
- package/dist/context.d.ts +7 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +1 -0
- package/dist/context.js.map +1 -0
- package/dist/crypto.d.ts +3 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +15 -0
- package/dist/crypto.js.map +1 -0
- package/dist/date.d.ts +10 -0
- package/dist/date.d.ts.map +1 -0
- package/dist/date.js +24 -0
- package/dist/date.js.map +1 -0
- package/dist/duration.d.ts +39 -0
- package/dist/duration.d.ts.map +1 -0
- package/dist/duration.js +52 -0
- package/dist/duration.js.map +1 -0
- package/dist/either.d.ts +20 -0
- package/dist/either.d.ts.map +1 -0
- package/dist/either.js +25 -0
- package/dist/either.js.map +1 -0
- package/dist/entry.d.ts +7 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +24 -0
- package/dist/entry.js.map +1 -0
- package/dist/equalitor.d.ts +5 -0
- package/dist/equalitor.d.ts.map +1 -0
- package/dist/equalitor.js +10 -0
- package/dist/equalitor.js.map +1 -0
- package/dist/error-event.d.ts +34 -0
- package/dist/error-event.d.ts.map +1 -0
- package/dist/error-event.js +91 -0
- package/dist/error-event.js.map +1 -0
- package/dist/error.d.ts +3 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +18 -0
- package/dist/error.js.map +1 -0
- package/dist/expression/array-expression.d.ts +14 -0
- package/dist/expression/array-expression.d.ts.map +1 -0
- package/dist/expression/array-expression.js +32 -0
- package/dist/expression/array-expression.js.map +1 -0
- package/dist/expression/expression-evaluator.d.ts +8 -0
- package/dist/expression/expression-evaluator.d.ts.map +1 -0
- package/dist/expression/expression-evaluator.js +31 -0
- package/dist/expression/expression-evaluator.js.map +1 -0
- package/dist/expression/expression.d.ts +54 -0
- package/dist/expression/expression.d.ts.map +1 -0
- package/dist/expression/expression.js +173 -0
- package/dist/expression/expression.js.map +1 -0
- package/dist/expression/internal.d.ts +10 -0
- package/dist/expression/internal.d.ts.map +1 -0
- package/dist/expression/internal.js +28 -0
- package/dist/expression/internal.js.map +1 -0
- package/dist/expression/numeric-expression.d.ts +79 -0
- package/dist/expression/numeric-expression.d.ts.map +1 -0
- package/dist/expression/numeric-expression.js +177 -0
- package/dist/expression/numeric-expression.js.map +1 -0
- package/dist/expression/string-expression.d.ts +24 -0
- package/dist/expression/string-expression.d.ts.map +1 -0
- package/dist/expression/string-expression.js +41 -0
- package/dist/expression/string-expression.js.map +1 -0
- package/dist/expression.d.ts +35 -0
- package/dist/expression.d.ts.map +1 -0
- package/dist/expression.js +12 -0
- package/dist/expression.js.map +1 -0
- package/dist/function.d.ts +2 -0
- package/dist/function.d.ts.map +1 -0
- package/dist/function.js +7 -0
- package/dist/function.js.map +1 -0
- package/dist/glob.d.ts +8 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +20 -0
- package/dist/glob.js.map +1 -0
- package/dist/global-variable.d.ts +7 -0
- package/dist/global-variable.d.ts.map +1 -0
- package/dist/global-variable.js +34 -0
- package/dist/global-variable.js.map +1 -0
- package/dist/hash.d.ts +11 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +30 -0
- package/dist/hash.js.map +1 -0
- package/dist/hex-code.d.ts +5 -0
- package/dist/hex-code.d.ts.map +1 -0
- package/dist/hex-code.js +7 -0
- package/dist/hex-code.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/lazy.d.ts +3 -0
- package/dist/lazy.d.ts.map +1 -0
- package/dist/lazy.js +13 -0
- package/dist/lazy.js.map +1 -0
- package/dist/logger.d.ts +30 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +124 -0
- package/dist/logger.js.map +1 -0
- package/dist/math.d.ts +22 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +123 -0
- package/dist/math.js.map +1 -0
- package/dist/misc.d.ts +3 -0
- package/dist/misc.d.ts.map +1 -0
- package/dist/misc.js +21 -0
- package/dist/misc.js.map +1 -0
- package/dist/object.d.ts +62 -0
- package/dist/object.d.ts.map +1 -0
- package/dist/object.js +170 -0
- package/dist/object.js.map +1 -0
- package/dist/patch.d.ts +41 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +87 -0
- package/dist/patch.js.map +1 -0
- package/dist/precondition.d.ts +8 -0
- package/dist/precondition.d.ts.map +1 -0
- package/dist/precondition.js +27 -0
- package/dist/precondition.js.map +1 -0
- package/dist/promise.d.ts +8 -0
- package/dist/promise.d.ts.map +1 -0
- package/dist/promise.js +18 -0
- package/dist/promise.js.map +1 -0
- package/dist/property.d.ts +11 -0
- package/dist/property.d.ts.map +1 -0
- package/dist/property.js +21 -0
- package/dist/property.js.map +1 -0
- package/dist/reference.d.ts +22 -0
- package/dist/reference.d.ts.map +1 -0
- package/dist/reference.js +51 -0
- package/dist/reference.js.map +1 -0
- package/dist/resource.d.ts +13 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +27 -0
- package/dist/resource.js.map +1 -0
- package/dist/result.d.ts +18 -0
- package/dist/result.d.ts.map +1 -0
- package/dist/result.js +50 -0
- package/dist/result.js.map +1 -0
- package/dist/retry.d.ts +18 -0
- package/dist/retry.d.ts.map +1 -0
- package/dist/retry.js +51 -0
- package/dist/retry.js.map +1 -0
- package/dist/rich-text.d.ts +17 -0
- package/dist/rich-text.d.ts.map +1 -0
- package/dist/rich-text.js +9 -0
- package/dist/rich-text.js.map +1 -0
- package/dist/set.d.ts +5 -0
- package/dist/set.d.ts.map +1 -0
- package/dist/set.js +44 -0
- package/dist/set.js.map +1 -0
- package/dist/signature.d.ts +9 -0
- package/dist/signature.d.ts.map +1 -0
- package/dist/signature.js +20 -0
- package/dist/signature.js.map +1 -0
- package/dist/store.d.ts +40 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +50 -0
- package/dist/store.js.map +1 -0
- package/dist/string.d.ts +40 -0
- package/dist/string.d.ts.map +1 -0
- package/dist/string.js +154 -0
- package/dist/string.js.map +1 -0
- package/dist/tag.d.ts +24 -0
- package/dist/tag.d.ts.map +1 -0
- package/dist/tag.js +50 -0
- package/dist/tag.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -0
- package/dist/ulid.d.ts +8 -0
- package/dist/ulid.d.ts.map +1 -0
- package/dist/ulid.js +28 -0
- package/dist/ulid.js.map +1 -0
- package/dist/unit.d.ts +4 -0
- package/dist/unit.d.ts.map +1 -0
- package/dist/unit.js +6 -0
- package/dist/unit.js.map +1 -0
- package/dist/uri.d.ts +47 -0
- package/dist/uri.d.ts.map +1 -0
- package/dist/uri.js +211 -0
- package/dist/uri.js.map +1 -0
- package/dist/url.d.ts +25 -0
- package/dist/url.d.ts.map +1 -0
- package/dist/url.js +120 -0
- package/dist/url.js.map +1 -0
- package/dist/uuid.d.ts +8 -0
- package/dist/uuid.d.ts.map +1 -0
- package/dist/uuid.js +35 -0
- package/dist/uuid.js.map +1 -0
- package/dist/zod.d.ts +17 -0
- package/dist/zod.d.ts.map +1 -0
- package/dist/zod.js +31 -0
- package/dist/zod.js.map +1 -0
- package/package.json +5 -2
- package/jest.config.js +0 -3
- package/src/array.ts +0 -142
- package/src/async.ts +0 -114
- package/src/cache.ts +0 -236
- package/src/combinable.ts +0 -40
- package/src/comparator.ts +0 -78
- package/src/content.ts +0 -138
- package/src/context.ts +0 -6
- package/src/crypto.ts +0 -11
- package/src/date.ts +0 -18
- package/src/duration.ts +0 -57
- package/src/either.ts +0 -29
- package/src/entry.ts +0 -21
- package/src/equalitor.ts +0 -12
- package/src/error-event.ts +0 -126
- package/src/error.ts +0 -16
- package/src/expression/array-expression.ts +0 -29
- package/src/expression/expression-evaluator.ts +0 -34
- package/src/expression/expression.ts +0 -188
- package/src/expression/internal.ts +0 -34
- package/src/expression/numeric-expression.ts +0 -182
- package/src/expression/string-expression.ts +0 -38
- package/src/expression.ts +0 -48
- package/src/function.ts +0 -3
- package/src/glob.ts +0 -19
- package/src/global-variable.ts +0 -40
- package/src/hash.ts +0 -28
- package/src/hex-code.ts +0 -6
- package/src/index.ts +0 -82
- package/src/lazy.ts +0 -11
- package/src/logger.ts +0 -144
- package/src/math.ts +0 -132
- package/src/misc.ts +0 -22
- package/src/object.ts +0 -236
- package/src/patch.ts +0 -128
- package/src/precondition.ts +0 -25
- package/src/promise.ts +0 -16
- package/src/property.ts +0 -29
- package/src/reference.ts +0 -68
- package/src/resource.ts +0 -32
- package/src/result.ts +0 -66
- package/src/retry.ts +0 -70
- package/src/rich-text.ts +0 -24
- package/src/set.ts +0 -46
- package/src/signature.ts +0 -20
- package/src/store.ts +0 -91
- package/src/string.ts +0 -173
- package/src/tag.ts +0 -68
- package/src/types.ts +0 -21
- package/src/ulid.ts +0 -28
- package/src/unit.ts +0 -4
- package/src/uri.ts +0 -321
- package/src/url.ts +0 -155
- package/src/uuid.ts +0 -37
- package/src/zod.ts +0 -24
- package/test/comparator.test.ts +0 -1
- package/test/expression.test.ts +0 -12
- package/test/object.test.ts +0 -104
- package/test/patch.test.ts +0 -170
- package/test/set.test.ts +0 -20
- package/test/string.test.ts +0 -22
- package/test/uri.test.ts +0 -111
- package/test/url.test.ts +0 -174
- package/tsconfig.build.json +0 -13
- package/tsup.config.ts +0 -4
package/dist/object.js
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
// src/object.ts
|
2
|
+
import {
|
3
|
+
clone as _clone,
|
4
|
+
cloneDeep as _cloneDeep,
|
5
|
+
invert as _invert,
|
6
|
+
isEqual as _isEqual,
|
7
|
+
isNil as _isNil,
|
8
|
+
isNumber,
|
9
|
+
isObject as _isObject,
|
10
|
+
isPlainObject as _isPlainObject,
|
11
|
+
isString,
|
12
|
+
isUndefined as _isUndefined,
|
13
|
+
mapValues as _mapValues,
|
14
|
+
merge as unsafeMerge,
|
15
|
+
mergeWith as unsafeMergeWith
|
16
|
+
} from "lodash-es";
|
17
|
+
import { produce } from "immer";
|
18
|
+
var update = produce;
|
19
|
+
var isUndefined = _isUndefined;
|
20
|
+
var isNil = _isNil;
|
21
|
+
var isPresent = (value) => {
|
22
|
+
return !isNil(value);
|
23
|
+
};
|
24
|
+
var isObject = _isObject;
|
25
|
+
var isPlainObject = _isPlainObject;
|
26
|
+
var deepEqual = _isEqual;
|
27
|
+
var invert = _invert;
|
28
|
+
var mapValues = _mapValues;
|
29
|
+
var clone = _clone;
|
30
|
+
var cloneDeep = _cloneDeep;
|
31
|
+
var mergeAll = (objects) => {
|
32
|
+
return objects.reduce((x, y) => merge(x, y));
|
33
|
+
};
|
34
|
+
function merge(object, ...otherArgs) {
|
35
|
+
return unsafeMerge({}, object, ...otherArgs);
|
36
|
+
}
|
37
|
+
function mergeInto(source, values) {
|
38
|
+
unsafeMerge(source, values);
|
39
|
+
}
|
40
|
+
var mergeWith = (...args) => {
|
41
|
+
const clone2 = cloneDeep(args[0]);
|
42
|
+
return unsafeMergeWith.apply(null, [clone2, ...args.slice(1)]);
|
43
|
+
};
|
44
|
+
function diffShallow(original, updated) {
|
45
|
+
const result = {
|
46
|
+
elementsUpdated: {},
|
47
|
+
elementsAdded: {},
|
48
|
+
elementsRemoved: {}
|
49
|
+
};
|
50
|
+
for (const [key, originalValue] of Object.entries(original)) {
|
51
|
+
const updatedValue = updated[key];
|
52
|
+
if (updatedValue === void 0) {
|
53
|
+
result.elementsRemoved[key] = originalValue;
|
54
|
+
} else if (!deepEqual(originalValue, updatedValue)) {
|
55
|
+
result.elementsUpdated[key] = { originalValue, updatedValue };
|
56
|
+
}
|
57
|
+
}
|
58
|
+
for (const [key, updatedValue] of Object.entries(updated)) {
|
59
|
+
const originalValue = original[key];
|
60
|
+
if (originalValue === void 0) {
|
61
|
+
result.elementsAdded[key] = updatedValue;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
return result;
|
65
|
+
}
|
66
|
+
var isValidKey = (field, obj) => {
|
67
|
+
return field in obj;
|
68
|
+
};
|
69
|
+
function fieldsPresent(object, fields) {
|
70
|
+
return fields.every((field) => isPresent(object[field]));
|
71
|
+
}
|
72
|
+
var path = (path2) => {
|
73
|
+
return { path: path2 };
|
74
|
+
};
|
75
|
+
var parsePath = (path2) => {
|
76
|
+
const result = [];
|
77
|
+
const regex = /([^.\[\]]+)|\[(\d+)]/g;
|
78
|
+
let match;
|
79
|
+
while ((match = regex.exec(path2)) !== null) {
|
80
|
+
if (match[1] !== void 0) {
|
81
|
+
result.push(match[1]);
|
82
|
+
} else if (match[2] !== void 0) {
|
83
|
+
result.push(Number(match[2]));
|
84
|
+
}
|
85
|
+
}
|
86
|
+
return { path: result };
|
87
|
+
};
|
88
|
+
var pathify = (path2) => {
|
89
|
+
if (isString(path2)) {
|
90
|
+
return parsePath(path2);
|
91
|
+
}
|
92
|
+
return path2;
|
93
|
+
};
|
94
|
+
var getPathValue = (object, initialPath) => {
|
95
|
+
const path2 = pathify(initialPath);
|
96
|
+
let current = object;
|
97
|
+
for (const key of path2.path) {
|
98
|
+
if (isPrimitive(current)) {
|
99
|
+
return void 0;
|
100
|
+
}
|
101
|
+
current = current[key];
|
102
|
+
}
|
103
|
+
return current;
|
104
|
+
};
|
105
|
+
var applyPathValue = (object, initialPath, value) => {
|
106
|
+
const path2 = pathify(initialPath);
|
107
|
+
const newObject = update(object, (draft) => {
|
108
|
+
let current = draft;
|
109
|
+
for (let i = 0; i < path2.path.length; i++) {
|
110
|
+
const key = path2.path[i];
|
111
|
+
const isLastKey = i === path2.path.length - 1;
|
112
|
+
if (isPrimitive(current)) {
|
113
|
+
return;
|
114
|
+
}
|
115
|
+
if (Array.isArray(current)) {
|
116
|
+
if (!isNumber(key)) {
|
117
|
+
return;
|
118
|
+
}
|
119
|
+
if (key >= current.length) {
|
120
|
+
return;
|
121
|
+
}
|
122
|
+
}
|
123
|
+
if (isLastKey) {
|
124
|
+
current[key] = value;
|
125
|
+
} else {
|
126
|
+
current = current[key];
|
127
|
+
}
|
128
|
+
}
|
129
|
+
});
|
130
|
+
if (newObject === object) {
|
131
|
+
return void 0;
|
132
|
+
}
|
133
|
+
return newObject;
|
134
|
+
};
|
135
|
+
var isPrimitive = (value) => {
|
136
|
+
return value === null || typeof value !== "object" && typeof value !== "function";
|
137
|
+
};
|
138
|
+
var getAttribute = (record, attribute) => {
|
139
|
+
return record[attribute];
|
140
|
+
};
|
141
|
+
var coerceNil = (value) => {
|
142
|
+
return isNil(value) ? void 0 : value;
|
143
|
+
};
|
144
|
+
export {
|
145
|
+
applyPathValue,
|
146
|
+
clone,
|
147
|
+
cloneDeep,
|
148
|
+
coerceNil,
|
149
|
+
deepEqual,
|
150
|
+
diffShallow,
|
151
|
+
fieldsPresent,
|
152
|
+
getAttribute,
|
153
|
+
getPathValue,
|
154
|
+
invert,
|
155
|
+
isNil,
|
156
|
+
isObject,
|
157
|
+
isPlainObject,
|
158
|
+
isPresent,
|
159
|
+
isUndefined,
|
160
|
+
isValidKey,
|
161
|
+
mapValues,
|
162
|
+
merge,
|
163
|
+
mergeAll,
|
164
|
+
mergeInto,
|
165
|
+
mergeWith,
|
166
|
+
parsePath,
|
167
|
+
path,
|
168
|
+
update
|
169
|
+
};
|
170
|
+
//# sourceMappingURL=object.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/object.ts"],"sourcesContent":["import {\n clone as _clone,\n cloneDeep as _cloneDeep,\n invert as _invert,\n isEqual as _isEqual,\n isNil as _isNil,\n isNumber,\n isObject as _isObject,\n isPlainObject as _isPlainObject,\n isString,\n isUndefined as _isUndefined,\n mapValues as _mapValues,\n merge as unsafeMerge,\n mergeWith as unsafeMergeWith,\n} from 'lodash-es'\nimport { produce } from 'immer'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport { Primitive, UnknownRecord } from 'type-fest'\n\nexport const update: typeof produce = produce\n\nexport const isUndefined = _isUndefined\nexport const isNil = _isNil\nexport const isPresent = <T>(value: T): value is NonNullable<T> => {\n return !isNil(value)\n}\nexport const isObject = _isObject\nexport const isPlainObject = _isPlainObject\nexport const deepEqual = _isEqual\nexport const invert = _invert\nexport const mapValues = _mapValues\n\nexport const clone = _clone\nexport const cloneDeep = _cloneDeep\n\nexport const mergeAll = <T>(objects: Array<T>): T => {\n return objects.reduce((x, y) => merge(x, y))\n}\n\nexport function merge<TObject, TSource>(object: TObject, source: TSource): TObject & TSource\nexport function merge<TObject, TSource1, TSource2>(object: TObject, source1: TSource1, source2: TSource2): TObject & TSource1 & TSource2\nexport function merge<TObject, TSource1, TSource2, TSource3>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3\n): TObject & TSource1 & TSource2 & TSource3\nexport function merge<TObject, TSource1, TSource2, TSource3, TSource4>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3,\n source4: TSource4\n): TObject & TSource1 & TSource2 & TSource3 & TSource4\nexport function merge(object: any, ...otherArgs: any[]): any {\n return unsafeMerge({}, object, ...otherArgs)\n}\n\nexport function mergeInto<Source1, Source2>(source: Source1, values: Source2): asserts source is Source1 & Source2 {\n unsafeMerge(source, values)\n}\n\nexport const mergeWith: typeof unsafeMergeWith = (...args: Array<any>) => {\n const clone = cloneDeep(args[0])\n return unsafeMergeWith.apply(null, [clone, ...args.slice(1)])\n}\n\nexport type ObjectDiffResult = {\n elementsUpdated: Record<string, { originalValue: unknown; updatedValue: unknown }>\n elementsAdded: UnknownRecord\n elementsRemoved: UnknownRecord\n}\n\nexport function diffShallow(original: UnknownRecord, updated: UnknownRecord): ObjectDiffResult {\n const result: ObjectDiffResult = {\n elementsUpdated: {},\n elementsAdded: {},\n elementsRemoved: {},\n }\n\n for (const [key, originalValue] of Object.entries(original)) {\n const updatedValue = updated[key]\n if (updatedValue === undefined) {\n result.elementsRemoved[key] = originalValue\n } else if (!deepEqual(originalValue, updatedValue)) {\n result.elementsUpdated[key] = { originalValue: originalValue, updatedValue: updatedValue }\n }\n }\n\n for (const [key, updatedValue] of Object.entries(updated)) {\n const originalValue = original[key]\n if (originalValue === undefined) {\n result.elementsAdded[key] = updatedValue\n }\n }\n return result\n}\n\nexport const isValidKey = (field: PropertyKey, obj: object): field is keyof typeof obj => {\n return field in obj\n}\n\n/** Determines if the list of fields are present on the object (not null or undefined), with type inference */\nexport function fieldsPresent<T extends object, K extends keyof T>(\n object: T,\n fields: Array<K>\n): object is Exclude<T, K> & Required<{ [P in K]: NonNullable<T[P]> }> {\n return fields.every((field) => isPresent(object[field]))\n}\n\nexport type ObjectPath = {\n path: Array<string | number>\n}\n\nexport const path = (path: Array<string | number>): ObjectPath => {\n return { path }\n}\n\nexport const parsePath = (path: string): ObjectPath => {\n const result: Array<string | number> = []\n const regex = /([^.\\[\\]]+)|\\[(\\d+)]/g\n\n let match: RegExpExecArray | null\n while ((match = regex.exec(path)) !== null) {\n if (match[1] !== undefined) {\n result.push(match[1])\n } else if (match[2] !== undefined) {\n result.push(Number(match[2]))\n }\n }\n\n return { path: result }\n}\n\nconst pathify = (path: ObjectPath | string): ObjectPath => {\n if (isString(path)) {\n return parsePath(path)\n }\n\n return path as ObjectPath\n}\n\nexport const getPathValue = (object: UnknownRecord, initialPath: ObjectPath | string): unknown | undefined => {\n const path = pathify(initialPath)\n let current: any = object\n\n for (const key of path.path) {\n if (isPrimitive(current)) {\n return undefined\n }\n\n current = current[key]\n }\n\n return current\n}\n\nexport const applyPathValue = (object: UnknownRecord, initialPath: ObjectPath | string, value: unknown): UnknownRecord | undefined => {\n const path = pathify(initialPath)\n\n const newObject = update(object, (draft) => {\n let current: any = draft\n\n for (let i = 0; i < path.path.length; i++) {\n const key = path.path[i]!\n const isLastKey = i === path.path.length - 1\n\n if (isPrimitive(current)) {\n return\n }\n\n if (Array.isArray(current)) {\n if (!isNumber(key)) {\n return\n }\n\n if (key >= current.length) {\n return\n }\n }\n\n if (isLastKey) {\n current[key] = value\n } else {\n current = current[key]\n }\n }\n })\n\n if (newObject === object) {\n return undefined\n }\n\n return newObject\n}\n\nconst isPrimitive = (value: any): value is Primitive => {\n return value === null || (typeof value !== 'object' && typeof value !== 'function')\n}\n\ntype TransformFunction = (value: any, path: (string | number)[], key: string | number, parent: any) => any\n\nconst walk = (value: any, transform: TransformFunction, path: (string | number)[] = []): any => {\n if (isNil(value) || isPrimitive(value)) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((value, index) => {\n const currentPath = [...path, index]\n return walk(transform(value, currentPath, index, value), transform, currentPath)\n })\n }\n\n const result: any = {}\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const currentPath = [...path, key]\n const transformedValue = transform(value[key], currentPath, key, value)\n result[key] = walk(transformedValue, transform, currentPath)\n }\n }\n\n return result\n}\n\nexport type RecordAttribute<Type = unknown, Class extends string = 'RecordAttribute'> = NominalType<string, [Type, Class]>\ntype RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never\n\nexport const getAttribute = <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T): RecordAttributeType<T> | undefined => {\n return record[attribute] as RecordAttributeType<T> | undefined\n}\n\nexport const coerceNil = <T>(value: T | null | undefined): T | undefined => {\n return isNil(value) ? undefined : value\n}\n"],"mappings":";AAAA;AAAA,EACE,SAAS;AAAA,EACT,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT;AAAA,EACA,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,SAAS;AAAA,EACT,aAAa;AAAA,OACR;AACP,SAAS,eAAe;AAIjB,IAAM,SAAyB;AAE/B,IAAM,cAAc;AACpB,IAAM,QAAQ;AACd,IAAM,YAAY,CAAI,UAAsC;AACjE,SAAO,CAAC,MAAM,KAAK;AACrB;AACO,IAAM,WAAW;AACjB,IAAM,gBAAgB;AACtB,IAAM,YAAY;AAClB,IAAM,SAAS;AACf,IAAM,YAAY;AAElB,IAAM,QAAQ;AACd,IAAM,YAAY;AAElB,IAAM,WAAW,CAAI,YAAyB;AACnD,SAAO,QAAQ,OAAO,CAAC,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC;AAC7C;AAiBO,SAAS,MAAM,WAAgB,WAAuB;AAC3D,SAAO,YAAY,CAAC,GAAG,QAAQ,GAAG,SAAS;AAC7C;AAEO,SAAS,UAA4B,QAAiB,QAAsD;AACjH,cAAY,QAAQ,MAAM;AAC5B;AAEO,IAAM,YAAoC,IAAI,SAAqB;AACxE,QAAMA,SAAQ,UAAU,KAAK,CAAC,CAAC;AAC/B,SAAO,gBAAgB,MAAM,MAAM,CAACA,QAAO,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC;AAC9D;AAQO,SAAS,YAAY,UAAyB,SAA0C;AAC7F,QAAM,SAA2B;AAAA,IAC/B,iBAAiB,CAAC;AAAA,IAClB,eAAe,CAAC;AAAA,IAChB,iBAAiB,CAAC;AAAA,EACpB;AAEA,aAAW,CAAC,KAAK,aAAa,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC3D,UAAM,eAAe,QAAQ,GAAG;AAChC,QAAI,iBAAiB,QAAW;AAC9B,aAAO,gBAAgB,GAAG,IAAI;AAAA,IAChC,WAAW,CAAC,UAAU,eAAe,YAAY,GAAG;AAClD,aAAO,gBAAgB,GAAG,IAAI,EAAE,eAA8B,aAA2B;AAAA,IAC3F;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,YAAY,KAAK,OAAO,QAAQ,OAAO,GAAG;AACzD,UAAM,gBAAgB,SAAS,GAAG;AAClC,QAAI,kBAAkB,QAAW;AAC/B,aAAO,cAAc,GAAG,IAAI;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,aAAa,CAAC,OAAoB,QAA2C;AACxF,SAAO,SAAS;AAClB;AAGO,SAAS,cACd,QACA,QACqE;AACrE,SAAO,OAAO,MAAM,CAAC,UAAU,UAAU,OAAO,KAAK,CAAC,CAAC;AACzD;AAMO,IAAM,OAAO,CAACC,UAA6C;AAChE,SAAO,EAAE,MAAAA,MAAK;AAChB;AAEO,IAAM,YAAY,CAACA,UAA6B;AACrD,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ;AAEd,MAAI;AACJ,UAAQ,QAAQ,MAAM,KAAKA,KAAI,OAAO,MAAM;AAC1C,QAAI,MAAM,CAAC,MAAM,QAAW;AAC1B,aAAO,KAAK,MAAM,CAAC,CAAC;AAAA,IACtB,WAAW,MAAM,CAAC,MAAM,QAAW;AACjC,aAAO,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,IAAM,UAAU,CAACA,UAA0C;AACzD,MAAI,SAASA,KAAI,GAAG;AAClB,WAAO,UAAUA,KAAI;AAAA,EACvB;AAEA,SAAOA;AACT;AAEO,IAAM,eAAe,CAAC,QAAuB,gBAA0D;AAC5G,QAAMA,QAAO,QAAQ,WAAW;AAChC,MAAI,UAAe;AAEnB,aAAW,OAAOA,MAAK,MAAM;AAC3B,QAAI,YAAY,OAAO,GAAG;AACxB,aAAO;AAAA,IACT;AAEA,cAAU,QAAQ,GAAG;AAAA,EACvB;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAAC,QAAuB,aAAkC,UAA8C;AACpI,QAAMA,QAAO,QAAQ,WAAW;AAEhC,QAAM,YAAY,OAAO,QAAQ,CAAC,UAAU;AAC1C,QAAI,UAAe;AAEnB,aAAS,IAAI,GAAG,IAAIA,MAAK,KAAK,QAAQ,KAAK;AACzC,YAAM,MAAMA,MAAK,KAAK,CAAC;AACvB,YAAM,YAAY,MAAMA,MAAK,KAAK,SAAS;AAE3C,UAAI,YAAY,OAAO,GAAG;AACxB;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAI,CAAC,SAAS,GAAG,GAAG;AAClB;AAAA,QACF;AAEA,YAAI,OAAO,QAAQ,QAAQ;AACzB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW;AACb,gBAAQ,GAAG,IAAI;AAAA,MACjB,OAAO;AACL,kBAAU,QAAQ,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,cAAc,QAAQ;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,cAAc,CAAC,UAAmC;AACtD,SAAO,UAAU,QAAS,OAAO,UAAU,YAAY,OAAO,UAAU;AAC1E;AA+BO,IAAM,eAAe,CAA6C,QAAuB,cAAqD;AACnJ,SAAO,OAAO,SAAS;AACzB;AAEO,IAAM,YAAY,CAAI,UAA+C;AAC1E,SAAO,MAAM,KAAK,IAAI,SAAY;AACpC;","names":["clone","path"]}
|
package/dist/patch.d.ts
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
import { EvaluateExpression, Expression, ReducingExpression } from '@bessemer/cornerstone/expression';
|
2
|
+
import { UnknownRecord } from 'type-fest';
|
3
|
+
export declare enum PatchType {
|
4
|
+
Set = "Set",
|
5
|
+
Apply = "Apply",
|
6
|
+
Patch = "Patch"
|
7
|
+
}
|
8
|
+
export type SetPatch<T> = {
|
9
|
+
_PatchType: PatchType.Set;
|
10
|
+
value: Expression<T>;
|
11
|
+
};
|
12
|
+
export type ApplyPatch<T> = {
|
13
|
+
_PatchType: PatchType.Apply;
|
14
|
+
value: Expression<T>;
|
15
|
+
reducer: ReducingExpression<T, T>;
|
16
|
+
};
|
17
|
+
export type PatchPatch<T> = {
|
18
|
+
_PatchType: PatchType.Patch;
|
19
|
+
patch: Patchable<T>;
|
20
|
+
};
|
21
|
+
export type Patch<T> = SetPatch<T> | ApplyPatch<T> | PatchPatch<T>;
|
22
|
+
export type PatchValue<T> = {
|
23
|
+
value: T;
|
24
|
+
patch: Patch<T>;
|
25
|
+
};
|
26
|
+
export type Patchable<T> = {
|
27
|
+
[P in keyof T]?: T[P] extends Array<infer U> ? Patch<U[]> | Patchable<U[]> : T[P] extends object | undefined ? Patch<T[P]> | Patchable<T[P]> : Patch<T[P]> | T[P];
|
28
|
+
};
|
29
|
+
export declare const set: <T>(value: Expression<T>) => Patch<T>;
|
30
|
+
export declare const apply: <T>(value: Expression<T>, reducer: ReducingExpression<T, T>) => Patch<T>;
|
31
|
+
export declare const patch: <T extends UnknownRecord, N extends Patchable<T> = Patchable<T>>(patch: N) => Patch<T>;
|
32
|
+
export declare const sum: (value: Expression<number>) => Patch<number>;
|
33
|
+
export declare const multiply: (value: Expression<number>) => Patch<number>;
|
34
|
+
export declare const concatenate: <T extends Array<Expression<unknown>>>(value: Expression<T>) => Patch<T>;
|
35
|
+
export type ResolvePatchesResult<T> = {
|
36
|
+
value: T;
|
37
|
+
patchValues: Array<PatchValue<T>>;
|
38
|
+
};
|
39
|
+
export declare const resolveWithDetails: <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression) => ResolvePatchesResult<T>;
|
40
|
+
export declare const resolve: <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression) => T;
|
41
|
+
//# sourceMappingURL=patch.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"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"}
|
package/dist/patch.js
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
// src/patch.ts
|
2
|
+
import {
|
3
|
+
ArrayExpressions,
|
4
|
+
Expressions,
|
5
|
+
NumericExpressions
|
6
|
+
} from "@bessemer/cornerstone/expression";
|
7
|
+
import { Objects, Preconditions } from "@bessemer/cornerstone";
|
8
|
+
var PatchType = /* @__PURE__ */ ((PatchType2) => {
|
9
|
+
PatchType2["Set"] = "Set";
|
10
|
+
PatchType2["Apply"] = "Apply";
|
11
|
+
PatchType2["Patch"] = "Patch";
|
12
|
+
return PatchType2;
|
13
|
+
})(PatchType || {});
|
14
|
+
var set = (value) => {
|
15
|
+
return {
|
16
|
+
_PatchType: "Set" /* Set */,
|
17
|
+
value
|
18
|
+
};
|
19
|
+
};
|
20
|
+
var apply = (value, reducer) => {
|
21
|
+
return {
|
22
|
+
_PatchType: "Apply" /* Apply */,
|
23
|
+
value,
|
24
|
+
reducer
|
25
|
+
};
|
26
|
+
};
|
27
|
+
var patch = (patch2) => {
|
28
|
+
return {
|
29
|
+
_PatchType: "Patch" /* Patch */,
|
30
|
+
patch: patch2
|
31
|
+
};
|
32
|
+
};
|
33
|
+
var sum = (value) => {
|
34
|
+
return apply(value, Expressions.reference(NumericExpressions.SumExpression));
|
35
|
+
};
|
36
|
+
var multiply = (value) => {
|
37
|
+
return apply(value, Expressions.reference(NumericExpressions.MultiplyExpression));
|
38
|
+
};
|
39
|
+
var concatenate = (value) => {
|
40
|
+
return apply(value, Expressions.reference(ArrayExpressions.ConcatenateExpression));
|
41
|
+
};
|
42
|
+
var resolveWithDetails = (value, patches, evaluate) => {
|
43
|
+
let currentValue = value;
|
44
|
+
const patchValues = patches.map((patch2) => {
|
45
|
+
switch (patch2._PatchType) {
|
46
|
+
case "Set" /* Set */:
|
47
|
+
currentValue = evaluate(patch2.value);
|
48
|
+
break;
|
49
|
+
case "Apply" /* Apply */:
|
50
|
+
currentValue = evaluate(Expressions.dereference(patch2.reducer, [currentValue, patch2.value]));
|
51
|
+
break;
|
52
|
+
case "Patch" /* Patch */:
|
53
|
+
currentValue = applyPatch(currentValue, patch2.patch, evaluate);
|
54
|
+
break;
|
55
|
+
default:
|
56
|
+
Preconditions.isUnreachable(() => `Unrecognized PatchType for value: ${JSON.stringify(it)}`);
|
57
|
+
}
|
58
|
+
return { value: currentValue, patch: patch2 };
|
59
|
+
});
|
60
|
+
return { value: currentValue, patchValues };
|
61
|
+
};
|
62
|
+
var resolve = (value, patches, evaluate) => {
|
63
|
+
return resolveWithDetails(value, patches, evaluate).value;
|
64
|
+
};
|
65
|
+
var applyPatch = (value, patch2, evaluate) => {
|
66
|
+
return Objects.mergeWith(value, patch2, (value2, patch3) => {
|
67
|
+
if (Objects.isNil(patch3)) {
|
68
|
+
return value2;
|
69
|
+
}
|
70
|
+
if (!Objects.isObject(patch3) || !("_PatchType" in patch3)) {
|
71
|
+
return void 0;
|
72
|
+
}
|
73
|
+
return evaluate(resolve(value2, [patch3], evaluate));
|
74
|
+
});
|
75
|
+
};
|
76
|
+
export {
|
77
|
+
PatchType,
|
78
|
+
apply,
|
79
|
+
concatenate,
|
80
|
+
multiply,
|
81
|
+
patch,
|
82
|
+
resolve,
|
83
|
+
resolveWithDetails,
|
84
|
+
set,
|
85
|
+
sum
|
86
|
+
};
|
87
|
+
//# sourceMappingURL=patch.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/patch.ts"],"sourcesContent":["import {\n ArrayExpressions,\n EvaluateExpression,\n Expression,\n Expressions,\n NumericExpressions,\n ReducingExpression,\n} from '@bessemer/cornerstone/expression'\nimport { Objects, Preconditions } from '@bessemer/cornerstone'\nimport { UnknownRecord } from 'type-fest'\n\nexport enum PatchType {\n Set = 'Set',\n Apply = 'Apply',\n Patch = 'Patch',\n}\n\nexport type SetPatch<T> = {\n _PatchType: PatchType.Set\n value: Expression<T>\n}\n\nexport type ApplyPatch<T> = {\n _PatchType: PatchType.Apply\n value: Expression<T>\n reducer: ReducingExpression<T, T>\n}\n\nexport type PatchPatch<T> = {\n _PatchType: PatchType.Patch\n patch: Patchable<T>\n}\n\nexport type Patch<T> = SetPatch<T> | ApplyPatch<T> | PatchPatch<T>\n\nexport type PatchValue<T> = {\n value: T\n patch: Patch<T>\n}\n\nexport type Patchable<T> = {\n [P in keyof T]?: T[P] extends Array<infer U>\n ? Patch<U[]> | Patchable<U[]>\n : T[P] extends object | undefined\n ? Patch<T[P]> | Patchable<T[P]>\n : Patch<T[P]> | T[P]\n}\n\nexport const set = <T>(value: Expression<T>): Patch<T> => {\n return {\n _PatchType: PatchType.Set,\n value: value as any,\n }\n}\n\nexport const apply = <T>(value: Expression<T>, reducer: ReducingExpression<T, T>): Patch<T> => {\n return {\n _PatchType: PatchType.Apply,\n value,\n reducer,\n }\n}\n\nexport const patch = <T extends UnknownRecord, N extends Patchable<T> = Patchable<T>>(patch: N): Patch<T> => {\n return {\n _PatchType: PatchType.Patch,\n patch,\n }\n}\n\nexport const sum = (value: Expression<number>): Patch<number> => {\n return apply(value, Expressions.reference(NumericExpressions.SumExpression))\n}\n\nexport const multiply = (value: Expression<number>): Patch<number> => {\n return apply(value, Expressions.reference(NumericExpressions.MultiplyExpression))\n}\n\nexport const concatenate = <T extends Array<Expression<unknown>>>(value: Expression<T>): Patch<T> => {\n return apply(value, Expressions.reference(ArrayExpressions.ConcatenateExpression)) as Patch<T>\n}\n\nexport type ResolvePatchesResult<T> = {\n value: T\n patchValues: Array<PatchValue<T>>\n}\n\nexport const resolveWithDetails = <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression): ResolvePatchesResult<T> => {\n let currentValue: T = value\n\n const patchValues = patches.map((patch) => {\n switch (patch._PatchType) {\n case PatchType.Set:\n currentValue = evaluate(patch.value)\n break\n case PatchType.Apply:\n currentValue = evaluate(Expressions.dereference(patch.reducer, [currentValue, patch.value]))\n break\n case PatchType.Patch:\n currentValue = applyPatch(currentValue, patch.patch, evaluate)\n break\n default:\n Preconditions.isUnreachable(() => `Unrecognized PatchType for value: ${JSON.stringify(it)}`)\n }\n\n return { value: currentValue, patch }\n })\n\n return { value: currentValue, patchValues }\n}\n\nexport const resolve = <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression): T => {\n return resolveWithDetails(value, patches, evaluate).value\n}\n\nconst applyPatch = <T>(value: T, patch: Patchable<T>, evaluate: EvaluateExpression): T => {\n return Objects.mergeWith(value, patch, (value, patch) => {\n if (Objects.isNil(patch)) {\n return value\n }\n\n if (!Objects.isObject(patch) || !('_PatchType' in patch)) {\n return undefined\n }\n\n return evaluate(resolve(value, [patch as Patch<T>], evaluate))\n })\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,SAAS,qBAAqB;AAGhC,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;AAqCL,IAAM,MAAM,CAAI,UAAmC;AACxD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAI,OAAsB,YAAgD;AAC7F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAiEC,WAAuB;AAC3G,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAAA;AAAA,EACF;AACF;AAEO,IAAM,MAAM,CAAC,UAA6C;AAC/D,SAAO,MAAM,OAAO,YAAY,UAAU,mBAAmB,aAAa,CAAC;AAC7E;AAEO,IAAM,WAAW,CAAC,UAA6C;AACpE,SAAO,MAAM,OAAO,YAAY,UAAU,mBAAmB,kBAAkB,CAAC;AAClF;AAEO,IAAM,cAAc,CAAuC,UAAmC;AACnG,SAAO,MAAM,OAAO,YAAY,UAAU,iBAAiB,qBAAqB,CAAC;AACnF;AAOO,IAAM,qBAAqB,CAAI,OAAU,SAA0B,aAA0D;AAClI,MAAI,eAAkB;AAEtB,QAAM,cAAc,QAAQ,IAAI,CAACA,WAAU;AACzC,YAAQA,OAAM,YAAY;AAAA,MACxB,KAAK;AACH,uBAAe,SAASA,OAAM,KAAK;AACnC;AAAA,MACF,KAAK;AACH,uBAAe,SAAS,YAAY,YAAYA,OAAM,SAAS,CAAC,cAAcA,OAAM,KAAK,CAAC,CAAC;AAC3F;AAAA,MACF,KAAK;AACH,uBAAe,WAAW,cAAcA,OAAM,OAAO,QAAQ;AAC7D;AAAA,MACF;AACE,sBAAc,cAAc,MAAM,qCAAqC,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,IAC/F;AAEA,WAAO,EAAE,OAAO,cAAc,OAAAA,OAAM;AAAA,EACtC,CAAC;AAED,SAAO,EAAE,OAAO,cAAc,YAAY;AAC5C;AAEO,IAAM,UAAU,CAAI,OAAU,SAA0B,aAAoC;AACjG,SAAO,mBAAmB,OAAO,SAAS,QAAQ,EAAE;AACtD;AAEA,IAAM,aAAa,CAAI,OAAUA,QAAqB,aAAoC;AACxF,SAAO,QAAQ,UAAU,OAAOA,QAAO,CAACC,QAAOD,WAAU;AACvD,QAAI,QAAQ,MAAMA,MAAK,GAAG;AACxB,aAAOC;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,SAASD,MAAK,KAAK,EAAE,gBAAgBA,SAAQ;AACxD,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,QAAQC,QAAO,CAACD,MAAiB,GAAG,QAAQ,CAAC;AAAA,EAC/D,CAAC;AACH;","names":["PatchType","patch","value"]}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import { LazyValue } from '@bessemer/cornerstone/lazy';
|
2
|
+
import { Nil } from '@bessemer/cornerstone/types';
|
3
|
+
export declare function isUnreachable(message?: LazyValue<string>): never;
|
4
|
+
export declare function isTrue(value: boolean, message?: LazyValue<string>): asserts value is true;
|
5
|
+
export declare function isFalse(value: boolean, message?: LazyValue<string>): asserts value is false;
|
6
|
+
export declare function isNil(value: any, message?: LazyValue<string>): asserts value is Nil;
|
7
|
+
export declare function isPresent<T>(value: T, message?: LazyValue<string>): asserts value is NonNullable<T>;
|
8
|
+
//# sourceMappingURL=precondition.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"precondition.d.ts","sourceRoot":"","sources":["../src/precondition.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAA;AAEjD,wBAAgB,aAAa,CAAC,OAAO,GAAE,SAAS,CAAC,MAAM,CAA6C,GAAG,KAAK,CAE3G;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,SAAS,CAAC,MAAM,CAA4C,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAInI;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,SAAS,CAAC,MAAM,CAA6C,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAEtI;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,SAAS,CAAC,MAAM,CAA2C,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAE5H;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,GAAE,SAAS,CAAC,MAAM,CAA+C,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEhJ"}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
// src/precondition.ts
|
2
|
+
import { Lazy, Objects } from "@bessemer/cornerstone";
|
3
|
+
function isUnreachable(message = "Preconditions.isUnreachable was reached") {
|
4
|
+
throw new Error(Lazy.evaluate(message));
|
5
|
+
}
|
6
|
+
function isTrue(value, message = "Preconditions.isTrue failed validation") {
|
7
|
+
if (!value) {
|
8
|
+
throw new Error(Lazy.evaluate(message));
|
9
|
+
}
|
10
|
+
}
|
11
|
+
function isFalse(value, message = "Preconditions.isFalse failed validation") {
|
12
|
+
return isTrue(!value, message);
|
13
|
+
}
|
14
|
+
function isNil(value, message = "Preconditions.isNil failed validation") {
|
15
|
+
return isTrue(Objects.isNil(value), message);
|
16
|
+
}
|
17
|
+
function isPresent(value, message = "Preconditions.isPresent failed validation") {
|
18
|
+
return isTrue(Objects.isPresent(value), message);
|
19
|
+
}
|
20
|
+
export {
|
21
|
+
isFalse,
|
22
|
+
isNil,
|
23
|
+
isPresent,
|
24
|
+
isTrue,
|
25
|
+
isUnreachable
|
26
|
+
};
|
27
|
+
//# sourceMappingURL=precondition.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/precondition.ts"],"sourcesContent":["import { Lazy, Objects } from '@bessemer/cornerstone'\nimport { LazyValue } from '@bessemer/cornerstone/lazy'\nimport { Nil } from '@bessemer/cornerstone/types'\n\nexport function isUnreachable(message: LazyValue<string> = 'Preconditions.isUnreachable was reached'): never {\n throw new Error(Lazy.evaluate(message))\n}\n\nexport function isTrue(value: boolean, message: LazyValue<string> = 'Preconditions.isTrue failed validation'): asserts value is true {\n if (!value) {\n throw new Error(Lazy.evaluate(message))\n }\n}\n\nexport function isFalse(value: boolean, message: LazyValue<string> = 'Preconditions.isFalse failed validation'): asserts value is false {\n return isTrue(!value, message)\n}\n\nexport function isNil(value: any, message: LazyValue<string> = 'Preconditions.isNil failed validation'): asserts value is Nil {\n return isTrue(Objects.isNil(value), message)\n}\n\nexport function isPresent<T>(value: T, message: LazyValue<string> = 'Preconditions.isPresent failed validation'): asserts value is NonNullable<T> {\n return isTrue(Objects.isPresent(value), message)\n}\n"],"mappings":";AAAA,SAAS,MAAM,eAAe;AAIvB,SAAS,cAAc,UAA6B,2CAAkD;AAC3G,QAAM,IAAI,MAAM,KAAK,SAAS,OAAO,CAAC;AACxC;AAEO,SAAS,OAAO,OAAgB,UAA6B,0CAAiE;AACnI,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,KAAK,SAAS,OAAO,CAAC;AAAA,EACxC;AACF;AAEO,SAAS,QAAQ,OAAgB,UAA6B,2CAAmE;AACtI,SAAO,OAAO,CAAC,OAAO,OAAO;AAC/B;AAEO,SAAS,MAAM,OAAY,UAA6B,yCAA+D;AAC5H,SAAO,OAAO,QAAQ,MAAM,KAAK,GAAG,OAAO;AAC7C;AAEO,SAAS,UAAa,OAAU,UAA6B,6CAA8E;AAChJ,SAAO,OAAO,QAAQ,UAAU,KAAK,GAAG,OAAO;AACjD;","names":[]}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
export type PromiseContext<T> = {
|
2
|
+
promise: Promise<T>;
|
3
|
+
resolve: (value: T) => void;
|
4
|
+
reject: (reason?: any) => void;
|
5
|
+
};
|
6
|
+
export declare const isPromise: <T>(element: T | Promise<T>) => element is Promise<T>;
|
7
|
+
export declare const create: <T>() => PromiseContext<T>;
|
8
|
+
//# sourceMappingURL=promise.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAAE,CAAA;AAEpH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAE1E,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,OAAK,cAAc,CAAC,CAAC,CAS5C,CAAA"}
|
package/dist/promise.js
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
// src/promise.ts
|
2
|
+
var isPromise = (element) => {
|
3
|
+
return typeof element.then === "function";
|
4
|
+
};
|
5
|
+
var create = () => {
|
6
|
+
let resolveVar;
|
7
|
+
let rejectVar;
|
8
|
+
const promise = new Promise((resolve, reject) => {
|
9
|
+
resolveVar = resolve;
|
10
|
+
rejectVar = reject;
|
11
|
+
});
|
12
|
+
return { promise, resolve: resolveVar, reject: rejectVar };
|
13
|
+
};
|
14
|
+
export {
|
15
|
+
create,
|
16
|
+
isPromise
|
17
|
+
};
|
18
|
+
//# sourceMappingURL=promise.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/promise.ts"],"sourcesContent":["export type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element: T | Promise<T>): element is Promise<T> => {\n return typeof (element as Promise<T>).then === 'function'\n}\n\nexport const create = <T>(): PromiseContext<T> => {\n let resolveVar\n let rejectVar\n const promise = new Promise<T>((resolve, reject) => {\n resolveVar = resolve\n rejectVar = reject\n })\n\n return { promise, resolve: resolveVar!, reject: rejectVar! }\n}\n"],"mappings":";AAEO,IAAM,YAAY,CAAI,YAAmD;AAC9E,SAAO,OAAQ,QAAuB,SAAS;AACjD;AAEO,IAAM,SAAS,MAA4B;AAChD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAClD,iBAAa;AACb,gBAAY;AAAA,EACd,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,YAAa,QAAQ,UAAW;AAC7D;","names":[]}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
import { SerializedTags, Tag, TaggedValue } from '@bessemer/cornerstone/tag';
|
2
|
+
import { UnknownRecord } from 'type-fest';
|
3
|
+
import { DeepPartial } from '@bessemer/cornerstone/types';
|
4
|
+
export type PropertyRecord<T extends UnknownRecord> = {
|
5
|
+
values: T;
|
6
|
+
overrides: Record<SerializedTags, PropertyOverride<T>>;
|
7
|
+
};
|
8
|
+
export type PropertyOverride<T> = TaggedValue<DeepPartial<T>>;
|
9
|
+
export declare const properties: <T extends UnknownRecord>(values: T, overrides?: Array<PropertyOverride<T>>) => PropertyRecord<T>;
|
10
|
+
export declare const resolve: <T extends UnknownRecord>(properties: PropertyRecord<T>, tags: Array<Tag>) => T;
|
11
|
+
//# sourceMappingURL=property.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,aAAa,IAAI;IACpD,MAAM,EAAE,CAAC,CAAA;IACT,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAE7D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,aAAa,EAAE,QAAQ,CAAC,EAAE,YAAY,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAWvH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,aAAa,EAAE,YAAY,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,KAAG,CAGlG,CAAA"}
|
package/dist/property.js
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
// src/property.ts
|
2
|
+
import { Objects, Tags } from "@bessemer/cornerstone";
|
3
|
+
var properties = (values, overrides) => {
|
4
|
+
const propertyOverrideEntries = (overrides ?? []).map((override) => {
|
5
|
+
return [Tags.serializeTags(override.tags), override];
|
6
|
+
});
|
7
|
+
const propertyOverrides = Object.fromEntries(propertyOverrideEntries);
|
8
|
+
return {
|
9
|
+
values,
|
10
|
+
overrides: propertyOverrides
|
11
|
+
};
|
12
|
+
};
|
13
|
+
var resolve = (properties2, tags) => {
|
14
|
+
const overrides = Tags.resolve(Object.values(properties2.overrides), tags);
|
15
|
+
return Objects.mergeAll([properties2.values, ...overrides.reverse()]);
|
16
|
+
};
|
17
|
+
export {
|
18
|
+
properties,
|
19
|
+
resolve
|
20
|
+
};
|
21
|
+
//# sourceMappingURL=property.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/property.ts"],"sourcesContent":["import { Objects, Tags } from '@bessemer/cornerstone'\nimport { SerializedTags, Tag, TaggedValue } from '@bessemer/cornerstone/tag'\nimport { UnknownRecord } from 'type-fest'\nimport { DeepPartial } from '@bessemer/cornerstone/types'\n\nexport type PropertyRecord<T extends UnknownRecord> = {\n values: T\n overrides: Record<SerializedTags, PropertyOverride<T>>\n}\n\nexport type PropertyOverride<T> = TaggedValue<DeepPartial<T>>\n\nexport const properties = <T extends UnknownRecord>(values: T, overrides?: Array<PropertyOverride<T>>): PropertyRecord<T> => {\n const propertyOverrideEntries = (overrides ?? []).map((override) => {\n return [Tags.serializeTags(override.tags), override]\n })\n\n const propertyOverrides: Record<SerializedTags, PropertyOverride<T>> = Object.fromEntries(propertyOverrideEntries)\n\n return {\n values,\n overrides: propertyOverrides,\n }\n}\n\nexport const resolve = <T extends UnknownRecord>(properties: PropertyRecord<T>, tags: Array<Tag>): T => {\n const overrides = Tags.resolve(Object.values(properties.overrides), tags)\n return Objects.mergeAll([properties.values, ...overrides.reverse()]) as T\n}\n"],"mappings":";AAAA,SAAS,SAAS,YAAY;AAYvB,IAAM,aAAa,CAA0B,QAAW,cAA8D;AAC3H,QAAM,2BAA2B,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa;AAClE,WAAO,CAAC,KAAK,cAAc,SAAS,IAAI,GAAG,QAAQ;AAAA,EACrD,CAAC;AAED,QAAM,oBAAiE,OAAO,YAAY,uBAAuB;AAEjH,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,IAAM,UAAU,CAA0BA,aAA+B,SAAwB;AACtG,QAAM,YAAY,KAAK,QAAQ,OAAO,OAAOA,YAAW,SAAS,GAAG,IAAI;AACxE,SAAO,QAAQ,SAAS,CAACA,YAAW,QAAQ,GAAG,UAAU,QAAQ,CAAC,CAAC;AACrE;","names":["properties"]}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { Equalitors } from '@bessemer/cornerstone';
|
2
|
+
import { Comparator } from '@bessemer/cornerstone/comparator';
|
3
|
+
import { NominalType } from '@bessemer/cornerstone/types';
|
4
|
+
export type ReferenceId<T extends string> = NominalType<string, ['ReferenceId', T]>;
|
5
|
+
export type Reference<T extends string> = {
|
6
|
+
id: ReferenceId<T>;
|
7
|
+
type: T;
|
8
|
+
note?: string;
|
9
|
+
};
|
10
|
+
export type ReferenceType<T extends Reference<string>> = T | T['id'];
|
11
|
+
export interface Referencable<T extends Reference<string>> {
|
12
|
+
reference: T;
|
13
|
+
}
|
14
|
+
export type ReferencableType<T extends Reference<string>> = T | Referencable<T>;
|
15
|
+
export declare const reference: <T extends string>(reference: Reference<T> | ReferenceId<T>, type: T, note?: string) => Reference<typeof type>;
|
16
|
+
export declare const isReferencable: (element: unknown) => element is Referencable<Reference<string>>;
|
17
|
+
export declare const isReference: (element: unknown) => element is Reference<string>;
|
18
|
+
export declare const getReference: <T extends Reference<string>>(reference: ReferencableType<T>) => T;
|
19
|
+
export declare const equals: <T extends string>(first: Reference<T>, second: Reference<T>) => boolean;
|
20
|
+
export declare const comparator: <T extends string>() => Comparator<Reference<T>>;
|
21
|
+
export declare const equalitor: () => Equalitors.Equalitor<Reference<string>>;
|
22
|
+
//# sourceMappingURL=reference.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../src/reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,UAAU,EAAoB,MAAM,uBAAuB,CAAA;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAA;AAEnF,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,IAAI;IACxC,EAAE,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IAClB,IAAI,EAAE,CAAC,CAAA;IACP,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;AAEpE,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC;IACvD,SAAS,EAAE,CAAC,CAAA;CACb;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAE/E,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,WAAW,SAAS,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,MAAM,KAAG,SAAS,CAAC,OAAO,IAAI,CAUnI,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAO1F,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,SAAS,OAAO,KAAG,OAAO,IAAI,SAAS,CAAC,MAAM,CAOzE,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,gBAAgB,CAAC,CAAC,CAAC,KAAG,CAO1F,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,SAAS,CAAC,CAAC,CAAC,KAAG,OAEpF,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,OAAK,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAEtE,CAAA;AAED,eAAO,MAAM,SAAS,+CAAgD,CAAA"}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
// src/reference.ts
|
2
|
+
import { Comparators, Equalitors, Objects, Strings } from "@bessemer/cornerstone";
|
3
|
+
var reference = (reference2, type, note) => {
|
4
|
+
if (!Strings.isString(reference2)) {
|
5
|
+
return reference2;
|
6
|
+
}
|
7
|
+
return {
|
8
|
+
id: reference2,
|
9
|
+
type,
|
10
|
+
...Objects.isPresent(note) ? { note } : {}
|
11
|
+
};
|
12
|
+
};
|
13
|
+
var isReferencable = (element) => {
|
14
|
+
if (!Objects.isObject(element)) {
|
15
|
+
return false;
|
16
|
+
}
|
17
|
+
const referencable = element;
|
18
|
+
return !Objects.isUndefined(referencable.reference);
|
19
|
+
};
|
20
|
+
var isReference = (element) => {
|
21
|
+
if (!Objects.isObject(element)) {
|
22
|
+
return false;
|
23
|
+
}
|
24
|
+
const referencable = element;
|
25
|
+
return !Objects.isUndefined(referencable.id) && !Objects.isUndefined(referencable.type) && !Objects.isUndefined(referencable.note);
|
26
|
+
};
|
27
|
+
var getReference = (reference2) => {
|
28
|
+
const referencable = reference2;
|
29
|
+
if (Objects.isPresent(referencable.reference)) {
|
30
|
+
return referencable.reference;
|
31
|
+
} else {
|
32
|
+
return reference2;
|
33
|
+
}
|
34
|
+
};
|
35
|
+
var equals = (first, second) => {
|
36
|
+
return first.id === second.id;
|
37
|
+
};
|
38
|
+
var comparator = () => {
|
39
|
+
return Comparators.compareBy((it) => it.id, Comparators.natural());
|
40
|
+
};
|
41
|
+
var equalitor = () => Equalitors.fromComparator(comparator());
|
42
|
+
export {
|
43
|
+
comparator,
|
44
|
+
equalitor,
|
45
|
+
equals,
|
46
|
+
getReference,
|
47
|
+
isReferencable,
|
48
|
+
isReference,
|
49
|
+
reference
|
50
|
+
};
|
51
|
+
//# sourceMappingURL=reference.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/reference.ts"],"sourcesContent":["import { Comparators, Equalitors, Objects, Strings } from '@bessemer/cornerstone'\nimport { Comparator } from '@bessemer/cornerstone/comparator'\nimport { NominalType } from '@bessemer/cornerstone/types'\n\nexport type ReferenceId<T extends string> = NominalType<string, ['ReferenceId', T]>\n\nexport type Reference<T extends string> = {\n id: ReferenceId<T>\n type: T\n note?: string\n}\n\nexport type ReferenceType<T extends Reference<string>> = T | T['id']\n\nexport interface Referencable<T extends Reference<string>> {\n reference: T\n}\n\nexport type ReferencableType<T extends Reference<string>> = T | Referencable<T>\n\nexport const reference = <T extends string>(reference: Reference<T> | ReferenceId<T>, type: T, note?: string): Reference<typeof type> => {\n if (!Strings.isString(reference)) {\n return reference\n }\n\n return {\n id: reference,\n type,\n ...(Objects.isPresent(note) ? { note: note } : {}),\n }\n}\n\nexport const isReferencable = (element: unknown): element is Referencable<Reference<string>> => {\n if (!Objects.isObject(element)) {\n return false\n }\n\n const referencable = element as Referencable<Reference<string>>\n return !Objects.isUndefined(referencable.reference)\n}\n\nexport const isReference = (element: unknown): element is Reference<string> => {\n if (!Objects.isObject(element)) {\n return false\n }\n\n const referencable = element as Reference<string>\n return !Objects.isUndefined(referencable.id) && !Objects.isUndefined(referencable.type) && !Objects.isUndefined(referencable.note)\n}\n\nexport const getReference = <T extends Reference<string>>(reference: ReferencableType<T>): T => {\n const referencable = reference as Referencable<T>\n if (Objects.isPresent(referencable.reference)) {\n return referencable.reference\n } else {\n return reference as T\n }\n}\n\nexport const equals = <T extends string>(first: Reference<T>, second: Reference<T>): boolean => {\n return first.id === second.id\n}\n\nexport const comparator = <T extends string>(): Comparator<Reference<T>> => {\n return Comparators.compareBy((it) => it.id, Comparators.natural())\n}\n\nexport const equalitor = () => Equalitors.fromComparator(comparator())\n"],"mappings":";AAAA,SAAS,aAAa,YAAY,SAAS,eAAe;AAoBnD,IAAM,YAAY,CAAmBA,YAA0C,MAAS,SAA0C;AACvI,MAAI,CAAC,QAAQ,SAASA,UAAS,GAAG;AAChC,WAAOA;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAIA;AAAA,IACJ;AAAA,IACA,GAAI,QAAQ,UAAU,IAAI,IAAI,EAAE,KAAW,IAAI,CAAC;AAAA,EAClD;AACF;AAEO,IAAM,iBAAiB,CAAC,YAAiE;AAC9F,MAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AACrB,SAAO,CAAC,QAAQ,YAAY,aAAa,SAAS;AACpD;AAEO,IAAM,cAAc,CAAC,YAAmD;AAC7E,MAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AACrB,SAAO,CAAC,QAAQ,YAAY,aAAa,EAAE,KAAK,CAAC,QAAQ,YAAY,aAAa,IAAI,KAAK,CAAC,QAAQ,YAAY,aAAa,IAAI;AACnI;AAEO,IAAM,eAAe,CAA8BA,eAAsC;AAC9F,QAAM,eAAeA;AACrB,MAAI,QAAQ,UAAU,aAAa,SAAS,GAAG;AAC7C,WAAO,aAAa;AAAA,EACtB,OAAO;AACL,WAAOA;AAAA,EACT;AACF;AAEO,IAAM,SAAS,CAAmB,OAAqB,WAAkC;AAC9F,SAAO,MAAM,OAAO,OAAO;AAC7B;AAEO,IAAM,aAAa,MAAkD;AAC1E,SAAO,YAAY,UAAU,CAAC,OAAO,GAAG,IAAI,YAAY,QAAQ,CAAC;AACnE;AAEO,IAAM,YAAY,MAAM,WAAW,eAAe,WAAW,CAAC;","names":["reference"]}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { NominalType } from '@bessemer/cornerstone/types';
|
2
|
+
import { ZodType } from 'zod';
|
3
|
+
export type ResourceKey = string;
|
4
|
+
export type ResourceNamespace = NominalType<string, 'ResourceNamespace'>;
|
5
|
+
export declare const ResourceNamespaceSchema: ZodType<ResourceNamespace>;
|
6
|
+
export declare namespace ResourceKey {
|
7
|
+
const namespace: (namespace: ResourceNamespace, key: ResourceKey) => ResourceKey;
|
8
|
+
const namespaceAll: (namespace: ResourceNamespace, keys: Array<ResourceKey>) => Array<ResourceKey>;
|
9
|
+
const stripNamespace: (namespace: ResourceNamespace, key: ResourceKey) => ResourceKey;
|
10
|
+
const stripNamespaceAll: (namespace: ResourceNamespace, keys: Array<ResourceKey>) => Array<ResourceKey>;
|
11
|
+
const extendNamespace: (...namespaces: Array<ResourceNamespace>) => ResourceNamespace;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=resource.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAE7B,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAEhC,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AACxE,eAAO,MAAM,uBAAuB,EAAE,OAAO,CAAC,iBAAiB,CAAgB,CAAA;AAE/E,yBAAiB,WAAW,CAAC;IAGpB,MAAM,SAAS,GAAI,WAAW,iBAAiB,EAAE,KAAK,WAAW,KAAG,WAE1E,CAAA;IAEM,MAAM,YAAY,GAAI,WAAW,iBAAiB,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,KAAG,KAAK,CAAC,WAAW,CAEtG,CAAA;IAEM,MAAM,cAAc,GAAI,WAAW,iBAAiB,EAAE,KAAK,WAAW,KAAG,WAE/E,CAAA;IAEM,MAAM,iBAAiB,GAAI,WAAW,iBAAiB,EAAE,MAAM,KAAK,CAAC,WAAW,CAAC,KAAG,KAAK,CAAC,WAAW,CAE3G,CAAA;IAEM,MAAM,eAAe,GAAI,GAAG,YAAY,KAAK,CAAC,iBAAiB,CAAC,KAAG,iBAEzE,CAAA;CACF"}
|
package/dist/resource.js
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
// src/resource.ts
|
2
|
+
import { Strings, Zod } from "@bessemer/cornerstone/index";
|
3
|
+
var ResourceNamespaceSchema = Zod.string();
|
4
|
+
var ResourceKey;
|
5
|
+
((ResourceKey2) => {
|
6
|
+
const ResourceNamespaceSeparator = "/";
|
7
|
+
ResourceKey2.namespace = (namespace2, key) => {
|
8
|
+
return `${namespace2}${ResourceNamespaceSeparator}${key}`;
|
9
|
+
};
|
10
|
+
ResourceKey2.namespaceAll = (namespace2, keys) => {
|
11
|
+
return keys.map((it) => ResourceKey2.namespace(namespace2, it));
|
12
|
+
};
|
13
|
+
ResourceKey2.stripNamespace = (namespace2, key) => {
|
14
|
+
return Strings.removeStart(key, `${namespace2}${ResourceNamespaceSeparator}`);
|
15
|
+
};
|
16
|
+
ResourceKey2.stripNamespaceAll = (namespace2, keys) => {
|
17
|
+
return keys.map((it) => ResourceKey2.stripNamespace(namespace2, it));
|
18
|
+
};
|
19
|
+
ResourceKey2.extendNamespace = (...namespaces) => {
|
20
|
+
return namespaces.join(ResourceNamespaceSeparator);
|
21
|
+
};
|
22
|
+
})(ResourceKey || (ResourceKey = {}));
|
23
|
+
export {
|
24
|
+
ResourceKey,
|
25
|
+
ResourceNamespaceSchema
|
26
|
+
};
|
27
|
+
//# sourceMappingURL=resource.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["../src/resource.ts"],"sourcesContent":["import { NominalType } from '@bessemer/cornerstone/types'\nimport { Strings, Zod } from '@bessemer/cornerstone/index'\nimport { ZodType } from 'zod'\n\nexport type ResourceKey = string\n\nexport type ResourceNamespace = NominalType<string, 'ResourceNamespace'>\nexport const ResourceNamespaceSchema: ZodType<ResourceNamespace> = Zod.string()\n\nexport namespace ResourceKey {\n const ResourceNamespaceSeparator = '/'\n\n export const namespace = (namespace: ResourceNamespace, key: ResourceKey): ResourceKey => {\n return `${namespace}${ResourceNamespaceSeparator}${key}`\n }\n\n export const namespaceAll = (namespace: ResourceNamespace, keys: Array<ResourceKey>): Array<ResourceKey> => {\n return keys.map((it) => ResourceKey.namespace(namespace, it))\n }\n\n export const stripNamespace = (namespace: ResourceNamespace, key: ResourceKey): ResourceKey => {\n return Strings.removeStart(key, `${namespace}${ResourceNamespaceSeparator}`)\n }\n\n export const stripNamespaceAll = (namespace: ResourceNamespace, keys: Array<ResourceKey>): Array<ResourceKey> => {\n return keys.map((it) => ResourceKey.stripNamespace(namespace, it))\n }\n\n export const extendNamespace = (...namespaces: Array<ResourceNamespace>): ResourceNamespace => {\n return namespaces.join(ResourceNamespaceSeparator)\n }\n}\n"],"mappings":";AACA,SAAS,SAAS,WAAW;AAMtB,IAAM,0BAAsD,IAAI,OAAO;AAEvE,IAAU;AAAA,CAAV,CAAUA,iBAAV;AACL,QAAM,6BAA6B;AAE5B,EAAMA,aAAA,YAAY,CAACC,YAA8B,QAAkC;AACxF,WAAO,GAAGA,UAAS,GAAG,0BAA0B,GAAG,GAAG;AAAA,EACxD;AAEO,EAAMD,aAAA,eAAe,CAACC,YAA8B,SAAiD;AAC1G,WAAO,KAAK,IAAI,CAAC,OAAOD,aAAY,UAAUC,YAAW,EAAE,CAAC;AAAA,EAC9D;AAEO,EAAMD,aAAA,iBAAiB,CAACC,YAA8B,QAAkC;AAC7F,WAAO,QAAQ,YAAY,KAAK,GAAGA,UAAS,GAAG,0BAA0B,EAAE;AAAA,EAC7E;AAEO,EAAMD,aAAA,oBAAoB,CAACC,YAA8B,SAAiD;AAC/G,WAAO,KAAK,IAAI,CAAC,OAAOD,aAAY,eAAeC,YAAW,EAAE,CAAC;AAAA,EACnE;AAEO,EAAMD,aAAA,kBAAkB,IAAI,eAA4D;AAC7F,WAAO,WAAW,KAAK,0BAA0B;AAAA,EACnD;AAAA,GArBe;","names":["ResourceKey","namespace"]}
|
package/dist/result.d.ts
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
import { Left, Right } from '@bessemer/cornerstone/either';
|
2
|
+
import { Throwable } from '@bessemer/cornerstone/types';
|
3
|
+
export type Success<T> = Right<T> & {
|
4
|
+
isSuccess: true;
|
5
|
+
};
|
6
|
+
export type Failure = Left<Throwable | null> & {
|
7
|
+
isSuccess: false;
|
8
|
+
};
|
9
|
+
export type Result<T> = Success<T> | Failure;
|
10
|
+
export type AsyncResult<T> = Promise<Result<T>>;
|
11
|
+
export declare const success: <T>(value: T) => Success<T>;
|
12
|
+
export declare const failure: (failure?: Throwable) => Failure;
|
13
|
+
export declare function tryValue<SOURCE_VALUE>(resolver: () => Promise<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>;
|
14
|
+
export declare function tryValue<SOURCE_VALUE>(resolver: () => SOURCE_VALUE): Result<SOURCE_VALUE>;
|
15
|
+
export declare function tryResult<SOURCE_VALUE>(resolver: () => Result<SOURCE_VALUE>): Result<SOURCE_VALUE>;
|
16
|
+
export declare function tryResult<SOURCE_VALUE>(resolver: () => AsyncResult<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>;
|
17
|
+
export declare function map<SOURCE_VALUE, TARGET_VALUE>(result: Result<SOURCE_VALUE>, valueMapper: (element: SOURCE_VALUE) => TARGET_VALUE): Result<TARGET_VALUE>;
|
18
|
+
//# sourceMappingURL=result.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAEvD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG;IAClC,SAAS,EAAE,IAAI,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG;IAC7C,SAAS,EAAE,KAAK,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;AAC5C,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AAE/C,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,CAAC,CAE9C,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,UAAU,SAAS,KAAG,OAE7C,CAAA;AAED,wBAAgB,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC,CAAA;AACxG,wBAAgB,QAAQ,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;AAc1F,wBAAgB,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAA;AACnG,wBAAgB,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,YAAY,CAAC,CAAA;AAc7G,wBAAgB,GAAG,CAAC,YAAY,EAAE,YAAY,EAC5C,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,EAC5B,WAAW,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,YAAY,GACnD,MAAM,CAAC,YAAY,CAAC,CAStB"}
|