@bessemer/cornerstone 0.5.1 → 0.5.4

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.
Files changed (282) hide show
  1. package/dist/array.d.ts +57 -0
  2. package/dist/array.d.ts.map +1 -0
  3. package/dist/array.js +137 -0
  4. package/dist/array.js.map +1 -0
  5. package/dist/async.d.ts +59 -0
  6. package/dist/async.d.ts.map +1 -0
  7. package/dist/async.js +62 -0
  8. package/dist/async.js.map +1 -0
  9. package/dist/cache.d.ts +106 -0
  10. package/dist/cache.d.ts.map +1 -0
  11. package/dist/cache.js +112 -0
  12. package/dist/cache.js.map +1 -0
  13. package/dist/combinable.d.ts +16 -0
  14. package/dist/combinable.d.ts.map +1 -0
  15. package/dist/combinable.js +31 -0
  16. package/dist/combinable.js.map +1 -0
  17. package/dist/comparator.d.ts +9 -0
  18. package/dist/comparator.d.ts.map +1 -0
  19. package/dist/comparator.js +76 -0
  20. package/dist/comparator.js.map +1 -0
  21. package/dist/content.d.ts +68 -0
  22. package/dist/content.d.ts.map +1 -0
  23. package/dist/content.js +79 -0
  24. package/dist/content.js.map +1 -0
  25. package/dist/context.d.ts +7 -0
  26. package/dist/context.d.ts.map +1 -0
  27. package/dist/context.js +1 -0
  28. package/dist/context.js.map +1 -0
  29. package/dist/crypto.d.ts +3 -0
  30. package/dist/crypto.d.ts.map +1 -0
  31. package/dist/crypto.js +15 -0
  32. package/dist/crypto.js.map +1 -0
  33. package/dist/date.d.ts +10 -0
  34. package/dist/date.d.ts.map +1 -0
  35. package/dist/date.js +24 -0
  36. package/dist/date.js.map +1 -0
  37. package/dist/duration.d.ts +39 -0
  38. package/dist/duration.d.ts.map +1 -0
  39. package/dist/duration.js +52 -0
  40. package/dist/duration.js.map +1 -0
  41. package/dist/either.d.ts +20 -0
  42. package/dist/either.d.ts.map +1 -0
  43. package/dist/either.js +25 -0
  44. package/dist/either.js.map +1 -0
  45. package/dist/entry.d.ts +7 -0
  46. package/dist/entry.d.ts.map +1 -0
  47. package/dist/entry.js +24 -0
  48. package/dist/entry.js.map +1 -0
  49. package/dist/equalitor.d.ts +5 -0
  50. package/dist/equalitor.d.ts.map +1 -0
  51. package/dist/equalitor.js +10 -0
  52. package/dist/equalitor.js.map +1 -0
  53. package/dist/error-event.d.ts +34 -0
  54. package/dist/error-event.d.ts.map +1 -0
  55. package/dist/error-event.js +91 -0
  56. package/dist/error-event.js.map +1 -0
  57. package/dist/error.d.ts +3 -0
  58. package/dist/error.d.ts.map +1 -0
  59. package/dist/error.js +18 -0
  60. package/dist/error.js.map +1 -0
  61. package/dist/expression/array-expression.d.ts +14 -0
  62. package/dist/expression/array-expression.d.ts.map +1 -0
  63. package/dist/expression/array-expression.js +32 -0
  64. package/dist/expression/array-expression.js.map +1 -0
  65. package/dist/expression/expression-evaluator.d.ts +8 -0
  66. package/dist/expression/expression-evaluator.d.ts.map +1 -0
  67. package/dist/expression/expression-evaluator.js +31 -0
  68. package/dist/expression/expression-evaluator.js.map +1 -0
  69. package/dist/expression/expression.d.ts +54 -0
  70. package/dist/expression/expression.d.ts.map +1 -0
  71. package/dist/expression/expression.js +173 -0
  72. package/dist/expression/expression.js.map +1 -0
  73. package/dist/expression/internal.d.ts +10 -0
  74. package/dist/expression/internal.d.ts.map +1 -0
  75. package/dist/expression/internal.js +28 -0
  76. package/dist/expression/internal.js.map +1 -0
  77. package/dist/expression/numeric-expression.d.ts +79 -0
  78. package/dist/expression/numeric-expression.d.ts.map +1 -0
  79. package/dist/expression/numeric-expression.js +177 -0
  80. package/dist/expression/numeric-expression.js.map +1 -0
  81. package/dist/expression/string-expression.d.ts +24 -0
  82. package/dist/expression/string-expression.d.ts.map +1 -0
  83. package/dist/expression/string-expression.js +41 -0
  84. package/dist/expression/string-expression.js.map +1 -0
  85. package/dist/expression.d.ts +35 -0
  86. package/dist/expression.d.ts.map +1 -0
  87. package/dist/expression.js +12 -0
  88. package/dist/expression.js.map +1 -0
  89. package/dist/function.d.ts +2 -0
  90. package/dist/function.d.ts.map +1 -0
  91. package/dist/function.js +7 -0
  92. package/dist/function.js.map +1 -0
  93. package/dist/glob.d.ts +8 -0
  94. package/dist/glob.d.ts.map +1 -0
  95. package/dist/glob.js +20 -0
  96. package/dist/glob.js.map +1 -0
  97. package/dist/global-variable.d.ts +7 -0
  98. package/dist/global-variable.d.ts.map +1 -0
  99. package/dist/global-variable.js +34 -0
  100. package/dist/global-variable.js.map +1 -0
  101. package/dist/hash.d.ts +11 -0
  102. package/dist/hash.d.ts.map +1 -0
  103. package/dist/hash.js +30 -0
  104. package/dist/hash.js.map +1 -0
  105. package/dist/hex-code.d.ts +5 -0
  106. package/dist/hex-code.d.ts.map +1 -0
  107. package/dist/hex-code.js +7 -0
  108. package/dist/hex-code.js.map +1 -0
  109. package/dist/index.d.ts +41 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +82 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/lazy.d.ts +3 -0
  114. package/dist/lazy.d.ts.map +1 -0
  115. package/dist/lazy.js +13 -0
  116. package/dist/lazy.js.map +1 -0
  117. package/dist/logger.d.ts +30 -0
  118. package/dist/logger.d.ts.map +1 -0
  119. package/dist/logger.js +124 -0
  120. package/dist/logger.js.map +1 -0
  121. package/dist/math.d.ts +22 -0
  122. package/dist/math.d.ts.map +1 -0
  123. package/dist/math.js +123 -0
  124. package/dist/math.js.map +1 -0
  125. package/dist/misc.d.ts +3 -0
  126. package/dist/misc.d.ts.map +1 -0
  127. package/dist/misc.js +21 -0
  128. package/dist/misc.js.map +1 -0
  129. package/dist/object.d.ts +62 -0
  130. package/dist/object.d.ts.map +1 -0
  131. package/dist/object.js +170 -0
  132. package/dist/object.js.map +1 -0
  133. package/dist/patch.d.ts +41 -0
  134. package/dist/patch.d.ts.map +1 -0
  135. package/dist/patch.js +87 -0
  136. package/dist/patch.js.map +1 -0
  137. package/dist/precondition.d.ts +8 -0
  138. package/dist/precondition.d.ts.map +1 -0
  139. package/dist/precondition.js +27 -0
  140. package/dist/precondition.js.map +1 -0
  141. package/dist/promise.d.ts +8 -0
  142. package/dist/promise.d.ts.map +1 -0
  143. package/dist/promise.js +18 -0
  144. package/dist/promise.js.map +1 -0
  145. package/dist/property.d.ts +11 -0
  146. package/dist/property.d.ts.map +1 -0
  147. package/dist/property.js +21 -0
  148. package/dist/property.js.map +1 -0
  149. package/dist/reference.d.ts +22 -0
  150. package/dist/reference.d.ts.map +1 -0
  151. package/dist/reference.js +51 -0
  152. package/dist/reference.js.map +1 -0
  153. package/dist/resource.d.ts +13 -0
  154. package/dist/resource.d.ts.map +1 -0
  155. package/dist/resource.js +27 -0
  156. package/dist/resource.js.map +1 -0
  157. package/dist/result.d.ts +18 -0
  158. package/dist/result.d.ts.map +1 -0
  159. package/dist/result.js +50 -0
  160. package/dist/result.js.map +1 -0
  161. package/dist/retry.d.ts +18 -0
  162. package/dist/retry.d.ts.map +1 -0
  163. package/dist/retry.js +51 -0
  164. package/dist/retry.js.map +1 -0
  165. package/dist/rich-text.d.ts +17 -0
  166. package/dist/rich-text.d.ts.map +1 -0
  167. package/dist/rich-text.js +9 -0
  168. package/dist/rich-text.js.map +1 -0
  169. package/dist/set.d.ts +5 -0
  170. package/dist/set.d.ts.map +1 -0
  171. package/dist/set.js +44 -0
  172. package/dist/set.js.map +1 -0
  173. package/dist/signature.d.ts +9 -0
  174. package/dist/signature.d.ts.map +1 -0
  175. package/dist/signature.js +20 -0
  176. package/dist/signature.js.map +1 -0
  177. package/dist/store.d.ts +40 -0
  178. package/dist/store.d.ts.map +1 -0
  179. package/dist/store.js +50 -0
  180. package/dist/store.js.map +1 -0
  181. package/dist/string.d.ts +40 -0
  182. package/dist/string.d.ts.map +1 -0
  183. package/dist/string.js +154 -0
  184. package/dist/string.js.map +1 -0
  185. package/dist/tag.d.ts +24 -0
  186. package/dist/tag.d.ts.map +1 -0
  187. package/dist/tag.js +50 -0
  188. package/dist/tag.js.map +1 -0
  189. package/dist/types.d.ts +16 -0
  190. package/dist/types.d.ts.map +1 -0
  191. package/dist/types.js +1 -0
  192. package/dist/types.js.map +1 -0
  193. package/dist/ulid.d.ts +8 -0
  194. package/dist/ulid.d.ts.map +1 -0
  195. package/dist/ulid.js +28 -0
  196. package/dist/ulid.js.map +1 -0
  197. package/dist/unit.d.ts +4 -0
  198. package/dist/unit.d.ts.map +1 -0
  199. package/dist/unit.js +6 -0
  200. package/dist/unit.js.map +1 -0
  201. package/dist/uri.d.ts +47 -0
  202. package/dist/uri.d.ts.map +1 -0
  203. package/dist/uri.js +211 -0
  204. package/dist/uri.js.map +1 -0
  205. package/dist/url.d.ts +25 -0
  206. package/dist/url.d.ts.map +1 -0
  207. package/dist/url.js +120 -0
  208. package/dist/url.js.map +1 -0
  209. package/dist/uuid.d.ts +8 -0
  210. package/dist/uuid.d.ts.map +1 -0
  211. package/dist/uuid.js +35 -0
  212. package/dist/uuid.js.map +1 -0
  213. package/dist/zod.d.ts +17 -0
  214. package/dist/zod.d.ts.map +1 -0
  215. package/dist/zod.js +31 -0
  216. package/dist/zod.js.map +1 -0
  217. package/package.json +5 -3
  218. package/jest.config.js +0 -3
  219. package/src/array.ts +0 -142
  220. package/src/async.ts +0 -114
  221. package/src/cache.ts +0 -236
  222. package/src/combinable.ts +0 -40
  223. package/src/comparator.ts +0 -78
  224. package/src/content.ts +0 -138
  225. package/src/context.ts +0 -6
  226. package/src/crypto.ts +0 -11
  227. package/src/date.ts +0 -18
  228. package/src/duration.ts +0 -57
  229. package/src/either.ts +0 -29
  230. package/src/entry.ts +0 -21
  231. package/src/equalitor.ts +0 -12
  232. package/src/error-event.ts +0 -126
  233. package/src/error.ts +0 -16
  234. package/src/expression/array-expression.ts +0 -29
  235. package/src/expression/expression-evaluator.ts +0 -34
  236. package/src/expression/expression.ts +0 -188
  237. package/src/expression/internal.ts +0 -34
  238. package/src/expression/numeric-expression.ts +0 -182
  239. package/src/expression/string-expression.ts +0 -38
  240. package/src/expression.ts +0 -48
  241. package/src/function.ts +0 -3
  242. package/src/glob.ts +0 -19
  243. package/src/global-variable.ts +0 -40
  244. package/src/hash.ts +0 -28
  245. package/src/hex-code.ts +0 -6
  246. package/src/index.ts +0 -82
  247. package/src/lazy.ts +0 -11
  248. package/src/logger.ts +0 -144
  249. package/src/math.ts +0 -132
  250. package/src/misc.ts +0 -22
  251. package/src/object.ts +0 -236
  252. package/src/patch.ts +0 -128
  253. package/src/precondition.ts +0 -25
  254. package/src/promise.ts +0 -16
  255. package/src/property.ts +0 -29
  256. package/src/reference.ts +0 -68
  257. package/src/resource.ts +0 -32
  258. package/src/result.ts +0 -66
  259. package/src/retry.ts +0 -70
  260. package/src/rich-text.ts +0 -24
  261. package/src/set.ts +0 -46
  262. package/src/signature.ts +0 -20
  263. package/src/store.ts +0 -91
  264. package/src/string.ts +0 -173
  265. package/src/tag.ts +0 -68
  266. package/src/types.ts +0 -21
  267. package/src/ulid.ts +0 -28
  268. package/src/unit.ts +0 -4
  269. package/src/uri.ts +0 -321
  270. package/src/url.ts +0 -155
  271. package/src/uuid.ts +0 -37
  272. package/src/zod.ts +0 -24
  273. package/test/comparator.test.ts +0 -1
  274. package/test/expression.test.ts +0 -12
  275. package/test/object.test.ts +0 -104
  276. package/test/patch.test.ts +0 -170
  277. package/test/set.test.ts +0 -20
  278. package/test/string.test.ts +0 -22
  279. package/test/uri.test.ts +0 -111
  280. package/test/url.test.ts +0 -174
  281. package/tsconfig.build.json +0 -13
  282. package/tsup.config.ts +0 -4
