@bessemer/cornerstone 0.5.114 → 0.5.116

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 (247) hide show
  1. package/dist/array.d.ts.map +1 -1
  2. package/dist/array.js +28 -28
  3. package/dist/array.js.map +1 -1
  4. package/dist/aspect-ratio.d.ts +3 -3
  5. package/dist/aspect-ratio.d.ts.map +1 -1
  6. package/dist/aspect-ratio.js +13 -12
  7. package/dist/aspect-ratio.js.map +1 -1
  8. package/dist/assertion.d.ts.map +1 -1
  9. package/dist/assertion.js +5 -5
  10. package/dist/assertion.js.map +1 -1
  11. package/dist/async-value.js +2 -2
  12. package/dist/async-value.js.map +1 -1
  13. package/dist/async.d.ts.map +1 -1
  14. package/dist/async.js +2 -2
  15. package/dist/async.js.map +1 -1
  16. package/dist/cache.d.ts.map +1 -1
  17. package/dist/cache.js +11 -12
  18. package/dist/cache.js.map +1 -1
  19. package/dist/combinable.js +5 -5
  20. package/dist/combinable.js.map +1 -1
  21. package/dist/comparator.js +8 -8
  22. package/dist/comparator.js.map +1 -1
  23. package/dist/data-size.d.ts +2 -1
  24. package/dist/data-size.d.ts.map +1 -1
  25. package/dist/data-size.js +3 -3
  26. package/dist/data-size.js.map +1 -1
  27. package/dist/either.js +5 -5
  28. package/dist/either.js.map +1 -1
  29. package/dist/equalitor.d.ts.map +1 -1
  30. package/dist/equalitor.js +2 -2
  31. package/dist/equalitor.js.map +1 -1
  32. package/dist/error/error-cause.d.ts.map +1 -1
  33. package/dist/error/error-cause.js +14 -14
  34. package/dist/error/error-cause.js.map +1 -1
  35. package/dist/error/error-code.js +2 -2
  36. package/dist/error/error-code.js.map +1 -1
  37. package/dist/error/error-event.d.ts +3 -2
  38. package/dist/error/error-event.d.ts.map +1 -1
  39. package/dist/error/error-event.js +28 -28
  40. package/dist/error/error-event.js.map +1 -1
  41. package/dist/error/error-type.d.ts +2 -1
  42. package/dist/error/error-type.d.ts.map +1 -1
  43. package/dist/error/error-type.js +2 -2
  44. package/dist/error/error-type.js.map +1 -1
  45. package/dist/error/error.js +5 -5
  46. package/dist/error/error.js.map +1 -1
  47. package/dist/expression/array-expression.js +3 -3
  48. package/dist/expression/array-expression.js.map +1 -1
  49. package/dist/expression/core-expression.d.ts.map +1 -1
  50. package/dist/expression/core-expression.js +19 -19
  51. package/dist/expression/core-expression.js.map +1 -1
  52. package/dist/expression/expression-evaluator.js +2 -2
  53. package/dist/expression/expression-evaluator.js.map +1 -1
  54. package/dist/expression/expression-mapper.js +4 -4
  55. package/dist/expression/expression-mapper.js.map +1 -1
  56. package/dist/expression/internal.js +3 -3
  57. package/dist/expression/internal.js.map +1 -1
  58. package/dist/expression/numeric-expression.js +13 -13
  59. package/dist/expression/numeric-expression.js.map +1 -1
  60. package/dist/expression/string-expression.js +4 -4
  61. package/dist/expression/string-expression.js.map +1 -1
  62. package/dist/glob.d.ts +3 -3
  63. package/dist/glob.d.ts.map +1 -1
  64. package/dist/glob.js +11 -12
  65. package/dist/glob.js.map +1 -1
  66. package/dist/global-variable.d.ts.map +1 -1
  67. package/dist/global-variable.js +5 -5
  68. package/dist/global-variable.js.map +1 -1
  69. package/dist/hex-code.d.ts +3 -3
  70. package/dist/hex-code.d.ts.map +1 -1
  71. package/dist/hex-code.js +11 -10
  72. package/dist/hex-code.js.map +1 -1
  73. package/dist/index.d.ts +10 -0
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +4 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/intl/country-code.d.ts +3 -3
  78. package/dist/intl/country-code.d.ts.map +1 -1
  79. package/dist/intl/country-code.js +9 -10
  80. package/dist/intl/country-code.js.map +1 -1
  81. package/dist/intl/country-subdivision-code.d.ts +3 -3
  82. package/dist/intl/country-subdivision-code.d.ts.map +1 -1
  83. package/dist/intl/country-subdivision-code.js +13 -11
  84. package/dist/intl/country-subdivision-code.js.map +1 -1
  85. package/dist/intl/currency-code.d.ts +3 -3
  86. package/dist/intl/currency-code.d.ts.map +1 -1
  87. package/dist/intl/currency-code.js +9 -10
  88. package/dist/intl/currency-code.js.map +1 -1
  89. package/dist/intl/language-code.d.ts +3 -3
  90. package/dist/intl/language-code.d.ts.map +1 -1
  91. package/dist/intl/language-code.js +9 -10
  92. package/dist/intl/language-code.js.map +1 -1
  93. package/dist/intl/locale.d.ts +3 -3
  94. package/dist/intl/locale.d.ts.map +1 -1
  95. package/dist/intl/locale.js +18 -19
  96. package/dist/intl/locale.js.map +1 -1
  97. package/dist/json.d.ts.map +1 -1
  98. package/dist/json.js +2 -2
  99. package/dist/json.js.map +1 -1
  100. package/dist/logger.d.ts.map +1 -1
  101. package/dist/logger.js +12 -12
  102. package/dist/logger.js.map +1 -1
  103. package/dist/map.js +8 -8
  104. package/dist/map.js.map +1 -1
  105. package/dist/mime-type.d.ts +3 -3
  106. package/dist/mime-type.d.ts.map +1 -1
  107. package/dist/mime-type.js +9 -10
  108. package/dist/mime-type.js.map +1 -1
  109. package/dist/misc.js +4 -4
  110. package/dist/misc.js.map +1 -1
  111. package/dist/monetary-amount.d.ts +3 -2
  112. package/dist/monetary-amount.d.ts.map +1 -1
  113. package/dist/monetary-amount.js +16 -16
  114. package/dist/monetary-amount.js.map +1 -1
  115. package/dist/net/content-type.d.ts +2 -1
  116. package/dist/net/content-type.d.ts.map +1 -1
  117. package/dist/net/content-type.js +2 -2
  118. package/dist/net/content-type.js.map +1 -1
  119. package/dist/net/domain-name.d.ts +3 -3
  120. package/dist/net/domain-name.d.ts.map +1 -1
  121. package/dist/net/domain-name.js +10 -11
  122. package/dist/net/domain-name.js.map +1 -1
  123. package/dist/net/http-method.d.ts.map +1 -1
  124. package/dist/net/http-method.js +9 -9
  125. package/dist/net/http-method.js.map +1 -1
  126. package/dist/net/ipv4-address.d.ts +3 -3
  127. package/dist/net/ipv4-address.d.ts.map +1 -1
  128. package/dist/net/ipv4-address.js +10 -11
  129. package/dist/net/ipv4-address.js.map +1 -1
  130. package/dist/net/ipv6-address.d.ts +3 -3
  131. package/dist/net/ipv6-address.d.ts.map +1 -1
  132. package/dist/net/ipv6-address.js +10 -11
  133. package/dist/net/ipv6-address.js.map +1 -1
  134. package/dist/net/uri-host-name.d.ts +3 -3
  135. package/dist/net/uri-host-name.d.ts.map +1 -1
  136. package/dist/net/uri-host-name.js +15 -16
  137. package/dist/net/uri-host-name.js.map +1 -1
  138. package/dist/net/uri.d.ts +1 -2
  139. package/dist/net/uri.d.ts.map +1 -1
  140. package/dist/net/uri.js +5 -3
  141. package/dist/net/uri.js.map +1 -1
  142. package/dist/net/url.d.ts.map +1 -1
  143. package/dist/net/url.js +6 -7
  144. package/dist/net/url.js.map +1 -1
  145. package/dist/object/object-path.d.ts.map +1 -1
  146. package/dist/object/object-path.js +23 -28
  147. package/dist/object/object-path.js.map +1 -1
  148. package/dist/object/type-path.js +19 -19
  149. package/dist/object/type-path.js.map +1 -1
  150. package/dist/patch.js +4 -4
  151. package/dist/patch.js.map +1 -1
  152. package/dist/promise.js +2 -2
  153. package/dist/promise.js.map +1 -1
  154. package/dist/property.d.ts.map +1 -1
  155. package/dist/property.js +7 -7
  156. package/dist/property.js.map +1 -1
  157. package/dist/proxy.js +2 -2
  158. package/dist/proxy.js.map +1 -1
  159. package/dist/range.js +2 -2
  160. package/dist/range.js.map +1 -1
  161. package/dist/reference.d.ts +2 -1
  162. package/dist/reference.d.ts.map +1 -1
  163. package/dist/reference.js +13 -13
  164. package/dist/reference.js.map +1 -1
  165. package/dist/resource-key.js +2 -2
  166. package/dist/resource-key.js.map +1 -1
  167. package/dist/result.js +5 -5
  168. package/dist/result.js.map +1 -1
  169. package/dist/retry.d.ts.map +1 -1
  170. package/dist/retry.js +12 -12
  171. package/dist/retry.js.map +1 -1
  172. package/dist/rich-text.js +2 -2
  173. package/dist/rich-text.js.map +1 -1
  174. package/dist/signature.d.ts.map +1 -1
  175. package/dist/signature.js +9 -9
  176. package/dist/signature.js.map +1 -1
  177. package/dist/sql/sql-expression-parser.js +2 -2
  178. package/dist/sql/sql-expression-parser.js.map +1 -1
  179. package/dist/store.d.ts.map +1 -1
  180. package/dist/store.js +9 -9
  181. package/dist/store.js.map +1 -1
  182. package/dist/string.js +4 -4
  183. package/dist/string.js.map +1 -1
  184. package/dist/tag.d.ts.map +1 -1
  185. package/dist/tag.js +10 -10
  186. package/dist/tag.js.map +1 -1
  187. package/dist/temporal/clock.d.ts +13 -13
  188. package/dist/temporal/clock.d.ts.map +1 -1
  189. package/dist/temporal/clock.js +10 -10
  190. package/dist/temporal/clock.js.map +1 -1
  191. package/dist/temporal/duration.d.ts +15 -9
  192. package/dist/temporal/duration.d.ts.map +1 -1
  193. package/dist/temporal/duration.js +30 -31
  194. package/dist/temporal/duration.js.map +1 -1
  195. package/dist/temporal/instant.d.ts +18 -15
  196. package/dist/temporal/instant.d.ts.map +1 -1
  197. package/dist/temporal/instant.js +42 -43
  198. package/dist/temporal/instant.js.map +1 -1
  199. package/dist/temporal/plain-date-time.d.ts +16 -13
  200. package/dist/temporal/plain-date-time.d.ts.map +1 -1
  201. package/dist/temporal/plain-date-time.js +36 -38
  202. package/dist/temporal/plain-date-time.js.map +1 -1
  203. package/dist/temporal/plain-date.d.ts +16 -13
  204. package/dist/temporal/plain-date.d.ts.map +1 -1
  205. package/dist/temporal/plain-date.js +35 -37
  206. package/dist/temporal/plain-date.js.map +1 -1
  207. package/dist/temporal/plain-month-day.d.ts +37 -0
  208. package/dist/temporal/plain-month-day.d.ts.map +1 -0
  209. package/dist/temporal/plain-month-day.js +84 -0
  210. package/dist/temporal/plain-month-day.js.map +1 -0
  211. package/dist/temporal/plain-time.d.ts +19 -17
  212. package/dist/temporal/plain-time.d.ts.map +1 -1
  213. package/dist/temporal/plain-time.js +43 -42
  214. package/dist/temporal/plain-time.js.map +1 -1
  215. package/dist/temporal/plain-year-month.d.ts +57 -0
  216. package/dist/temporal/plain-year-month.d.ts.map +1 -0
  217. package/dist/temporal/plain-year-month.js +109 -0
  218. package/dist/temporal/plain-year-month.js.map +1 -0
  219. package/dist/temporal/time-zone-id.d.ts +5 -4
  220. package/dist/temporal/time-zone-id.d.ts.map +1 -1
  221. package/dist/temporal/time-zone-id.js +11 -11
  222. package/dist/temporal/time-zone-id.js.map +1 -1
  223. package/dist/temporal/time-zone-offset.d.ts +12 -11
  224. package/dist/temporal/time-zone-offset.d.ts.map +1 -1
  225. package/dist/temporal/time-zone-offset.js +42 -50
  226. package/dist/temporal/time-zone-offset.js.map +1 -1
  227. package/dist/temporal/zoned-date-time.d.ts +16 -13
  228. package/dist/temporal/zoned-date-time.d.ts.map +1 -1
  229. package/dist/temporal/zoned-date-time.js +35 -36
  230. package/dist/temporal/zoned-date-time.js.map +1 -1
  231. package/dist/uuid/ulid.d.ts +3 -3
  232. package/dist/uuid/ulid.d.ts.map +1 -1
  233. package/dist/uuid/ulid.js +9 -10
  234. package/dist/uuid/ulid.js.map +1 -1
  235. package/dist/uuid/uuid-v4.d.ts +3 -3
  236. package/dist/uuid/uuid-v4.d.ts.map +1 -1
  237. package/dist/uuid/uuid-v4.js +13 -14
  238. package/dist/uuid/uuid-v4.js.map +1 -1
  239. package/dist/uuid/uuid-v7.d.ts +1 -2
  240. package/dist/uuid/uuid-v7.d.ts.map +1 -1
  241. package/dist/uuid/uuid-v7.js +1 -2
  242. package/dist/uuid/uuid-v7.js.map +1 -1
  243. package/dist/zod-util.d.ts +4 -21
  244. package/dist/zod-util.d.ts.map +1 -1
  245. package/dist/zod-util.js +21 -11
  246. package/dist/zod-util.js.map +1 -1
  247. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/net/url.ts"],"sourcesContent":["import { Dictionary, NominalType } from '@bessemer/cornerstone/types'\nimport * as Uris from '@bessemer/cornerstone/net/uri'\nimport { Uri, UriBuilder, UriComponent, UriLiteral, UriLocation, UriParseMode } from '@bessemer/cornerstone/net/uri'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\nimport { ErrorEvent, unpackResult } from '@bessemer/cornerstone/error/error-event'\nimport * as Strings from '@bessemer/cornerstone/string'\nimport * as Arrays from '@bessemer/cornerstone/array'\nimport { first, isEmpty } from '@bessemer/cornerstone/array'\nimport { structuredTransform } from '@bessemer/cornerstone/zod-util'\nimport Zod from 'zod'\nimport * as Equalitors from '@bessemer/cornerstone/equalitor'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\nimport { MergeExclusive } from 'type-fest'\nimport * as Objects from '@bessemer/cornerstone/object'\n\nexport const encode = Uris.encode\n\nexport const decode = Uris.decode\n\nexport type UrlLiteral = NominalType<UriLiteral, typeof Namespace>\n\nexport interface UrlLocation extends UriLocation {\n pathSegments: Array<string>\n parameters: Dictionary<string | Array<string>>\n}\n\nexport interface Url extends Uri {\n _type: typeof Namespace\n location: UrlLocation\n href: UrlLiteral\n relative: boolean\n}\n\nexport const Namespace = Uris.UrlNamespace\nexport const EqualBy: Equalitor<Url> = Equalitors.deepNatural()\n\ntype UrlBuilderPathPart = MergeExclusive<{ path?: string | null }, { pathSegments?: Array<string> }>\ntype UrlBuilderQueryPart = MergeExclusive<{ query?: string | null }, { parameters?: Dictionary<string | Array<string>> }>\ntype UrlBuilderLocationPart = UrlBuilderPathPart &\n UrlBuilderQueryPart & {\n fragment?: string | null\n }\n\nexport type UrlBuilder = UriBuilder & {\n location?: UrlBuilderLocationPart | null | undefined\n relative?: boolean\n}\n\nexport type UrlLike = Url | Uri | UrlBuilder | UriLiteral | UrlLiteral\n\nexport const parseString = (value: string, mode: UriParseMode = UriParseMode.Strict): Result<Url, ErrorEvent> => {\n return Results.map(Uris.parseString(value, mode), (it) => Results.success(fromUri(it)))\n}\n\nexport function from(value: UrlLike | string): Url\nexport function from(value: UrlLike | string | null): Url | null\nexport function from(value: UrlLike | string | undefined): Url | undefined\nexport function from(value: UrlLike | string | null | undefined): Url | null | undefined\nexport function from(value: UrlLike | string | null | undefined): Url | null | undefined {\n if (Objects.isNil(value)) {\n return value\n }\n if (isUrl(value)) {\n return value\n }\n if (Uris.isUri(value)) {\n return fromUri(value)\n }\n if (Strings.isString(value)) {\n return unpackResult(parseString(value))\n }\n\n return build(value as UrlBuilder)\n}\n\nexport function toLiteral(likeValue: UrlLike): UrlLiteral\nexport function toLiteral(likeValue: UrlLike | null): UrlLiteral | null\nexport function toLiteral(likeValue: UrlLike | undefined): UrlLiteral | undefined\nexport function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined\nexport function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined {\n if (Objects.isNil(likeValue)) {\n return likeValue\n }\n\n const value = from(likeValue)\n return format(value) as UrlLiteral\n}\n\nexport const SchemaLiteral = structuredTransform(Zod.string(), (it: string) => Results.map(parseString(it), (it) => toLiteral(it)))\n// JOHN need a schema for the object version...\n// export const SchemaInstance = structuredTransform(Zod.string(), parseString)\n\nexport const empty = (): Url => {\n const result = Uris.empty()\n\n return {\n ...result,\n _type: Namespace,\n href: result.href as UrlLiteral,\n location: {\n ...result.location,\n pathSegments: [],\n parameters: {},\n },\n relative: true,\n }\n}\n\nexport const isUrl = (value: unknown): value is Url => {\n if (!Objects.isObject(value)) {\n return false\n }\n\n const uriValue = value as any as Url\n return uriValue._type === Namespace\n}\n\nexport const update = (element: UrlLike, builder: UrlBuilder): Url => {\n const url = from(element)\n\n const buildRelative = builder.relative === true\n\n let location: UrlBuilderLocationPart | null | undefined\n if (Strings.isString(builder.location) || Objects.isNull(builder.location)) {\n location = builder.location\n } else {\n const usePathSegments = !Objects.isUndefined(builder.location?.pathSegments)\n const useParameters = !Objects.isUndefined(builder.location?.parameters)\n\n location = {\n ...(usePathSegments\n ? { pathSegments: builder.location?.pathSegments }\n : { path: Objects.isUndefined(builder.location?.path) ? url.location.path : builder.location.path }),\n ...(useParameters\n ? { parameters: builder.location?.parameters }\n : { query: Objects.isUndefined(builder.location?.query) ? url.location.query : builder.location.query }),\n fragment: Objects.isUndefined(builder.location?.fragment) ? url.location.fragment : builder.location.fragment,\n }\n }\n\n const uriBuilder: UrlBuilder = {\n scheme: Objects.isUndefined(builder.scheme) && !buildRelative ? url.scheme : builder.scheme,\n host: Objects.isUndefined(builder.host) && !buildRelative ? url.host : builder.host,\n authentication: Objects.isUndefined(builder.authentication) && !buildRelative ? url.authentication : builder.authentication,\n location,\n relative: buildRelative,\n }\n\n return from(uriBuilder)\n}\n\nexport const navigate = (base: UrlLike, next: UrlLike): Url => {\n const baseUrl = from(base)\n const nextUrl = from(next)\n\n const isOnlyFragment = nextUrl.relative && Objects.isNil(nextUrl.location.path) && Objects.isNil(nextUrl.location.query)\n\n const builder: UrlBuilder = {\n scheme: nextUrl.scheme ?? undefined,\n host: nextUrl.host ?? undefined,\n authentication: Objects.isPresent(nextUrl.host) ? nextUrl.authentication : undefined,\n location: {\n pathSegments: nextUrl.relative ? [...baseUrl.location.pathSegments, ...nextUrl.location.pathSegments] : nextUrl.location.pathSegments,\n query: isOnlyFragment ? undefined : nextUrl.location.query,\n fragment: nextUrl.location.fragment,\n },\n }\n\n const uri = update(baseUrl, builder)\n return uri\n}\n\nexport const format = Uris.format\nexport const isComplete = Uris.isComplete\n\nconst build = (builder: UrlBuilder): Url => {\n if ((builder.relative ?? false) && Objects.isPresent(builder.host)) {\n throw new Error(`[${Namespace}]: Unable to construct a relative url with a non-null host: ${builder}`)\n }\n\n const uriBuilder = convertUrlBuilderToUriBuilder(builder)\n const uri = Uris.from(uriBuilder)\n return fromUri(uri)\n}\n\nconst convertUrlBuilderToUriBuilder = (builder: UrlBuilder): UriBuilder => {\n if (Objects.isNil(builder.location)) {\n if (Objects.isNil(builder.host)) {\n return {\n ...builder,\n location: { path: builder.relative === true ? '' : '/' },\n }\n }\n\n return builder\n }\n\n if (Strings.isString(builder.location)) {\n return builder\n }\n\n const relative = builder.relative ?? false\n let path = relative ? Strings.removeStart(builder.location.path ?? '', '/') : builder.location.path\n if (Objects.isPresent(builder.location.pathSegments)) {\n path = formatPathSegments(builder.location.pathSegments, Objects.isPresent(builder.host), relative)\n }\n\n let query = builder.location.query\n if (Objects.isPresent(builder.location.parameters)) {\n query = formatQueryParameters(builder.location.parameters)\n }\n\n return {\n ...builder,\n location: { path, query, fragment: builder.location.fragment },\n }\n}\n\nconst fromUri = (uri: Uri): Url => {\n let relative: boolean = false\n let pathSegments: Array<string> = []\n const parameters: Dictionary<string | Array<string>> = {}\n\n if (Objects.isPresent(uri.location.path)) {\n if (!uri.location.path.startsWith('/')) {\n relative = true\n }\n\n pathSegments = Strings.removeStart(uri.location.path, '/')\n .split('/')\n .filter((it) => !Strings.isBlank(it))\n .map((urlPathPart) => decode(urlPathPart))\n } else {\n if (Objects.isNil(uri.host)) {\n relative = true\n }\n }\n\n if (Objects.isPresent(uri.location.query)) {\n uri.location.query.split('&').forEach((parameterPair) => {\n let splitParameters = parameterPair.split('=')\n\n if (!Strings.isBlank(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 const url: Url = {\n ...uri,\n _type: Namespace,\n location: {\n path: formatPathSegments(pathSegments, Objects.isPresent(uri.host), relative),\n pathSegments,\n query: formatQueryParameters(parameters),\n parameters,\n fragment: uri.location.fragment,\n },\n href: uri.href as UrlLiteral,\n relative,\n }\n\n url.href = format(url) as UrlLiteral\n return url\n}\n\nconst formatPathSegments = (pathSegments: Array<string>, hasHost: boolean, relative: boolean): UriComponent | null => {\n if (Arrays.isEmpty(pathSegments)) {\n if (!hasHost && !relative) {\n return '/'\n } else {\n return null\n }\n }\n\n return (relative ? '' : '/') + 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 (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\n// JOHN I don't know about these two methods...\nexport const getParameter = (url: UrlLike, name: string): string | undefined => {\n const parameter = from(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":["isEmpty","encode","decode","parseString","from","format","it","empty","isComplete"]}
