@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 @@
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../src/tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAE7D,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE3D,MAAM,MAAM,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;AAE1E,MAAM,MAAM,GAAG,CAAC,QAAQ,GAAG,OAAO,IAAI;IACpC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IACvB,KAAK,EAAE,QAAQ,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,KAAK,EAAE,CAAC,CAAA;IACR,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAG,GAAG,CAAC,CAAC,CAKxD,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC;;;CAKlD,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,CAAC,OAAK,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAKpD,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,CAAC,OAAK,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAElD,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAElE,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAG,cAMtD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,KAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAEhG,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,KAAG,KAAK,CAAC,CAAC,CAW1G,CAAA"}
package/dist/tag.js ADDED
@@ -0,0 +1,50 @@
1
+ // src/tag.ts
2
+ import { Arrays, Comparators, Equalitors, Sets } from "@bessemer/cornerstone";
3
+ var tag = (type, value2) => {
4
+ return {
5
+ type,
6
+ value: value2
7
+ };
8
+ };
9
+ var value = (value2, tags) => {
10
+ return {
11
+ value: value2,
12
+ tags: Arrays.sortWith(tags, tagComparator())
13
+ };
14
+ };
15
+ var tagComparator = () => {
16
+ return Comparators.aggregate([
17
+ Comparators.compareBy((it) => it.type, Comparators.natural()),
18
+ Comparators.compareBy((it) => JSON.stringify(it.value), Comparators.natural())
19
+ ]);
20
+ };
21
+ var tagEqualitor = () => {
22
+ return Equalitors.fromComparator(tagComparator());
23
+ };
24
+ var serializeTags = (tags) => {
25
+ const serializedTags = Arrays.sortWith(tags, tagComparator()).map(({ type, value: value2 }) => `${type}:${JSON.stringify(value2)}`).join(".");
26
+ return serializedTags;
27
+ };
28
+ var resolve = (values, tags) => {
29
+ return resolveBy(values, (it) => it.tags, tags);
30
+ };
31
+ var resolveBy = (values, mapper, tags) => {
32
+ const resolvedValues = Sets.properPowerSet(tags).flatMap((tags2) => {
33
+ return values.filter((it) => Arrays.equalWith(mapper(it), tags2, tagEqualitor()));
34
+ });
35
+ if (Arrays.isEmpty(resolvedValues)) {
36
+ const defaultValues = values.filter((it) => Arrays.isEmpty(mapper(it)));
37
+ return defaultValues;
38
+ }
39
+ return resolvedValues.reverse();
40
+ };
41
+ export {
42
+ resolve,
43
+ resolveBy,
44
+ serializeTags,
45
+ tag,
46
+ tagComparator,
47
+ tagEqualitor,
48
+ value
49
+ };
50
+ //# sourceMappingURL=tag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tag.ts"],"sourcesContent":["import { NominalType } from '@bessemer/cornerstone/types'\nimport { Comparator } from '@bessemer/cornerstone/comparator'\nimport { Arrays, Comparators, Equalitors, Sets } from '@bessemer/cornerstone'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\n\nexport type TagType<DataType> = NominalType<string, ['TagType', DataType]>\n\nexport type Tag<DataType = unknown> = {\n type: TagType<DataType>\n value: DataType\n}\n\nexport type TaggedValue<T> = {\n value: T\n tags: Array<Tag>\n}\n\nexport const tag = <T>(type: TagType<T>, value: T): Tag<T> => {\n return {\n type,\n value,\n }\n}\n\nexport const value = <T>(value: T, tags: Array<Tag>) => {\n return {\n value,\n tags: Arrays.sortWith(tags, tagComparator()),\n }\n}\n\nexport const tagComparator = <T>(): Comparator<Tag<T>> => {\n return Comparators.aggregate([\n Comparators.compareBy((it) => it.type, Comparators.natural()),\n Comparators.compareBy((it) => JSON.stringify(it.value), Comparators.natural()),\n ])\n}\n\nexport const tagEqualitor = <T>(): Equalitor<Tag<T>> => {\n return Equalitors.fromComparator(tagComparator())\n}\n\nexport type SerializedTags = NominalType<string, 'SerializedTags'>\n\nexport const serializeTags = <T>(tags: Array<Tag<T>>): SerializedTags => {\n const serializedTags: SerializedTags = Arrays.sortWith(tags, tagComparator())\n .map(({ type, value }) => `${type}:${JSON.stringify(value)}`)\n .join('.')\n\n return serializedTags\n}\n\nexport const resolve = <T>(values: Array<TaggedValue<T>>, tags: Array<Tag>): Array<TaggedValue<T>> => {\n return resolveBy(values, (it) => it.tags, tags)\n}\n\nexport const resolveBy = <T>(values: Array<T>, mapper: (value: T) => Array<Tag>, tags: Array<Tag>): Array<T> => {\n const resolvedValues = Sets.properPowerSet(tags).flatMap((tags) => {\n return values.filter((it) => Arrays.equalWith(mapper(it), tags, tagEqualitor()))\n })\n\n if (Arrays.isEmpty(resolvedValues)) {\n const defaultValues = values.filter((it) => Arrays.isEmpty(mapper(it)))\n return defaultValues\n }\n\n return resolvedValues.reverse()\n}\n"],"mappings":";AAEA,SAAS,QAAQ,aAAa,YAAY,YAAY;AAe/C,IAAM,MAAM,CAAI,MAAkBA,WAAqB;AAC5D,SAAO;AAAA,IACL;AAAA,IACA,OAAAA;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAIA,QAAU,SAAqB;AACtD,SAAO;AAAA,IACL,OAAAA;AAAA,IACA,MAAM,OAAO,SAAS,MAAM,cAAc,CAAC;AAAA,EAC7C;AACF;AAEO,IAAM,gBAAgB,MAA6B;AACxD,SAAO,YAAY,UAAU;AAAA,IAC3B,YAAY,UAAU,CAAC,OAAO,GAAG,MAAM,YAAY,QAAQ,CAAC;AAAA,IAC5D,YAAY,UAAU,CAAC,OAAO,KAAK,UAAU,GAAG,KAAK,GAAG,YAAY,QAAQ,CAAC;AAAA,EAC/E,CAAC;AACH;AAEO,IAAM,eAAe,MAA4B;AACtD,SAAO,WAAW,eAAe,cAAc,CAAC;AAClD;AAIO,IAAM,gBAAgB,CAAI,SAAwC;AACvE,QAAM,iBAAiC,OAAO,SAAS,MAAM,cAAc,CAAC,EACzE,IAAI,CAAC,EAAE,MAAM,OAAAA,OAAM,MAAM,GAAG,IAAI,IAAI,KAAK,UAAUA,MAAK,CAAC,EAAE,EAC3D,KAAK,GAAG;AAEX,SAAO;AACT;AAEO,IAAM,UAAU,CAAI,QAA+B,SAA4C;AACpG,SAAO,UAAU,QAAQ,CAAC,OAAO,GAAG,MAAM,IAAI;AAChD;AAEO,IAAM,YAAY,CAAI,QAAkB,QAAkC,SAA+B;AAC9G,QAAM,iBAAiB,KAAK,eAAe,IAAI,EAAE,QAAQ,CAACC,UAAS;AACjE,WAAO,OAAO,OAAO,CAAC,OAAO,OAAO,UAAU,OAAO,EAAE,GAAGA,OAAM,aAAa,CAAC,CAAC;AAAA,EACjF,CAAC;AAED,MAAI,OAAO,QAAQ,cAAc,GAAG;AAClC,UAAM,gBAAgB,OAAO,OAAO,CAAC,OAAO,OAAO,QAAQ,OAAO,EAAE,CAAC,CAAC;AACtE,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,QAAQ;AAChC;","names":["value","tags"]}
@@ -0,0 +1,16 @@
1
+ export interface NominalTyping<NominalTypingT> {
2
+ _type?: NominalTypingT;
3
+ }
4
+ export type NominalType<T, NominalTypingT> = T & NominalTyping<NominalTypingT>;
5
+ interface TaggedTyping<TaggedTypingT> {
6
+ _type: TaggedTypingT;
7
+ }
8
+ export type TaggedType<T, TaggedTypingT> = T & TaggedTyping<TaggedTypingT>;
9
+ export type Throwable = unknown;
10
+ export type Dictionary<T> = Record<string, T>;
11
+ export type Nil = null | undefined;
12
+ export type DeepPartial<T> = {
13
+ [P in keyof T]?: T[P] extends Array<infer U> ? DeepPartial<U>[] : T[P] extends object | undefined ? DeepPartial<T[P]> : T[P];
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa,CAAC,cAAc;IAC3C,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,cAAc,IAAI,CAAC,GAAG,aAAa,CAAC,cAAc,CAAC,CAAA;AAE9E,UAAU,YAAY,CAAC,aAAa;IAClC,KAAK,EAAE,aAAa,CAAA;CACrB;AAED,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,aAAa,IAAI,CAAC,GAAG,YAAY,CAAC,aAAa,CAAC,CAAA;AAE1E,MAAM,MAAM,SAAS,GAAG,OAAO,CAAA;AAE/B,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;AAE7C,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,SAAS,CAAA;AAElC,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;KAC1B,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC7H,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
package/dist/ulid.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { TaggedType } from '@bessemer/cornerstone/types';
2
+ export type Ulid = TaggedType<string, 'Ulid'>;
3
+ export declare const generate: () => Ulid;
4
+ export declare const asString: (value: Ulid) => string;
5
+ export declare const generateString: () => string;
6
+ export declare const of: (value: string) => Ulid;
7
+ export declare const isValid: (value: unknown) => value is Ulid;
8
+ //# sourceMappingURL=ulid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ulid.d.ts","sourceRoot":"","sources":["../src/ulid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,MAAM,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE7C,eAAO,MAAM,QAAQ,QAAO,IAE3B,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,IAAI,KAAG,MAEtC,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,MAEjC,CAAA;AAED,eAAO,MAAM,EAAE,GAAI,OAAO,MAAM,KAAG,IAGlC,CAAA;AAID,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,IAEjD,CAAA"}
package/dist/ulid.js ADDED
@@ -0,0 +1,28 @@
1
+ // src/ulid.ts
2
+ import { ulid } from "ulid";
3
+ import { Preconditions, Strings } from "@bessemer/cornerstone/index";
4
+ var generate = () => {
5
+ return ulid();
6
+ };
7
+ var asString = (value) => {
8
+ return value;
9
+ };
10
+ var generateString = () => {
11
+ return asString(generate());
12
+ };
13
+ var of = (value) => {
14
+ Preconditions.isTrue(isValid(value), () => `Attempted to coerce invalid value to Ulid: ${value}`);
15
+ return value;
16
+ };
17
+ var pattern = /^[0-9A-HJKMNP-TV-Z]{26}$/;
18
+ var isValid = (value) => {
19
+ return Strings.isString(value) && pattern.test(value);
20
+ };
21
+ export {
22
+ asString,
23
+ generate,
24
+ generateString,
25
+ isValid,
26
+ of
27
+ };
28
+ //# sourceMappingURL=ulid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ulid.ts"],"sourcesContent":["import { ulid } from 'ulid'\nimport { TaggedType } from '@bessemer/cornerstone/types'\nimport { Preconditions, Strings } from '@bessemer/cornerstone/index'\n\nexport type Ulid = TaggedType<string, 'Ulid'>\n\nexport const generate = (): Ulid => {\n return ulid() as Ulid\n}\n\nexport const asString = (value: Ulid): string => {\n return value\n}\n\nexport const generateString = (): string => {\n return asString(generate())\n}\n\nexport const of = (value: string): Ulid => {\n Preconditions.isTrue(isValid(value), () => `Attempted to coerce invalid value to Ulid: ${value}`)\n return value as Ulid\n}\n\nconst pattern = /^[0-9A-HJKMNP-TV-Z]{26}$/\n\nexport const isValid = (value: unknown): value is Ulid => {\n return Strings.isString(value) && pattern.test(value)\n}\n"],"mappings":";AAAA,SAAS,YAAY;AAErB,SAAS,eAAe,eAAe;AAIhC,IAAM,WAAW,MAAY;AAClC,SAAO,KAAK;AACd;AAEO,IAAM,WAAW,CAAC,UAAwB;AAC/C,SAAO;AACT;AAEO,IAAM,iBAAiB,MAAc;AAC1C,SAAO,SAAS,SAAS,CAAC;AAC5B;AAEO,IAAM,KAAK,CAAC,UAAwB;AACzC,gBAAc,OAAO,QAAQ,KAAK,GAAG,MAAM,8CAA8C,KAAK,EAAE;AAChG,SAAO;AACT;AAEA,IAAM,UAAU;AAET,IAAM,UAAU,CAAC,UAAkC;AACxD,SAAO,QAAQ,SAAS,KAAK,KAAK,QAAQ,KAAK,KAAK;AACtD;","names":[]}
package/dist/unit.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { NominalType } from '@bessemer/cornerstone/types';
2
+ export type Unit = NominalType<null, 'Unit'>;
3
+ export declare const Unit: Unit;
4
+ //# sourceMappingURL=unit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit.d.ts","sourceRoot":"","sources":["../src/unit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,MAAM,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC5C,eAAO,MAAM,IAAI,EAAE,IAAoB,CAAA"}
package/dist/unit.js ADDED
@@ -0,0 +1,6 @@
1
+ // src/unit.ts
2
+ var Unit = null;
3
+ export {
4
+ Unit
5
+ };
6
+ //# sourceMappingURL=unit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/unit.ts"],"sourcesContent":["import { NominalType } from '@bessemer/cornerstone/types'\n\nexport type Unit = NominalType<null, 'Unit'>\nexport const Unit: Unit = null as never\n"],"mappings":";AAGO,IAAM,OAAa;","names":[]}
package/dist/uri.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ import { NominalType } from '@bessemer/cornerstone/types';
2
+ export declare const encode: (uriComponent: UriComponent) => string;
3
+ export declare const decode: (uriComponent: UriComponent) => string;
4
+ export type UriString = NominalType<string, 'UriString'>;
5
+ export type UriComponent = string;
6
+ export type UriScheme = string;
7
+ export type UriAuthentication = {
8
+ principal: string;
9
+ password: string | null;
10
+ };
11
+ export type UriHost = {
12
+ value: string;
13
+ port: number | null;
14
+ };
15
+ export interface UriLocation {
16
+ path: string;
17
+ query: string | null;
18
+ fragment: string | null;
19
+ }
20
+ export interface Uri {
21
+ scheme: UriScheme | null;
22
+ host: UriHost | null;
23
+ authentication: UriAuthentication | null;
24
+ location: UriLocation;
25
+ }
26
+ export declare const parse: (urlString: UriString) => Uri;
27
+ export declare const emptyLocation: () => UriLocation;
28
+ export type UriBuilder = {
29
+ scheme?: string;
30
+ host?: {
31
+ value: string;
32
+ port?: number;
33
+ } | string;
34
+ authentication?: {
35
+ principal: string;
36
+ password?: string;
37
+ } | string;
38
+ location?: {
39
+ path: string;
40
+ query?: string;
41
+ fragment?: string;
42
+ } | string;
43
+ };
44
+ export declare const build: (builder: UriBuilder) => Uri;
45
+ export declare const format: (uri: Uri) => UriString;
46
+ export declare const buildString: (builder: UriBuilder) => UriString;
47
+ //# sourceMappingURL=uri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../src/uri.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAGzD,eAAO,MAAM,MAAM,GAAI,cAAc,YAAY,WAEhD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,cAAc,YAAY,WAEhD,CAAA;AAED,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;AACxD,MAAM,MAAM,YAAY,GAAG,MAAM,CAAA;AAEjC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB,CAAA;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,MAAM,WAAW,GAAG;IAClB,MAAM,EAAE,SAAS,GAAG,IAAI,CAAA;IACxB,IAAI,EAAE,OAAO,GAAG,IAAI,CAAA;IACpB,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACxC,QAAQ,EAAE,WAAW,CAAA;CACtB;AA8ID,eAAO,MAAM,KAAK,GAAI,WAAW,SAAS,KAAG,GAO5C,CAAA;AAED,eAAO,MAAM,aAAa,QAAO,WAMhC,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EACD;QACE,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,GACD,MAAM,CAAA;IACV,cAAc,CAAC,EACX;QACE,SAAS,EAAE,MAAM,CAAA;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GACD,MAAM,CAAA;IACV,QAAQ,CAAC,EACL;QACE,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,GACD,MAAM,CAAA;CACX,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,SAAS,UAAU,KAAG,GA8C3C,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,KAAK,GAAG,KAAG,SA8BjC,CAAA;AAoBD,eAAO,MAAM,WAAW,GAAI,SAAS,UAAU,KAAG,SAEjD,CAAA"}
package/dist/uri.js ADDED
@@ -0,0 +1,211 @@
1
+ // src/uri.ts
2
+ import { Objects, Strings } from "@bessemer/cornerstone";
3
+ var encode = (uriComponent) => {
4
+ return encodeURIComponent(uriComponent);
5
+ };
6
+ var decode = (uriComponent) => {
7
+ return decodeURIComponent(uriComponent);
8
+ };
9
+ var parseSchemePart = (url) => {
10
+ const schemeMatch = Strings.splitFirst(url, /(\/\/|:)/);
11
+ if (Objects.isNil(schemeMatch.selection) || schemeMatch.separator === "//") {
12
+ return [null, url];
13
+ }
14
+ if (Strings.isEmpty(schemeMatch.selection)) {
15
+ return [null, schemeMatch.rest];
16
+ } else {
17
+ return [schemeMatch.selection, schemeMatch.rest];
18
+ }
19
+ };
20
+ var parseAuthenticationPart = (url) => {
21
+ let targetPart = url;
22
+ const queryMatch = Strings.splitFirst(targetPart, "?");
23
+ const fragmentMatch = Strings.splitFirst(targetPart, "#");
24
+ if (Objects.isPresent(queryMatch.selection)) {
25
+ targetPart = queryMatch.selection;
26
+ } else if (Objects.isPresent(fragmentMatch.selection)) {
27
+ targetPart = fragmentMatch.selection;
28
+ }
29
+ const { selection: authentication } = Strings.splitFirst(targetPart, "@");
30
+ if (Objects.isNil(authentication)) {
31
+ return [null, url];
32
+ }
33
+ const { rest } = Strings.splitFirst(url, "@");
34
+ return [parseAuthentication(Strings.removeStart(authentication, "//")), "//" + rest];
35
+ };
36
+ var parseAuthentication = (authentication) => {
37
+ const { selection: principal, rest: authenticationRest } = Strings.splitFirst(authentication, ":");
38
+ if (Objects.isNil(principal)) {
39
+ return { principal: authenticationRest, password: null };
40
+ }
41
+ if (Strings.isEmpty(principal)) {
42
+ throw new Error(`Unable to parse Authentication: ${authentication}`);
43
+ }
44
+ return { principal, password: authenticationRest };
45
+ };
46
+ var parseHostPart = (url) => {
47
+ if (Strings.startsWith(url, "?") || Strings.startsWith(url, "#")) {
48
+ return [null, url];
49
+ }
50
+ let hostRequired = Strings.startsWith(url, "//");
51
+ if (!hostRequired) {
52
+ return [null, url];
53
+ }
54
+ url = Strings.removeStart(url, "//");
55
+ const urlMatch = Strings.splitFirst(url, /[\/?#]/);
56
+ let host = urlMatch.rest;
57
+ let rest = "";
58
+ if (Objects.isPresent(urlMatch.selection)) {
59
+ host = urlMatch.selection;
60
+ rest = urlMatch.separator + urlMatch.rest;
61
+ }
62
+ if (Strings.isEmpty(host)) {
63
+ return [null, rest];
64
+ }
65
+ return [parseHost(host), rest];
66
+ };
67
+ var parseHost = (host) => {
68
+ if (Strings.startsWith(host, "[")) {
69
+ const ipMatch = Strings.splitFirst(host, "]");
70
+ if (Objects.isPresent(ipMatch.selection)) {
71
+ const portMatch = Strings.splitFirst(ipMatch.rest, ":");
72
+ if (Objects.isPresent(portMatch.selection)) {
73
+ if (Strings.isEmpty(portMatch.selection)) {
74
+ return { value: ipMatch.selection + "]", port: Number(portMatch.rest) };
75
+ }
76
+ } else {
77
+ return { value: ipMatch.selection + "]", port: null };
78
+ }
79
+ }
80
+ }
81
+ let hostMatch = Strings.splitFirst(host, ":");
82
+ if (Objects.isNil(hostMatch.selection)) {
83
+ return { value: hostMatch.rest, port: null };
84
+ }
85
+ if (Strings.isEmpty(hostMatch.selection)) {
86
+ throw new Error(`Unable to parse Host: ${host}`);
87
+ }
88
+ const hostName = hostMatch.selection;
89
+ return { value: hostName, port: Number(hostMatch.rest) };
90
+ };
91
+ var parseLocation = (url) => {
92
+ const location = { path: "", query: null, fragment: null };
93
+ const fragmentMatch = Strings.splitFirst(url, "#");
94
+ if (Objects.isPresent(fragmentMatch.selection) && !Strings.isEmpty(fragmentMatch.rest)) {
95
+ location.fragment = fragmentMatch.rest;
96
+ }
97
+ const queryMatch = Strings.splitFirst(fragmentMatch.selection ?? fragmentMatch.rest, "?");
98
+ if (Objects.isPresent(queryMatch.selection) && !Strings.isEmpty(queryMatch.rest)) {
99
+ location.query = queryMatch.rest;
100
+ }
101
+ location.path = queryMatch.selection ?? queryMatch.rest;
102
+ return location;
103
+ };
104
+ var parse = (urlString) => {
105
+ const [scheme, rest1] = parseSchemePart(urlString);
106
+ const [authentication, rest2] = parseAuthenticationPart(rest1);
107
+ const [host, rest3] = parseHostPart(rest2);
108
+ const location = parseLocation(rest3);
109
+ const url = { scheme, host, authentication, location };
110
+ return url;
111
+ };
112
+ var emptyLocation = () => {
113
+ return {
114
+ path: "",
115
+ query: null,
116
+ fragment: null
117
+ };
118
+ };
119
+ var build = (builder) => {
120
+ const scheme = builder.scheme ?? null;
121
+ let host = null;
122
+ if (Objects.isPresent(builder.host)) {
123
+ if (Strings.isString(builder.host)) {
124
+ host = parseHost(builder.host);
125
+ } else {
126
+ host = {
127
+ value: builder.host.value,
128
+ port: builder.host.port ?? null
129
+ };
130
+ }
131
+ }
132
+ let authentication = null;
133
+ if (Objects.isPresent(builder.authentication)) {
134
+ if (Strings.isString(builder.authentication)) {
135
+ authentication = parseAuthentication(builder.authentication);
136
+ } else {
137
+ authentication = {
138
+ principal: builder.authentication.principal,
139
+ password: builder.authentication.password ?? null
140
+ };
141
+ }
142
+ }
143
+ let location = emptyLocation();
144
+ if (Objects.isPresent(builder.location)) {
145
+ if (Strings.isString(builder.location)) {
146
+ location = parseLocation(builder.location);
147
+ } else {
148
+ location = {
149
+ path: builder.location.path,
150
+ query: builder.location.query ?? null,
151
+ fragment: builder.location.fragment ?? null
152
+ };
153
+ }
154
+ }
155
+ return {
156
+ scheme,
157
+ host,
158
+ authentication,
159
+ location
160
+ };
161
+ };
162
+ var format = (uri) => {
163
+ let urlString = "";
164
+ if (Objects.isPresent(uri.scheme)) {
165
+ urlString = urlString + uri.scheme;
166
+ }
167
+ if (Objects.isPresent(uri.host)) {
168
+ if (Objects.isPresent(uri.scheme)) {
169
+ urlString = urlString + "://";
170
+ }
171
+ if (Objects.isPresent(uri.authentication)) {
172
+ urlString = urlString + uri.authentication.principal;
173
+ if (Objects.isPresent(uri.authentication.password)) {
174
+ urlString = urlString + ":" + uri.authentication.password;
175
+ }
176
+ urlString = urlString + "@";
177
+ }
178
+ urlString = urlString + uri.host.value;
179
+ if (Objects.isPresent(uri.host.port)) {
180
+ urlString = urlString + ":" + uri.host.port;
181
+ }
182
+ }
183
+ urlString = urlString + formatLocation(uri.location);
184
+ return urlString;
185
+ };
186
+ var formatLocation = (location) => {
187
+ let urlString = "";
188
+ if (!Strings.isEmpty(location.path)) {
189
+ urlString = urlString + location.path;
190
+ }
191
+ if (!Strings.isEmpty(location.query)) {
192
+ urlString = urlString + "?" + location.query;
193
+ }
194
+ if (!Strings.isEmpty(location.fragment)) {
195
+ urlString = urlString + "#" + encode(location.fragment);
196
+ }
197
+ return urlString;
198
+ };
199
+ var buildString = (builder) => {
200
+ return format(build(builder));
201
+ };
202
+ export {
203
+ build,
204
+ buildString,
205
+ decode,
206
+ emptyLocation,
207
+ encode,
208
+ format,
209
+ parse
210
+ };
211
+ //# sourceMappingURL=uri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/uri.ts"],"sourcesContent":["import { Objects, Strings } from '@bessemer/cornerstone'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport { StringSplitResult } from '@bessemer/cornerstone/string'\n\nexport const encode = (uriComponent: UriComponent) => {\n return encodeURIComponent(uriComponent)\n}\n\nexport const decode = (uriComponent: UriComponent) => {\n return decodeURIComponent(uriComponent)\n}\n\nexport type UriString = NominalType<string, 'UriString'>\nexport type UriComponent = string\n\nexport type UriScheme = string\n\nexport type UriAuthentication = {\n principal: string\n password: string | null\n}\n\nexport type UriHost = {\n value: string\n port: number | null\n}\n\nexport interface UriLocation {\n path: string\n query: string | null\n fragment: string | null\n}\n\nexport interface Uri {\n scheme: UriScheme | null\n host: UriHost | null\n authentication: UriAuthentication | null\n location: UriLocation\n}\n\nconst parseSchemePart = (url: UriComponent): [UriScheme | null, UriComponent] => {\n // Search for the colon or double slash\n const schemeMatch = Strings.splitFirst(url, /(\\/\\/|:)/)\n\n // If we don't find either, or we hit the double slash before finding a colon, there is no scheme\n if (Objects.isNil(schemeMatch.selection) || schemeMatch.separator === '//') {\n return [null, url]\n }\n\n // This means the string started with :, so no protocol. We'll go ahead and remove the : from consideration\n if (Strings.isEmpty(schemeMatch.selection)) {\n return [null, schemeMatch.rest]\n } else {\n return [schemeMatch.selection, schemeMatch.rest]\n }\n}\n\nconst parseAuthenticationPart = (url: UriComponent): [UriAuthentication | null, UriComponent] => {\n let targetPart = url\n const queryMatch = Strings.splitFirst(targetPart, '?')\n const fragmentMatch = Strings.splitFirst(targetPart, '#')\n if (Objects.isPresent(queryMatch.selection)) {\n targetPart = queryMatch.selection\n } else if (Objects.isPresent(fragmentMatch.selection)) {\n targetPart = fragmentMatch.selection\n }\n\n const { selection: authentication } = Strings.splitFirst(targetPart, '@')\n\n // If there is no @, then we don't have an authentication\n if (Objects.isNil(authentication)) {\n return [null, url]\n }\n\n const { rest } = Strings.splitFirst(url, '@')\n\n return [parseAuthentication(Strings.removeStart(authentication, '//')), '//' + rest]\n}\n\nconst parseAuthentication = (authentication: UriComponent): UriAuthentication => {\n const { selection: principal, rest: authenticationRest } = Strings.splitFirst(authentication, ':')\n\n // If there isn't a colon, then there is no password but there is a username\n if (Objects.isNil(principal)) {\n return { principal: authenticationRest, password: null }\n }\n\n // The authentication section started with a :, don't know what to make of this... password but no username?\n if (Strings.isEmpty(principal)) {\n throw new Error(`Unable to parse Authentication: ${authentication}`)\n }\n\n // Otherwise, we have both, so return the complete authentication object and the rest\n return { principal, password: authenticationRest }\n}\n\nconst parseHostPart = (url: UriComponent): [UriHost | null, UriComponent] => {\n // Check if the host is starting with reserved characters, if so we should just bail on trying to parse\n if (Strings.startsWith(url, '?') || Strings.startsWith(url, '#')) {\n return [null, url]\n }\n\n let hostRequired = Strings.startsWith(url, '//')\n if (!hostRequired) {\n return [null, url]\n }\n\n url = Strings.removeStart(url, '//')\n\n // Lets grab everything to the left of the first / ? or #, this is the remainder of our authority (if any)\n const urlMatch = Strings.splitFirst(url, /[\\/?#]/)\n let host = urlMatch.rest\n let rest = ''\n\n if (Objects.isPresent(urlMatch.selection)) {\n host = urlMatch.selection\n rest = urlMatch.separator + urlMatch.rest\n }\n\n if (Strings.isEmpty(host)) {\n return [null, rest]\n }\n\n return [parseHost(host), rest]\n}\n\nconst parseHost = (host: UriComponent): UriHost => {\n // Try to see if we have an ipv6 address like the form [2001:db8::7] and handle it\n if (Strings.startsWith(host, '[')) {\n const ipMatch = Strings.splitFirst(host, ']')\n\n if (Objects.isPresent(ipMatch.selection)) {\n const portMatch = Strings.splitFirst(ipMatch.rest, ':')\n if (Objects.isPresent(portMatch.selection)) {\n if (Strings.isEmpty(portMatch.selection)) {\n return { value: ipMatch.selection + ']', port: Number(portMatch.rest) }\n }\n } else {\n return { value: ipMatch.selection + ']', port: null }\n }\n }\n }\n\n let hostMatch: StringSplitResult = Strings.splitFirst(host, ':')\n\n // We have no :, which means no port, so treat the rest as the hostname\n if (Objects.isNil(hostMatch.selection)) {\n return { value: hostMatch.rest, port: null }\n }\n\n // The host started with a :, this is odd\n if (Strings.isEmpty(hostMatch.selection)) {\n throw new Error(`Unable to parse Host: ${host}`)\n }\n\n const hostName = hostMatch.selection\n\n // Otherwise, we have both, so return the complete authentication object and the rest\n return { value: hostName, port: Number(hostMatch.rest) }\n}\n\nconst parseLocation = (url: UriComponent): UriLocation => {\n const location: UriLocation = { path: '', query: null, fragment: null }\n\n // Lets see if we have a fragment and parse it off the end\n const fragmentMatch = Strings.splitFirst(url, '#')\n if (Objects.isPresent(fragmentMatch.selection) && !Strings.isEmpty(fragmentMatch.rest)) {\n location.fragment = fragmentMatch.rest\n }\n\n // Lets see if we have a query string and parse it off the remainder\n const queryMatch = Strings.splitFirst(fragmentMatch.selection ?? fragmentMatch.rest, '?')\n if (Objects.isPresent(queryMatch.selection) && !Strings.isEmpty(queryMatch.rest)) {\n location.query = queryMatch.rest\n }\n\n location.path = queryMatch.selection ?? queryMatch.rest\n return location\n}\n\nexport const parse = (urlString: UriString): Uri => {\n const [scheme, rest1] = parseSchemePart(urlString)\n const [authentication, rest2] = parseAuthenticationPart(rest1)\n const [host, rest3] = parseHostPart(rest2)\n const location = parseLocation(rest3)\n const url: Uri = { scheme, host, authentication, location }\n return url\n}\n\nexport const emptyLocation = (): UriLocation => {\n return {\n path: '',\n query: null,\n fragment: null,\n }\n}\n\nexport type UriBuilder = {\n scheme?: string\n host?:\n | {\n value: string\n port?: number\n }\n | string\n authentication?:\n | {\n principal: string\n password?: string\n }\n | string\n location?:\n | {\n path: string\n query?: string\n fragment?: string\n }\n | string\n}\n\nexport const build = (builder: UriBuilder): Uri => {\n const scheme = builder.scheme ?? null\n\n let host: UriHost | null = null\n if (Objects.isPresent(builder.host)) {\n if (Strings.isString(builder.host)) {\n host = parseHost(builder.host)\n } else {\n host = {\n value: builder.host.value,\n port: builder.host.port ?? null,\n }\n }\n }\n\n let authentication: UriAuthentication | null = null\n if (Objects.isPresent(builder.authentication)) {\n if (Strings.isString(builder.authentication)) {\n authentication = parseAuthentication(builder.authentication)\n } else {\n authentication = {\n principal: builder.authentication.principal,\n password: builder.authentication.password ?? null,\n }\n }\n }\n\n let location: UriLocation = emptyLocation()\n if (Objects.isPresent(builder.location)) {\n if (Strings.isString(builder.location)) {\n location = parseLocation(builder.location)\n } else {\n location = {\n path: builder.location.path,\n query: builder.location.query ?? null,\n fragment: builder.location.fragment ?? null,\n }\n }\n }\n\n return {\n scheme,\n host,\n authentication,\n location,\n }\n}\n\nexport const format = (uri: Uri): UriString => {\n let urlString = ''\n if (Objects.isPresent(uri.scheme)) {\n urlString = urlString + uri.scheme\n }\n\n if (Objects.isPresent(uri.host)) {\n if (Objects.isPresent(uri.scheme)) {\n urlString = urlString + '://'\n }\n\n if (Objects.isPresent(uri.authentication)) {\n urlString = urlString + uri.authentication.principal\n\n if (Objects.isPresent(uri.authentication.password)) {\n urlString = urlString + ':' + uri.authentication.password\n }\n\n urlString = urlString + '@'\n }\n\n urlString = urlString + uri.host.value\n\n if (Objects.isPresent(uri.host.port)) {\n urlString = urlString + ':' + uri.host.port\n }\n }\n\n urlString = urlString + formatLocation(uri.location)\n return urlString\n}\n\nconst formatLocation = (location: UriLocation): string => {\n let urlString = ''\n\n if (!Strings.isEmpty(location.path)) {\n urlString = urlString + location.path\n }\n\n if (!Strings.isEmpty(location.query)) {\n urlString = urlString + '?' + location.query\n }\n\n if (!Strings.isEmpty(location.fragment)) {\n urlString = urlString + '#' + encode(location.fragment!)\n }\n\n return urlString\n}\n\nexport const buildString = (builder: UriBuilder): UriString => {\n return format(build(builder))\n}\n"],"mappings":"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","names":[]}
package/dist/url.d.ts ADDED
@@ -0,0 +1,25 @@
1
+ import { Dictionary } from '@bessemer/cornerstone/types';
2
+ import { Uri, UriBuilder, UriComponent, UriLocation, UriString } from '@bessemer/cornerstone/uri';
3
+ export declare const encode: (uriComponent: UriComponent) => string;
4
+ export declare const decode: (uriComponent: UriComponent) => string;
5
+ export interface UrlLocation extends UriLocation {
6
+ pathSegments: Array<string>;
7
+ parameters: Dictionary<string | Array<string>>;
8
+ }
9
+ export interface Url extends Uri {
10
+ location: UrlLocation;
11
+ }
12
+ export type UrlLike = Url | UriString;
13
+ export declare const parse: (urlString: UriString, normalize?: boolean) => Url;
14
+ export declare const format: (uri: Uri) => UriString;
15
+ export type UrlBuilder = UriBuilder & {
16
+ location?: {
17
+ parameters?: Dictionary<string | Array<string>>;
18
+ };
19
+ };
20
+ export declare const build: (builder: UrlBuilder) => Url;
21
+ export declare const buildString: (builder: UrlBuilder) => UriString;
22
+ export declare const reify: (blah: UrlLike) => Url;
23
+ export declare const getParameter: (url: UrlLike, name: string) => string | undefined;
24
+ export declare const getJsonParameter: <T>(url: UrlLike, name: string) => T | undefined;
25
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAEjG,eAAO,MAAM,MAAM,wCAAc,CAAA;AAEjC,eAAO,MAAM,MAAM,wCAAc,CAAA;AAEjC,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CAC/C;AAED,MAAM,WAAW,GAAI,SAAQ,GAAG;IAC9B,QAAQ,EAAE,WAAW,CAAA;CACtB;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,SAAS,CAAA;AA8CrC,eAAO,MAAM,KAAK,GAAI,WAAW,SAAS,EAAE,YAAW,OAAc,KAAG,GAkBvE,CAAA;AAED,eAAO,MAAM,MAAM,yBAAc,CAAA;AAuBjC,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IACpC,QAAQ,CAAC,EAAE;QACT,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;KAChD,CAAA;CACF,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,SAAS,UAAU,KAAG,GAY3C,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,SAAS,UAAU,KAAG,SAEjD,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,MAAM,OAAO,KAAG,GAMrC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,KAAK,OAAO,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAWlE,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,KAAK,OAAO,EAAE,MAAM,MAAM,KAAG,CAAC,GAAG,SAGpE,CAAA"}
package/dist/url.js ADDED
@@ -0,0 +1,120 @@
1
+ // src/url.ts
2
+ import { Arrays, Objects, Strings, Uris } from "@bessemer/cornerstone";
3
+ var encode = Uris.encode;
4
+ var decode = Uris.decode;
5
+ var augmentUriLocation = (uriLocation, normalize) => {
6
+ const pathSegments = [];
7
+ const parameters = {};
8
+ if (!Strings.isBlank(uriLocation.path)) {
9
+ Strings.removeStart(uriLocation.path, "/").split("/").forEach((urlPathPart) => {
10
+ if (!Strings.isBlank(urlPathPart) || !normalize) {
11
+ pathSegments.push(decode(urlPathPart));
12
+ }
13
+ });
14
+ }
15
+ if (Objects.isPresent(uriLocation.query)) {
16
+ uriLocation.query.split("&").forEach((parameterPair) => {
17
+ let splitParameters = parameterPair.split("=");
18
+ if (!Strings.isBlank(Arrays.first(splitParameters))) {
19
+ let key = decode(splitParameters[0]);
20
+ let value = "";
21
+ if (splitParameters.length === 2) {
22
+ value = splitParameters[1];
23
+ }
24
+ if (Objects.isNil(parameters[key])) {
25
+ parameters[key] = decode(value);
26
+ } else if (!Array.isArray(parameters[key])) {
27
+ let paramList = [parameters[key]];
28
+ paramList.push(decode(value));
29
+ parameters[key] = paramList;
30
+ } else {
31
+ parameters[key].push(decode(value));
32
+ }
33
+ }
34
+ });
35
+ }
36
+ return {
37
+ ...uriLocation,
38
+ pathSegments,
39
+ parameters
40
+ };
41
+ };
42
+ var parse = (urlString, normalize = true) => {
43
+ const uri = Uris.parse(urlString);
44
+ const location = augmentUriLocation(uri.location, normalize);
45
+ if (normalize) {
46
+ if (!Arrays.isEmpty(location.pathSegments)) {
47
+ location.path = (Strings.startsWith(location.path, "/") ? "/" : "") + formatPathSegments(location.pathSegments);
48
+ } else {
49
+ location.path = "";
50
+ }
51
+ location.query = formatQueryParameters(location.parameters);
52
+ }
53
+ return {
54
+ ...uri,
55
+ location
56
+ };
57
+ };
58
+ var format = Uris.format;
59
+ var formatPathSegments = (pathSegments) => {
60
+ return pathSegments.map((it) => encode(it)).join("/");
61
+ };
62
+ var formatQueryParameters = (parameters) => {
63
+ const parameterEntries = Object.entries(parameters);
64
+ if (Arrays.isEmpty(parameterEntries)) {
65
+ return null;
66
+ }
67
+ return Object.entries(parameters).flatMap(([key, value]) => {
68
+ if (Array.isArray(value)) {
69
+ return value.map((it) => `${encode(key)}=${encode(it)}`);
70
+ } else {
71
+ return [`${encode(key)}=${encode(value)}`];
72
+ }
73
+ }).join("&");
74
+ };
75
+ var build = (builder) => {
76
+ const uri = Uris.build(builder);
77
+ if (Objects.isPresent(builder.location?.parameters)) {
78
+ uri.location.query = formatQueryParameters(builder.location.parameters);
79
+ }
80
+ const urlLocation = augmentUriLocation(uri.location, false);
81
+ return {
82
+ ...uri,
83
+ location: urlLocation
84
+ };
85
+ };
86
+ var buildString = (builder) => {
87
+ return format(build(builder));
88
+ };
89
+ var reify = (blah) => {
90
+ if (!Strings.isString(blah)) {
91
+ return blah;
92
+ }
93
+ return parse(blah);
94
+ };
95
+ var getParameter = (url, name) => {
96
+ const parameter = reify(url).location.parameters[name];
97
+ if (Objects.isNil(parameter)) {
98
+ return void 0;
99
+ }
100
+ if (Array.isArray(parameter)) {
101
+ throw new Error(`Expected a single parameter value but found multiple for parameter: ${name}`);
102
+ }
103
+ return parameter;
104
+ };
105
+ var getJsonParameter = (url, name) => {
106
+ const value = getParameter(url, name);
107
+ return Objects.isPresent(value) ? JSON.parse(value) : void 0;
108
+ };
109
+ export {
110
+ build,
111
+ buildString,
112
+ decode,
113
+ encode,
114
+ format,
115
+ getJsonParameter,
116
+ getParameter,
117
+ parse,
118
+ reify
119
+ };
120
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/url.ts"],"sourcesContent":["import { Arrays, Objects, Strings, Uris } from '@bessemer/cornerstone'\nimport { Dictionary } from '@bessemer/cornerstone/types'\nimport { Uri, UriBuilder, UriComponent, UriLocation, UriString } from '@bessemer/cornerstone/uri'\n\nexport const encode = Uris.encode\n\nexport const decode = Uris.decode\n\nexport interface UrlLocation extends UriLocation {\n pathSegments: Array<string>\n parameters: Dictionary<string | Array<string>>\n}\n\nexport interface Url extends Uri {\n location: UrlLocation\n}\n\nexport type UrlLike = Url | UriString\n\nconst augmentUriLocation = (uriLocation: UriLocation, normalize: boolean): UrlLocation => {\n const pathSegments: Array<string> = []\n const parameters: Dictionary<string | Array<string>> = {}\n\n if (!Strings.isBlank(uriLocation.path)) {\n Strings.removeStart(uriLocation.path, '/')\n .split('/')\n .forEach((urlPathPart) => {\n if (!Strings.isBlank(urlPathPart) || !normalize) {\n pathSegments.push(decode(urlPathPart))\n }\n })\n }\n\n if (Objects.isPresent(uriLocation.query)) {\n uriLocation.query.split('&').forEach((parameterPair) => {\n let splitParameters = parameterPair.split('=')\n\n if (!Strings.isBlank(Arrays.first(splitParameters))) {\n let key = decode(splitParameters[0]!)\n let value = ''\n if (splitParameters.length === 2) {\n value = splitParameters[1]!\n }\n if (Objects.isNil(parameters[key])) {\n parameters[key] = decode(value)\n } else if (!Array.isArray(parameters[key])) {\n let paramList = [parameters[key]]\n paramList.push(decode(value))\n parameters[key] = paramList\n } else {\n parameters[key].push(decode(value))\n }\n }\n })\n }\n\n return {\n ...uriLocation,\n pathSegments,\n parameters,\n }\n}\n\nexport const parse = (urlString: UriString, normalize: boolean = true): Url => {\n const uri = Uris.parse(urlString)\n const location = augmentUriLocation(uri.location, normalize)\n\n if (normalize) {\n if (!Arrays.isEmpty(location.pathSegments)) {\n location.path = (Strings.startsWith(location.path, '/') ? '/' : '') + formatPathSegments(location.pathSegments)\n } else {\n location.path = ''\n }\n\n location.query = formatQueryParameters(location.parameters)\n }\n\n return {\n ...uri,\n location,\n }\n}\n\nexport const format = Uris.format\n\nconst formatPathSegments = (pathSegments: Array<string>): UriComponent => {\n return pathSegments.map((it) => encode(it)).join('/')\n}\n\nconst formatQueryParameters = (parameters: Dictionary<string | Array<string>>): UriComponent | null => {\n const parameterEntries = Object.entries(parameters)\n if (Arrays.isEmpty(parameterEntries)) {\n return null\n }\n\n return Object.entries(parameters)\n .flatMap(([key, value]) => {\n if (Array.isArray(value)) {\n return value.map((it) => `${encode(key)}=${encode(it)}`)\n } else {\n return [`${encode(key)}=${encode(value)}`]\n }\n })\n .join('&')\n}\n\nexport type UrlBuilder = UriBuilder & {\n location?: {\n parameters?: Dictionary<string | Array<string>>\n }\n}\n\nexport const build = (builder: UrlBuilder): Url => {\n const uri = Uris.build(builder)\n if (Objects.isPresent(builder.location?.parameters)) {\n uri.location.query = formatQueryParameters(builder.location.parameters)\n }\n\n const urlLocation = augmentUriLocation(uri.location, false)\n\n return {\n ...uri,\n location: urlLocation,\n }\n}\n\nexport const buildString = (builder: UrlBuilder): UriString => {\n return format(build(builder))\n}\n\nexport const reify = (blah: UrlLike): Url => {\n if (!Strings.isString(blah)) {\n return blah\n }\n\n return parse(blah)\n}\n\nexport const getParameter = (url: UrlLike, name: string): string | undefined => {\n const parameter = reify(url).location.parameters[name]\n if (Objects.isNil(parameter)) {\n return undefined\n }\n\n if (Array.isArray(parameter)) {\n throw new Error(`Expected a single parameter value but found multiple for parameter: ${name}`)\n }\n\n return parameter\n}\n\nexport const getJsonParameter = <T>(url: UrlLike, name: string): T | undefined => {\n const value = getParameter(url, name)\n return Objects.isPresent(value) ? JSON.parse(value) : undefined\n}\n"],"mappings":"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","names":[]}
package/dist/uuid.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { TaggedType } from '@bessemer/cornerstone/types';
2
+ export type Uuid = TaggedType<string, 'Uuid'>;
3
+ export declare const generate: () => Uuid;
4
+ export declare const asString: (value: Uuid) => string;
5
+ export declare const generateString: () => string;
6
+ export declare const of: (value: string) => Uuid;
7
+ export declare const isValid: (value: unknown) => value is Uuid;
8
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../src/uuid.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,MAAM,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAE7C,eAAO,MAAM,QAAQ,QAAO,IAM3B,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,OAAO,IAAI,KAAG,MAEtC,CAAA;AAED,eAAO,MAAM,cAAc,QAAO,MAEjC,CAAA;AAQD,eAAO,MAAM,EAAE,GAAI,OAAO,MAAM,KAAG,IAGlC,CAAA;AAID,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,IAEjD,CAAA"}