@@ -0,0 +1,57 @@
1
+ import { Equalitor } from '@bessemer/cornerstone/equalitor';
2
+ import { Signable } from '@bessemer/cornerstone/signature';
3
+ import { Either } from '@bessemer/cornerstone/either';
4
+ import { Comparator } from '@bessemer/cornerstone/comparator';
5
+ import { Arrayable } from 'type-fest';
6
+ export declare const equalWith: <T>(first: Array<T>, second: Array<T>, equalitor: Equalitor<T>) => boolean;
7
+ export declare const equalBy: <T>(first: Array<T>, second: Array<T>, mapper: (element: T) => Signable) => boolean;
8
+ export declare const equal: <T extends Signable>(first: Array<T>, second: Array<T>) => boolean;
9
+ export declare const differenceWith: <T>(first: Array<T>, second: Array<T>, equalitor: Equalitor<T>) => Array<T>;
10
+ export declare const differenceBy: <T>(first: Array<T>, second: Array<T>, mapper: (element: T) => Signable) => Array<T>;
11
+ export declare const difference: <T extends Signable>(first: Array<T>, second: Array<T>) => Array<T>;
12
+ export declare const removeWith: <T>(array: Array<T>, element: T, equalitor: Equalitor<T>) => Array<T>;
13
+ export declare const removeBy: <T>(array: Array<T>, element: T, mapper: (element: T) => Signable) => Array<T>;
14
+ export declare const remove: <T extends Signable>(array: Array<T>, element: T) => Array<T>;
15
+ export declare const containsWith: <T>(array: Array<T>, element: T, equalitor: Equalitor<T>) => boolean;
16
+ export declare const containsBy: <T>(array: Array<T>, element: T, mapper: (element: T) => Signable) => boolean;
17
+ export declare const contains: <T extends Signable>(array: Array<T>, element: T) => boolean;
18
+ export declare const containsAllWith: <T>(first: Array<T>, second: Array<T>, equalitor: Equalitor<T>) => boolean;
19
+ export declare const containsAllBy: <T>(first: Array<T>, second: Array<T>, mapper: (element: T) => Signable) => boolean;
20
+ export declare const containsAll: <T extends Signable>(first: Array<T>, second: Array<T>) => boolean;
21
+ export declare const dedupeWith: <T>(array: Array<T>, equalitor: Equalitor<T>) => Array<T>;
22
+ export declare const dedupeBy: <T>(array: Array<T>, mapper: (element: T) => Signable) => Array<T>;
23
+ export declare const dedupe: <T extends Signable>(array: Array<T>) => Array<T>;
24
+ export declare const sortWith: <T>(array: Array<T>, comparator: Comparator<T>) => Array<T>;
25
+ export declare const sortBy: <T>(array: Array<T>, mapper: (element: T) => Signable) => Array<T>;
26
+ export declare const sort: <T extends Signable>(array: Array<T>) => Array<T>;
27
+ export declare const concatenate: <T>(...values: Array<import("lodash").Many<T>>) => T[];
28
+ export declare const first: {
29
+ <T>(array: readonly [T, ...unknown[]]): T;
30
+ <T>(array: import("lodash").List<T> | null | undefined): T | undefined;
31
+ };
32
+ export declare const only: <T>(array: Array<T>) => T;
33
+ export declare const last: <T>(array: import("lodash").List<T> | null | undefined) => T | undefined;
34
+ export declare const isEmpty: {
35
+ <T extends {
36
+ __trapAny: any;
37
+ }>(value?: T): boolean;
38
+ (value: string): value is "";
39
+ (value: Map<any, any> | Set<any> | import("lodash").List<any> | null | undefined): boolean;
40
+ (value: object): boolean;
41
+ <T extends object>(value: T | null | undefined): value is import("lodash").EmptyObjectOf<T> | null | undefined;
42
+ (value?: any): boolean;
43
+ };
44
+ export declare const range: {
45
+ (start: number, end?: number, step?: number): number[];
46
+ (end: number, index: string | number, guard: object): number[];
47
+ };
48
+ export declare const groupBy: {
49
+ <T>(collection: import("lodash").List<T> | null | undefined, iteratee?: import("lodash").ValueIteratee<T>): import("lodash").Dictionary<T[]>;
50
+ <T extends object>(collection: T | null | undefined, iteratee?: import("lodash").ValueIteratee<T[keyof T]>): import("lodash").Dictionary<Array<T[keyof T]>>;
51
+ };
52
+ export declare const rest: <T>(array: Array<T>, elementsToSkip?: number) => Array<T>;
53
+ export declare const clear: (array: Array<unknown>) => void;
54
+ export declare const bisect: <T, L, R>(array: Array<T>, bisector: (element: T, index: number) => Either<L, R>) => [Array<L>, Array<R>];
55
+ export declare const toArray: <T>(array: Arrayable<T>) => Array<T>;
56
+ export declare const flatten: <T>(array: import("lodash").List<import("lodash").Many<T>> | null | undefined) => T[];
57
+ //# sourceMappingURL=array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"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"}
package/dist/array.js ADDED
@@ -0,0 +1,137 @@
1
+ // src/array.ts
2
+ import {
3
+ concat,
4
+ differenceBy as _differenceBy,
5
+ differenceWith as _differenceWith,
6
+ first as _first,
7
+ flatten as _flatten,
8
+ groupBy as _groupBy,
9
+ isEmpty as _isEmpty,
10
+ last as _last,
11
+ range as _range,
12
+ remove as _remove,
13
+ uniqBy,
14
+ uniqWith
15
+ } from "lodash-es";
16
+ import { Comparators, Eithers, Preconditions, Signatures } from "@bessemer/cornerstone";
17
+ var equalWith = (first2, second, equalitor) => {
18
+ if (first2.length !== second.length) {
19
+ return false;
20
+ }
21
+ return first2.every((element, index) => equalitor(element, second[index]));
22
+ };
23
+ var equalBy = (first2, second, mapper) => {
24
+ return equalWith(first2, second, (first3, second2) => Signatures.sign(mapper(first3)) === Signatures.sign(mapper(second2)));
25
+ };
26
+ var equal = (first2, second) => {
27
+ return equalBy(first2, second, Signatures.sign);
28
+ };
29
+ var differenceWith = (first2, second, equalitor) => {
30
+ return _differenceWith(first2, second, equalitor);
31
+ };
32
+ var differenceBy = (first2, second, mapper) => {
33
+ return _differenceBy(first2, second, (it) => Signatures.sign(mapper(it)));
34
+ };
35
+ var difference = (first2, second) => {
36
+ return differenceBy(first2, second, Signatures.sign);
37
+ };
38
+ var removeWith = (array, element, equalitor) => {
39
+ return differenceWith(array, [element], equalitor);
40
+ };
41
+ var removeBy = (array, element, mapper) => {
42
+ return differenceBy(array, [element], mapper);
43
+ };
44
+ var remove = (array, element) => {
45
+ return difference(array, [element]);
46
+ };
47
+ var containsWith = (array, element, equalitor) => {
48
+ return array.some((it) => equalitor(it, element));
49
+ };
50
+ var containsBy = (array, element, mapper) => {
51
+ return containsWith(array, element, (first2, second) => Signatures.sign(mapper(first2)) === Signatures.sign(mapper(second)));
52
+ };
53
+ var contains = (array, element) => containsBy(array, element, Signatures.sign);
54
+ var containsAllWith = (first2, second, equalitor) => isEmpty(differenceWith(second, first2, equalitor));
55
+ var containsAllBy = (first2, second, mapper) => isEmpty(differenceBy(second, first2, mapper));
56
+ var containsAll = (first2, second) => isEmpty(difference(second, first2));
57
+ var dedupeWith = (array, equalitor) => {
58
+ return uniqWith(array, equalitor);
59
+ };
60
+ var dedupeBy = (array, mapper) => {
61
+ return uniqBy(array, (it) => Signatures.sign(mapper(it)));
62
+ };
63
+ var dedupe = (array) => {
64
+ return dedupeBy(array, Signatures.sign);
65
+ };
66
+ var sortWith = (array, comparator) => {
67
+ return [...array].sort(comparator);
68
+ };
69
+ var sortBy = (array, mapper) => {
70
+ return sortWith(
71
+ array,
72
+ Comparators.compareBy((it) => Signatures.sign(mapper(it)), Comparators.natural())
73
+ );
74
+ };
75
+ var sort = (array) => sortBy(array, Signatures.sign);
76
+ var concatenate = concat;
77
+ var first = _first;
78
+ var only = (array) => {
79
+ Preconditions.isTrue(array.length === 1);
80
+ return first(array);
81
+ };
82
+ var last = _last;
83
+ var isEmpty = _isEmpty;
84
+ var range = _range;
85
+ var groupBy = _groupBy;
86
+ var rest = (array, elementsToSkip = 1) => {
87
+ return array.slice(elementsToSkip);
88
+ };
89
+ var clear = (array) => {
90
+ _remove(array, () => true);
91
+ };
92
+ var bisect = (array, bisector) => {
93
+ return Eithers.split(array.map(bisector));
94
+ };
95
+ var toArray = (array) => {
96
+ if (Array.isArray(array)) {
97
+ return array;
98
+ }
99
+ return [array];
100
+ };
101
+ var flatten = _flatten;
102
+ export {
103
+ bisect,
104
+ clear,
105
+ concatenate,
106
+ contains,
107
+ containsAll,
108
+ containsAllBy,
109
+ containsAllWith,
110
+ containsBy,
111
+ containsWith,
112
+ dedupe,
113
+ dedupeBy,
114
+ dedupeWith,
115
+ difference,
116
+ differenceBy,
117
+ differenceWith,
118
+ equal,
119
+ equalBy,
120
+ equalWith,
121
+ first,
122
+ flatten,
123
+ groupBy,
124
+ isEmpty,
125
+ last,
126
+ only,
127
+ range,
128
+ remove,
129
+ removeBy,
130
+ removeWith,
131
+ rest,
132
+ sort,
133
+ sortBy,
134
+ sortWith,
135
+ toArray
136
+ };
137
+ //# sourceMappingURL=array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/array.ts"],"sourcesContent":["import {\n concat,\n differenceBy as _differenceBy,\n differenceWith as _differenceWith,\n first as _first,\n flatten as _flatten,\n groupBy as _groupBy,\n isEmpty as _isEmpty,\n last as _last,\n range as _range,\n remove as _remove,\n uniqBy,\n uniqWith,\n} from 'lodash-es'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\nimport { Signable } from '@bessemer/cornerstone/signature'\nimport { Comparators, Eithers, Preconditions, Signatures } from '@bessemer/cornerstone'\nimport { Either } from '@bessemer/cornerstone/either'\nimport { Comparator } from '@bessemer/cornerstone/comparator'\nimport { Arrayable } from 'type-fest'\n\nexport const equalWith = <T>(first: Array<T>, second: Array<T>, equalitor: Equalitor<T>): boolean => {\n if (first.length !== second.length) {\n return false\n }\n\n return first.every((element, index) => equalitor(element, second[index]!))\n}\n\nexport const equalBy = <T>(first: Array<T>, second: Array<T>, mapper: (element: T) => Signable): boolean => {\n return equalWith(first, second, (first, second) => Signatures.sign(mapper(first)) === Signatures.sign(mapper(second)))\n}\n\nexport const equal = <T extends Signable>(first: Array<T>, second: Array<T>): boolean => {\n return equalBy(first, second, Signatures.sign)\n}\n\nexport const differenceWith = <T>(first: Array<T>, second: Array<T>, equalitor: Equalitor<T>): Array<T> => {\n return _differenceWith(first, second, equalitor)\n}\n\nexport const differenceBy = <T>(first: Array<T>, second: Array<T>, mapper: (element: T) => Signable): Array<T> => {\n return _differenceBy(first, second, (it) => Signatures.sign(mapper(it)))\n}\n\nexport const difference = <T extends Signable>(first: Array<T>, second: Array<T>): Array<T> => {\n return differenceBy(first, second, Signatures.sign)\n}\n\nexport const removeWith = <T>(array: Array<T>, element: T, equalitor: Equalitor<T>): Array<T> => {\n return differenceWith(array, [element], equalitor)\n}\n\nexport const removeBy = <T>(array: Array<T>, element: T, mapper: (element: T) => Signable): Array<T> => {\n return differenceBy(array, [element], mapper)\n}\n\nexport const remove = <T extends Signable>(array: Array<T>, element: T): Array<T> => {\n return difference(array, [element])\n}\n\nexport const containsWith = <T>(array: Array<T>, element: T, equalitor: Equalitor<T>): boolean => {\n return array.some((it) => equalitor(it, element))\n}\n\nexport const containsBy = <T>(array: Array<T>, element: T, mapper: (element: T) => Signable): boolean => {\n return containsWith(array, element, (first, second) => Signatures.sign(mapper(first)) === Signatures.sign(mapper(second)))\n}\n\nexport const contains = <T extends Signable>(array: Array<T>, element: T): boolean => containsBy(array, element, Signatures.sign)\n\nexport const containsAllWith = <T>(first: Array<T>, second: Array<T>, equalitor: Equalitor<T>): boolean =>\n isEmpty(differenceWith(second, first, equalitor))\n\nexport const containsAllBy = <T>(first: Array<T>, second: Array<T>, mapper: (element: T) => Signable): boolean =>\n isEmpty(differenceBy(second, first, mapper))\n\nexport const containsAll = <T extends Signable>(first: Array<T>, second: Array<T>): boolean => isEmpty(difference(second, first))\n\nexport const dedupeWith = <T>(array: Array<T>, equalitor: Equalitor<T>): Array<T> => {\n return uniqWith(array, equalitor)\n}\n\nexport const dedupeBy = <T>(array: Array<T>, mapper: (element: T) => Signable): Array<T> => {\n return uniqBy(array, (it) => Signatures.sign(mapper(it)))\n}\n\nexport const dedupe = <T extends Signable>(array: Array<T>): Array<T> => {\n return dedupeBy(array, Signatures.sign)\n}\n\nexport const sortWith = <T>(array: Array<T>, comparator: Comparator<T>): Array<T> => {\n return [...array].sort(comparator)\n}\n\nexport const sortBy = <T>(array: Array<T>, mapper: (element: T) => Signable): Array<T> => {\n return sortWith(\n array,\n Comparators.compareBy((it) => Signatures.sign(mapper(it)), Comparators.natural())\n )\n}\n\nexport const sort = <T extends Signable>(array: Array<T>): Array<T> => sortBy(array, Signatures.sign)\n\nexport const concatenate = concat\n\nexport const first = _first\n\nexport const only = <T>(array: Array<T>): T => {\n Preconditions.isTrue(array.length === 1)\n return first(array)!\n}\n\nexport const last = _last\n\nexport const isEmpty = _isEmpty\n// TODO make a better range function\nexport const range = _range\n// TODO should this live in collections?\nexport const groupBy = _groupBy\n\nexport const rest = <T>(array: Array<T>, elementsToSkip: number = 1): Array<T> => {\n return array.slice(elementsToSkip)\n}\n\nexport const clear = (array: Array<unknown>): void => {\n _remove(array, () => true)\n}\n\nexport const bisect = <T, L, R>(array: Array<T>, bisector: (element: T, index: number) => Either<L, R>): [Array<L>, Array<R>] => {\n return Eithers.split(array.map(bisector))\n}\n\nexport const toArray = <T>(array: Arrayable<T>): Array<T> => {\n if (Array.isArray(array)) {\n return array\n }\n\n return [array]\n}\n\nexport const flatten = _flatten\n"],"mappings":"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","names":["first","second"]}
@@ -0,0 +1,59 @@
1
+ import { Duration } from '@bessemer/cornerstone/duration';
2
+ export type PendingValue = {
3
+ isSuccess: false;
4
+ isError: false;
5
+ isLoading: false;
6
+ isFetching: boolean;
7
+ data: undefined;
8
+ };
9
+ export type LoadingValue = {
10
+ isSuccess: false;
11
+ isError: false;
12
+ isLoading: true;
13
+ isFetching: boolean;
14
+ data: undefined;
15
+ };
16
+ export type ErrorValue = {
17
+ isSuccess: false;
18
+ isError: true;
19
+ isLoading: false;
20
+ isFetching: boolean;
21
+ data: unknown;
22
+ };
23
+ export type FetchingValueSuccess<T> = {
24
+ isSuccess: true;
25
+ isError: false;
26
+ isLoading: false;
27
+ isFetching: true;
28
+ data: T;
29
+ };
30
+ export type FetchingValueError = {
31
+ isSuccess: false;
32
+ isError: true;
33
+ isLoading: false;
34
+ isFetching: true;
35
+ data: unknown;
36
+ };
37
+ export type SettledValue<T> = {
38
+ isSuccess: true;
39
+ isError: false;
40
+ isLoading: false;
41
+ isFetching: false;
42
+ data: T;
43
+ };
44
+ export type AsyncValue<T> = PendingValue | LoadingValue | ErrorValue | FetchingValueSuccess<T> | FetchingValueError | SettledValue<T>;
45
+ export declare const isSettled: <T>(value: AsyncValue<T>) => value is SettledValue<T>;
46
+ export declare const loading: () => LoadingValue;
47
+ export declare const fetching: <T>(data: T) => FetchingValueSuccess<T>;
48
+ export declare const settled: <T>(data: T) => SettledValue<T>;
49
+ export declare const error: (error: unknown) => ErrorValue;
50
+ export declare const handle: <T, N>(value: AsyncValue<T | null>, handlers: {
51
+ loading: () => N;
52
+ error: (error: unknown) => N;
53
+ absent: () => N;
54
+ success: (data: T) => N;
55
+ }) => N;
56
+ export declare const map: <T, N>(value: AsyncValue<T>, mapper: (value: T) => N) => AsyncValue<N>;
57
+ export declare const execute: <T>(runnable: () => Promise<T>) => Promise<T>;
58
+ export declare const sleep: (duration: Duration) => Promise<void>;
59
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../src/async.ts"],"names":[],"mappings":"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"}
package/dist/async.js ADDED
@@ -0,0 +1,62 @@
1
+ // src/async.ts
2
+ import { Durations, Objects } from "@bessemer/cornerstone";
3
+ var isSettled = (value) => {
4
+ return value.isSuccess && !value.isError && !value.isLoading && !value.isFetching;
5
+ };
6
+ var loading = () => ({ isSuccess: false, isError: false, isLoading: true, isFetching: true, data: void 0 });
7
+ var fetching = (data) => ({
8
+ isSuccess: true,
9
+ isError: false,
10
+ isLoading: false,
11
+ isFetching: true,
12
+ data
13
+ });
14
+ var settled = (data) => ({ isSuccess: true, isError: false, isLoading: false, isFetching: false, data });
15
+ var error = (error2) => ({ isSuccess: false, isError: true, isLoading: false, isFetching: false, data: error2 });
16
+ var handle = (value, handlers) => {
17
+ if (value.isLoading || value.isError && value.isFetching) {
18
+ return handlers.loading();
19
+ }
20
+ if (value.isError) {
21
+ return handlers.error(value.data);
22
+ }
23
+ if (Objects.isNil(value.data)) {
24
+ return handlers.absent();
25
+ }
26
+ return handlers.success(value.data);
27
+ };
28
+ var map = (value, mapper) => {
29
+ if (!value.isSuccess) {
30
+ return value;
31
+ }
32
+ return { ...value, data: mapper(value.data) };
33
+ };
34
+ var execute = (runnable) => {
35
+ return new Promise(async (resolve, reject) => {
36
+ setTimeout(async () => {
37
+ try {
38
+ const value = await runnable();
39
+ resolve(value);
40
+ } catch (e) {
41
+ reject(e);
42
+ }
43
+ }, 0);
44
+ });
45
+ };
46
+ var sleep = (duration) => {
47
+ return new Promise((resolve) => {
48
+ setTimeout(resolve, Durations.inMilliseconds(duration));
49
+ });
50
+ };
51
+ export {
52
+ error,
53
+ execute,
54
+ fetching,
55
+ handle,
56
+ isSettled,
57
+ loading,
58
+ map,
59
+ settled,
60
+ sleep
61
+ };
62
+ //# sourceMappingURL=async.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/async.ts"],"sourcesContent":["import { Duration } from '@bessemer/cornerstone/duration'\nimport { Durations, Objects } from '@bessemer/cornerstone'\n\nexport type PendingValue = {\n isSuccess: false\n isError: false\n isLoading: false\n isFetching: boolean\n data: undefined\n}\n\nexport type LoadingValue = {\n isSuccess: false\n isError: false\n isLoading: true\n isFetching: boolean\n data: undefined\n}\n\nexport type ErrorValue = {\n isSuccess: false\n isError: true\n isLoading: false\n isFetching: boolean\n data: unknown\n}\n\nexport type FetchingValueSuccess<T> = {\n isSuccess: true\n isError: false\n isLoading: false\n isFetching: true\n data: T\n}\n\nexport type FetchingValueError = {\n isSuccess: false\n isError: true\n isLoading: false\n isFetching: true\n data: unknown\n}\n\nexport type SettledValue<T> = {\n isSuccess: true\n isError: false\n isLoading: false\n isFetching: false\n data: T\n}\n\nexport type AsyncValue<T> = PendingValue | LoadingValue | ErrorValue | FetchingValueSuccess<T> | FetchingValueError | SettledValue<T>\n\nexport const isSettled = <T>(value: AsyncValue<T>): value is SettledValue<T> => {\n return value.isSuccess && !value.isError && !value.isLoading && !value.isFetching\n}\n\nexport const loading = (): LoadingValue => ({ isSuccess: false, isError: false, isLoading: true, isFetching: true, data: undefined })\n\nexport const fetching = <T>(data: T): FetchingValueSuccess<T> => ({\n isSuccess: true,\n isError: false,\n isLoading: false,\n isFetching: true,\n data,\n})\n\nexport const settled = <T>(data: T): SettledValue<T> => ({ isSuccess: true, isError: false, isLoading: false, isFetching: false, data })\n\nexport const error = (error: unknown): ErrorValue => ({ isSuccess: false, isError: true, isLoading: false, isFetching: false, data: error })\n\nexport const handle = <T, N>(\n value: AsyncValue<T | null>,\n handlers: { loading: () => N; error: (error: unknown) => N; absent: () => N; success: (data: T) => N }\n): N => {\n if (value.isLoading || (value.isError && value.isFetching)) {\n return handlers.loading()\n }\n if (value.isError) {\n return handlers.error(value.data)\n }\n if (Objects.isNil(value.data)) {\n return handlers.absent()\n }\n\n return handlers.success(value.data)\n}\n\nexport const map = <T, N>(value: AsyncValue<T>, mapper: (value: T) => N): AsyncValue<N> => {\n if (!value.isSuccess) {\n return value\n }\n\n return { ...value, data: mapper(value.data) }\n}\n\nexport const execute = <T>(runnable: () => Promise<T>): Promise<T> => {\n return new Promise(async (resolve, reject) => {\n setTimeout(async () => {\n try {\n const value = await runnable()\n resolve(value)\n } catch (e) {\n reject(e)\n }\n }, 0)\n })\n}\n\nexport const sleep = (duration: Duration): Promise<void> => {\n return new Promise((resolve) => {\n setTimeout(resolve, Durations.inMilliseconds(duration))\n })\n}\n"],"mappings":";AACA,SAAS,WAAW,eAAe;AAoD5B,IAAM,YAAY,CAAI,UAAmD;AAC9E,SAAO,MAAM,aAAa,CAAC,MAAM,WAAW,CAAC,MAAM,aAAa,CAAC,MAAM;AACzE;AAEO,IAAM,UAAU,OAAqB,EAAE,WAAW,OAAO,SAAS,OAAO,WAAW,MAAM,YAAY,MAAM,MAAM,OAAU;AAE5H,IAAM,WAAW,CAAI,UAAsC;AAAA,EAChE,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AACF;AAEO,IAAM,UAAU,CAAI,UAA8B,EAAE,WAAW,MAAM,SAAS,OAAO,WAAW,OAAO,YAAY,OAAO,KAAK;AAE/H,IAAM,QAAQ,CAACA,YAAgC,EAAE,WAAW,OAAO,SAAS,MAAM,WAAW,OAAO,YAAY,OAAO,MAAMA,OAAM;AAEnI,IAAM,SAAS,CACpB,OACA,aACM;AACN,MAAI,MAAM,aAAc,MAAM,WAAW,MAAM,YAAa;AAC1D,WAAO,SAAS,QAAQ;AAAA,EAC1B;AACA,MAAI,MAAM,SAAS;AACjB,WAAO,SAAS,MAAM,MAAM,IAAI;AAAA,EAClC;AACA,MAAI,QAAQ,MAAM,MAAM,IAAI,GAAG;AAC7B,WAAO,SAAS,OAAO;AAAA,EACzB;AAEA,SAAO,SAAS,QAAQ,MAAM,IAAI;AACpC;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,CAAC,MAAM,WAAW;AACpB,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,OAAO,MAAM,OAAO,MAAM,IAAI,EAAE;AAC9C;AAEO,IAAM,UAAU,CAAI,aAA2C;AACpE,SAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,eAAW,YAAY;AACrB,UAAI;AACF,cAAM,QAAQ,MAAM,SAAS;AAC7B,gBAAQ,KAAK;AAAA,MACf,SAAS,GAAG;AACV,eAAO,CAAC;AAAA,MACV;AAAA,IACF,GAAG,CAAC;AAAA,EACN,CAAC;AACH;AAEO,IAAM,QAAQ,CAAC,aAAsC;AAC1D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,UAAU,eAAe,QAAQ,CAAC;AAAA,EACxD,CAAC;AACH;","names":["error"]}
@@ -0,0 +1,106 @@
1
+ import { AbstractLocalKeyValueStore, AbstractRemoteKeyValueStore, LocalKeyValueStore, RemoteKeyValueStore } from '@bessemer/cornerstone/store';
2
+ import { Duration } from '@bessemer/cornerstone/duration';
3
+ import { ResourceKey, ResourceNamespace } from '@bessemer/cornerstone/resource';
4
+ import { AbstractApplicationContext } from '@bessemer/cornerstone/context';
5
+ import { NominalType } from '@bessemer/cornerstone/types';
6
+ import { Entry } from '@bessemer/cornerstone/entry';
7
+ import { GlobPattern } from '@bessemer/cornerstone/glob';
8
+ import { Arrayable } from 'type-fest';
9
+ import { ZodType } from 'zod';
10
+ export type CacheProps = {
11
+ maxSize: number | null;
12
+ timeToLive: Duration;
13
+ timeToStale: Duration | null;
14
+ };
15
+ export type CacheOptions = Partial<CacheProps>;
16
+ export declare namespace CacheProps {
17
+ const buildCacheProps: (options?: CacheOptions) => CacheProps;
18
+ }
19
+ export declare namespace CacheKey {
20
+ const disableCaching: () => ResourceNamespace;
21
+ const isDisabled: (key: ResourceNamespace) => boolean;
22
+ }
23
+ export type CacheSector = {
24
+ globs: Array<GlobPattern>;
25
+ };
26
+ export declare namespace CacheSector {
27
+ const of: (globs: Arrayable<GlobPattern>) => {
28
+ globs: GlobPattern[];
29
+ };
30
+ const namespace: (namespace: ResourceNamespace, sector: CacheSector) => CacheSector;
31
+ }
32
+ export type CacheName = NominalType<string, 'CacheName'>;
33
+ export declare const CacheNameSchema: ZodType<CacheName>;
34
+ export interface AbstractCache<T> {
35
+ name: CacheName;
36
+ }
37
+ export interface Cache<T> extends AbstractCache<T> {
38
+ fetchValue(namespace: ResourceNamespace, key: ResourceKey, fetch: () => Promise<T>): Promise<T>;
39
+ fetchValues(namespace: ResourceNamespace, keys: Array<ResourceKey>, fetch: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>): Promise<Array<Entry<T>>>;
40
+ writeValue(namespace: ResourceNamespace, key: ResourceKey, value: T | undefined): Promise<void>;
41
+ writeValues(namespace: ResourceNamespace, entries: Array<Entry<T | undefined>>): Promise<void>;
42
+ evictAll(sector: CacheSector): Promise<void>;
43
+ }
44
+ export interface CacheProvider<T> extends RemoteKeyValueStore<CacheEntry<T>> {
45
+ type: CacheProviderType;
46
+ evictAll(sector: CacheSector): Promise<void>;
47
+ }
48
+ export declare abstract class AbstractCacheProvider<T> extends AbstractRemoteKeyValueStore<CacheEntry<T>> implements CacheProvider<T> {
49
+ abstract type: CacheProviderType;
50
+ abstract evictAll(sector: CacheSector): Promise<void>;
51
+ }
52
+ export interface LocalCache<T> extends AbstractCache<T> {
53
+ getValue(namespace: ResourceNamespace, key: ResourceKey, fetch: () => T): T;
54
+ getValues(namespace: ResourceNamespace, keys: Array<ResourceKey>, fetch: (keys: Array<ResourceKey>) => Array<Entry<T>>): Array<Entry<T>>;
55
+ setValue(namespace: ResourceNamespace, key: ResourceKey, value: T | undefined): void;
56
+ setValues(namespace: ResourceNamespace, entries: Array<Entry<T | undefined>>): void;
57
+ removeAll(sector: CacheSector): void;
58
+ }
59
+ export interface LocalCacheProvider<T> extends LocalKeyValueStore<CacheEntry<T>>, CacheProvider<T> {
60
+ removeAll(sector: CacheSector): void;
61
+ }
62
+ export declare abstract class AbstractLocalCacheProvider<T> extends AbstractLocalKeyValueStore<CacheEntry<T>> implements LocalCacheProvider<T> {
63
+ abstract type: CacheProviderType;
64
+ abstract removeAll(sector: CacheSector): void;
65
+ evictAll(sector: CacheSector): Promise<void>;
66
+ }
67
+ export type CacheEntry<T> = {
68
+ value: T;
69
+ liveTimestamp: Date | null;
70
+ staleTimestamp: Date | null;
71
+ };
72
+ export declare namespace CacheEntry {
73
+ const isActive: <T>(entry: CacheEntry<T>) => boolean;
74
+ const isDead: <T>(entry: CacheEntry<T> | undefined) => boolean;
75
+ const isAlive: <T>(entry: CacheEntry<T> | undefined) => boolean;
76
+ const isStale: <T>(entry: CacheEntry<T>) => boolean;
77
+ const of: <T>(value: T) => CacheEntry<T>;
78
+ const applyProps: <T>(originalEntry: CacheEntry<T>, props: CacheProps) => CacheEntry<T>;
79
+ }
80
+ export type CacheConfigurationOptions = CacheConfigurationSection & {
81
+ local: CacheConfigurationSection;
82
+ };
83
+ export type CacheConfigurationSection = {
84
+ defaults: CacheDefinition;
85
+ /**
86
+ * These options map from cache name key to configuration. They are a way for the tenant to override the configurations
87
+ * for specific caches from the cache configuration here.
88
+ */
89
+ caches?: Record<string, Partial<CacheDefinition>>;
90
+ };
91
+ export type CacheDefinition = {
92
+ options?: CacheOptions;
93
+ providers: Array<CacheProviderConfiguration>;
94
+ };
95
+ export type CacheProviderType = NominalType<string, 'CacheProviderType'>;
96
+ export type CacheProviderConfiguration = CacheOptions & {
97
+ type: CacheProviderType;
98
+ };
99
+ export type CacheConfiguration = CacheConfigurationSection & {
100
+ local: CacheConfigurationSection;
101
+ };
102
+ export type CacheProviderRegistry<ContextType extends AbstractApplicationContext> = {
103
+ type: CacheProviderType;
104
+ construct: <T>(props: CacheProps, context: ContextType) => CacheProvider<T>;
105
+ };
106
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/cache.js ADDED
@@ -0,0 +1,112 @@
1
+ // src/cache.ts
2
+ import { AbstractLocalKeyValueStore, AbstractRemoteKeyValueStore } from "@bessemer/cornerstone/store";
3
+ import { Arrays, Dates, Durations, Objects, Strings, Zod } from "@bessemer/cornerstone";
4
+ import { ResourceKey } from "@bessemer/cornerstone/resource";
5
+ var CacheProps;
6
+ ((CacheProps2) => {
7
+ const DefaultCacheProps = {
8
+ maxSize: 5e4,
9
+ timeToLive: Durations.OneDay,
10
+ timeToStale: Durations.OneHour
11
+ };
12
+ CacheProps2.buildCacheProps = (options) => {
13
+ options = options ?? {};
14
+ const props = Objects.merge(DefaultCacheProps, options);
15
+ if (props.maxSize === null && props.timeToLive === null) {
16
+ throw new Error("Invalid cache configuration, both maxSize and timeToLive are null");
17
+ }
18
+ return props;
19
+ };
20
+ })(CacheProps || (CacheProps = {}));
21
+ var CacheKey;
22
+ ((CacheKey2) => {
23
+ const DisableCacheToken = "f6822c1a-d527-4c65-b9dd-ddc24620b684";
24
+ CacheKey2.disableCaching = () => {
25
+ return DisableCacheToken;
26
+ };
27
+ CacheKey2.isDisabled = (key) => {
28
+ return Strings.contains(key, DisableCacheToken);
29
+ };
30
+ })(CacheKey || (CacheKey = {}));
31
+ var CacheSector;
32
+ ((CacheSector2) => {
33
+ CacheSector2.of = (globs) => {
34
+ return { globs: Arrays.toArray(globs) };
35
+ };
36
+ CacheSector2.namespace = (namespace2, sector) => {
37
+ return { globs: ResourceKey.namespaceAll(namespace2, sector.globs) };
38
+ };
39
+ })(CacheSector || (CacheSector = {}));
40
+ var CacheNameSchema = Zod.string();
41
+ var AbstractCacheProvider = class extends AbstractRemoteKeyValueStore {
42
+ };
43
+ var AbstractLocalCacheProvider = class extends AbstractLocalKeyValueStore {
44
+ async evictAll(sector) {
45
+ this.removeAll(sector);
46
+ }
47
+ };
48
+ var CacheEntry;
49
+ ((CacheEntry2) => {
50
+ CacheEntry2.isActive = (entry) => {
51
+ if ((0, CacheEntry2.isDead)(entry) || (0, CacheEntry2.isStale)(entry)) {
52
+ return false;
53
+ }
54
+ return true;
55
+ };
56
+ CacheEntry2.isDead = (entry) => {
57
+ if (Objects.isNil(entry)) {
58
+ return true;
59
+ }
60
+ if (Objects.isNil(entry.liveTimestamp)) {
61
+ return false;
62
+ }
63
+ return Dates.isBefore(entry.liveTimestamp, Dates.now());
64
+ };
65
+ CacheEntry2.isAlive = (entry) => !(0, CacheEntry2.isDead)(entry);
66
+ CacheEntry2.isStale = (entry) => {
67
+ if (Objects.isNil(entry.staleTimestamp)) {
68
+ return false;
69
+ }
70
+ return Dates.isBefore(entry.staleTimestamp, Dates.now());
71
+ };
72
+ CacheEntry2.of = (value) => {
73
+ const entry = {
74
+ value,
75
+ liveTimestamp: null,
76
+ staleTimestamp: null
77
+ };
78
+ return entry;
79
+ };
80
+ CacheEntry2.applyProps = (originalEntry, props) => {
81
+ let liveTimestamp = originalEntry.liveTimestamp;
82
+ if (!Objects.isNil(props.timeToLive)) {
83
+ const limit = Dates.addMilliseconds(Dates.now(), Durations.inMilliseconds(props.timeToLive));
84
+ if (Dates.isBefore(limit, liveTimestamp ?? limit)) {
85
+ liveTimestamp = limit;
86
+ }
87
+ }
88
+ let staleTimestamp = originalEntry.staleTimestamp;
89
+ if (!Objects.isNil(props.timeToStale)) {
90
+ const limit = Dates.addMilliseconds(Dates.now(), Durations.inMilliseconds(props.timeToStale));
91
+ if (Dates.isBefore(limit, staleTimestamp ?? limit)) {
92
+ staleTimestamp = limit;
93
+ }
94
+ }
95
+ const limitedEntry = {
96
+ value: originalEntry.value,
97
+ liveTimestamp,
98
+ staleTimestamp
99
+ };
100
+ return limitedEntry;
101
+ };
102
+ })(CacheEntry || (CacheEntry = {}));
103
+ export {
104
+ AbstractCacheProvider,
105
+ AbstractLocalCacheProvider,
106
+ CacheEntry,
107
+ CacheKey,
108
+ CacheNameSchema,
109
+ CacheProps,
110
+ CacheSector
111
+ };
112
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache.ts"],"sourcesContent":["import { AbstractLocalKeyValueStore, AbstractRemoteKeyValueStore, LocalKeyValueStore, RemoteKeyValueStore } from '@bessemer/cornerstone/store'\nimport { Arrays, Dates, Durations, Objects, Strings, Zod } from '@bessemer/cornerstone'\nimport { Duration } from '@bessemer/cornerstone/duration'\nimport { ResourceKey, ResourceNamespace } from '@bessemer/cornerstone/resource'\nimport { AbstractApplicationContext } from '@bessemer/cornerstone/context'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport { Entry } from '@bessemer/cornerstone/entry'\nimport { GlobPattern } from '@bessemer/cornerstone/glob'\nimport { Arrayable } from 'type-fest'\nimport { ZodType } from 'zod'\n\n// JOHN should this even be in cornerstone? especially consider the config types down at the bottom\n\nexport type CacheProps = {\n maxSize: number | null\n timeToLive: Duration\n timeToStale: Duration | null\n}\n\nexport type CacheOptions = Partial<CacheProps>\n\nexport namespace CacheProps {\n const DefaultCacheProps = {\n maxSize: 50000,\n timeToLive: Durations.OneDay,\n timeToStale: Durations.OneHour,\n }\n\n export const buildCacheProps = (options?: CacheOptions): CacheProps => {\n options = options ?? {}\n\n const props = Objects.merge(DefaultCacheProps, options)\n\n if (props.maxSize === null && props.timeToLive === null) {\n throw new Error('Invalid cache configuration, both maxSize and timeToLive are null')\n }\n\n return props\n }\n}\n\nexport namespace CacheKey {\n // We use a hardcoded UUID to represent a unique token value that serves as a flag to disable caching\n const DisableCacheToken = 'f6822c1a-d527-4c65-b9dd-ddc24620b684'\n\n export const disableCaching = (): ResourceNamespace => {\n return DisableCacheToken\n }\n\n export const isDisabled = (key: ResourceNamespace): boolean => {\n return Strings.contains(key, DisableCacheToken)\n }\n}\n\nexport type CacheSector = {\n globs: Array<GlobPattern>\n}\n\nexport namespace CacheSector {\n export const of = (globs: Arrayable<GlobPattern>) => {\n return { globs: Arrays.toArray(globs) }\n }\n\n export const namespace = (namespace: ResourceNamespace, sector: CacheSector): CacheSector => {\n return { globs: ResourceKey.namespaceAll(namespace, sector.globs) }\n }\n}\n\nexport type CacheName = NominalType<string, 'CacheName'>\nexport const CacheNameSchema: ZodType<CacheName> = Zod.string()\n\nexport interface AbstractCache<T> {\n name: CacheName\n}\n\nexport interface Cache<T> extends AbstractCache<T> {\n fetchValue(namespace: ResourceNamespace, key: ResourceKey, fetch: () => Promise<T>): Promise<T>\n\n fetchValues(\n namespace: ResourceNamespace,\n keys: Array<ResourceKey>,\n fetch: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>\n ): Promise<Array<Entry<T>>>\n\n writeValue(namespace: ResourceNamespace, key: ResourceKey, value: T | undefined): Promise<void>\n\n writeValues(namespace: ResourceNamespace, entries: Array<Entry<T | undefined>>): Promise<void>\n\n evictAll(sector: CacheSector): Promise<void>\n}\n\nexport interface CacheProvider<T> extends RemoteKeyValueStore<CacheEntry<T>> {\n type: CacheProviderType\n\n evictAll(sector: CacheSector): Promise<void>\n}\n\nexport abstract class AbstractCacheProvider<T> extends AbstractRemoteKeyValueStore<CacheEntry<T>> implements CacheProvider<T> {\n abstract type: CacheProviderType\n\n abstract evictAll(sector: CacheSector): Promise<void>\n}\n\nexport interface LocalCache<T> extends AbstractCache<T> {\n getValue(namespace: ResourceNamespace, key: ResourceKey, fetch: () => T): T\n\n getValues(namespace: ResourceNamespace, keys: Array<ResourceKey>, fetch: (keys: Array<ResourceKey>) => Array<Entry<T>>): Array<Entry<T>>\n\n setValue(namespace: ResourceNamespace, key: ResourceKey, value: T | undefined): void\n\n setValues(namespace: ResourceNamespace, entries: Array<Entry<T | undefined>>): void\n\n removeAll(sector: CacheSector): void\n}\n\nexport interface LocalCacheProvider<T> extends LocalKeyValueStore<CacheEntry<T>>, CacheProvider<T> {\n removeAll(sector: CacheSector): void\n}\n\nexport abstract class AbstractLocalCacheProvider<T> extends AbstractLocalKeyValueStore<CacheEntry<T>> implements LocalCacheProvider<T> {\n abstract type: CacheProviderType\n\n abstract removeAll(sector: CacheSector): void\n\n async evictAll(sector: CacheSector): Promise<void> {\n this.removeAll(sector)\n }\n}\n\nexport type CacheEntry<T> = {\n value: T\n liveTimestamp: Date | null\n staleTimestamp: Date | null\n}\n\nexport namespace CacheEntry {\n export const isActive = <T>(entry: CacheEntry<T>): boolean => {\n if (isDead(entry) || isStale(entry)) {\n return false\n }\n\n return true\n }\n\n export const isDead = <T>(entry: CacheEntry<T> | undefined): boolean => {\n if (Objects.isNil(entry)) {\n return true\n }\n\n if (Objects.isNil(entry.liveTimestamp)) {\n return false\n }\n\n return Dates.isBefore(entry.liveTimestamp, Dates.now())\n }\n\n export const isAlive = <T>(entry: CacheEntry<T> | undefined): boolean => !isDead(entry)\n\n export const isStale = <T>(entry: CacheEntry<T>): boolean => {\n if (Objects.isNil(entry.staleTimestamp)) {\n return false\n }\n\n return Dates.isBefore(entry.staleTimestamp, Dates.now())\n }\n\n export const of = <T>(value: T) => {\n const entry: CacheEntry<T> = {\n value,\n liveTimestamp: null,\n staleTimestamp: null,\n }\n\n return entry\n }\n\n // JOHN do we want to enforce some kind of minimum liveness threshold?\n export const applyProps = <T>(originalEntry: CacheEntry<T>, props: CacheProps): CacheEntry<T> => {\n let liveTimestamp: Date | null = originalEntry.liveTimestamp\n if (!Objects.isNil(props.timeToLive)) {\n const limit = Dates.addMilliseconds(Dates.now(), Durations.inMilliseconds(props.timeToLive))\n if (Dates.isBefore(limit, liveTimestamp ?? limit)) {\n liveTimestamp = limit\n }\n }\n\n let staleTimestamp: Date | null = originalEntry.staleTimestamp\n if (!Objects.isNil(props.timeToStale)) {\n const limit = Dates.addMilliseconds(Dates.now(), Durations.inMilliseconds(props.timeToStale))\n if (Dates.isBefore(limit, staleTimestamp ?? limit)) {\n staleTimestamp = limit\n }\n }\n\n const limitedEntry: CacheEntry<T> = {\n value: originalEntry.value,\n liveTimestamp,\n staleTimestamp,\n }\n\n return limitedEntry\n }\n}\n\nexport type CacheConfigurationOptions = CacheConfigurationSection & {\n local: CacheConfigurationSection\n}\n\nexport type CacheConfigurationSection = {\n defaults: CacheDefinition\n\n /**\n * These options map from cache name key to configuration. They are a way for the tenant to override the configurations\n * for specific caches from the cache configuration here.\n */\n caches?: Record<string, Partial<CacheDefinition>>\n}\n\nexport type CacheDefinition = {\n options?: CacheOptions\n providers: Array<CacheProviderConfiguration>\n}\n\nexport type CacheProviderType = NominalType<string, 'CacheProviderType'>\nexport type CacheProviderConfiguration = CacheOptions & {\n type: CacheProviderType\n}\n\nexport type CacheConfiguration = CacheConfigurationSection & {\n local: CacheConfigurationSection\n}\n\nexport type CacheProviderRegistry<ContextType extends AbstractApplicationContext> = {\n type: CacheProviderType\n construct: <T>(props: CacheProps, context: ContextType) => CacheProvider<T>\n}\n"],"mappings":"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","names":["CacheProps","CacheKey","CacheSector","namespace","CacheEntry"]}
@@ -0,0 +1,16 @@
1
+ export interface Combinable {
2
+ combinability: Combinability;
3
+ }
4
+ export type Combinability = {
5
+ type: CombinabilityType;
6
+ class: CombinabilityClass;
7
+ };
8
+ export declare enum CombinabilityType {
9
+ Stackable = "Stackable",
10
+ Singleton = "Singleton",
11
+ Totalitarian = "Totalitarian"
12
+ }
13
+ export type CombinabilityClass = string | null;
14
+ export declare const DefaultCombinability: Combinability;
15
+ export declare const combinations: <T extends Combinable>(combinables: Array<T>) => Array<Array<T>>;
16
+ //# sourceMappingURL=combinable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinable.d.ts","sourceRoot":"","sources":["../src/combinable.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,aAAa,CAAA;CAC7B;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,iBAAiB,CAAA;IACvB,KAAK,EAAE,kBAAkB,CAAA;CAC1B,CAAA;AAED,oBAAY,iBAAiB;IAC3B,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAAA;AAE9C,eAAO,MAAM,oBAAoB,EAAE,aAGlC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,UAAU,EAAE,aAAa,KAAK,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAexF,CAAA"}