1
+ {"version":3,"sources":["../../src/net/url.ts"],"sourcesContent":["import { Dictionary, NominalType } from '@bessemer/cornerstone/types'\nimport * as Uris from '@bessemer/cornerstone/net/uri'\nimport { Uri, UriBuilder, UriComponent, UriLiteral, UriLocation, UriParseMode } from '@bessemer/cornerstone/net/uri'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\nimport * as ErrorEvents from '@bessemer/cornerstone/error/error-event'\nimport { ErrorEvent } from '@bessemer/cornerstone/error/error-event'\nimport * as Strings from '@bessemer/cornerstone/string'\nimport * as Arrays from '@bessemer/cornerstone/array'\nimport * as ZodUtil from '@bessemer/cornerstone/zod-util'\nimport Zod from 'zod'\nimport * as Equalitors from '@bessemer/cornerstone/equalitor'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\nimport { MergeExclusive } from 'type-fest'\nimport * as Objects from '@bessemer/cornerstone/object'\n\nexport const encode = Uris.encode\n\nexport const decode = Uris.decode\n\nexport type UrlLiteral = NominalType<UriLiteral, typeof Namespace>\n\nexport interface UrlLocation extends UriLocation {\n pathSegments: Array<string>\n parameters: Dictionary<string | Array<string>>\n}\n\nexport interface Url extends Uri {\n _type: typeof Namespace\n location: UrlLocation\n href: UrlLiteral\n relative: boolean\n}\n\nexport const Namespace = Uris.UrlNamespace\nexport const EqualBy: Equalitor<Url> = Equalitors.deepNatural()\n\ntype UrlBuilderPathPart = MergeExclusive<{ path?: string | null }, { pathSegments?: Array<string> }>\ntype UrlBuilderQueryPart = MergeExclusive<{ query?: string | null }, { parameters?: Dictionary<string | Array<string>> }>\ntype UrlBuilderLocationPart = UrlBuilderPathPart &\n UrlBuilderQueryPart & {\n fragment?: string | null\n }\n\nexport type UrlBuilder = UriBuilder & {\n location?: UrlBuilderLocationPart | null | undefined\n relative?: boolean\n}\n\nexport type UrlLike = Url | Uri | UrlBuilder | UriLiteral | UrlLiteral\n\nexport const parseString = (value: string, mode: UriParseMode = UriParseMode.Strict): Result<Url, ErrorEvent> => {\n return Results.map(Uris.parseString(value, mode), (it) => Results.success(fromUri(it)))\n}\n\nexport function from(value: UrlLike | string): Url\nexport function from(value: UrlLike | string | null): Url | null\nexport function from(value: UrlLike | string | undefined): Url | undefined\nexport function from(value: UrlLike | string | null | undefined): Url | null | undefined\nexport function from(value: UrlLike | string | null | undefined): Url | null | undefined {\n if (Objects.isNil(value)) {\n return value\n }\n if (isUrl(value)) {\n return value\n }\n if (Uris.isUri(value)) {\n return fromUri(value)\n }\n if (Strings.isString(value)) {\n return ErrorEvents.unpackResult(parseString(value))\n }\n\n return build(value as UrlBuilder)\n}\n\nexport function toLiteral(likeValue: UrlLike): UrlLiteral\nexport function toLiteral(likeValue: UrlLike | null): UrlLiteral | null\nexport function toLiteral(likeValue: UrlLike | undefined): UrlLiteral | undefined\nexport function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined\nexport function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined {\n if (Objects.isNil(likeValue)) {\n return likeValue\n }\n\n const value = from(likeValue)\n return format(value) as UrlLiteral\n}\n\nexport const SchemaLiteral = ZodUtil.structuredTransform(Zod.string(), (it: string) => Results.map(parseString(it), (it) => toLiteral(it)))\n// JOHN need a schema for the object version...\n// export const SchemaInstance = structuredTransform(Zod.string(), parseString)\n\nexport const empty = (): Url => {\n const result = Uris.empty()\n\n return {\n ...result,\n _type: Namespace,\n href: result.href as UrlLiteral,\n location: {\n ...result.location,\n pathSegments: [],\n parameters: {},\n },\n relative: true,\n }\n}\n\nexport const isUrl = (value: unknown): value is Url => {\n if (!Objects.isObject(value)) {\n return false\n }\n\n const uriValue = value as any as Url\n return uriValue._type === Namespace\n}\n\nexport const update = (element: UrlLike, builder: UrlBuilder): Url => {\n const url = from(element)\n\n const buildRelative = builder.relative === true\n\n let location: UrlBuilderLocationPart | null | undefined\n if (Strings.isString(builder.location) || Objects.isNull(builder.location)) {\n location = builder.location\n } else {\n const usePathSegments = !Objects.isUndefined(builder.location?.pathSegments)\n const useParameters = !Objects.isUndefined(builder.location?.parameters)\n\n location = {\n ...(usePathSegments\n ? { pathSegments: builder.location?.pathSegments }\n : { path: Objects.isUndefined(builder.location?.path) ? url.location.path : builder.location.path }),\n ...(useParameters\n ? { parameters: builder.location?.parameters }\n : { query: Objects.isUndefined(builder.location?.query) ? url.location.query : builder.location.query }),\n fragment: Objects.isUndefined(builder.location?.fragment) ? url.location.fragment : builder.location.fragment,\n }\n }\n\n const uriBuilder: UrlBuilder = {\n scheme: Objects.isUndefined(builder.scheme) && !buildRelative ? url.scheme : builder.scheme,\n host: Objects.isUndefined(builder.host) && !buildRelative ? url.host : builder.host,\n authentication: Objects.isUndefined(builder.authentication) && !buildRelative ? url.authentication : builder.authentication,\n location,\n relative: buildRelative,\n }\n\n return from(uriBuilder)\n}\n\nexport const navigate = (base: UrlLike, next: UrlLike): Url => {\n const baseUrl = from(base)\n const nextUrl = from(next)\n\n const isOnlyFragment = nextUrl.relative && Objects.isNil(nextUrl.location.path) && Objects.isNil(nextUrl.location.query)\n\n const builder: UrlBuilder = {\n scheme: nextUrl.scheme ?? undefined,\n host: nextUrl.host ?? undefined,\n authentication: Objects.isPresent(nextUrl.host) ? nextUrl.authentication : undefined,\n location: {\n pathSegments: nextUrl.relative ? [...baseUrl.location.pathSegments, ...nextUrl.location.pathSegments] : nextUrl.location.pathSegments,\n query: isOnlyFragment ? undefined : nextUrl.location.query,\n fragment: nextUrl.location.fragment,\n },\n }\n\n const uri = update(baseUrl, builder)\n return uri\n}\n\nexport const format = Uris.format\nexport const isComplete = Uris.isComplete\n\nconst build = (builder: UrlBuilder): Url => {\n if ((builder.relative ?? false) && Objects.isPresent(builder.host)) {\n throw new Error(`[${Namespace}]: Unable to construct a relative url with a non-null host: ${builder}`)\n }\n\n const uriBuilder = convertUrlBuilderToUriBuilder(builder)\n const uri = Uris.from(uriBuilder)\n return fromUri(uri)\n}\n\nconst convertUrlBuilderToUriBuilder = (builder: UrlBuilder): UriBuilder => {\n if (Objects.isNil(builder.location)) {\n if (Objects.isNil(builder.host)) {\n return {\n ...builder,\n location: { path: builder.relative === true ? '' : '/' },\n }\n }\n\n return builder\n }\n\n if (Strings.isString(builder.location)) {\n return builder\n }\n\n const relative = builder.relative ?? false\n let path = relative ? Strings.removeStart(builder.location.path ?? '', '/') : builder.location.path\n if (Objects.isPresent(builder.location.pathSegments)) {\n path = formatPathSegments(builder.location.pathSegments, Objects.isPresent(builder.host), relative)\n }\n\n let query = builder.location.query\n if (Objects.isPresent(builder.location.parameters)) {\n query = formatQueryParameters(builder.location.parameters)\n }\n\n return {\n ...builder,\n location: { path, query, fragment: builder.location.fragment },\n }\n}\n\nconst fromUri = (uri: Uri): Url => {\n let relative: boolean = false\n let pathSegments: Array<string> = []\n const parameters: Dictionary<string | Array<string>> = {}\n\n if (Objects.isPresent(uri.location.path)) {\n if (!uri.location.path.startsWith('/')) {\n relative = true\n }\n\n pathSegments = Strings.removeStart(uri.location.path, '/')\n .split('/')\n .filter((it) => !Strings.isBlank(it))\n .map((urlPathPart) => decode(urlPathPart))\n } else {\n if (Objects.isNil(uri.host)) {\n relative = true\n }\n }\n\n if (Objects.isPresent(uri.location.query)) {\n uri.location.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 const url: Url = {\n ...uri,\n _type: Namespace,\n location: {\n path: formatPathSegments(pathSegments, Objects.isPresent(uri.host), relative),\n pathSegments,\n query: formatQueryParameters(parameters),\n parameters,\n fragment: uri.location.fragment,\n },\n href: uri.href as UrlLiteral,\n relative,\n }\n\n url.href = format(url) as UrlLiteral\n return url\n}\n\nconst formatPathSegments = (pathSegments: Array<string>, hasHost: boolean, relative: boolean): UriComponent | null => {\n if (Arrays.isEmpty(pathSegments)) {\n if (!hasHost && !relative) {\n return '/'\n } else {\n return null\n }\n }\n\n return (relative ? '' : '/') + 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\n// JOHN I don't know about these two methods...\nexport const getParameter = (url: UrlLike, name: string): string | undefined => {\n const parameter = from(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":["encode","decode","parseString","from","format","it","empty","isComplete"]}
@@ -1 +1 @@
1
- {"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../../src/object/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACb,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAKL,QAAQ,EACT,MAAM,wCAAwC,CAAA;AAO/C,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC,sBAAsB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;AAEnH,eAAO,MAAM,EAAE,GAAI,CAAC,SAAS,sBAAsB,EAAE,OAAO,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAE5F,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAY7E,CAAA;AAED,eAAO,MAAM,MAAM,mJAMjB,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAEtG,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,cAAc,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAEzH,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,UAAU,EAAE,QAAQ,OAAO,EAAE,cAAc,OAAO,KAAG,OAkBxF,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,YAAY,SAAS,YAAY,EACvD,YAAY,UAAU,EACtB,cAAc,QAAQ,CAAC,YAAY,CAAC,KACnC,UAAU,IAAI,UAAU,CAAC,YAAY,CAEvC,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,YAAY,EAAE,gBAAgB,SAAS,YAAY,EAC9F,YAAY,UAAU,CAAC,UAAU,CAAC,EAClC,kBAAkB,QAAQ,CAAC,gBAAgB,CAAC,KAC3C,UAEF,CAAA"}
1
+ {"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../../src/object/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACb,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAA;AAQjE,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC,sBAAsB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;AAEnH,eAAO,MAAM,EAAE,GAAI,CAAC,SAAS,sBAAsB,EAAE,OAAO,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAE5F,CAAA;AAED,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAY7E,CAAA;AAED,eAAO,MAAM,MAAM,mJAMjB,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAEtG,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,cAAc,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAEzH,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,UAAU,EAAE,QAAQ,OAAO,EAAE,cAAc,OAAO,KAAG,OAkBxF,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,YAAY,SAAS,YAAY,EACvD,YAAY,UAAU,EACtB,cAAc,QAAQ,CAAC,YAAY,CAAC,KACnC,UAAU,IAAI,UAAU,CAAC,YAAY,CAEvC,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,YAAY,EAAE,gBAAgB,SAAS,YAAY,EAC9F,YAAY,UAAU,CAAC,UAAU,CAAC,EAClC,kBAAkB,QAAQ,CAAC,gBAAgB,CAAC,KAC3C,UAEF,CAAA"}
@@ -1,24 +1,19 @@
1
1
  // src/object/object-path.ts
2
2
  import Zod from "zod";
3
- import {
4
- from as typePathFromString,
5
- getValue as typePathGetValue,
6
- intersect as typePathIntersect,
7
- matches as typePathMatches
8
- } from "@bessemer/cornerstone/object/type-path";
9
- import { isEmpty, only } from "@bessemer/cornerstone/array";
10
- import { assert } from "@bessemer/cornerstone/assertion";
3
+ import * as TypePaths from "@bessemer/cornerstone/object/type-path";
4
+ import * as Arrays from "@bessemer/cornerstone/array";
5
+ import * as Assertions from "@bessemer/cornerstone/assertion";
11
6
  import { produce } from "immer";
12
- import { isObject } from "@bessemer/cornerstone/object";
7
+ import * as Objects from "@bessemer/cornerstone/object";
13
8
  var of = (value) => {
14
9
  return value;
15
10
  };
16
- var from = (path) => {
17
- const typePath = typePathFromString(path);
11
+ var from2 = (path) => {
12
+ const typePath = TypePaths.from(path);
18
13
  typePath.forEach((it) => {
19
- assert(it !== "*", () => "ObjectPaths do not allow for wildcard selectors");
14
+ Assertions.assert(it !== "*", () => "ObjectPaths do not allow for wildcard selectors");
20
15
  if (Array.isArray(it)) {
21
- assert(it.length === 1, () => "ObjectPaths do not allow for multiple index selectors or array slices");
16
+ Assertions.assert(it.length === 1, () => "ObjectPaths do not allow for multiple index selectors or array slices");
22
17
  }
23
18
  });
24
19
  return typePath;
@@ -27,46 +22,46 @@ var Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) =
27
22
  if (Array.isArray(it)) {
28
23
  return of(it);
29
24
  } else {
30
- return from(it);
25
+ return from2(it);
31
26
  }
32
27
  });
