@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
package/dist/result.js ADDED
@@ -0,0 +1,50 @@
1
+ // src/result.ts
2
+ import { Eithers, Promises } from "@bessemer/cornerstone";
3
+ var success = (value) => {
4
+ return { ...Eithers.right(value), isSuccess: true };
5
+ };
6
+ var failure = (failure2) => {
7
+ return { ...Eithers.left(failure2 ?? null), isSuccess: false };
8
+ };
9
+ function tryValue(resolver) {
10
+ try {
11
+ let result = resolver();
12
+ if (Promises.isPromise(result)) {
13
+ return result.then((it) => success(it)).catch((it) => failure(it));
14
+ } else {
15
+ return success(result);
16
+ }
17
+ } catch (e) {
18
+ return failure(e);
19
+ }
20
+ }
21
+ function tryResult(resolver) {
22
+ try {
23
+ let result = resolver();
24
+ if (Promises.isPromise(result)) {
25
+ return result.catch((it) => failure(it));
26
+ } else {
27
+ return result;
28
+ }
29
+ } catch (e) {
30
+ return failure(e);
31
+ }
32
+ }
33
+ function map(result, valueMapper) {
34
+ if (result.isSuccess) {
35
+ return {
36
+ ...result,
37
+ value: valueMapper(result.value)
38
+ };
39
+ } else {
40
+ return result;
41
+ }
42
+ }
43
+ export {
44
+ failure,
45
+ map,
46
+ success,
47
+ tryResult,
48
+ tryValue
49
+ };
50
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/result.ts"],"sourcesContent":["import { Left, Right } from '@bessemer/cornerstone/either'\nimport { Eithers, Promises } from '@bessemer/cornerstone'\nimport { Throwable } from '@bessemer/cornerstone/types'\n\nexport type Success<T> = Right<T> & {\n isSuccess: true\n}\n\nexport type Failure = Left<Throwable | null> & {\n isSuccess: false\n}\n\nexport type Result<T> = Success<T> | Failure\nexport type AsyncResult<T> = Promise<Result<T>>\n\nexport const success = <T>(value: T): Success<T> => {\n return { ...Eithers.right(value), isSuccess: true }\n}\n\nexport const failure = (failure?: Throwable): Failure => {\n return { ...Eithers.left(failure ?? null), isSuccess: false }\n}\n\nexport function tryValue<SOURCE_VALUE>(resolver: () => Promise<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>\nexport function tryValue<SOURCE_VALUE>(resolver: () => SOURCE_VALUE): Result<SOURCE_VALUE>\nexport function tryValue<SOURCE_VALUE>(resolver: () => SOURCE_VALUE | Promise<SOURCE_VALUE>): Result<SOURCE_VALUE> | Promise<Result<SOURCE_VALUE>> {\n try {\n let result = resolver()\n if (Promises.isPromise(result)) {\n return result.then((it) => success(it)).catch((it) => failure(it))\n } else {\n return success(result)\n }\n } catch (e: any) {\n return failure(e)\n }\n}\n\nexport function tryResult<SOURCE_VALUE>(resolver: () => Result<SOURCE_VALUE>): Result<SOURCE_VALUE>\nexport function tryResult<SOURCE_VALUE>(resolver: () => AsyncResult<SOURCE_VALUE>): AsyncResult<SOURCE_VALUE>\nexport function tryResult<SOURCE_VALUE>(resolver: () => Result<SOURCE_VALUE> | AsyncResult<SOURCE_VALUE>): ReturnType<typeof resolver> {\n try {\n let result = resolver()\n if (Promises.isPromise(result)) {\n return result.catch((it) => failure(it))\n } else {\n return result\n }\n } catch (e: any) {\n return failure(e)\n }\n}\n\nexport function map<SOURCE_VALUE, TARGET_VALUE>(\n result: Result<SOURCE_VALUE>,\n valueMapper: (element: SOURCE_VALUE) => TARGET_VALUE\n): Result<TARGET_VALUE> {\n if (result.isSuccess) {\n return {\n ...result,\n value: valueMapper(result.value),\n }\n } else {\n return result\n }\n}\n"],"mappings":";AACA,SAAS,SAAS,gBAAgB;AAc3B,IAAM,UAAU,CAAI,UAAyB;AAClD,SAAO,EAAE,GAAG,QAAQ,MAAM,KAAK,GAAG,WAAW,KAAK;AACpD;AAEO,IAAM,UAAU,CAACA,aAAiC;AACvD,SAAO,EAAE,GAAG,QAAQ,KAAKA,YAAW,IAAI,GAAG,WAAW,MAAM;AAC9D;AAIO,SAAS,SAAuB,UAA4G;AACjJ,MAAI;AACF,QAAI,SAAS,SAAS;AACtB,QAAI,SAAS,UAAU,MAAM,GAAG;AAC9B,aAAO,OAAO,KAAK,CAAC,OAAO,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,IACnE,OAAO;AACL,aAAO,QAAQ,MAAM;AAAA,IACvB;AAAA,EACF,SAAS,GAAQ;AACf,WAAO,QAAQ,CAAC;AAAA,EAClB;AACF;AAIO,SAAS,UAAwB,UAA+F;AACrI,MAAI;AACF,QAAI,SAAS,SAAS;AACtB,QAAI,SAAS,UAAU,MAAM,GAAG;AAC9B,aAAO,OAAO,MAAM,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,IACzC,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,SAAS,GAAQ;AACf,WAAO,QAAQ,CAAC;AAAA,EAClB;AACF;AAEO,SAAS,IACd,QACA,aACsB;AACtB,MAAI,OAAO,WAAW;AACpB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO,YAAY,OAAO,KAAK;AAAA,IACjC;AAAA,EACF,OAAO;AACL,WAAO;AAAA,EACT;AACF;","names":["failure"]}
@@ -0,0 +1,18 @@
1
+ import { Duration } from '@bessemer/cornerstone/duration';
2
+ import { AsyncResult, Result } from '@bessemer/cornerstone/result';
3
+ import { PartialDeep } from 'type-fest';
4
+ export type RetryProps = {
5
+ attempts: number;
6
+ delay: Duration;
7
+ };
8
+ export type RetryOptions = PartialDeep<RetryProps>;
9
+ export declare const None: RetryProps;
10
+ export declare const DefaultRetryProps: RetryProps;
11
+ export type RetryState = {
12
+ attempt: number;
13
+ props: RetryProps;
14
+ };
15
+ export declare const initialize: (initialOptions?: RetryOptions) => RetryState;
16
+ export declare const retry: (state: RetryState) => Promise<RetryState | undefined>;
17
+ export declare const usingRetry: <T>(runnable: () => Promise<Result<T>>, initialOptions?: RetryOptions) => AsyncResult<T>;
18
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAEvC,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,QAAQ,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAA;AAElD,eAAO,MAAM,IAAI,EAAE,UAGlB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,UAG/B,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,UAAU,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,iBAAiB,YAAY,KAAG,UAQ1D,CAAA;AAED,eAAO,MAAM,KAAK,GAAU,OAAO,UAAU,KAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAa7E,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,CAAC,EAAE,UAAU,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,YAAY,KAAG,WAAW,CAAC,CAAC,CAiBpH,CAAA"}
package/dist/retry.js ADDED
@@ -0,0 +1,51 @@
1
+ // src/retry.ts
2
+ import { Async, Durations, Maths, Objects, Preconditions, Results } from "@bessemer/cornerstone/index";
3
+ var None = {
4
+ attempts: 0,
5
+ delay: Durations.Zero
6
+ };
7
+ var DefaultRetryProps = {
8
+ attempts: 3,
9
+ delay: Durations.ofMilliseconds(500)
10
+ };
11
+ var initialize = (initialOptions) => {
12
+ const props = Objects.merge(DefaultRetryProps, initialOptions);
13
+ Preconditions.isTrue(props.attempts >= 0, () => "usingRetry attempts must be >= 0");
14
+ return {
15
+ attempt: 0,
16
+ props
17
+ };
18
+ };
19
+ var retry = async (state) => {
20
+ if (state.attempt >= state.props.attempts - 1) {
21
+ return void 0;
22
+ }
23
+ const delayMs = Durations.inMilliseconds(state.props.delay);
24
+ const maxJitterMs = delayMs * 0.3;
25
+ await Async.sleep(Durations.ofMilliseconds(delayMs + Maths.random(0, maxJitterMs)));
26
+ return {
27
+ props: state.props,
28
+ attempt: state.attempt + 1
29
+ };
30
+ };
31
+ var usingRetry = async (runnable, initialOptions) => {
32
+ let retryState = initialize(initialOptions);
33
+ let previousResult = Results.failure();
34
+ do {
35
+ const result = await runnable();
36
+ previousResult = result;
37
+ if (result.isSuccess) {
38
+ return result;
39
+ }
40
+ retryState = await retry(retryState);
41
+ } while (!Objects.isUndefined(retryState));
42
+ return previousResult;
43
+ };
44
+ export {
45
+ DefaultRetryProps,
46
+ None,
47
+ initialize,
48
+ retry,
49
+ usingRetry
50
+ };
51
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/retry.ts"],"sourcesContent":["import { Duration } from '@bessemer/cornerstone/duration'\nimport { Async, Durations, Maths, Objects, Preconditions, Results } from '@bessemer/cornerstone/index'\nimport { AsyncResult, Result } from '@bessemer/cornerstone/result'\nimport { PartialDeep } from 'type-fest'\n\nexport type RetryProps = {\n attempts: number\n delay: Duration\n}\n\nexport type RetryOptions = PartialDeep<RetryProps>\n\nexport const None: RetryProps = {\n attempts: 0,\n delay: Durations.Zero,\n}\n\nexport const DefaultRetryProps: RetryProps = {\n attempts: 3,\n delay: Durations.ofMilliseconds(500),\n}\n\nexport type RetryState = {\n attempt: number\n props: RetryProps\n}\n\nexport const initialize = (initialOptions?: RetryOptions): RetryState => {\n const props = Objects.merge(DefaultRetryProps, initialOptions)\n Preconditions.isTrue(props.attempts >= 0, () => 'usingRetry attempts must be >= 0')\n\n return {\n attempt: 0,\n props,\n }\n}\n\nexport const retry = async (state: RetryState): Promise<RetryState | undefined> => {\n if (state.attempt >= state.props.attempts - 1) {\n return undefined\n }\n\n const delayMs = Durations.inMilliseconds(state.props.delay)\n const maxJitterMs = delayMs * 0.3 // We calculate max jitter as 30% of the delay\n await Async.sleep(Durations.ofMilliseconds(delayMs + Maths.random(0, maxJitterMs)))\n\n return {\n props: state.props,\n attempt: state.attempt + 1,\n }\n}\n\nexport const usingRetry = async <T>(runnable: () => Promise<Result<T>>, initialOptions?: RetryOptions): AsyncResult<T> => {\n let retryState: RetryState | undefined = initialize(initialOptions)\n let previousResult: Result<T> = Results.failure()\n\n do {\n // JOHN Should this be a try/catch? it was causing debugging problems\n const result = await runnable()\n previousResult = result\n\n if (result.isSuccess) {\n return result\n }\n\n retryState = await retry(retryState)\n } while (!Objects.isUndefined(retryState))\n\n return previousResult\n}\n"],"mappings":";AACA,SAAS,OAAO,WAAW,OAAO,SAAS,eAAe,eAAe;AAWlE,IAAM,OAAmB;AAAA,EAC9B,UAAU;AAAA,EACV,OAAO,UAAU;AACnB;AAEO,IAAM,oBAAgC;AAAA,EAC3C,UAAU;AAAA,EACV,OAAO,UAAU,eAAe,GAAG;AACrC;AAOO,IAAM,aAAa,CAAC,mBAA8C;AACvE,QAAM,QAAQ,QAAQ,MAAM,mBAAmB,cAAc;AAC7D,gBAAc,OAAO,MAAM,YAAY,GAAG,MAAM,kCAAkC;AAElF,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,OAAO,UAAuD;AACjF,MAAI,MAAM,WAAW,MAAM,MAAM,WAAW,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,UAAU,eAAe,MAAM,MAAM,KAAK;AAC1D,QAAM,cAAc,UAAU;AAC9B,QAAM,MAAM,MAAM,UAAU,eAAe,UAAU,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC;AAElF,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,SAAS,MAAM,UAAU;AAAA,EAC3B;AACF;AAEO,IAAM,aAAa,OAAU,UAAoC,mBAAkD;AACxH,MAAI,aAAqC,WAAW,cAAc;AAClE,MAAI,iBAA4B,QAAQ,QAAQ;AAEhD,KAAG;AAED,UAAM,SAAS,MAAM,SAAS;AAC9B,qBAAiB;AAEjB,QAAI,OAAO,WAAW;AACpB,aAAO;AAAA,IACT;AAEA,iBAAa,MAAM,MAAM,UAAU;AAAA,EACrC,SAAS,CAAC,QAAQ,YAAY,UAAU;AAExC,SAAO;AACT;","names":[]}
@@ -0,0 +1,17 @@
1
+ import { NominalType } from '@bessemer/cornerstone/types';
2
+ export type RichTextJson = {
3
+ type?: string;
4
+ attrs?: Record<string, any>;
5
+ content?: RichTextJson[];
6
+ marks?: {
7
+ type: string;
8
+ attrs?: Record<string, any>;
9
+ [key: string]: any;
10
+ }[];
11
+ text?: string;
12
+ [key: string]: any;
13
+ };
14
+ export type RichTextString = NominalType<string, 'RichTextString'>;
15
+ export type RichText = RichTextString | RichTextJson;
16
+ export declare const isJson: (text: RichText) => text is RichTextJson;
17
+ //# sourceMappingURL=rich-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rich-text.d.ts","sourceRoot":"","sources":["../src/rich-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAIzD,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC3B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;QAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,EAAE,CAAA;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAElE,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAA;AAEpD,eAAO,MAAM,MAAM,GAAI,MAAM,QAAQ,KAAG,IAAI,IAAI,YAE/C,CAAA"}
@@ -0,0 +1,9 @@
1
+ // src/rich-text.ts
2
+ import { Objects } from "@bessemer/cornerstone";
3
+ var isJson = (text) => {
4
+ return Objects.isObject(text);
5
+ };
6
+ export {
7
+ isJson
8
+ };
9
+ //# sourceMappingURL=rich-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/rich-text.ts"],"sourcesContent":["import { NominalType } from '@bessemer/cornerstone/types'\nimport { Objects } from '@bessemer/cornerstone'\n\n// These are to match TipTap types, but without us having to depend on the TipTap library\nexport type RichTextJson = {\n type?: string\n attrs?: Record<string, any>\n content?: RichTextJson[]\n marks?: {\n type: string\n attrs?: Record<string, any>\n [key: string]: any\n }[]\n text?: string\n [key: string]: any\n}\n\nexport type RichTextString = NominalType<string, 'RichTextString'>\n\nexport type RichText = RichTextString | RichTextJson\n\nexport const isJson = (text: RichText): text is RichTextJson => {\n return Objects.isObject(text)\n}\n"],"mappings":";AACA,SAAS,eAAe;AAoBjB,IAAM,SAAS,CAAC,SAAyC;AAC9D,SAAO,QAAQ,SAAS,IAAI;AAC9B;","names":[]}
package/dist/set.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ export declare const cartesianProduct: <T>(...arrays: Array<Array<T>>) => Array<Array<T>>;
2
+ export declare const permute: <T>(values: Array<T>) => Array<Array<T>>;
3
+ export declare const properPowerSet: <T>(values: Array<T>) => Array<Array<T>>;
4
+ export declare const powerSet: <T>(values: Array<T>) => Array<Array<T>>;
5
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../src/set.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,GAAG,QAAQ,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAE9E,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAiB3D,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAkBlE,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAE5D,CAAA"}
package/dist/set.js ADDED
@@ -0,0 +1,44 @@
1
+ // src/set.ts
2
+ var cartesianProduct = (...arrays) => {
3
+ return arrays.reduce((acc, array) => acc.flatMap((product) => array.map((element) => [...product, element])), [[]]);
4
+ };
5
+ var permute = (values) => {
6
+ let result = [];
7
+ const permuteInternal = (arr, m = []) => {
8
+ if (arr.length === 0) {
9
+ result.push(m);
10
+ } else {
11
+ for (let i = 0; i < arr.length; i++) {
12
+ let curr = arr.slice();
13
+ let next = curr.splice(i, 1);
14
+ permuteInternal(curr.slice(), m.concat(next));
15
+ }
16
+ }
17
+ };
18
+ permuteInternal(values);
19
+ return result;
20
+ };
21
+ var properPowerSet = (values) => {
22
+ const powerSet2 = [];
23
+ const totalSubsets = 1 << values.length;
24
+ for (let i = 1; i < totalSubsets; i++) {
25
+ const subset = [];
26
+ for (let j = 0; j < values.length; j++) {
27
+ if (i & 1 << j) {
28
+ subset.push(values[j]);
29
+ }
30
+ }
31
+ powerSet2.push(subset);
32
+ }
33
+ return powerSet2;
34
+ };
35
+ var powerSet = (values) => {
36
+ return [[], ...properPowerSet(values)];
37
+ };
38
+ export {
39
+ cartesianProduct,
40
+ permute,
41
+ powerSet,
42
+ properPowerSet
43
+ };
44
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/set.ts"],"sourcesContent":["export const cartesianProduct = <T>(...arrays: Array<Array<T>>): Array<Array<T>> => {\n return arrays.reduce<Array<Array<T>>>((acc, array) => acc.flatMap((product) => array.map((element) => [...product, element])), [[]])\n}\n\nexport const permute = <T>(values: Array<T>): Array<Array<T>> => {\n let result: Array<Array<T>> = []\n\n const permuteInternal = (arr: Array<T>, m: Array<T> = []) => {\n if (arr.length === 0) {\n result.push(m)\n } else {\n for (let i = 0; i < arr.length; i++) {\n let curr = arr.slice()\n let next = curr.splice(i, 1)\n permuteInternal(curr.slice(), m.concat(next))\n }\n }\n }\n\n permuteInternal(values)\n return result\n}\n\nexport const properPowerSet = <T>(values: Array<T>): Array<Array<T>> => {\n const powerSet: Array<Array<T>> = []\n\n const totalSubsets = 1 << values.length // 2^n, where n is the size of the set\n\n for (let i = 1; i < totalSubsets; i++) {\n // Start from 1 to exclude the empty set\n const subset: T[] = []\n for (let j = 0; j < values.length; j++) {\n if (i & (1 << j)) {\n // Check if the j-th element is in the subset\n subset.push(values[j]!)\n }\n }\n powerSet.push(subset)\n }\n\n return powerSet\n}\n\nexport const powerSet = <T>(values: Array<T>): Array<Array<T>> => {\n return [[], ...properPowerSet(values)]\n}\n"],"mappings":";AAAO,IAAM,mBAAmB,IAAO,WAA6C;AAClF,SAAO,OAAO,OAAwB,CAAC,KAAK,UAAU,IAAI,QAAQ,CAAC,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrI;AAEO,IAAM,UAAU,CAAI,WAAsC;AAC/D,MAAI,SAA0B,CAAC;AAE/B,QAAM,kBAAkB,CAAC,KAAe,IAAc,CAAC,MAAM;AAC3D,QAAI,IAAI,WAAW,GAAG;AACpB,aAAO,KAAK,CAAC;AAAA,IACf,OAAO;AACL,eAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,YAAI,OAAO,IAAI,MAAM;AACrB,YAAI,OAAO,KAAK,OAAO,GAAG,CAAC;AAC3B,wBAAgB,KAAK,MAAM,GAAG,EAAE,OAAO,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,kBAAgB,MAAM;AACtB,SAAO;AACT;AAEO,IAAM,iBAAiB,CAAI,WAAsC;AACtE,QAAMA,YAA4B,CAAC;AAEnC,QAAM,eAAe,KAAK,OAAO;AAEjC,WAAS,IAAI,GAAG,IAAI,cAAc,KAAK;AAErC,UAAM,SAAc,CAAC;AACrB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,IAAK,KAAK,GAAI;AAEhB,eAAO,KAAK,OAAO,CAAC,CAAE;AAAA,MACxB;AAAA,IACF;AACA,IAAAA,UAAS,KAAK,MAAM;AAAA,EACtB;AAEA,SAAOA;AACT;AAEO,IAAM,WAAW,CAAI,WAAsC;AAChE,SAAO,CAAC,CAAC,GAAG,GAAG,eAAe,MAAM,CAAC;AACvC;","names":["powerSet"]}
@@ -0,0 +1,9 @@
1
+ import { Reference } from '@bessemer/cornerstone/reference';
2
+ export type Signable = number | string | {
3
+ id: string;
4
+ } | {
5
+ reference: Reference<string>;
6
+ };
7
+ export declare const sign: (value: Signable) => string | number;
8
+ export declare const signAll: (values: Array<Signable>) => Array<string | number>;
9
+ //# sourceMappingURL=signature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.d.ts","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE3D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAE1F,eAAO,MAAM,IAAI,GAAI,OAAO,QAAQ,KAAG,MAAM,GAAG,MAU/C,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,QAAQ,KAAK,CAAC,QAAQ,CAAC,KAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAEtE,CAAA"}
@@ -0,0 +1,20 @@
1
+ // src/signature.ts
2
+ import { Objects, References } from "@bessemer/cornerstone";
3
+ var sign = (value) => {
4
+ if (Objects.isObject(value)) {
5
+ if (References.isReferencable(value)) {
6
+ return value.reference.id;
7
+ } else {
8
+ return value.id;
9
+ }
10
+ }
11
+ return value;
12
+ };
13
+ var signAll = (values) => {
14
+ return values.map(sign);
15
+ };
16
+ export {
17
+ sign,
18
+ signAll
19
+ };
20
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/signature.ts"],"sourcesContent":["import { Objects, References } from '@bessemer/cornerstone'\nimport { Reference } from '@bessemer/cornerstone/reference'\n\nexport type Signable = number | string | { id: string } | { reference: Reference<string> }\n\nexport const sign = (value: Signable): string | number => {\n if (Objects.isObject(value)) {\n if (References.isReferencable(value)) {\n return value.reference.id\n } else {\n return value.id\n }\n }\n\n return value\n}\n\nexport const signAll = (values: Array<Signable>): Array<string | number> => {\n return values.map(sign)\n}\n"],"mappings":";AAAA,SAAS,SAAS,kBAAkB;AAK7B,IAAM,OAAO,CAAC,UAAqC;AACxD,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,QAAI,WAAW,eAAe,KAAK,GAAG;AACpC,aAAO,MAAM,UAAU;AAAA,IACzB,OAAO;AACL,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,UAAU,CAAC,WAAoD;AAC1E,SAAO,OAAO,IAAI,IAAI;AACxB;","names":[]}
@@ -0,0 +1,40 @@
1
+ import { ResourceKey } from '@bessemer/cornerstone/resource';
2
+ import { Entry } from '@bessemer/cornerstone/entry';
3
+ export interface LocalStore<T> {
4
+ setValue: (value: T | undefined) => void;
5
+ getValue: () => T | undefined;
6
+ }
7
+ export interface LocalKeyValueStore<T> {
8
+ setValues: (entries: Array<Entry<T | undefined>>) => void;
9
+ setValue: (key: ResourceKey, value: T | undefined) => void;
10
+ getEntries: () => Array<Entry<T>>;
11
+ getValues: (keys: Array<ResourceKey>) => Array<Entry<T>>;
12
+ getValue: (key: ResourceKey) => T | undefined;
13
+ }
14
+ export interface RemoteStore<T> {
15
+ writeValue: (value: T | undefined) => Promise<void>;
16
+ fetchValue: () => Promise<T | undefined>;
17
+ }
18
+ export interface RemoteKeyValueStore<T> {
19
+ writeValues: (entries: Array<Entry<T | undefined>>) => Promise<void>;
20
+ writeValue: (key: ResourceKey, value: T | undefined) => Promise<void>;
21
+ fetchValues: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>;
22
+ fetchValue: (key: ResourceKey) => Promise<T | undefined>;
23
+ }
24
+ export declare abstract class AbstractRemoteKeyValueStore<T> implements RemoteKeyValueStore<T> {
25
+ abstract writeValues: (entries: Array<Entry<T | undefined>>) => Promise<void>;
26
+ writeValue: (key: ResourceKey, value: T | undefined) => Promise<void>;
27
+ abstract fetchValues: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>;
28
+ fetchValue: (key: ResourceKey) => Promise<T | undefined>;
29
+ }
30
+ export declare abstract class AbstractLocalKeyValueStore<T> extends AbstractRemoteKeyValueStore<T> implements LocalKeyValueStore<T> {
31
+ abstract setValues: (entries: Array<Entry<T | undefined>>) => void;
32
+ setValue: (key: ResourceKey, value: T | undefined) => void;
33
+ abstract getEntries: () => Array<Entry<T>>;
34
+ abstract getValues: (keys: Array<ResourceKey>) => Array<Entry<T>>;
35
+ getValue: (key: ResourceKey) => T | undefined;
36
+ fetchValues: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>;
37
+ writeValues: (entries: Array<Entry<T | undefined>>) => Promise<void>;
38
+ }
39
+ export declare const fromMap: <T>() => LocalKeyValueStore<T>;
40
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/store.js ADDED
@@ -0,0 +1,50 @@
1
+ // src/store.ts
2
+ import { Arrays, Entries, Objects } from "@bessemer/cornerstone/index";
3
+ var AbstractRemoteKeyValueStore = class {
4
+ writeValue = async (key, value) => {
5
+ await this.writeValues([Entries.of(key, value)]);
6
+ };
7
+ fetchValue = async (key) => {
8
+ return Arrays.first(await this.fetchValues([key]))?.[1];
9
+ };
10
+ };
11
+ var AbstractLocalKeyValueStore = class extends AbstractRemoteKeyValueStore {
12
+ setValue = (key, value) => {
13
+ this.setValues([Entries.of(key, value)]);
14
+ };
15
+ getValue = (key) => {
16
+ return Arrays.first(this.getValues([key]))?.[1];
17
+ };
18
+ fetchValues = async (keys) => {
19
+ return this.getValues(keys);
20
+ };
21
+ writeValues = async (entries) => {
22
+ this.setValues(entries);
23
+ };
24
+ };
25
+ var fromMap = () => {
26
+ const map = /* @__PURE__ */ new Map();
27
+ return new class extends AbstractLocalKeyValueStore {
28
+ getEntries = () => {
29
+ return Array.from(map.entries());
30
+ };
31
+ setValues = (entries) => {
32
+ entries.forEach(([key, value]) => {
33
+ if (Objects.isNil(value)) {
34
+ map.delete(key);
35
+ } else {
36
+ map.set(key, value);
37
+ }
38
+ });
39
+ };
40
+ getValues = (keys) => {
41
+ return keys.map((key) => Entries.of(key, map.get(key))).filter((it) => Objects.isPresent(it[1]));
42
+ };
43
+ }();
44
+ };
45
+ export {
46
+ AbstractLocalKeyValueStore,
47
+ AbstractRemoteKeyValueStore,
48
+ fromMap
49
+ };
50
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store.ts"],"sourcesContent":["import { ResourceKey } from '@bessemer/cornerstone/resource'\nimport { Entry } from '@bessemer/cornerstone/entry'\nimport { Arrays, Entries, Objects } from '@bessemer/cornerstone/index'\n\nexport interface LocalStore<T> {\n setValue: (value: T | undefined) => void\n getValue: () => T | undefined\n}\n\nexport interface LocalKeyValueStore<T> {\n setValues: (entries: Array<Entry<T | undefined>>) => void\n setValue: (key: ResourceKey, value: T | undefined) => void\n\n getEntries: () => Array<Entry<T>>\n getValues: (keys: Array<ResourceKey>) => Array<Entry<T>>\n getValue: (key: ResourceKey) => T | undefined\n}\n\nexport interface RemoteStore<T> {\n writeValue: (value: T | undefined) => Promise<void>\n fetchValue: () => Promise<T | undefined>\n}\n\nexport interface RemoteKeyValueStore<T> {\n writeValues: (entries: Array<Entry<T | undefined>>) => Promise<void>\n writeValue: (key: ResourceKey, value: T | undefined) => Promise<void>\n\n fetchValues: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>\n fetchValue: (key: ResourceKey) => Promise<T | undefined>\n}\n\nexport abstract class AbstractRemoteKeyValueStore<T> implements RemoteKeyValueStore<T> {\n abstract writeValues: (entries: Array<Entry<T | undefined>>) => Promise<void>\n\n writeValue = async (key: ResourceKey, value: T | undefined): Promise<void> => {\n await this.writeValues([Entries.of(key, value)])\n }\n\n abstract fetchValues: (keys: Array<ResourceKey>) => Promise<Array<Entry<T>>>\n\n fetchValue = async (key: ResourceKey): Promise<T | undefined> => {\n return Arrays.first(await this.fetchValues([key]))?.[1]\n }\n}\n\nexport abstract class AbstractLocalKeyValueStore<T> extends AbstractRemoteKeyValueStore<T> implements LocalKeyValueStore<T> {\n abstract setValues: (entries: Array<Entry<T | undefined>>) => void\n\n setValue = (key: ResourceKey, value: T | undefined): void => {\n this.setValues([Entries.of(key, value)])\n }\n\n abstract getEntries: () => Array<Entry<T>>\n abstract getValues: (keys: Array<ResourceKey>) => Array<Entry<T>>\n\n getValue = (key: ResourceKey): T | undefined => {\n return Arrays.first(this.getValues([key]))?.[1]\n }\n\n fetchValues = async (keys: Array<ResourceKey>): Promise<Array<Entry<T>>> => {\n return this.getValues(keys)\n }\n\n writeValues = async (entries: Array<Entry<T | undefined>>): Promise<void> => {\n this.setValues(entries)\n }\n}\n\nexport const fromMap = <T>(): LocalKeyValueStore<T> => {\n const map = new Map<string, T>()\n\n return new (class extends AbstractLocalKeyValueStore<T> {\n override getEntries = (): Array<Entry<T>> => {\n return Array.from(map.entries())\n }\n\n override setValues = (entries: Entry<T | undefined>[]): void => {\n entries.forEach(([key, value]) => {\n if (Objects.isNil(value)) {\n map.delete(key)\n } else {\n map.set(key, value)\n }\n })\n }\n\n override getValues = (keys: Array<ResourceKey>): Array<Entry<T>> => {\n return keys.map((key) => Entries.of(key, map.get(key)!)).filter((it) => Objects.isPresent(it[1]))\n }\n })()\n}\n"],"mappings":";AAEA,SAAS,QAAQ,SAAS,eAAe;AA6BlC,IAAe,8BAAf,MAAgF;AAAA,EAGrF,aAAa,OAAO,KAAkB,UAAwC;AAC5E,UAAM,KAAK,YAAY,CAAC,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,EACjD;AAAA,EAIA,aAAa,OAAO,QAA6C;AAC/D,WAAO,OAAO,MAAM,MAAM,KAAK,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAAA,EACxD;AACF;AAEO,IAAe,6BAAf,cAAqD,4BAAgE;AAAA,EAG1H,WAAW,CAAC,KAAkB,UAA+B;AAC3D,SAAK,UAAU,CAAC,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,EACzC;AAAA,EAKA,WAAW,CAAC,QAAoC;AAC9C,WAAO,OAAO,MAAM,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;AAAA,EAChD;AAAA,EAEA,cAAc,OAAO,SAAuD;AAC1E,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEA,cAAc,OAAO,YAAwD;AAC3E,SAAK,UAAU,OAAO;AAAA,EACxB;AACF;AAEO,IAAM,UAAU,MAAgC;AACrD,QAAM,MAAM,oBAAI,IAAe;AAE/B,SAAO,IAAK,cAAc,2BAA8B;AAAA,IAC7C,aAAa,MAAuB;AAC3C,aAAO,MAAM,KAAK,IAAI,QAAQ,CAAC;AAAA,IACjC;AAAA,IAES,YAAY,CAAC,YAA0C;AAC9D,cAAQ,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChC,YAAI,QAAQ,MAAM,KAAK,GAAG;AACxB,cAAI,OAAO,GAAG;AAAA,QAChB,OAAO;AACL,cAAI,IAAI,KAAK,KAAK;AAAA,QACpB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAES,YAAY,CAAC,SAA8C;AAClE,aAAO,KAAK,IAAI,CAAC,QAAQ,QAAQ,GAAG,KAAK,IAAI,IAAI,GAAG,CAAE,CAAC,EAAE,OAAO,CAAC,OAAO,QAAQ,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,IAClG;AAAA,EACF,EAAG;AACL;","names":[]}
@@ -0,0 +1,40 @@
1
+ import { UnknownRecord } from 'type-fest';
2
+ export declare const isString: (value?: any) => value is string;
3
+ export declare const isEmpty: {
4
+ <T extends {
5
+ __trapAny: any;
6
+ }>(value?: T): boolean;
7
+ (value: string): value is "";
8
+ (value: Map<any, any> | Set<any> | import("lodash").List<any> | null | undefined): boolean;
9
+ (value: object): boolean;
10
+ <T extends object>(value: T | null | undefined): value is import("lodash").EmptyObjectOf<T> | null | undefined;
11
+ (value?: any): boolean;
12
+ };
13
+ export type StringSplitResult = {
14
+ selection: string;
15
+ separator: string;
16
+ rest: string;
17
+ } | {
18
+ selection: null;
19
+ separator: null;
20
+ rest: string;
21
+ };
22
+ export declare const splitFirst: (str: string, splitter: string | RegExp) => StringSplitResult;
23
+ export declare const splitLast: (str: string, splitter: string | RegExp) => StringSplitResult;
24
+ export declare const splitLastRegex: (str: string, regex: RegExp) => StringSplitResult;
25
+ export declare const splitAt: (str: string, index: number) => [string, string];
26
+ export declare const startsWith: (string?: string, target?: string, position?: number) => boolean;
27
+ export declare const endsWith: (string?: string, target?: string, position?: number) => boolean;
28
+ export declare const removeStart: (string: string, substring: string) => string;
29
+ export declare const removeEnd: (string: string, substring: string) => string;
30
+ export declare const isBlank: (str?: string | null) => boolean;
31
+ export declare const mostCentralOccurrence: (str: string, substr: string) => number | null;
32
+ export declare const replacePlaceholders: (string: string, parameters: UnknownRecord, getParamPlaceholder?: (paramName: string) => string) => string;
33
+ export declare const padStart: (string?: string, length?: number, chars?: string) => string;
34
+ export declare const padEnd: (string?: string, length?: number, chars?: string) => string;
35
+ export declare const contains: <T>(collection: import("lodash").Dictionary<T> | import("lodash").NumericDictionary<T> | null | undefined, target: T, fromIndex?: number) => boolean;
36
+ export declare const replace: {
37
+ (string: string, pattern: RegExp | string, replacement: import("lodash").ReplaceFunction | string): string;
38
+ (pattern: RegExp | string, replacement: import("lodash").ReplaceFunction | string): string;
39
+ };
40
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,eAAO,MAAM,QAAQ,GAAI,QAAQ,GAAG,KAAG,KAAK,IAAI,MAE/C,CAAA;AAED,eAAO,MAAM,OAAO;;;;;;;;;CAAW,CAAA;AAE/B,MAAM,MAAM,iBAAiB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3I,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,MAAM,KAAG,iBAqBnE,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,KAAK,MAAM,EAAE,UAAU,MAAM,GAAG,MAAM,KAAG,iBAgClE,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,iBAuB3D,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,CAAC,MAAM,EAAE,MAAM,CAEnE,CAAA;AAED,eAAO,MAAM,UAAU,kEAAc,CAAA;AACrC,eAAO,MAAM,QAAQ,kEAAY,CAAA;AAEjC,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,MAM/D,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,EAAE,WAAW,MAAM,KAAG,MAM7D,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,GAAG,IAAI,KAAG,OAG7C,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,GAAG,IA2B5E,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,YAAY,aAAa,EAAE,uBAAuB,WAAW,MAAM,WAAuB,WAK7I,CAAA;AAED,eAAO,MAAM,QAAQ,8DAAY,CAAA;AACjC,eAAO,MAAM,MAAM,8DAAU,CAAA;AAE7B,eAAO,MAAM,QAAQ,sJAAY,CAAA;AAEjC,eAAO,MAAM,OAAO;;;CAAW,CAAA"}
package/dist/string.js ADDED
@@ -0,0 +1,154 @@
1
+ // src/string.ts
2
+ import {
3
+ endsWith as _endsWith,
4
+ includes as _includes,
5
+ isEmpty as _isEmpty,
6
+ isString as _isString,
7
+ padEnd as _padEnd,
8
+ padStart as _padStart,
9
+ replace as _replace,
10
+ startsWith as _startsWith
11
+ } from "lodash-es";
12
+ import { Arrays } from "@bessemer/cornerstone";
13
+ var isString = (value) => {
14
+ return _isString(value);
15
+ };
16
+ var isEmpty = _isEmpty;
17
+ var splitFirst = (str, splitter) => {
18
+ if (isString(splitter)) {
19
+ const results = str.split(splitter);
20
+ if (results.length === 1) {
21
+ return { selection: null, separator: null, rest: str };
22
+ }
23
+ return { selection: results[0], separator: splitter, rest: Arrays.rest(results).join(splitter) };
24
+ } else {
25
+ const match = splitter.exec(str);
26
+ if (!match) {
27
+ return { selection: null, separator: null, rest: str };
28
+ }
29
+ const matchIndex = match.index;
30
+ const beforeMatch = str.slice(0, matchIndex);
31
+ const afterMatch = str.slice(matchIndex + match[0].length);
32
+ const separator = match[0];
33
+ return { selection: beforeMatch, separator, rest: afterMatch };
34
+ }
35
+ };
36
+ var splitLast = (str, splitter) => {
37
+ if (isString(splitter)) {
38
+ const results = str.split(splitter);
39
+ if (results.length === 1) {
40
+ return { selection: null, separator: null, rest: str };
41
+ }
42
+ return { selection: results[results.length - 1], separator: splitter, rest: results.slice(0, results.length - 1).join(splitter) };
43
+ } else {
44
+ if (!splitter.global) {
45
+ splitter = new RegExp(splitter.source, splitter.flags + "g");
46
+ }
47
+ const matches = Array.from(str.matchAll(splitter));
48
+ if (matches.length === 0) {
49
+ return { selection: null, separator: null, rest: str };
50
+ }
51
+ const lastMatch = matches[matches.length - 1];
52
+ const matchIndex = lastMatch.index;
53
+ const separator = lastMatch[0];
54
+ const beforeMatch = str.slice(0, matchIndex);
55
+ const afterMatch = str.slice(matchIndex + separator.length);
56
+ return {
57
+ selection: afterMatch,
58
+ separator,
59
+ rest: beforeMatch
60
+ };
61
+ }
62
+ };
63
+ var splitLastRegex = (str, regex) => {
64
+ let lastMatch = null;
65
+ let match;
66
+ while ((match = regex.exec(str)) !== null) {
67
+ lastMatch = match;
68
+ }
69
+ if (!lastMatch) {
70
+ return { selection: null, separator: null, rest: str };
71
+ }
72
+ const matchIndex = lastMatch.index;
73
+ const separator = lastMatch[0];
74
+ const beforeMatch = str.slice(0, matchIndex);
75
+ const afterMatch = str.slice(matchIndex + separator.length);
76
+ return {
77
+ selection: afterMatch,
78
+ separator,
79
+ rest: beforeMatch
80
+ };
81
+ };
82
+ var splitAt = (str, index) => {
83
+ return [str.slice(0, index), str.slice(index)];
84
+ };
85
+ var startsWith = _startsWith;
86
+ var endsWith = _endsWith;
87
+ var removeStart = (string, substring) => {
88
+ if (!string.startsWith(substring)) {
89
+ return string;
90
+ }
91
+ return string.slice(substring.length);
92
+ };
93
+ var removeEnd = (string, substring) => {
94
+ if (!string.endsWith(substring)) {
95
+ return string;
96
+ }
97
+ return string.slice(0, -substring.length);
98
+ };
99
+ var isBlank = (str) => {
100
+ const testStr = str ?? "";
101
+ return /^\s*$/.test(testStr);
102
+ };
103
+ var mostCentralOccurrence = (str, substr) => {
104
+ const occurrences = [];
105
+ let index = str.indexOf(substr);
106
+ while (index !== -1) {
107
+ occurrences.push(index);
108
+ index = str.indexOf(substr, index + 1);
109
+ }
110
+ if (occurrences.length === 0) {
111
+ return null;
112
+ }
113
+ const center = str.length / 2;
114
+ let closestIndex = occurrences[0];
115
+ let minDistance = Math.abs(center - closestIndex);
116
+ for (let i = 1; i < occurrences.length; i++) {
117
+ const distance = Math.abs(center - occurrences[i]);
118
+ if (distance < minDistance) {
119
+ minDistance = distance;
120
+ closestIndex = occurrences[i];
121
+ }
122
+ }
123
+ return closestIndex;
124
+ };
125
+ var replacePlaceholders = (string, parameters, getParamPlaceholder = (paramName) => `{{${paramName}}}`) => {
126
+ return Object.entries(parameters).reduce(
127
+ (intermediateString, [paramName, paramValue]) => intermediateString.replaceAll(getParamPlaceholder(paramName), `${paramValue}`),
128
+ string
129
+ );
130
+ };
131
+ var padStart = _padStart;
132
+ var padEnd = _padEnd;
133
+ var contains = _includes;
134
+ var replace = _replace;
135
+ export {
136
+ contains,
137
+ endsWith,
138
+ isBlank,
139
+ isEmpty,
140
+ isString,
141
+ mostCentralOccurrence,
142
+ padEnd,
143
+ padStart,
144
+ removeEnd,
145
+ removeStart,
146
+ replace,
147
+ replacePlaceholders,
148
+ splitAt,
149
+ splitFirst,
150
+ splitLast,
151
+ splitLastRegex,
152
+ startsWith
153
+ };
154
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/string.ts"],"sourcesContent":["import {\n endsWith as _endsWith,\n includes as _includes,\n isEmpty as _isEmpty,\n isString as _isString,\n padEnd as _padEnd,\n padStart as _padStart,\n replace as _replace,\n startsWith as _startsWith,\n} from 'lodash-es'\nimport { Arrays } from '@bessemer/cornerstone'\nimport { UnknownRecord } from 'type-fest'\n\nexport const isString = (value?: any): value is string => {\n return _isString(value)\n}\n\nexport const isEmpty = _isEmpty\n\nexport type StringSplitResult = { selection: string; separator: string; rest: string } | { selection: null; separator: null; rest: string }\n\nexport const splitFirst = (str: string, splitter: string | RegExp): StringSplitResult => {\n if (isString(splitter)) {\n const results = str.split(splitter)\n if (results.length === 1) {\n return { selection: null, separator: null, rest: str }\n }\n\n return { selection: results[0]!, separator: splitter, rest: Arrays.rest(results).join(splitter) }\n } else {\n const match = splitter.exec(str)\n\n if (!match) {\n return { selection: null, separator: null, rest: str }\n }\n\n const matchIndex = match.index\n const beforeMatch = str.slice(0, matchIndex)\n const afterMatch = str.slice(matchIndex + match[0].length)\n const separator = match[0]\n return { selection: beforeMatch, separator, rest: afterMatch }\n }\n}\n\nexport const splitLast = (str: string, splitter: string | RegExp): StringSplitResult => {\n if (isString(splitter)) {\n const results = str.split(splitter)\n if (results.length === 1) {\n return { selection: null, separator: null, rest: str }\n }\n\n return { selection: results[results.length - 1]!, separator: splitter, rest: results.slice(0, results.length - 1).join(splitter) }\n } else {\n if (!splitter.global) {\n splitter = new RegExp(splitter.source, splitter.flags + 'g')\n }\n\n const matches = Array.from(str.matchAll(splitter))\n\n if (matches.length === 0) {\n return { selection: null, separator: null, rest: str }\n }\n\n // Use the last match\n const lastMatch = matches[matches.length - 1]!\n const matchIndex = lastMatch.index!\n const separator = lastMatch[0]!\n const beforeMatch = str.slice(0, matchIndex)\n const afterMatch = str.slice(matchIndex + separator.length)\n\n return {\n selection: afterMatch,\n separator: separator,\n rest: beforeMatch,\n }\n }\n}\n\nexport const splitLastRegex = (str: string, regex: RegExp): StringSplitResult => {\n // Find the last match using regex lastIndex\n let lastMatch: RegExpExecArray | null = null\n let match\n\n while ((match = regex.exec(str)) !== null) {\n lastMatch = match\n }\n\n if (!lastMatch) {\n return { selection: null, separator: null, rest: str }\n }\n\n const matchIndex = lastMatch.index!\n const separator = lastMatch[0]\n const beforeMatch = str.slice(0, matchIndex)\n const afterMatch = str.slice(matchIndex + separator.length)\n\n return {\n selection: afterMatch,\n separator,\n rest: beforeMatch,\n }\n}\n\nexport const splitAt = (str: string, index: number): [string, string] => {\n return [str.slice(0, index), str.slice(index)] as const\n}\n\nexport const startsWith = _startsWith\nexport const endsWith = _endsWith\n\nexport const removeStart = (string: string, substring: string): string => {\n if (!string.startsWith(substring)) {\n return string\n }\n\n return string.slice(substring.length)\n}\n\nexport const removeEnd = (string: string, substring: string): string => {\n if (!string.endsWith(substring)) {\n return string\n }\n\n return string.slice(0, -substring.length)\n}\n\nexport const isBlank = (str?: string | null): boolean => {\n const testStr = str ?? ''\n return /^\\s*$/.test(testStr)\n}\n\nexport const mostCentralOccurrence = (str: string, substr: string): number | null => {\n const occurrences: number[] = []\n let index = str.indexOf(substr)\n\n while (index !== -1) {\n occurrences.push(index)\n index = str.indexOf(substr, index + 1)\n }\n\n if (occurrences.length === 0) {\n return null\n }\n\n const center = str.length / 2\n\n let closestIndex = occurrences[0]!\n let minDistance = Math.abs(center - closestIndex)\n\n for (let i = 1; i < occurrences.length; i++) {\n const distance = Math.abs(center - occurrences[i]!)\n if (distance < minDistance) {\n minDistance = distance\n closestIndex = occurrences[i]!\n }\n }\n\n return closestIndex\n}\n\nexport const replacePlaceholders = (string: string, parameters: UnknownRecord, getParamPlaceholder = (paramName: string) => `{{${paramName}}}`) => {\n return Object.entries(parameters).reduce(\n (intermediateString, [paramName, paramValue]) => intermediateString.replaceAll(getParamPlaceholder(paramName), `${paramValue}`),\n string\n )\n}\n\nexport const padStart = _padStart\nexport const padEnd = _padEnd\n\nexport const contains = _includes\n\nexport const replace = _replace\n"],"mappings":"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","names":[]}
package/dist/tag.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { NominalType } from '@bessemer/cornerstone/types';
2
+ import { Comparator } from '@bessemer/cornerstone/comparator';
3
+ import { Equalitor } from '@bessemer/cornerstone/equalitor';
4
+ export type TagType<DataType> = NominalType<string, ['TagType', DataType]>;
5
+ export type Tag<DataType = unknown> = {
6
+ type: TagType<DataType>;
7
+ value: DataType;
8
+ };
9
+ export type TaggedValue<T> = {
10
+ value: T;
11
+ tags: Array<Tag>;
12
+ };
13
+ export declare const tag: <T>(type: TagType<T>, value: T) => Tag<T>;
14
+ export declare const value: <T>(value: T, tags: Array<Tag>) => {
15
+ value: T;
16
+ tags: Tag<unknown>[];
17
+ };
18
+ export declare const tagComparator: <T>() => Comparator<Tag<T>>;
19
+ export declare const tagEqualitor: <T>() => Equalitor<Tag<T>>;
20
+ export type SerializedTags = NominalType<string, 'SerializedTags'>;
21
+ export declare const serializeTags: <T>(tags: Array<Tag<T>>) => SerializedTags;
22
+ export declare const resolve: <T>(values: Array<TaggedValue<T>>, tags: Array<Tag>) => Array<TaggedValue<T>>;
23
+ export declare const resolveBy: <T>(values: Array<T>, mapper: (value: T) => Array<Tag>, tags: Array<Tag>) => Array<T>;
24
+ //# sourceMappingURL=tag.d.ts.map