33
- var getValue = (path, object) => {
34
- return typePathGetValue(path, object);
28
+ var getValue2 = (path, object) => {
29
+ return TypePaths.getValue(path, object);
35
30
  };
36
31
  var applyValue = (path, object, valueToApply) => {
37
32
  return applyAnyValue(path, object, valueToApply);
38
33
  };
39
34
  var applyAnyValue = (path, object, valueToApply) => {
40
- if (isEmpty(path)) {
35
+ if (Arrays.isEmpty(path)) {
41
36
  return valueToApply;
42
37
  }
43
38
  return produce(object, (draft) => {
44
39
  const rest = path.slice(0, -1);
45
40
  const last = path[path.length - 1];
46
- const parent = getValue(of(rest), draft);
47
- assert(isObject(parent) || Array.isArray(parent), () => `Unable to apply value: ${valueToApply} at ObjectPath: ${path} against object: ${object}`);
41
+ const parent = getValue2(of(rest), draft);
42
+ Assertions.assert(Objects.isObject(parent) || Array.isArray(parent), () => `Unable to apply value: ${valueToApply} at ObjectPath: ${path} against object: ${object}`);
48
43
  if (Array.isArray(last)) {
49
- const index = only(last);
44
+ const index = Arrays.only(last);
50
45
  parent[index] = valueToApply;
51
46
  } else {
52
47
  parent[last] = valueToApply;
53
48
  }
54
49
  });
55
50
  };
56
- var matches = (targetPath, matchingPath) => {
57
- return typePathMatches(targetPath, matchingPath);
51
+ var matches2 = (targetPath, matchingPath) => {
52
+ return TypePaths.matches(targetPath, matchingPath);
58
53
  };
59
- var intersect = (targetPath, intersectingPath) => {
60
- return typePathIntersect(targetPath, intersectingPath);
54
+ var intersect2 = (targetPath, intersectingPath) => {
55
+ return TypePaths.intersect(targetPath, intersectingPath);
61
56
  };
62
57
  export {
63
58
  Schema,
64
59
  applyAnyValue,
65
60
  applyValue,
66
- from,
67
- getValue,
68
- intersect,
69
- matches,
61
+ from2 as from,
62
+ getValue2 as getValue,
63
+ intersect2 as intersect,
64
+ matches2 as matches,
70
65
  of
71
66
  };
72
67
  //# sourceMappingURL=object-path.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/object/object-path.ts"],"sourcesContent":["import Zod from 'zod'\nimport { TaggedType } from '@bessemer/cornerstone/types'\nimport {\n InferObjectPath,\n ObjectPathConcreteType,\n ObjectPathType,\n ParseObjectPath,\n TypePathGet,\n TypePathType,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport {\n from as typePathFromString,\n getValue as typePathGetValue,\n intersect as typePathIntersect,\n matches as typePathMatches,\n TypePath,\n} from '@bessemer/cornerstone/object/type-path'\nimport { isEmpty, only } from '@bessemer/cornerstone/array'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport { produce } from 'immer'\nimport { isObject } from '@bessemer/cornerstone/object'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type ObjectPath<T extends TypePathType = TypePathType> = TaggedType<ObjectPathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends ObjectPathConcreteType>(value: T): ObjectPath<InferObjectPath<T>> => {\n return value as ObjectPath<InferObjectPath<T>>\n}\n\nexport const from = <T extends string>(path: T): ObjectPath<ParseObjectPath<T>> => {\n const typePath = typePathFromString(path)\n\n typePath.forEach((it) => {\n assert(it !== '*', () => 'ObjectPaths do not allow for wildcard selectors')\n\n if (Array.isArray(it)) {\n assert(it.length === 1, () => 'ObjectPaths do not allow for multiple index selectors or array slices')\n }\n })\n\n return typePath as ObjectPath<ParseObjectPath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N): TypePathGet<T, N> => {\n return typePathGetValue(path, object)\n}\n\nexport const applyValue = <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N, valueToApply: TypePathGet<T, N>): N => {\n return applyAnyValue(path, object, valueToApply) as N\n}\n\nexport const applyAnyValue = (path: ObjectPath, object: unknown, valueToApply: unknown): unknown => {\n if (isEmpty(path)) {\n return valueToApply\n }\n\n return produce(object, (draft) => {\n const rest = path.slice(0, -1)\n const last = path[path.length - 1]!\n const parent = getValue(of(rest), draft) as any\n\n assert(isObject(parent) || Array.isArray(parent), () => `Unable to apply value: ${valueToApply} at ObjectPath: ${path} against object: ${object}`)\n if (Array.isArray(last)) {\n const index = only(last)\n parent[index] = valueToApply\n } else {\n parent[last] = valueToApply\n }\n })\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: ObjectPath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is ObjectPath<MatchingPath> => {\n return typePathMatches(targetPath, matchingPath)\n}\n\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: ObjectPath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): ObjectPath => {\n return typePathIntersect(targetPath, intersectingPath) as ObjectPath\n}\n"],"mappings":";AAAA,OAAO,SAAS;AAUhB;AAAA,EACE,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,OAEN;AACP,SAAS,SAAS,YAAY;AAC9B,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAKlB,IAAM,KAAK,CAAmC,UAA6C;AAChG,SAAO;AACT;AAEO,IAAM,OAAO,CAAmB,SAA4C;AACjF,QAAM,WAAW,mBAAmB,IAAI;AAExC,WAAS,QAAQ,CAAC,OAAO;AACvB,WAAO,OAAO,KAAK,MAAM,iDAAiD;AAE1E,QAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,aAAO,GAAG,WAAW,GAAG,MAAM,uEAAuE;AAAA,IACvG;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO;AACzF,MAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,WAAO,GAAG,EAAE;AAAA,EACd,OAAO;AACL,WAAO,KAAK,EAAE;AAAA,EAChB;AACF,CAAC;AAEM,IAAM,WAAW,CAA8B,MAAqB,WAAiC;AAC1G,SAAO,iBAAiB,MAAM,MAAM;AACtC;AAEO,IAAM,aAAa,CAA8B,MAAqB,QAAW,iBAAuC;AAC7H,SAAO,cAAc,MAAM,QAAQ,YAAY;AACjD;AAEO,IAAM,gBAAgB,CAAC,MAAkB,QAAiB,iBAAmC;AAClG,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAC7B,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAM,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK;AAEvC,WAAO,SAAS,MAAM,KAAK,MAAM,QAAQ,MAAM,GAAG,MAAM,0BAA0B,YAAY,mBAAmB,IAAI,oBAAoB,MAAM,EAAE;AACjJ,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,QAAQ,KAAK,IAAI;AACvB,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEO,IAAM,UAAU,CACrB,YACA,iBAC2C;AAC3C,SAAO,gBAAgB,YAAY,YAAY;AACjD;AAEO,IAAM,YAAY,CACvB,YACA,qBACe;AACf,SAAO,kBAAkB,YAAY,gBAAgB;AACvD;","names":[]}
1
+ {"version":3,"sources":["../../src/object/object-path.ts"],"sourcesContent":["import Zod from 'zod'\nimport { TaggedType } from '@bessemer/cornerstone/types'\nimport {\n InferObjectPath,\n ObjectPathConcreteType,\n ObjectPathType,\n ParseObjectPath,\n TypePathGet,\n TypePathType,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport { TypePath } from '@bessemer/cornerstone/object/type-path'\nimport * as TypePaths from '@bessemer/cornerstone/object/type-path'\nimport * as Arrays from '@bessemer/cornerstone/array'\nimport * as Assertions from '@bessemer/cornerstone/assertion'\nimport { produce } from 'immer'\nimport * as Objects from '@bessemer/cornerstone/object'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type ObjectPath<T extends TypePathType = TypePathType> = TaggedType<ObjectPathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends ObjectPathConcreteType>(value: T): ObjectPath<InferObjectPath<T>> => {\n return value as ObjectPath<InferObjectPath<T>>\n}\n\nexport const from = <T extends string>(path: T): ObjectPath<ParseObjectPath<T>> => {\n const typePath = TypePaths.from(path)\n\n typePath.forEach((it) => {\n Assertions.assert(it !== '*', () => 'ObjectPaths do not allow for wildcard selectors')\n\n if (Array.isArray(it)) {\n Assertions.assert(it.length === 1, () => 'ObjectPaths do not allow for multiple index selectors or array slices')\n }\n })\n\n return typePath as ObjectPath<ParseObjectPath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N): TypePathGet<T, N> => {\n return TypePaths.getValue(path, object)\n}\n\nexport const applyValue = <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N, valueToApply: TypePathGet<T, N>): N => {\n return applyAnyValue(path, object, valueToApply) as N\n}\n\nexport const applyAnyValue = (path: ObjectPath, object: unknown, valueToApply: unknown): unknown => {\n if (Arrays.isEmpty(path)) {\n return valueToApply\n }\n\n return produce(object, (draft) => {\n const rest = path.slice(0, -1)\n const last = path[path.length - 1]!\n const parent = getValue(of(rest), draft) as any\n\n Assertions.assert(Objects.isObject(parent) || Array.isArray(parent), () => `Unable to apply value: ${valueToApply} at ObjectPath: ${path} against object: ${object}`)\n if (Array.isArray(last)) {\n const index = Arrays.only(last)\n parent[index] = valueToApply\n } else {\n parent[last] = valueToApply\n }\n })\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: ObjectPath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is ObjectPath<MatchingPath> => {\n return TypePaths.matches(targetPath, matchingPath)\n}\n\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: ObjectPath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): ObjectPath => {\n return TypePaths.intersect(targetPath, intersectingPath) as ObjectPath\n}\n"],"mappings":";AAAA,OAAO,SAAS;AAWhB,YAAY,eAAe;AAC3B,YAAY,YAAY;AACxB,YAAY,gBAAgB;AAC5B,SAAS,eAAe;AACxB,YAAY,aAAa;AAKlB,IAAM,KAAK,CAAmC,UAA6C;AAChG,SAAO;AACT;AAEO,IAAMA,QAAO,CAAmB,SAA4C;AACjF,QAAM,WAAqB,eAAK,IAAI;AAEpC,WAAS,QAAQ,CAAC,OAAO;AACvB,IAAW,kBAAO,OAAO,KAAK,MAAM,iDAAiD;AAErF,QAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,MAAW,kBAAO,GAAG,WAAW,GAAG,MAAM,uEAAuE;AAAA,IAClH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO;AACzF,MAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,WAAO,GAAG,EAAE;AAAA,EACd,OAAO;AACL,WAAOA,MAAK,EAAE;AAAA,EAChB;AACF,CAAC;AAEM,IAAMC,YAAW,CAA8B,MAAqB,WAAiC;AAC1G,SAAiB,mBAAS,MAAM,MAAM;AACxC;AAEO,IAAM,aAAa,CAA8B,MAAqB,QAAW,iBAAuC;AAC7H,SAAO,cAAc,MAAM,QAAQ,YAAY;AACjD;AAEO,IAAM,gBAAgB,CAAC,MAAkB,QAAiB,iBAAmC;AAClG,MAAW,eAAQ,IAAI,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAC7B,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAM,SAASA,UAAS,GAAG,IAAI,GAAG,KAAK;AAEvC,IAAW,kBAAe,iBAAS,MAAM,KAAK,MAAM,QAAQ,MAAM,GAAG,MAAM,0BAA0B,YAAY,mBAAmB,IAAI,oBAAoB,MAAM,EAAE;AACpK,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,QAAe,YAAK,IAAI;AAC9B,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEO,IAAMC,WAAU,CACrB,YACA,iBAC2C;AAC3C,SAAiB,kBAAQ,YAAY,YAAY;AACnD;AAEO,IAAMC,aAAY,CACvB,YACA,qBACe;AACf,SAAiB,oBAAU,YAAY,gBAAgB;AACzD;","names":["from","getValue","matches","intersect"]}
@@ -1,16 +1,16 @@
1
1
  // src/object/type-path.ts
2
- import { assert } from "@bessemer/cornerstone/assertion";
2
+ import * as Assertions from "@bessemer/cornerstone/assertion";
3
3
  import Zod from "zod";
4
- import { isNil, isObject } from "@bessemer/cornerstone/object";
5
- import { isNumber } from "@bessemer/cornerstone/math";
6
- import { contains, containsAll, isEmpty, only } from "@bessemer/cornerstone/array";
4
+ import * as Objects from "@bessemer/cornerstone/object";
5
+ import * as Maths from "@bessemer/cornerstone/math";
6
+ import * as Arrays from "@bessemer/cornerstone/array";
7
7
  import * as Results from "@bessemer/cornerstone/result";
8
8
  var of = (value) => {
9
9
  return value;
10
10
  };
11
11
  var TypePathRegex = /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\*|\d+|\[\s*(?:\*|\d+(?:\s*,\s*\d+)*)\s*])(?:\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\*|\d+)|\[\s*(?:\*|\d+(?:\s*,\s*\d+)*)\s*])*$|^$/;
12
12
  var from = (path) => {
13
- assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`);
13
+ Assertions.assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`);
14
14
  if (path === "") {
15
15
  return [];
16
16
  }
@@ -72,7 +72,7 @@ var getValue = (path, object) => {
72
72
  let current = object;
73
73
  let collectorMode = false;
74
74
  for (const selector of path) {
75
- if (isNil(current)) {
75
+ if (Objects.isNil(current)) {
76
76
  return void 0;
77
77
  }
78
78
  if (collectorMode) {
@@ -108,10 +108,10 @@ var evaluateSelector = (selector, current) => {
108
108
  var evaluateNameSelector = (selector, current) => {
109
109
  if (Array.isArray(current)) {
110
110
  const numberSelector = Number(selector);
111
- assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`);
111
+ Assertions.assert(Maths.isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`);
112
112
  return evaluateIndexSelector([numberSelector], current);
113
113
  }
114
- if (!isObject(current)) {
114
+ if (!Objects.isObject(current)) {
115
115
  return [void 0, false];
116
116
  }
117
117
  return [current[selector], false];
@@ -120,7 +120,7 @@ var evaluateWildcardSelector = (current) => {
120
120
  if (Array.isArray(current)) {
121
121
  return [current, true];
122
122
  }
123
- if (isObject(current)) {
123
+ if (Objects.isObject(current)) {
124
124
  throw new Error("Wildcard operations on Objects is not yet supported");
125
125
  }
126
126
  throw new Error(`Unable to apply wildcard operator to value: ${current}`);
@@ -130,7 +130,7 @@ var evaluateIndexSelector = (selector, current) => {
130
130
  throw new Error(`Unable to apply index operator to value: ${current}`);
131
131
  }
132
132
  if (selector.length === 1) {
133
- return [current[only(selector)], false];
133
+ return [current[Arrays.only(selector)], false];
134
134
  }
135
135
  const indexSelector = selector;
136
136
  const result = indexSelector.map((it) => current[it]);
@@ -146,18 +146,18 @@ var matches = (targetPath, matchingPath) => {
146
146
  let index = 0;
147
147
  for (const targetPathSelector of targetPath) {
148
148
  const matchingPathSelector = matchingPath[index];
149
- if (isNil(matchingPathSelector)) {
149
+ if (Objects.isNil(matchingPathSelector)) {
150
150
  return true;
151
151
  } else if (isWildcardSelector(matchingPathSelector)) {
152
152
  } else if (isWildcardSelector(targetPathSelector)) {
153
153
  return false;
154
154
  } else if (Array.isArray(matchingPathSelector)) {
155
155
  if (Array.isArray(targetPathSelector)) {
156
- if (!containsAll(matchingPathSelector, targetPathSelector)) {
156
+ if (!Arrays.containsAll(matchingPathSelector, targetPathSelector)) {
157
157
  return false;
158
158
  }
159
159
  } else {
160
- if (!contains(matchingPathSelector, Number(targetPathSelector))) {
160
+ if (!Arrays.contains(matchingPathSelector, Number(targetPathSelector))) {
161
161
  return false;
162
162
  }
163
163
  }
@@ -166,7 +166,7 @@ var matches = (targetPath, matchingPath) => {
166
166
  if (targetPathSelector.length !== 1) {
167
167
  return false;
168
168
  }
169
- const targetPathSelectorIndex = only(targetPathSelector);
169
+ const targetPathSelectorIndex = Arrays.only(targetPathSelector);
170
170
  if (targetPathSelectorIndex !== Number(matchingPathSelector)) {
171
171
  return false;
172
172
  }
@@ -189,7 +189,7 @@ var intersectAny = (targetPath, intersectingPath) => {
189
189
  for (const targetPathSelector of targetPath) {
190
190
  const intersectingPathSelector = intersectingPath[index];
191
191
  const makeError = () => new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`);
192
- if (isNil(intersectingPathSelector)) {
192
+ if (Objects.isNil(intersectingPathSelector)) {
193
193
  return Results.success(of(result));
194
194
  } else if (isWildcardSelector(intersectingPathSelector)) {
195
195
  result.push(targetPathSelector);
@@ -197,13 +197,13 @@ var intersectAny = (targetPath, intersectingPath) => {
197
197
  return Results.failure(makeError());
198
198
  } else if (Array.isArray(intersectingPathSelector)) {
199
199
  if (Array.isArray(targetPathSelector)) {
200
- const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it));
201
- if (isEmpty(filteredTargetPaths)) {
200
+ const filteredTargetPaths = targetPathSelector.filter((it) => Arrays.contains(intersectingPathSelector, it));
201
+ if (Arrays.isEmpty(filteredTargetPaths)) {
202
202
  return Results.failure(makeError());
203
203
  }
204
204
  result.push(filteredTargetPaths);
205
205
  } else {
206
- if (!contains(intersectingPathSelector, Number(targetPathSelector))) {
206
+ if (!Arrays.contains(intersectingPathSelector, Number(targetPathSelector))) {
207
207
  return Results.failure(makeError());
208
208
  }
209
209
  result.push(targetPathSelector);
@@ -213,7 +213,7 @@ var intersectAny = (targetPath, intersectingPath) => {
213
213
  if (targetPathSelector.length !== 1) {
214
214
  return Results.failure(makeError());
215
215
  }
216
- const targetPathSelectorIndex = only(targetPathSelector);
216
+ const targetPathSelectorIndex = Arrays.only(targetPathSelector);
217
217
  if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {
218
218
  return Results.failure(makeError());
219
219
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport Zod from 'zod'\nimport {\n IndexSelector,\n InferTypePath,\n NameSelector,\n ParseTypePath,\n TypePathConcreteType,\n TypePathGet,\n TypePathSelector,\n TypePathType,\n WildcardSelector,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport { isNil, isObject } from '@bessemer/cornerstone/object'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { contains, containsAll, isEmpty, only } from '@bessemer/cornerstone/array'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type TypePath<T extends TypePathType = TypePathType> = TaggedType<TypePathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends TypePathConcreteType>(value: T): TypePath<InferTypePath<T>> => {\n return value as TypePath<InferTypePath<T>>\n}\n\nconst TypePathRegex =\n /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])(?:\\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+)|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])*$|^$/\n\nexport const from = <T extends string>(path: T): TypePath<ParseTypePath<T>> => {\n assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`)\n\n if (path === '') {\n return [] as TypePath<ParseTypePath<T>>\n }\n\n const segments: Array<string | Array<string | number>> = []\n let current = ''\n let i = 0\n\n while (i < path.length) {\n const char = path[i]\n\n if (char === '.') {\n if (current) {\n segments.push(current)\n current = ''\n }\n i++\n } else if (char === '[') {\n if (current) {\n segments.push(current)\n current = ''\n }\n\n // Find the matching closing bracket\n let bracketContent = ''\n i++ // Skip opening bracket\n let depth = 1\n\n while (i < path.length && depth > 0) {\n const bracketChar = path[i]\n if (bracketChar === '[') {\n depth++\n } else if (bracketChar === ']') {\n depth--\n }\n\n if (depth > 0) {\n bracketContent += bracketChar\n }\n i++\n }\n\n if (bracketContent === '*') {\n segments.push('*')\n } else {\n const indices = bracketContent\n .split(',')\n .map((s) => s.trim())\n .map((s) => parseInt(s, 10))\n\n segments.push(indices)\n }\n } else {\n current += char\n i++\n }\n }\n\n // Add any remaining current segment\n if (current) {\n segments.push(current)\n }\n\n return segments as TypePath<ParseTypePath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends TypePathType, N>(path: TypePath<T>, object: N): TypePathGet<T, N> => {\n let current: unknown = object\n let collectorMode = false\n\n for (const selector of path) {\n if (isNil(current)) {\n return undefined as TypePathGet<T, N>\n }\n\n if (collectorMode) {\n if (!Array.isArray(current)) {\n throw new Error('Illegal State - in collectorMode but current value is not an Array')\n }\n\n const result = current.flatMap((it) => {\n const [value, isCollecting] = evaluateSelector(selector, it)\n if (isCollecting) {\n return value\n } else {\n return [value]\n }\n })\n\n current = result\n } else {\n const [result, isCollecting] = evaluateSelector(selector, current)\n current = result\n collectorMode = isCollecting\n }\n }\n\n return current as TypePathGet<T, N>\n}\n\nconst evaluateSelector = (selector: TypePathSelector, current: unknown): [unknown, boolean] => {\n if (isWildcardSelector(selector)) {\n return evaluateWildcardSelector(current)\n }\n\n if (Array.isArray(selector)) {\n return evaluateIndexSelector(selector as IndexSelector, current)\n }\n\n return evaluateNameSelector(selector, current)\n}\n\nconst evaluateNameSelector = (selector: NameSelector, current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n const numberSelector = Number(selector)\n assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`)\n return evaluateIndexSelector([numberSelector], current)\n }\n\n if (!isObject(current)) {\n return [undefined, false]\n }\n\n return [current[selector], false]\n}\n\nconst evaluateWildcardSelector = (current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n return [current, true]\n }\n\n if (isObject(current)) {\n throw new Error('Wildcard operations on Objects is not yet supported')\n }\n\n throw new Error(`Unable to apply wildcard operator to value: ${current}`)\n}\n\nconst evaluateIndexSelector = (selector: IndexSelector, current: unknown): [unknown, boolean] => {\n if (!Array.isArray(current)) {\n throw new Error(`Unable to apply index operator to value: ${current}`)\n }\n\n if (selector.length === 1) {\n return [current[only(selector)], false]\n }\n\n const indexSelector = selector as IndexSelector\n const result = indexSelector.map((it) => current[it])\n return [result, true]\n}\n\nexport const isWildcardSelector = (selector: TypePathSelector): selector is WildcardSelector => {\n return selector === '*'\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: TypePath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is TypePath<MatchingPath> => {\n if (targetPath.length < matchingPath.length) {\n return false\n }\n\n let index = 0\n for (const targetPathSelector of targetPath) {\n const matchingPathSelector = matchingPath[index]\n\n if (isNil(matchingPathSelector)) {\n return true\n } else if (isWildcardSelector(matchingPathSelector)) {\n // Matching path wildcards always match - they're wild\n } else if (isWildcardSelector(targetPathSelector)) {\n return false\n } else if (Array.isArray(matchingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n if (!containsAll(matchingPathSelector, targetPathSelector)) {\n return false\n }\n } else {\n if (!contains(matchingPathSelector, Number(targetPathSelector))) {\n return false\n }\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return false\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(matchingPathSelector)) {\n return false\n }\n } else {\n if (targetPathSelector !== matchingPathSelector) {\n return false\n }\n }\n }\n\n index++\n }\n\n return true\n}\n\nexport const intersectAny = (targetPath: TypePath, intersectingPath: TypePath): Result<TypePath> => {\n if (targetPath.length < intersectingPath.length) {\n return Results.failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`))\n }\n\n let index = 0\n let result: TypePathConcreteType = []\n for (const targetPathSelector of targetPath) {\n const intersectingPathSelector = intersectingPath[index]\n const makeError = () =>\n new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`)\n\n if (isNil(intersectingPathSelector)) {\n return Results.success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return Results.failure(makeError())\n } else if (Array.isArray(intersectingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it))\n if (isEmpty(filteredTargetPaths)) {\n return Results.failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return Results.failure(makeError())\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return Results.success(of(result))\n}\n\n// JOHN this needs to do a type resolution step...\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: TypePath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): TypePath => {\n const result = intersectAny(targetPath, intersectingPath)\n Results.assertSuccess(result)\n return result\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport * as Assertions from '@bessemer/cornerstone/assertion'\nimport Zod from 'zod'\nimport {\n IndexSelector,\n InferTypePath,\n NameSelector,\n ParseTypePath,\n TypePathConcreteType,\n TypePathGet,\n TypePathSelector,\n TypePathType,\n WildcardSelector,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport * as Objects from '@bessemer/cornerstone/object'\nimport * as Maths from '@bessemer/cornerstone/math'\nimport * as Arrays from '@bessemer/cornerstone/array'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type TypePath<T extends TypePathType = TypePathType> = TaggedType<TypePathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends TypePathConcreteType>(value: T): TypePath<InferTypePath<T>> => {\n return value as TypePath<InferTypePath<T>>\n}\n\nconst TypePathRegex =\n /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])(?:\\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+)|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])*$|^$/\n\nexport const from = <T extends string>(path: T): TypePath<ParseTypePath<T>> => {\n Assertions.assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`)\n\n if (path === '') {\n return [] as TypePath<ParseTypePath<T>>\n }\n\n const segments: Array<string | Array<string | number>> = []\n let current = ''\n let i = 0\n\n while (i < path.length) {\n const char = path[i]\n\n if (char === '.') {\n if (current) {\n segments.push(current)\n current = ''\n }\n i++\n } else if (char === '[') {\n if (current) {\n segments.push(current)\n current = ''\n }\n\n // Find the matching closing bracket\n let bracketContent = ''\n i++ // Skip opening bracket\n let depth = 1\n\n while (i < path.length && depth > 0) {\n const bracketChar = path[i]\n if (bracketChar === '[') {\n depth++\n } else if (bracketChar === ']') {\n depth--\n }\n\n if (depth > 0) {\n bracketContent += bracketChar\n }\n i++\n }\n\n if (bracketContent === '*') {\n segments.push('*')\n } else {\n const indices = bracketContent\n .split(',')\n .map((s) => s.trim())\n .map((s) => parseInt(s, 10))\n\n segments.push(indices)\n }\n } else {\n current += char\n i++\n }\n }\n\n // Add any remaining current segment\n if (current) {\n segments.push(current)\n }\n\n return segments as TypePath<ParseTypePath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends TypePathType, N>(path: TypePath<T>, object: N): TypePathGet<T, N> => {\n let current: unknown = object\n let collectorMode = false\n\n for (const selector of path) {\n if (Objects.isNil(current)) {\n return undefined as TypePathGet<T, N>\n }\n\n if (collectorMode) {\n if (!Array.isArray(current)) {\n throw new Error('Illegal State - in collectorMode but current value is not an Array')\n }\n\n const result = current.flatMap((it) => {\n const [value, isCollecting] = evaluateSelector(selector, it)\n if (isCollecting) {\n return value\n } else {\n return [value]\n }\n })\n\n current = result\n } else {\n const [result, isCollecting] = evaluateSelector(selector, current)\n current = result\n collectorMode = isCollecting\n }\n }\n\n return current as TypePathGet<T, N>\n}\n\nconst evaluateSelector = (selector: TypePathSelector, current: unknown): [unknown, boolean] => {\n if (isWildcardSelector(selector)) {\n return evaluateWildcardSelector(current)\n }\n\n if (Array.isArray(selector)) {\n return evaluateIndexSelector(selector as IndexSelector, current)\n }\n\n return evaluateNameSelector(selector, current)\n}\n\nconst evaluateNameSelector = (selector: NameSelector, current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n const numberSelector = Number(selector)\n Assertions.assert(Maths.isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`)\n return evaluateIndexSelector([numberSelector], current)\n }\n\n if (!Objects.isObject(current)) {\n return [undefined, false]\n }\n\n return [current[selector], false]\n}\n\nconst evaluateWildcardSelector = (current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n return [current, true]\n }\n\n if (Objects.isObject(current)) {\n throw new Error('Wildcard operations on Objects is not yet supported')\n }\n\n throw new Error(`Unable to apply wildcard operator to value: ${current}`)\n}\n\nconst evaluateIndexSelector = (selector: IndexSelector, current: unknown): [unknown, boolean] => {\n if (!Array.isArray(current)) {\n throw new Error(`Unable to apply index operator to value: ${current}`)\n }\n\n if (selector.length === 1) {\n return [current[Arrays.only(selector)], false]\n }\n\n const indexSelector = selector as IndexSelector\n const result = indexSelector.map((it) => current[it])\n return [result, true]\n}\n\nexport const isWildcardSelector = (selector: TypePathSelector): selector is WildcardSelector => {\n return selector === '*'\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: TypePath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is TypePath<MatchingPath> => {\n if (targetPath.length < matchingPath.length) {\n return false\n }\n\n let index = 0\n for (const targetPathSelector of targetPath) {\n const matchingPathSelector = matchingPath[index]\n\n if (Objects.isNil(matchingPathSelector)) {\n return true\n } else if (isWildcardSelector(matchingPathSelector)) {\n // Matching path wildcards always match - they're wild\n } else if (isWildcardSelector(targetPathSelector)) {\n return false\n } else if (Array.isArray(matchingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n if (!Arrays.containsAll(matchingPathSelector, targetPathSelector)) {\n return false\n }\n } else {\n if (!Arrays.contains(matchingPathSelector, Number(targetPathSelector))) {\n return false\n }\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return false\n }\n\n const targetPathSelectorIndex = Arrays.only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(matchingPathSelector)) {\n return false\n }\n } else {\n if (targetPathSelector !== matchingPathSelector) {\n return false\n }\n }\n }\n\n index++\n }\n\n return true\n}\n\nexport const intersectAny = (targetPath: TypePath, intersectingPath: TypePath): Result<TypePath> => {\n if (targetPath.length < intersectingPath.length) {\n return Results.failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`))\n }\n\n let index = 0\n let result: TypePathConcreteType = []\n for (const targetPathSelector of targetPath) {\n const intersectingPathSelector = intersectingPath[index]\n const makeError = () =>\n new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`)\n\n if (Objects.isNil(intersectingPathSelector)) {\n return Results.success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return Results.failure(makeError())\n } else if (Array.isArray(intersectingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n const filteredTargetPaths = targetPathSelector.filter((it) => Arrays.contains(intersectingPathSelector, it))\n if (Arrays.isEmpty(filteredTargetPaths)) {\n return Results.failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!Arrays.contains(intersectingPathSelector, Number(targetPathSelector))) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return Results.failure(makeError())\n }\n\n const targetPathSelectorIndex = Arrays.only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return Results.success(of(result))\n}\n\n// JOHN this needs to do a type resolution step...\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: TypePath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): TypePath => {\n const result = intersectAny(targetPath, intersectingPath)\n Results.assertSuccess(result)\n return result\n}\n"],"mappings":"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","names":[]}
package/dist/patch.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  Expressions,
5
5
  NumericExpressions
6
6
  } from "@bessemer/cornerstone/expression";
7
- import { deepMergeWith, isNil, isObject } from "@bessemer/cornerstone/object";
7
+ import * as Objects from "@bessemer/cornerstone/object";
8
8
  var PatchType = /* @__PURE__ */ ((PatchType2) => {
9
9
  PatchType2["Set"] = "Set";
10
10
  PatchType2["Apply"] = "Apply";
@@ -63,11 +63,11 @@ var resolve = (value, patches, evaluate) => {
63
63
  return resolveWithDetails(value, patches, evaluate).value;
64
64
  };
65
65
  var applyPatch = (value, patch2, evaluate) => {
66
- return deepMergeWith(value, patch2, (value2, patch3) => {
67
- if (isNil(patch3)) {
66
+ return Objects.deepMergeWith(value, patch2, (value2, patch3) => {
67
+ if (Objects.isNil(patch3)) {
68
68
  return value2;
69
69
  }
70
- if (!isObject(patch3) || !("_PatchType" in patch3)) {
70
+ if (!Objects.isObject(patch3) || !("_PatchType" in patch3)) {
71
71
  return void 0;
72
72
  }
73
73
  return evaluate(resolve(value2, [patch3], evaluate));
package/dist/patch.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/patch.ts"],"sourcesContent":["import {\n ArrayExpressions,\n EvaluateExpression,\n Expression,\n Expressions,\n NumericExpressions,\n ReducingExpression,\n} from '@bessemer/cornerstone/expression'\nimport { UnknownRecord } from 'type-fest'\nimport { deepMergeWith, isNil, isObject } from '@bessemer/cornerstone/object'\n\nexport enum PatchType {\n Set = 'Set',\n Apply = 'Apply',\n Patch = 'Patch',\n}\n\nexport type SetPatch<T> = {\n _PatchType: PatchType.Set\n value: Expression<T>\n}\n\nexport type ApplyPatch<T> = {\n _PatchType: PatchType.Apply\n value: Expression<T>\n reducer: ReducingExpression<T, T>\n}\n\nexport type PatchPatch<T> = {\n _PatchType: PatchType.Patch\n patch: Patchable<T>\n}\n\nexport type Patch<T> = SetPatch<T> | ApplyPatch<T> | PatchPatch<T>\n\nexport type PatchValue<T> = {\n value: T\n patch: Patch<T>\n}\n\nexport type Patchable<T> = {\n [P in keyof T]?: T[P] extends Array<infer U>\n ? Patch<U[]> | Patchable<U[]>\n : T[P] extends object | undefined\n ? Patch<T[P]> | Patchable<T[P]>\n : Patch<T[P]> | T[P]\n}\n\nexport const set = <T>(value: Expression<T>): Patch<T> => {\n return {\n _PatchType: PatchType.Set,\n value: value as any,\n }\n}\n\nexport const apply = <T>(value: Expression<T>, reducer: ReducingExpression<T, T>): Patch<T> => {\n return {\n _PatchType: PatchType.Apply,\n value,\n reducer,\n }\n}\n\nexport const patch = <T extends UnknownRecord, N extends Patchable<T> = Patchable<T>>(patch: N): Patch<T> => {\n return {\n _PatchType: PatchType.Patch,\n patch,\n }\n}\n\nexport const sum = (value: Expression<number>): Patch<number> => {\n return apply(value, Expressions.reference(NumericExpressions.SumExpression))\n}\n\nexport const multiply = (value: Expression<number>): Patch<number> => {\n return apply(value, Expressions.reference(NumericExpressions.MultiplyExpression))\n}\n\nexport const concatenate = <T extends Array<Expression<unknown>>>(value: Expression<T>): Patch<T> => {\n return apply(value, Expressions.reference(ArrayExpressions.ConcatenateExpression)) as Patch<T>\n}\n\nexport type ResolvePatchesResult<T> = {\n value: T\n patchValues: Array<PatchValue<T>>\n}\n\nexport const resolveWithDetails = <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression): ResolvePatchesResult<T> => {\n let currentValue: T = value\n\n const patchValues = patches.map((patch) => {\n switch (patch._PatchType) {\n case PatchType.Set:\n currentValue = evaluate(patch.value)\n break\n case PatchType.Apply:\n currentValue = evaluate(Expressions.dereference(patch.reducer, [currentValue, patch.value]))\n break\n case PatchType.Patch:\n currentValue = applyPatch(currentValue, patch.patch, evaluate)\n break\n default:\n throw new Error(`Unrecognized PatchType for value: ${JSON.stringify(it)}`)\n }\n\n return { value: currentValue, patch }\n })\n\n return { value: currentValue, patchValues }\n}\n\nexport const resolve = <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression): T => {\n return resolveWithDetails(value, patches, evaluate).value\n}\n\nconst applyPatch = <T>(value: T, patch: Patchable<T>, evaluate: EvaluateExpression): T => {\n return deepMergeWith(value, patch, (value, patch) => {\n if (isNil(patch)) {\n return value\n }\n\n if (!isObject(patch) || !('_PatchType' in patch)) {\n return undefined\n }\n\n return evaluate(resolve(value, [patch as Patch<T>], evaluate))\n })\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,eAAe,OAAO,gBAAgB;AAExC,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;AAqCL,IAAM,MAAM,CAAI,UAAmC;AACxD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAI,OAAsB,YAAgD;AAC7F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAiEC,WAAuB;AAC3G,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAAA;AAAA,EACF;AACF;AAEO,IAAM,MAAM,CAAC,UAA6C;AAC/D,SAAO,MAAM,OAAO,YAAY,UAAU,mBAAmB,aAAa,CAAC;AAC7E;AAEO,IAAM,WAAW,CAAC,UAA6C;AACpE,SAAO,MAAM,OAAO,YAAY,UAAU,mBAAmB,kBAAkB,CAAC;AAClF;AAEO,IAAM,cAAc,CAAuC,UAAmC;AACnG,SAAO,MAAM,OAAO,YAAY,UAAU,iBAAiB,qBAAqB,CAAC;AACnF;AAOO,IAAM,qBAAqB,CAAI,OAAU,SAA0B,aAA0D;AAClI,MAAI,eAAkB;AAEtB,QAAM,cAAc,QAAQ,IAAI,CAACA,WAAU;AACzC,YAAQA,OAAM,YAAY;AAAA,MACxB,KAAK;AACH,uBAAe,SAASA,OAAM,KAAK;AACnC;AAAA,MACF,KAAK;AACH,uBAAe,SAAS,YAAY,YAAYA,OAAM,SAAS,CAAC,cAAcA,OAAM,KAAK,CAAC,CAAC;AAC3F;AAAA,MACF,KAAK;AACH,uBAAe,WAAW,cAAcA,OAAM,OAAO,QAAQ;AAC7D;AAAA,MACF;AACE,cAAM,IAAI,MAAM,qCAAqC,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,IAC7E;AAEA,WAAO,EAAE,OAAO,cAAc,OAAAA,OAAM;AAAA,EACtC,CAAC;AAED,SAAO,EAAE,OAAO,cAAc,YAAY;AAC5C;AAEO,IAAM,UAAU,CAAI,OAAU,SAA0B,aAAoC;AACjG,SAAO,mBAAmB,OAAO,SAAS,QAAQ,EAAE;AACtD;AAEA,IAAM,aAAa,CAAI,OAAUA,QAAqB,aAAoC;AACxF,SAAO,cAAc,OAAOA,QAAO,CAACC,QAAOD,WAAU;AACnD,QAAI,MAAMA,MAAK,GAAG;AAChB,aAAOC;AAAA,IACT;AAEA,QAAI,CAAC,SAASD,MAAK,KAAK,EAAE,gBAAgBA,SAAQ;AAChD,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,QAAQC,QAAO,CAACD,MAAiB,GAAG,QAAQ,CAAC;AAAA,EAC/D,CAAC;AACH;","names":["PatchType","patch","value"]}
1
+ {"version":3,"sources":["../src/patch.ts"],"sourcesContent":["import {\n ArrayExpressions,\n EvaluateExpression,\n Expression,\n Expressions,\n NumericExpressions,\n ReducingExpression,\n} from '@bessemer/cornerstone/expression'\nimport { UnknownRecord } from 'type-fest'\nimport * as Objects from '@bessemer/cornerstone/object'\n\nexport enum PatchType {\n Set = 'Set',\n Apply = 'Apply',\n Patch = 'Patch',\n}\n\nexport type SetPatch<T> = {\n _PatchType: PatchType.Set\n value: Expression<T>\n}\n\nexport type ApplyPatch<T> = {\n _PatchType: PatchType.Apply\n value: Expression<T>\n reducer: ReducingExpression<T, T>\n}\n\nexport type PatchPatch<T> = {\n _PatchType: PatchType.Patch\n patch: Patchable<T>\n}\n\nexport type Patch<T> = SetPatch<T> | ApplyPatch<T> | PatchPatch<T>\n\nexport type PatchValue<T> = {\n value: T\n patch: Patch<T>\n}\n\nexport type Patchable<T> = {\n [P in keyof T]?: T[P] extends Array<infer U>\n ? Patch<U[]> | Patchable<U[]>\n : T[P] extends object | undefined\n ? Patch<T[P]> | Patchable<T[P]>\n : Patch<T[P]> | T[P]\n}\n\nexport const set = <T>(value: Expression<T>): Patch<T> => {\n return {\n _PatchType: PatchType.Set,\n value: value as any,\n }\n}\n\nexport const apply = <T>(value: Expression<T>, reducer: ReducingExpression<T, T>): Patch<T> => {\n return {\n _PatchType: PatchType.Apply,\n value,\n reducer,\n }\n}\n\nexport const patch = <T extends UnknownRecord, N extends Patchable<T> = Patchable<T>>(patch: N): Patch<T> => {\n return {\n _PatchType: PatchType.Patch,\n patch,\n }\n}\n\nexport const sum = (value: Expression<number>): Patch<number> => {\n return apply(value, Expressions.reference(NumericExpressions.SumExpression))\n}\n\nexport const multiply = (value: Expression<number>): Patch<number> => {\n return apply(value, Expressions.reference(NumericExpressions.MultiplyExpression))\n}\n\nexport const concatenate = <T extends Array<Expression<unknown>>>(value: Expression<T>): Patch<T> => {\n return apply(value, Expressions.reference(ArrayExpressions.ConcatenateExpression)) as Patch<T>\n}\n\nexport type ResolvePatchesResult<T> = {\n value: T\n patchValues: Array<PatchValue<T>>\n}\n\nexport const resolveWithDetails = <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression): ResolvePatchesResult<T> => {\n let currentValue: T = value\n\n const patchValues = patches.map((patch) => {\n switch (patch._PatchType) {\n case PatchType.Set:\n currentValue = evaluate(patch.value)\n break\n case PatchType.Apply:\n currentValue = evaluate(Expressions.dereference(patch.reducer, [currentValue, patch.value]))\n break\n case PatchType.Patch:\n currentValue = applyPatch(currentValue, patch.patch, evaluate)\n break\n default:\n throw new Error(`Unrecognized PatchType for value: ${JSON.stringify(it)}`)\n }\n\n return { value: currentValue, patch }\n })\n\n return { value: currentValue, patchValues }\n}\n\nexport const resolve = <T>(value: T, patches: Array<Patch<T>>, evaluate: EvaluateExpression): T => {\n return resolveWithDetails(value, patches, evaluate).value\n}\n\nconst applyPatch = <T>(value: T, patch: Patchable<T>, evaluate: EvaluateExpression): T => {\n return Objects.deepMergeWith(value, patch, (value, patch) => {\n if (Objects.isNil(patch)) {\n return value\n }\n\n if (!Objects.isObject(patch) || !('_PatchType' in patch)) {\n return undefined\n }\n\n return evaluate(resolve(value, [patch as Patch<T>], evaluate))\n })\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAGA;AAAA,EACA;AAAA,OAEK;AAEP,YAAY,aAAa;AAElB,IAAK,YAAL,kBAAKA,eAAL;AACL,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;AAqCL,IAAM,MAAM,CAAI,UAAmC;AACxD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAI,OAAsB,YAAgD;AAC7F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAiEC,WAAuB;AAC3G,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,OAAAA;AAAA,EACF;AACF;AAEO,IAAM,MAAM,CAAC,UAA6C;AAC/D,SAAO,MAAM,OAAO,YAAY,UAAU,mBAAmB,aAAa,CAAC;AAC7E;AAEO,IAAM,WAAW,CAAC,UAA6C;AACpE,SAAO,MAAM,OAAO,YAAY,UAAU,mBAAmB,kBAAkB,CAAC;AAClF;AAEO,IAAM,cAAc,CAAuC,UAAmC;AACnG,SAAO,MAAM,OAAO,YAAY,UAAU,iBAAiB,qBAAqB,CAAC;AACnF;AAOO,IAAM,qBAAqB,CAAI,OAAU,SAA0B,aAA0D;AAClI,MAAI,eAAkB;AAEtB,QAAM,cAAc,QAAQ,IAAI,CAACA,WAAU;AACzC,YAAQA,OAAM,YAAY;AAAA,MACxB,KAAK;AACH,uBAAe,SAASA,OAAM,KAAK;AACnC;AAAA,MACF,KAAK;AACH,uBAAe,SAAS,YAAY,YAAYA,OAAM,SAAS,CAAC,cAAcA,OAAM,KAAK,CAAC,CAAC;AAC3F;AAAA,MACF,KAAK;AACH,uBAAe,WAAW,cAAcA,OAAM,OAAO,QAAQ;AAC7D;AAAA,MACF;AACE,cAAM,IAAI,MAAM,qCAAqC,KAAK,UAAU,EAAE,CAAC,EAAE;AAAA,IAC7E;AAEA,WAAO,EAAE,OAAO,cAAc,OAAAA,OAAM;AAAA,EACtC,CAAC;AAED,SAAO,EAAE,OAAO,cAAc,YAAY;AAC5C;AAEO,IAAM,UAAU,CAAI,OAAU,SAA0B,aAAoC;AACjG,SAAO,mBAAmB,OAAO,SAAS,QAAQ,EAAE;AACtD;AAEA,IAAM,aAAa,CAAI,OAAUA,QAAqB,aAAoC;AACxF,SAAe,sBAAc,OAAOA,QAAO,CAACC,QAAOD,WAAU;AAC3D,QAAY,cAAMA,MAAK,GAAG;AACxB,aAAOC;AAAA,IACT;AAEA,QAAI,CAAS,iBAASD,MAAK,KAAK,EAAE,gBAAgBA,SAAQ;AACxD,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,QAAQC,QAAO,CAACD,MAAiB,GAAG,QAAQ,CAAC;AAAA,EAC/D,CAAC;AACH;","names":["PatchType","patch","value"]}
package/dist/promise.js CHANGED
@@ -1,8 +1,8 @@
1
1
  // src/promise.ts
2
- import { isNil } from "@bessemer/cornerstone/object";
2
+ import * as Objects from "@bessemer/cornerstone/object";
3
3
  import { executeAsync } from "@bessemer/cornerstone/internal";
4
4
  var isPromise = (element) => {
5
- if (isNil(element)) {
5
+ if (Objects.isNil(element)) {
6
6
  return false;
7
7
  }
8
8
  return typeof element.then === "function";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/promise.ts"],"sourcesContent":["import { isNil } from '@bessemer/cornerstone/object'\nimport { Promisable } from 'type-fest'\nimport { executeAsync } from '@bessemer/cornerstone/internal'\n\nexport type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element: Promisable<T>): element is PromiseLike<T> => {\n if (isNil(element)) {\n return false\n }\n\n return typeof (element as Promise<T>).then === 'function'\n}\n\nexport const map = <T, N>(value: Promisable<T>, mapper: (value: T) => N): Promisable<N> => {\n if (isPromise(value)) {\n return executeAsync(async () => mapper(await value))\n } else {\n return mapper(value)\n }\n}\n\nexport const toPromise = <T>(element: T | Promise<T>): Promise<T> => {\n if (isPromise(element)) {\n return element\n }\n\n const { resolve, promise } = create<T>()\n resolve(element)\n return promise\n}\n\nexport const create = <T>(): PromiseContext<T> => {\n let resolveVar\n let rejectVar\n const promise = new Promise<T>((resolve, reject) => {\n resolveVar = resolve\n rejectVar = reject\n })\n\n return { promise, resolve: resolveVar!, reject: rejectVar! }\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAEtB,SAAS,oBAAoB;AAItB,IAAM,YAAY,CAAI,YAAsD;AACjF,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,OAAQ,QAAuB,SAAS;AACjD;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,UAAU,KAAK,GAAG;AACpB,WAAO,aAAa,YAAY,OAAO,MAAM,KAAK,CAAC;AAAA,EACrD,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEO,IAAM,YAAY,CAAI,YAAwC;AACnE,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAU;AACvC,UAAQ,OAAO;AACf,SAAO;AACT;AAEO,IAAM,SAAS,MAA4B;AAChD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAClD,iBAAa;AACb,gBAAY;AAAA,EACd,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,YAAa,QAAQ,UAAW;AAC7D;","names":[]}
1
+ {"version":3,"sources":["../src/promise.ts"],"sourcesContent":["import * as Objects from '@bessemer/cornerstone/object'\nimport { Promisable } from 'type-fest'\nimport { executeAsync } from '@bessemer/cornerstone/internal'\n\nexport type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element: Promisable<T>): element is PromiseLike<T> => {\n if (Objects.isNil(element)) {\n return false\n }\n\n return typeof (element as Promise<T>).then === 'function'\n}\n\nexport const map = <T, N>(value: Promisable<T>, mapper: (value: T) => N): Promisable<N> => {\n if (isPromise(value)) {\n return executeAsync(async () => mapper(await value))\n } else {\n return mapper(value)\n }\n}\n\nexport const toPromise = <T>(element: T | Promise<T>): Promise<T> => {\n if (isPromise(element)) {\n return element\n }\n\n const { resolve, promise } = create<T>()\n resolve(element)\n return promise\n}\n\nexport const create = <T>(): PromiseContext<T> => {\n let resolveVar\n let rejectVar\n const promise = new Promise<T>((resolve, reject) => {\n resolveVar = resolve\n rejectVar = reject\n })\n\n return { promise, resolve: resolveVar!, reject: rejectVar! }\n}\n"],"mappings":";AAAA,YAAY,aAAa;AAEzB,SAAS,oBAAoB;AAItB,IAAM,YAAY,CAAI,YAAsD;AACjF,MAAY,cAAM,OAAO,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,OAAQ,QAAuB,SAAS;AACjD;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,UAAU,KAAK,GAAG;AACpB,WAAO,aAAa,YAAY,OAAO,MAAM,KAAK,CAAC;AAAA,EACrD,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEO,IAAM,YAAY,CAAI,YAAwC;AACnE,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAU;AACvC,UAAQ,OAAO;AACf,SAAO;AACT;AAEO,IAAM,SAAS,MAA4B;AAChD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAClD,iBAAa;AACb,gBAAY;AAAA,EACd,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,YAAa,QAAQ,UAAW;AAC7D;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,cAAc,EAAiB,GAAG,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAClH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGtD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,aAAa,IAAI;IACpD,MAAM,EAAE,CAAC,CAAA;IACT,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAE7D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,aAAa,EAAE,QAAQ,CAAC,EAAE,YAAY,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAWvH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,aAAa,EAAE,YAAY,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,KAAG,CAGlG,CAAA"}
1
+ {"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAGtD,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,aAAa,IAAI;IACpD,MAAM,EAAE,CAAC,CAAA;IACT,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAA;CACvD,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAA;AAE7D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,aAAa,EAAE,QAAQ,CAAC,EAAE,YAAY,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAG,cAAc,CAAC,CAAC,CAWvH,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,CAAC,SAAS,aAAa,EAAE,YAAY,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,KAAG,CAGlG,CAAA"}
package/dist/property.js CHANGED
@@ -1,9 +1,9 @@
1
1
  // src/property.ts
2
- import { resolve as resolveTag, serializeTags } from "@bessemer/cornerstone/tag";
3
- import { deepMergeAll } from "@bessemer/cornerstone/object";
2
+ import * as Tags from "@bessemer/cornerstone/tag";
3
+ import * as Objects from "@bessemer/cornerstone/object";
4
4
  var properties = (values, overrides) => {
5
5
  const propertyOverrideEntries = (overrides ?? []).map((override) => {
6
- return [serializeTags(override.tags), override];
6
+ return [Tags.serializeTags(override.tags), override];
7
7
  });
8
8
  const propertyOverrides = Object.fromEntries(propertyOverrideEntries);
9
9
  return {
@@ -11,12 +11,12 @@ var properties = (values, overrides) => {
11
11
  overrides: propertyOverrides
12
12
  };
13
13
  };
14
- var resolve = (properties2, tags) => {
15
- const overrides = resolveTag(Object.values(properties2.overrides), tags);
16
- return deepMergeAll([properties2.values, ...overrides.reverse()]);
14
+ var resolve2 = (properties2, tags) => {
15
+ const overrides = Tags.resolve(Object.values(properties2.overrides), tags);
16
+ return Objects.deepMergeAll([properties2.values, ...overrides.reverse()]);
17
17
  };
18
18
  export {
19
19
  properties,
20
- resolve
20
+ resolve2 as resolve
21
21
  };
22
22
  //# sourceMappingURL=property.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/property.ts"],"sourcesContent":["import { resolve as resolveTag, SerializedTags, serializeTags, Tag, TaggedValue } from '@bessemer/cornerstone/tag'\nimport { PartialDeep, UnknownRecord } from 'type-fest'\nimport { deepMergeAll } from '@bessemer/cornerstone/object'\n\nexport type PropertyRecord<T extends UnknownRecord> = {\n values: T\n overrides: Record<SerializedTags, PropertyOverride<T>>\n}\n\nexport type PropertyOverride<T> = TaggedValue<PartialDeep<T>>\n\nexport const properties = <T extends UnknownRecord>(values: T, overrides?: Array<PropertyOverride<T>>): PropertyRecord<T> => {\n const propertyOverrideEntries = (overrides ?? []).map((override) => {\n return [serializeTags(override.tags), override]\n })\n\n const propertyOverrides: Record<SerializedTags, PropertyOverride<T>> = Object.fromEntries(propertyOverrideEntries)\n\n return {\n values,\n overrides: propertyOverrides,\n }\n}\n\nexport const resolve = <T extends UnknownRecord>(properties: PropertyRecord<T>, tags: Array<Tag>): T => {\n const overrides = resolveTag(Object.values(properties.overrides), tags)\n return deepMergeAll([properties.values, ...overrides.reverse()]) as T\n}\n"],"mappings":";AAAA,SAAS,WAAW,YAA4B,qBAAuC;AAEvF,SAAS,oBAAoB;AAStB,IAAM,aAAa,CAA0B,QAAW,cAA8D;AAC3H,QAAM,2BAA2B,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa;AAClE,WAAO,CAAC,cAAc,SAAS,IAAI,GAAG,QAAQ;AAAA,EAChD,CAAC;AAED,QAAM,oBAAiE,OAAO,YAAY,uBAAuB;AAEjH,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,IAAM,UAAU,CAA0BA,aAA+B,SAAwB;AACtG,QAAM,YAAY,WAAW,OAAO,OAAOA,YAAW,SAAS,GAAG,IAAI;AACtE,SAAO,aAAa,CAACA,YAAW,QAAQ,GAAG,UAAU,QAAQ,CAAC,CAAC;AACjE;","names":["properties"]}
1
+ {"version":3,"sources":["../src/property.ts"],"sourcesContent":["import * as Tags from '@bessemer/cornerstone/tag'\nimport { SerializedTags, Tag, TaggedValue } from '@bessemer/cornerstone/tag'\nimport { PartialDeep, UnknownRecord } from 'type-fest'\nimport * as Objects from '@bessemer/cornerstone/object'\n\nexport type PropertyRecord<T extends UnknownRecord> = {\n values: T\n overrides: Record<SerializedTags, PropertyOverride<T>>\n}\n\nexport type PropertyOverride<T> = TaggedValue<PartialDeep<T>>\n\nexport const properties = <T extends UnknownRecord>(values: T, overrides?: Array<PropertyOverride<T>>): PropertyRecord<T> => {\n const propertyOverrideEntries = (overrides ?? []).map((override) => {\n return [Tags.serializeTags(override.tags), override]\n })\n\n const propertyOverrides: Record<SerializedTags, PropertyOverride<T>> = Object.fromEntries(propertyOverrideEntries)\n\n return {\n values,\n overrides: propertyOverrides,\n }\n}\n\nexport const resolve = <T extends UnknownRecord>(properties: PropertyRecord<T>, tags: Array<Tag>): T => {\n const overrides = Tags.resolve(Object.values(properties.overrides), tags)\n return Objects.deepMergeAll([properties.values, ...overrides.reverse()]) as T\n}\n"],"mappings":";AAAA,YAAY,UAAU;AAGtB,YAAY,aAAa;AASlB,IAAM,aAAa,CAA0B,QAAW,cAA8D;AAC3H,QAAM,2BAA2B,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa;AAClE,WAAO,CAAM,mBAAc,SAAS,IAAI,GAAG,QAAQ;AAAA,EACrD,CAAC;AAED,QAAM,oBAAiE,OAAO,YAAY,uBAAuB;AAEjH,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,IAAMA,WAAU,CAA0BC,aAA+B,SAAwB;AACtG,QAAM,YAAiB,aAAQ,OAAO,OAAOA,YAAW,SAAS,GAAG,IAAI;AACxE,SAAe,qBAAa,CAACA,YAAW,QAAQ,GAAG,UAAU,QAAQ,CAAC,CAAC;AACzE;","names":["resolve","properties"]}
package/dist/proxy.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/proxy.ts
2
- import { isFunction } from "@bessemer/cornerstone/function";
2
+ import * as Functions from "@bessemer/cornerstone/function";
3
3
  var extend = (target, extensions) => {
4
4
  return new Proxy(target, {
5
5
  get(target2, prop, receiver) {
@@ -7,7 +7,7 @@ var extend = (target, extensions) => {
7
7
  return extensions[prop];
8
8
  }
9
9
  const value = Reflect.get(target2, prop, receiver);
10
- if (isFunction(value)) {
10
+ if (Functions.isFunction(value)) {
11
11
  return value.bind(target2);
12
12
  }
13
13
  return value;
package/dist/proxy.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["import { isFunction } from '@bessemer/cornerstone/function'\n\nexport const extend = <Target extends object, E extends Record<string, unknown>>(target: Target, extensions: E): Target & E => {\n return new Proxy(target, {\n get(target, prop, receiver) {\n if (prop in extensions) {\n return extensions[prop as string]\n }\n\n const value = Reflect.get(target, prop, receiver)\n if (isFunction(value)) {\n return value.bind(target)\n }\n\n return value\n },\n }) as Target & E\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAEpB,IAAM,SAAS,CAA2D,QAAgB,eAA8B;AAC7H,SAAO,IAAI,MAAM,QAAQ;AAAA,IACvB,IAAIA,SAAQ,MAAM,UAAU;AAC1B,UAAI,QAAQ,YAAY;AACtB,eAAO,WAAW,IAAc;AAAA,MAClC;AAEA,YAAM,QAAQ,QAAQ,IAAIA,SAAQ,MAAM,QAAQ;AAChD,UAAI,WAAW,KAAK,GAAG;AACrB,eAAO,MAAM,KAAKA,OAAM;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":["target"]}
1
+ {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["import * as Functions from '@bessemer/cornerstone/function'\n\nexport const extend = <Target extends object, E extends Record<string, unknown>>(target: Target, extensions: E): Target & E => {\n return new Proxy(target, {\n get(target, prop, receiver) {\n if (prop in extensions) {\n return extensions[prop as string]\n }\n\n const value = Reflect.get(target, prop, receiver)\n if (Functions.isFunction(value)) {\n return value.bind(target)\n }\n\n return value\n },\n }) as Target & E\n}\n"],"mappings":";AAAA,YAAY,eAAe;AAEpB,IAAM,SAAS,CAA2D,QAAgB,eAA8B;AAC7H,SAAO,IAAI,MAAM,QAAQ;AAAA,IACvB,IAAIA,SAAQ,MAAM,UAAU;AAC1B,UAAI,QAAQ,YAAY;AACtB,eAAO,WAAW,IAAc;AAAA,MAClC;AAEA,YAAM,QAAQ,QAAQ,IAAIA,SAAQ,MAAM,QAAQ;AAChD,UAAc,qBAAW,KAAK,GAAG;AAC/B,eAAO,MAAM,KAAKA,OAAM;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;","names":["target"]}
package/dist/range.js CHANGED
@@ -1,12 +1,12 @@
1
1
  // src/range.ts
2
2
  import Zod from "zod";
3
- import { isUndefined } from "@bessemer/cornerstone/object";
3
+ import * as Objects from "@bessemer/cornerstone/object";
4
4
  var schema = (type) => {
5
5
  return Zod.tuple([type.nullable(), type.nullable()]);
6
6
  };
7
7
  var NumericSchema = schema(Zod.number());
8
8
  var of = (bounds) => {
9
- if (isUndefined(bounds[1])) {
9
+ if (Objects.isUndefined(bounds[1])) {
10
10
  return [bounds[0], null];
11
11
  }
12
12
  return bounds;
package/dist/range.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/range.ts"],"sourcesContent":["import Zod, { ZodType } from 'zod'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport { isUndefined } from '@bessemer/cornerstone/object'\n\n// JOHN bounds are still a mess! what about finite bounds ???\nexport type Bounds<T> = NominalType<[T | null, T | null], 'Bounds'>\nexport type BoundsInput<T> = [lower: T | null, upper?: T | null] | Bounds<T>\n\nexport const schema = <T extends ZodType>(type: T): ZodType<Bounds<Zod.infer<T>>, Bounds<Zod.infer<T>>> => {\n return Zod.tuple([type.nullable(), type.nullable()]) as any\n}\n\nexport type NumericBounds = Bounds<number>\nexport const NumericSchema = schema(Zod.number())\n\nexport type FiniteBounds<T> = [T, T]\n\nexport const of = <T>(bounds: BoundsInput<T>): Bounds<T> => {\n if (isUndefined(bounds[1])) {\n return [bounds[0], null] as Bounds<T>\n }\n\n return bounds as Bounds<T>\n}\n"],"mappings":";AAAA,OAAO,SAAsB;AAE7B,SAAS,mBAAmB;AAMrB,IAAM,SAAS,CAAoB,SAAiE;AACzG,SAAO,IAAI,MAAM,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC,CAAC;AACrD;AAGO,IAAM,gBAAgB,OAAO,IAAI,OAAO,CAAC;AAIzC,IAAM,KAAK,CAAI,WAAsC;AAC1D,MAAI,YAAY,OAAO,CAAC,CAAC,GAAG;AAC1B,WAAO,CAAC,OAAO,CAAC,GAAG,IAAI;AAAA,EACzB;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/range.ts"],"sourcesContent":["import Zod, { ZodType } from 'zod'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport * as Objects from '@bessemer/cornerstone/object'\n\n// JOHN bounds are still a mess! what about finite bounds ???\nexport type Bounds<T> = NominalType<[T | null, T | null], 'Bounds'>\nexport type BoundsInput<T> = [lower: T | null, upper?: T | null] | Bounds<T>\n\nexport const schema = <T extends ZodType>(type: T): ZodType<Bounds<Zod.infer<T>>, Bounds<Zod.infer<T>>> => {\n return Zod.tuple([type.nullable(), type.nullable()]) as any\n}\n\nexport type NumericBounds = Bounds<number>\nexport const NumericSchema = schema(Zod.number())\n\nexport type FiniteBounds<T> = [T, T]\n\nexport const of = <T>(bounds: BoundsInput<T>): Bounds<T> => {\n if (Objects.isUndefined(bounds[1])) {\n return [bounds[0], null] as Bounds<T>\n }\n\n return bounds as Bounds<T>\n}\n"],"mappings":";AAAA,OAAO,SAAsB;AAE7B,YAAY,aAAa;AAMlB,IAAM,SAAS,CAAoB,SAAiE;AACzG,SAAO,IAAI,MAAM,CAAC,KAAK,SAAS,GAAG,KAAK,SAAS,CAAC,CAAC;AACrD;AAGO,IAAM,gBAAgB,OAAO,IAAI,OAAO,CAAC;AAIzC,IAAM,KAAK,CAAI,WAAsC;AAC1D,MAAY,oBAAY,OAAO,CAAC,CAAC,GAAG;AAClC,WAAO,CAAC,OAAO,CAAC,GAAG,IAAI;AAAA,EACzB;AAEA,SAAO;AACT;","names":[]}