@bessemer/cornerstone 0.5.97 → 0.5.99

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 (189) hide show
  1. package/dist/array.d.ts +62 -1
  2. package/dist/array.d.ts.map +1 -1
  3. package/dist/array.js +24 -11
  4. package/dist/array.js.map +1 -1
  5. package/dist/aspect-ratio.d.ts +1 -1
  6. package/dist/aspect-ratio.d.ts.map +1 -1
  7. package/dist/aspect-ratio.js +4 -4
  8. package/dist/aspect-ratio.js.map +1 -1
  9. package/dist/async-value.d.ts +10 -2
  10. package/dist/async-value.d.ts.map +1 -1
  11. package/dist/async-value.js +33 -2
  12. package/dist/async-value.js.map +1 -1
  13. package/dist/cache.js +1 -1
  14. package/dist/cache.js.map +1 -1
  15. package/dist/equalitor.d.ts +1 -0
  16. package/dist/equalitor.d.ts.map +1 -1
  17. package/dist/equalitor.js +3 -0
  18. package/dist/equalitor.js.map +1 -1
  19. package/dist/error/error-cause.d.ts +35 -0
  20. package/dist/error/error-cause.d.ts.map +1 -0
  21. package/dist/error/error-cause.js +97 -0
  22. package/dist/error/error-cause.js.map +1 -0
  23. package/dist/error/error-code.d.ts +17 -0
  24. package/dist/error/error-code.d.ts.map +1 -0
  25. package/dist/error/error-code.js +32 -0
  26. package/dist/error/error-code.js.map +1 -0
  27. package/dist/error/error-event.d.ts +29 -48
  28. package/dist/error/error-event.d.ts.map +1 -1
  29. package/dist/error/error-event.js +62 -151
  30. package/dist/error/error-event.js.map +1 -1
  31. package/dist/error/error-type.d.ts +1 -0
  32. package/dist/error/error-type.d.ts.map +1 -1
  33. package/dist/error/error-type.js +4 -2
  34. package/dist/error/error-type.js.map +1 -1
  35. package/dist/function.d.ts +1 -1
  36. package/dist/function.d.ts.map +1 -1
  37. package/dist/function.js +3 -2
  38. package/dist/function.js.map +1 -1
  39. package/dist/glob.d.ts +1 -1
  40. package/dist/glob.d.ts.map +1 -1
  41. package/dist/glob.js +4 -4
  42. package/dist/glob.js.map +1 -1
  43. package/dist/hex-code.d.ts +1 -1
  44. package/dist/hex-code.d.ts.map +1 -1
  45. package/dist/hex-code.js +4 -4
  46. package/dist/hex-code.js.map +1 -1
  47. package/dist/index.d.ts +10 -5
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +15 -5
  50. package/dist/index.js.map +1 -1
  51. package/dist/intl/country-code.d.ts +1 -1
  52. package/dist/intl/country-code.d.ts.map +1 -1
  53. package/dist/intl/country-code.js +4 -4
  54. package/dist/intl/country-code.js.map +1 -1
  55. package/dist/intl/country-subdivision-code.d.ts +1 -1
  56. package/dist/intl/country-subdivision-code.d.ts.map +1 -1
  57. package/dist/intl/country-subdivision-code.js +4 -4
  58. package/dist/intl/country-subdivision-code.js.map +1 -1
  59. package/dist/intl/currency-code.d.ts +1 -1
  60. package/dist/intl/currency-code.d.ts.map +1 -1
  61. package/dist/intl/currency-code.js +4 -4
  62. package/dist/intl/currency-code.js.map +1 -1
  63. package/dist/intl/language-code.d.ts +1 -1
  64. package/dist/intl/language-code.d.ts.map +1 -1
  65. package/dist/intl/language-code.js +4 -4
  66. package/dist/intl/language-code.js.map +1 -1
  67. package/dist/intl/locale.d.ts +1 -1
  68. package/dist/intl/locale.d.ts.map +1 -1
  69. package/dist/intl/locale.js +6 -6
  70. package/dist/intl/locale.js.map +1 -1
  71. package/dist/mime-type.d.ts +1 -1
  72. package/dist/mime-type.d.ts.map +1 -1
  73. package/dist/mime-type.js +4 -4
  74. package/dist/mime-type.js.map +1 -1
  75. package/dist/net/domain-name.d.ts +10 -0
  76. package/dist/net/domain-name.d.ts.map +1 -0
  77. package/dist/net/domain-name.js +30 -0
  78. package/dist/net/domain-name.js.map +1 -0
  79. package/dist/net/ipv4-address.d.ts +10 -0
  80. package/dist/net/ipv4-address.d.ts.map +1 -0
  81. package/dist/net/ipv4-address.js +30 -0
  82. package/dist/net/ipv4-address.js.map +1 -0
  83. package/dist/net/ipv6-address.d.ts +10 -0
  84. package/dist/net/ipv6-address.d.ts.map +1 -0
  85. package/dist/net/ipv6-address.js +30 -0
  86. package/dist/net/ipv6-address.js.map +1 -0
  87. package/dist/net/uri-host-name.d.ts +12 -0
  88. package/dist/net/uri-host-name.d.ts.map +1 -0
  89. package/dist/net/uri-host-name.js +44 -0
  90. package/dist/net/uri-host-name.js.map +1 -0
  91. package/dist/net/uri.d.ts +249 -0
  92. package/dist/net/uri.d.ts.map +1 -0
  93. package/dist/net/uri.js +444 -0
  94. package/dist/net/uri.js.map +1 -0
  95. package/dist/net/url.d.ts +58 -0
  96. package/dist/net/url.d.ts.map +1 -0
  97. package/dist/net/url.js +211 -0
  98. package/dist/net/url.js.map +1 -0
  99. package/dist/object/object-path.d.ts +1 -1
  100. package/dist/object/object-path.d.ts.map +1 -1
  101. package/dist/object/object-path.js +4 -4
  102. package/dist/object/object-path.js.map +1 -1
  103. package/dist/object/type-path.d.ts +1 -1
  104. package/dist/object/type-path.d.ts.map +1 -1
  105. package/dist/object/type-path.js +3 -3
  106. package/dist/object/type-path.js.map +1 -1
  107. package/dist/object.d.ts +1 -1
  108. package/dist/object.d.ts.map +1 -1
  109. package/dist/object.js +8 -6
  110. package/dist/object.js.map +1 -1
  111. package/dist/property.d.ts +2 -3
  112. package/dist/property.d.ts.map +1 -1
  113. package/dist/property.js.map +1 -1
  114. package/dist/resource-key.d.ts +7 -5
  115. package/dist/resource-key.d.ts.map +1 -1
  116. package/dist/resource-key.js +27 -15
  117. package/dist/resource-key.js.map +1 -1
  118. package/dist/result.d.ts.map +1 -1
  119. package/dist/result.js +3 -3
  120. package/dist/result.js.map +1 -1
  121. package/dist/string.d.ts +10 -21
  122. package/dist/string.d.ts.map +1 -1
  123. package/dist/string.js +54 -25
  124. package/dist/string.js.map +1 -1
  125. package/dist/tag.d.ts +2 -2
  126. package/dist/tag.d.ts.map +1 -1
  127. package/dist/tag.js +11 -12
  128. package/dist/tag.js.map +1 -1
  129. package/dist/temporal/duration.d.ts +4 -5
  130. package/dist/temporal/duration.d.ts.map +1 -1
  131. package/dist/temporal/duration.js +3 -7
  132. package/dist/temporal/duration.js.map +1 -1
  133. package/dist/temporal/instant.d.ts +4 -5
  134. package/dist/temporal/instant.d.ts.map +1 -1
  135. package/dist/temporal/instant.js +3 -7
  136. package/dist/temporal/instant.js.map +1 -1
  137. package/dist/temporal/plain-date-time.d.ts +4 -5
  138. package/dist/temporal/plain-date-time.d.ts.map +1 -1
  139. package/dist/temporal/plain-date-time.js +3 -7
  140. package/dist/temporal/plain-date-time.js.map +1 -1
  141. package/dist/temporal/plain-date.d.ts +8 -9
  142. package/dist/temporal/plain-date.d.ts.map +1 -1
  143. package/dist/temporal/plain-date.js +3 -7
  144. package/dist/temporal/plain-date.js.map +1 -1
  145. package/dist/temporal/plain-time.d.ts +6 -7
  146. package/dist/temporal/plain-time.d.ts.map +1 -1
  147. package/dist/temporal/plain-time.js +4 -8
  148. package/dist/temporal/plain-time.js.map +1 -1
  149. package/dist/temporal/time-zone-id.d.ts +1 -1
  150. package/dist/temporal/time-zone-id.d.ts.map +1 -1
  151. package/dist/temporal/time-zone-id.js +4 -4
  152. package/dist/temporal/time-zone-id.js.map +1 -1
  153. package/dist/temporal/time-zone-offset.d.ts +1 -1
  154. package/dist/temporal/time-zone-offset.d.ts.map +1 -1
  155. package/dist/temporal/time-zone-offset.js +4 -4
  156. package/dist/temporal/time-zone-offset.js.map +1 -1
  157. package/dist/temporal/zoned-date-time.d.ts +51 -0
  158. package/dist/temporal/zoned-date-time.d.ts.map +1 -0
  159. package/dist/temporal/zoned-date-time.js +106 -0
  160. package/dist/temporal/zoned-date-time.js.map +1 -0
  161. package/dist/types.d.ts +2 -2
  162. package/dist/types.d.ts.map +1 -1
  163. package/dist/{ulid.d.ts → uuid/ulid.d.ts} +2 -2
  164. package/dist/uuid/ulid.d.ts.map +1 -0
  165. package/dist/uuid/ulid.js +29 -0
  166. package/dist/uuid/ulid.js.map +1 -0
  167. package/dist/uuid/uuid-v4.d.ts +11 -0
  168. package/dist/uuid/uuid-v4.d.ts.map +1 -0
  169. package/dist/{uuid.js → uuid/uuid-v4.js} +11 -11
  170. package/dist/uuid/uuid-v4.js.map +1 -0
  171. package/dist/uuid/uuid-v7.d.ts +18 -0
  172. package/dist/uuid/uuid-v7.d.ts.map +1 -0
  173. package/dist/uuid/uuid-v7.js +44 -0
  174. package/dist/uuid/uuid-v7.js.map +1 -0
  175. package/package.json +1 -1
  176. package/dist/ulid.d.ts.map +0 -1
  177. package/dist/ulid.js +0 -29
  178. package/dist/ulid.js.map +0 -1
  179. package/dist/uri.d.ts +0 -52
  180. package/dist/uri.d.ts.map +0 -1
  181. package/dist/uri.js +0 -222
  182. package/dist/uri.js.map +0 -1
  183. package/dist/url.d.ts +0 -26
  184. package/dist/url.d.ts.map +0 -1
  185. package/dist/url.js +0 -120
  186. package/dist/url.js.map +0 -1
  187. package/dist/uuid.d.ts +0 -11
  188. package/dist/uuid.d.ts.map +0 -1
  189. package/dist/uuid.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/net/uri.ts"],"sourcesContent":["import { NominalType, TaggedType } from '@bessemer/cornerstone/types'\nimport * as Strings from '@bessemer/cornerstone/string'\nimport { StringSplitResult } from '@bessemer/cornerstone/string'\nimport * as Objects from '@bessemer/cornerstone/object'\nimport * as Arrays from '@bessemer/cornerstone/array'\nimport * as ResourceKeys from '@bessemer/cornerstone/resource-key'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result, success } from '@bessemer/cornerstone/result'\nimport * as ErrorEvents from '@bessemer/cornerstone/error/error-event'\nimport { ErrorEvent } from '@bessemer/cornerstone/error/error-event'\nimport { structuredTransform } from '@bessemer/cornerstone/zod-util'\nimport Zod from 'zod'\nimport * as IpV6Addresses from '@bessemer/cornerstone/net/ipv6-address'\nimport { ValueOf } from 'type-fest'\nimport * as Equalitors from '@bessemer/cornerstone/equalitor'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\nimport * as UriHostNames from '@bessemer/cornerstone/net/uri-host-name'\nimport { UriHostName } from '@bessemer/cornerstone/net/uri-host-name'\n\nexport type UriString = TaggedType<string, 'UriString'>\nexport type UriComponent = string\n\nexport type UriScheme = string\n\nexport type UriAuthentication = {\n principal: string\n password: string | null\n}\n\nexport type UriHost = {\n value: UriHostName\n port: number | null\n}\n\nexport interface UriLocation {\n path: string | null\n query: string | null\n fragment: string | null\n}\n\nexport const Namespace = ResourceKeys.createNamespace('uri')\nexport const UrlNamespace = ResourceKeys.createNamespace('url')\nexport const EqualBy: Equalitor<Uri> = Equalitors.deepNatural()\n\nexport type UriLiteral = NominalType<string, typeof Namespace>\n\nexport interface UriStructure {\n _type: typeof Namespace | typeof UrlNamespace\n scheme: UriScheme | null\n host: UriHost | null\n authentication: UriAuthentication | null\n location: UriLocation\n}\n\nexport interface Uri extends UriStructure {\n href: UriLiteral\n}\n\ntype UriBuilderAuthentication =\n | {\n principal: string\n password?: string | null\n }\n | string\n\ntype UriBuilderHost =\n | {\n value: string\n port?: number | null\n }\n | string\n\ntype UriBuilderLocation =\n | {\n path?: string | null\n query?: string | null\n fragment?: string | null\n }\n | string\n\nexport type UriBuilder = {\n scheme?: string | null | undefined\n authentication?: UriBuilderAuthentication | null | undefined\n host?: UriBuilderHost | null | undefined\n location?: UriBuilderLocation | null | undefined\n}\n\nexport type UriLike = Uri | UriLiteral | UriBuilder\n\n/**\n * Parses a string into a Uri object, handling all URI components including scheme,\n * authority (host and authentication), and location (path, query, fragment).\n * Returns a Result containing either the parsed Uri or an ErrorEvent on failure.\n *\n * **Example**\n *\n * ```ts\n * import { Uris } from \"@bessemer/cornerstone\"\n *\n * // Parse a complete HTTPS URI\n * const result = Uris.parseString('https://user:pass@example.com:8080/api/v1?q=test#section')\n * if (result.isSuccess) {\n * console.log(result.value.scheme) // 'https'\n * console.log(result.value.host?.value) // 'example.com'\n * console.log(result.value.authentication?.principal) // 'user'\n * }\n *\n * // Parse a simple URI without authority\n * const urnResult = Uris.parseString('urn:isbn:0451450523')\n * if (urnResult.isSuccess) {\n * console.log(urnResult.value.scheme) // 'urn'\n * console.log(urnResult.value.location.path) // 'isbn:0451450523'\n * }\n * ```\n *\n * @category parsing\n */\nexport const parseString = (value: string): Result<Uri, ErrorEvent> => {\n // JOHN we want to improve the syntax burden of handling a series of Result objects like this\n if (Strings.isBlank(value)) {\n return Results.failure(\n ErrorEvents.required({\n namespace: Namespace,\n message: `[${Namespace}]: Unable to parse Uri from empty string.`,\n })\n )\n }\n\n const schemeResult = parseSchemePart(value)\n if (!schemeResult.isSuccess) {\n return Results.failure(\n ErrorEvents.invalidValue(value, {\n namespace: Namespace,\n message: `[${Namespace}]: Unable to parse Uri from uri string: [${value}]`,\n causes: schemeResult.value.causes,\n })\n )\n }\n\n const [scheme, rest1] = schemeResult.value\n\n const authorityPartResult = parseAuthorityPart(rest1)\n if (!authorityPartResult.isSuccess) {\n return Results.failure(\n ErrorEvents.invalidValue(value, {\n namespace: Namespace,\n message: `[${Namespace}]: Unable to parse Uri from uri string: [${value}]`,\n causes: authorityPartResult.value.causes,\n })\n )\n }\n const [authority, rest2] = authorityPartResult.value\n\n const location = parseLocation(rest2)\n\n const structure: UriStructure = {\n _type: Namespace,\n scheme,\n host: authority.host,\n authentication: authority.authentication,\n location,\n }\n\n return Results.success({\n ...structure,\n href: formatInternal(structure),\n })\n}\n\n/**\n * Converts various URI-like inputs into a Uri object. Handles Uri instances,\n * string literals, and builder objects, returning them as-is when already a Uri\n * or converting them appropriately.\n *\n * **Example**\n *\n * ```ts\n * import { Uris } from \"@bessemer/cornerstone\"\n *\n * // String literal parsed into Uri\n * const fromString = Uris.from('https://api.example.com/v1')\n * console.log(fromString.scheme) // 'https'\n * console.log(fromString.host?.value) // 'api.example.com'\n *\n * // Builder object converted to Uri\n * const fromBuilder = Uris.from({\n * scheme: 'https',\n * host: { value: 'example.com', port: 8080 },\n * location: { path: '/api' }\n * })\n * console.log(fromBuilder.host?.port) // 8080\n *\n * @category conversion\n */\nexport function from(value: UriLike | string): Uri\nexport function from(value: UriLike | string | null): Uri | null\nexport function from(value: UriLike | string | undefined): Uri | undefined\nexport function from(value: UriLike | string | null | undefined): Uri | null | undefined\nexport function from(value: UriLike | string | null | undefined): Uri | null | undefined {\n if (Objects.isNil(value)) {\n return value\n }\n if (isUri(value)) {\n return value\n }\n if (Strings.isString(value)) {\n return ErrorEvents.unpackResult(parseString(value))\n }\n\n return build(value as UriBuilder)\n}\n\n/**\n * Converts various URI-like inputs into a normalized string literal representation.\n * Takes any URI-like value and returns its canonical string form\n *\n * **Example**\n *\n * ```ts\n * import { Uris } from \"@bessemer/cornerstone\"\n *\n * // Convert Uri instance to string literal\n * const uri = Uris.build({ scheme: 'https', host: 'example.com', location: { path: '/api' } })\n * const literal = Uris.toLiteral(uri)\n * console.log(literal) // \"https://example.com/api\"\n *\n * // Convert builder object to string literal\n * const fromBuilder = Uris.toLiteral({\n * scheme: 'https',\n * host: { value: 'api.example.com', port: 8080 },\n * authentication: { principal: 'user', password: 'pass' },\n * location: { path: '/v1', parameters: { q: 'search' } }\n * })\n * console.log(fromBuilder) // \"https://user:pass@api.example.com:8080/v1?q=search\"\n * ```\n *\n * @category serialization\n */\nexport function toLiteral(likeValue: UriLike): UriLiteral\nexport function toLiteral(likeValue: UriLike | null): UriLiteral | null\nexport function toLiteral(likeValue: UriLike | undefined): UriLiteral | undefined\nexport function toLiteral(likeValue: UriLike | null | undefined): UriLiteral | null | undefined\nexport function toLiteral(likeValue: UriLike | null | undefined): UriLiteral | null | undefined {\n if (Objects.isNil(likeValue)) {\n return likeValue\n }\n\n const value = from(likeValue)\n return format(value) as UriLiteral\n}\n\nexport const SchemaLiteral = structuredTransform(Zod.string(), (it: string) => Results.mapResult(parseString(it), (it) => toLiteral(it)))\n// JOHN need a schema for the object version...\n// export const SchemaInstance = structuredTransform(Zod.string(), parseString)\n\n/**\n * Tests if the provided value is a Uri.\n *\n * **Example**\n *\n * ```ts\n * import { Uris } from \"@bessemer/cornerstone\"\n *\n * // Check if unknown value is a Uri\n * function processValue(value: unknown) {\n * if (Uris.isUri(value)) {\n * console.log(value.scheme) // Type-safe access\n * console.log(value.location.path)\n * }\n * }\n * ```\n *\n * @category type-guards\n */\nexport const isUri = (value: unknown): value is Uri => {\n if (!Objects.isObject(value)) {\n return false\n }\n\n const uriValue = value as any as Uri\n return uriValue._type === Namespace || uriValue._type === UrlNamespace\n}\n\n/**\n * Merges an existing URI with partial changes to create a new URI instance.\n * Allows selective updates without replacing the entire URI.\n *\n * **Example**\n *\n * ```ts\n * import { Uris } from \"@bessemer/cornerstone\"\n *\n * // Start with a base URI\n * const baseUri = Uris.build({\n * scheme: 'https',\n * host: { value: 'api.example.com', port: 443 },\n * authentication: { principal: 'user', password: 'pass' },\n * location: { path: '/v1', parameters: { format: 'json' } }\n * })\n *\n * // Change just the host and add query parameter\n * const updatedUri = Uris.merge(baseUri, {\n * host: { value: 'api.production.com' }, // Port preserved from original\n * location: {\n * parameters: { version: '2.0' } // Merges with existing parameters\n * }\n * })\n *\n * console.log(updatedUri.host?.value) // 'api.production.com'\n * console.log(updatedUri.host?.port) // 443 (preserved)\n * console.log(updatedUri.location.parameters) // { format: 'json', version: '2.0' }\n * ```\n *\n * @category transformation\n */\nexport const merge = (element: UriLike, builder: UriBuilder): Uri => {\n const uri = from(element)\n\n let location: UriBuilderLocation | null | undefined\n if (Strings.isString(builder.location) || Objects.isNull(builder.location)) {\n location = builder.location\n } else {\n location = { ...uri.location, ...(builder.location ?? {}) }\n }\n\n const uriBuilder: UriBuilder = {\n scheme: Objects.isUndefined(builder.scheme) ? uri.scheme : builder.scheme,\n host: Objects.isUndefined(builder.host) ? uri.host : builder.host,\n authentication: Objects.isUndefined(builder.authentication) ? uri.authentication : builder.authentication,\n location,\n }\n\n return from(uriBuilder)\n}\n\nconst parseSchemePart = (url: UriComponent): Result<[UriScheme | null, UriComponent], ErrorEvent> => {\n // Search for the colon or double slash\n const schemeMatch = Strings.splitFirst(url, /(\\/\\/|:)/)\n\n // If we don't find either, or we hit the double slash before finding a colon, there is no scheme\n if (Objects.isNil(schemeMatch.selection) || schemeMatch.separator === '//') {\n return Results.success([null, url])\n }\n\n // This means the string started with :, so no protocol\n if (Strings.isEmpty(schemeMatch.selection)) {\n return Results.success([null, ':' + schemeMatch.rest])\n } else {\n const schemeResult = parseScheme(schemeMatch.selection)\n if (!schemeResult.isSuccess) {\n return schemeResult\n }\n\n return Results.success([schemeResult.value, schemeMatch.rest])\n }\n}\n\nconst parseScheme = (scheme: UriComponent): Result<UriScheme, ErrorEvent> => {\n // RFC 3986: scheme = ALPHA *( ALPHA / DIGIT / \"+\" / \"-\" / \".\" )\n const schemeRegex = /^[a-zA-Z][a-zA-Z0-9+.-]*$/\n if (!schemeRegex.test(scheme)) {\n return Results.failure(\n ErrorEvents.invalidValue(scheme, {\n namespace: Namespace,\n message: `[${Namespace}]: Invalid characters in Scheme.`,\n })\n )\n }\n\n return Results.success(scheme)\n}\n\nconst parseAuthorityPart = (\n initialUrl: UriComponent\n): Result<[{ host: UriHost | null; authentication: UriAuthentication | null }, UriComponent], ErrorEvent> => {\n if (!initialUrl.startsWith('//')) {\n return success([{ host: null, authentication: null }, initialUrl])\n }\n\n const url = Strings.removeStart(initialUrl, '//')\n\n const authenticationPartResult = parseAuthenticationPart(url)\n if (!authenticationPartResult.isSuccess) {\n return authenticationPartResult\n }\n const [authentication, rest1] = authenticationPartResult.value\n\n const hostPartResult = parseHostPart(rest1)\n if (!hostPartResult.isSuccess) {\n return hostPartResult\n }\n const [host, rest2] = hostPartResult.value\n\n return success([{ host, authentication }, rest2])\n}\n\nconst parseAuthenticationPart = (url: UriComponent): Result<[UriAuthentication | null, UriComponent], ErrorEvent> => {\n let targetPart = url\n const queryMatch = Strings.splitFirst(targetPart, '?')\n const fragmentMatch = Strings.splitFirst(targetPart, '#')\n if (Objects.isPresent(queryMatch.selection)) {\n targetPart = queryMatch.selection\n } else if (Objects.isPresent(fragmentMatch.selection)) {\n targetPart = fragmentMatch.selection\n }\n\n const { selection: authentication } = Strings.splitFirst(targetPart, '@')\n\n // If there is no @, then we don't have an authentication\n if (Objects.isNil(authentication)) {\n return Results.success([null, url])\n }\n\n const { rest } = Strings.splitFirst(url, '@')\n\n const authenticationParseResult = parseAuthentication(authentication)\n if (!authenticationParseResult.isSuccess) {\n return authenticationParseResult\n }\n\n return Results.success([authenticationParseResult.value, rest])\n}\n\nconst parseAuthentication = (authentication: UriComponent): Result<UriAuthentication, ErrorEvent> => {\n const { selection: principal, rest: authenticationRest } = Strings.splitFirst(authentication, ':')\n\n // If there isn't a colon, then there is no password but there is a username\n if (Objects.isNil(principal)) {\n if (!isAuthenticationComponentValid(authenticationRest)) {\n return Results.failure(\n ErrorEvents.invalidValue(authenticationRest, {\n namespace: Namespace,\n message: `[${Namespace}]: Invalid characters for UriAuthentication in principal string: [${authenticationRest}]`,\n })\n )\n }\n\n return Results.success({ principal: decode(authenticationRest), password: null })\n }\n\n // The authentication section started with a :, don't know what to make of this... password but no username?\n if (Strings.isEmpty(principal)) {\n return Results.failure(\n ErrorEvents.invalidValue(authentication, {\n namespace: Namespace,\n message: `[${Namespace}]: Unable to parse UriAuthentication from authentication string: [${authentication}]`,\n })\n )\n }\n\n if (!isAuthenticationComponentValid(principal)) {\n return Results.failure(\n ErrorEvents.invalidValue(principal, {\n namespace: Namespace,\n message: `[${Namespace}]: Invalid characters for UriAuthentication in principal string: [${principal}]`,\n })\n )\n }\n\n if (!isAuthenticationComponentValid(authenticationRest)) {\n return Results.failure(\n ErrorEvents.invalidValue(authenticationRest, {\n namespace: Namespace,\n message: `[${Namespace}]: Invalid characters for UriAuthentication in password string: [${authenticationRest}]`,\n })\n )\n }\n\n // Otherwise, we have both, so return the complete authentication object and the rest\n return Results.success({ principal: decode(principal), password: decode(authenticationRest) })\n}\n\nconst isAuthenticationComponentValid = (component: UriComponent): boolean => {\n const userinfoRegex = /^[A-Za-z0-9\\-._~!$&'()*+,;=%]*$/\n\n if (component.includes('%')) {\n const percentEncodingRegex = /%[0-9A-Fa-f]{2}/g\n const percentMatches = component.match(/%/g) || []\n const validEncodingMatches = component.match(percentEncodingRegex) || []\n\n if (percentMatches.length !== validEncodingMatches.length) {\n return false\n }\n }\n\n return userinfoRegex.test(component)\n}\n\nconst parseHostPart = (url: UriComponent): Result<[UriHost | null, UriComponent], ErrorEvent> => {\n // Check if the host is starting with reserved characters, if so we should just bail on trying to parse\n if (url.startsWith('?') || url.startsWith('#')) {\n return Results.success([null, url])\n }\n\n // Lets grab everything to the left of the first / ? or #, this is the remainder of our authority (if any)\n const urlMatch = Strings.splitFirst(url, /[\\/?#]/)\n let host = urlMatch.rest\n let rest = ''\n\n if (Objects.isPresent(urlMatch.selection)) {\n host = urlMatch.selection\n rest = urlMatch.separator + urlMatch.rest\n }\n\n if (Strings.isEmpty(host)) {\n return Results.success([null, rest])\n }\n\n const parseHostResult = parseHost(host)\n if (!parseHostResult.isSuccess) {\n return parseHostResult\n }\n\n return Results.success([parseHostResult.value, rest])\n}\n\nconst parseHost = (host: UriComponent): Result<UriHost, ErrorEvent> => {\n // Try to see if we have an ipv6 address like the form [2001:db8::7] and handle it\n if (host.startsWith('[')) {\n const ipMatch = Strings.splitFirst(Strings.removeStart(host, '['), ']')\n\n if (Objects.isPresent(ipMatch.selection)) {\n const ipV6Result = IpV6Addresses.parseString(ipMatch.selection)\n if (!ipV6Result.isSuccess) {\n return ipV6Result\n }\n\n const portMatch = Strings.splitFirst(ipMatch.rest, ':')\n if (Objects.isPresent(portMatch.selection) && Strings.isEmpty(portMatch.selection)) {\n if (!Strings.isNumber(portMatch.rest)) {\n return Results.failure(ErrorEvents.invalidValue(host, { namespace: Namespace, message: `[${Namespace}]: Unable to parse Host: [${host}]` }))\n }\n\n return Results.success({ value: `[${ipMatch.selection}]` as UriHostName, port: Number(portMatch.rest) })\n } else {\n return Results.success({ value: `[${ipMatch.selection}]` as UriHostName, port: null })\n }\n }\n }\n\n let hostMatch: StringSplitResult = Strings.splitFirst(host, ':')\n\n // We have no :, which means no port, so treat the rest as the hostname\n if (Objects.isNil(hostMatch.selection)) {\n const hostNameResult = UriHostNames.parseString(hostMatch.rest)\n if (!hostNameResult.isSuccess) {\n return Results.failure(\n ErrorEvents.invalidValue(host, {\n namespace: Namespace,\n message: `[${Namespace}]: Unable to parse Host from host string: [${host}]`,\n causes: hostNameResult.value.causes,\n })\n )\n }\n\n return Results.success({ value: hostNameResult.value, port: null })\n }\n\n // The host started with a :, this is odd\n if (Strings.isEmpty(hostMatch.selection)) {\n return Results.failure(\n ErrorEvents.invalidValue(host, { namespace: Namespace, message: `[${Namespace}]: Unable to parse Host from host string: [${host}]` })\n )\n }\n\n const hostName = hostMatch.selection\n\n if (!Strings.isNumber(hostMatch.rest)) {\n return Results.failure(\n ErrorEvents.invalidValue(host, { namespace: Namespace, message: `[${Namespace}]: Unable to parse Host from host string: [${host}]` })\n )\n }\n\n // Otherwise, we have both, so return the complete authentication object and the rest\n const hostNameResult = UriHostNames.parseString(hostName)\n if (!hostNameResult.isSuccess) {\n return Results.failure(\n ErrorEvents.invalidValue(host, {\n namespace: Namespace,\n message: `[${Namespace}]: Unable to parse Host from host string: [${host}]`,\n causes: hostNameResult.value.causes,\n })\n )\n }\n\n return Results.success({ value: hostNameResult.value, port: Number(hostMatch.rest) })\n}\n\nconst parseLocation = (url: UriComponent): UriLocation => {\n const location: UriLocation = { path: null, query: null, fragment: null }\n\n // Lets see if we have a fragment and parse it off the end\n const fragmentMatch = Strings.splitFirst(url, '#')\n if (Objects.isPresent(fragmentMatch.selection) && !Strings.isEmpty(fragmentMatch.rest)) {\n location.fragment = encodeWhitespace(fragmentMatch.rest)\n }\n\n // Lets see if we have a query string and parse it off the remainder\n const queryMatch = Strings.splitFirst(fragmentMatch.selection ?? fragmentMatch.rest, '?')\n if (Objects.isPresent(queryMatch.selection) && !Strings.isEmpty(queryMatch.rest)) {\n location.query = encodeWhitespace(queryMatch.rest)\n }\n\n const path = Strings.emptyToNull(queryMatch.selection ?? queryMatch.rest)\n if (Objects.isPresent(path)) {\n location.path = encodeWhitespace(path)\n }\n return location\n}\n\nconst build = (builder: UriBuilder): Uri => {\n const scheme = Objects.isPresent(builder.scheme) ? ErrorEvents.unpackResult(parseScheme(builder.scheme)) : null\n let host: UriHost | null = null\n let authentication: UriAuthentication | null = null\n\n if (Objects.isPresent(builder.host)) {\n if (Strings.isString(builder.host)) {\n host = ErrorEvents.unpackResult(parseHost(builder.host))\n } else {\n host = {\n value: UriHostNames.from(builder.host.value),\n port: builder.host.port ?? null,\n }\n }\n\n if (Objects.isPresent(builder.authentication)) {\n if (Strings.isString(builder.authentication)) {\n authentication = ErrorEvents.unpackResult(parseAuthentication(builder.authentication))\n } else {\n authentication = {\n principal: builder.authentication.principal,\n password: builder.authentication.password ?? null,\n }\n }\n }\n }\n\n let location: UriLocation = {\n path: null,\n query: null,\n fragment: null,\n }\n\n if (Objects.isPresent(builder.location)) {\n if (Strings.isString(builder.location)) {\n let locationString = builder.location\n if (Objects.isPresent(builder.host) && !locationString.startsWith('/') && !locationString.startsWith('?') && !locationString.startsWith('#')) {\n locationString = '/' + locationString\n }\n\n location = parseLocation(locationString)\n } else {\n let path = builder.location.path ?? null\n if (Objects.isPresent(path) && !path.startsWith('/') && Objects.isPresent(builder.host)) {\n path = '/' + path\n }\n\n location = {\n path: Objects.isPresent(path) ? encodeWhitespace(path) : null,\n query: Objects.isPresent(builder.location.query) ? encodeWhitespace(builder.location.query) : null,\n fragment: Objects.isPresent(builder.location.fragment) ? encodeWhitespace(builder.location.fragment) : null,\n }\n }\n }\n\n const structure: UriStructure = {\n _type: Namespace,\n scheme,\n host,\n authentication,\n location,\n }\n\n return {\n ...structure,\n href: formatInternal(structure),\n }\n}\n\nexport const UriComponentType = {\n Scheme: 'Scheme',\n Authentication: 'Authentication',\n Host: 'Host',\n Location: 'Location',\n Path: 'Path',\n Query: 'Query',\n Fragment: 'Fragment',\n} as const\n\nexport type UriComponentType = ValueOf<typeof UriComponentType>\n\n/**\n * Converts a URI object into its string representation, with optional exclusion of specific URI components.\n *\n * **Example**\n *\n * ```ts\n * import { Uris, UriComponentType } from \"@bessemer/cornerstone\"\n *\n * const uri = Uris.build({\n * scheme: 'https',\n * authentication: { principal: 'user', password: 'secret' },\n * host: { value: 'api.example.com', port: 8080 },\n * location: { path: '/v1/data', parameters: { format: 'json' }, fragment: 'results' }\n * })\n *\n * // Format complete URI\n * const fullUri = Uris.format(uri)\n * console.log(fullUri) // \"https://user:secret@api.example.com:8080/v1/data?format=json#results\"\n *\n * // Exclude authentication for public sharing\n * const publicUri = Uris.format(uri, [UriComponentType.Authentication])\n * console.log(publicUri) // \"https://api.example.com:8080/v1/data?format=json#results\"\n *\n * // Format path-only URI\n * const pathOnly = Uris.format(uri, [\n * UriComponentType.Scheme,\n * UriComponentType.Host,\n * UriComponentType.Authentication\n * ])\n * console.log(pathOnly) // \"/v1/data?format=json#results\"\n * ```\n *\n * @category serialization\n */\nexport const format = (uriLike: UriLike, excludedUriComponents: Array<UriComponentType> = []): UriLiteral => {\n return formatInternal(from(uriLike), excludedUriComponents)\n}\n\nconst formatInternal = (uri: UriStructure, excludedUriComponents: Array<UriComponentType> = []): UriLiteral => {\n let urlString = ''\n if (Objects.isPresent(uri.scheme) && !Arrays.contains(excludedUriComponents, UriComponentType.Scheme)) {\n urlString = urlString + uri.scheme + ':'\n }\n\n if (Objects.isPresent(uri.host) && !Arrays.contains(excludedUriComponents, UriComponentType.Host)) {\n urlString = urlString + '//'\n\n if (Objects.isPresent(uri.authentication) && !Arrays.contains(excludedUriComponents, UriComponentType.Authentication)) {\n urlString = urlString + encode(uri.authentication.principal)\n\n if (Objects.isPresent(uri.authentication.password)) {\n urlString = urlString + ':' + encode(uri.authentication.password)\n }\n\n urlString = urlString + '@'\n }\n\n urlString = urlString + uri.host.value\n if (Objects.isPresent(uri.host.port)) {\n urlString = urlString + ':' + uri.host.port\n }\n }\n\n if (!Arrays.contains(excludedUriComponents, UriComponentType.Location)) {\n urlString = urlString + formatLocation(uri.location, excludedUriComponents)\n }\n\n return urlString as UriLiteral\n}\n\nconst formatLocation = (location: UriLocation, excludedUriComponents: Array<UriComponentType> = []): string => {\n let urlString = ''\n\n if (Objects.isPresent(location.path) && !Arrays.contains(excludedUriComponents, UriComponentType.Path)) {\n urlString = urlString + location.path\n }\n\n if (Objects.isPresent(location.query) && !Arrays.contains(excludedUriComponents, UriComponentType.Query)) {\n urlString = urlString + '?' + location.query\n }\n\n if (Objects.isPresent(location.fragment) && !Arrays.contains(excludedUriComponents, UriComponentType.Fragment)) {\n urlString = urlString + '#' + location.fragment\n }\n\n return urlString\n}\n\nconst encodeWhitespace = (uriComponent: UriComponent) => {\n return uriComponent.replaceAll(' ', '%20')\n}\n\nexport const encode = (uriComponent: UriComponent) => {\n return encodeURIComponent(uriComponent)\n}\n\nexport const decode = (uriComponent: UriComponent) => {\n return decodeURIComponent(uriComponent)\n}\n"],"mappings":"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","names":["success","parseString","from","it","hostNameResult"]}
@@ -0,0 +1,58 @@
1
+ import { Dictionary, NominalType } from '@bessemer/cornerstone/types';
2
+ import * as Uris from '@bessemer/cornerstone/net/uri';
3
+ import { Uri, UriBuilder, UriComponent, UriLiteral, UriLocation } from '@bessemer/cornerstone/net/uri';
4
+ import { Result } from '@bessemer/cornerstone/result';
5
+ import { ErrorEvent } from '@bessemer/cornerstone/error/error-event';
6
+ import Zod from 'zod';
7
+ import { Equalitor } from '@bessemer/cornerstone/equalitor';
8
+ import { MergeExclusive } from 'type-fest';
9
+ export declare const encode: (uriComponent: UriComponent) => string;
10
+ export declare const decode: (uriComponent: UriComponent) => string;
11
+ export type UrlLiteral = NominalType<UriLiteral, typeof Namespace>;
12
+ export interface UrlLocation extends UriLocation {
13
+ relative: boolean;
14
+ pathSegments: Array<string>;
15
+ parameters: Dictionary<string | Array<string>>;
16
+ }
17
+ export interface Url extends Uri {
18
+ _type: typeof Namespace;
19
+ location: UrlLocation;
20
+ href: UrlLiteral;
21
+ }
22
+ export declare const Namespace: import("../resource-key").ResourceNamespace<"url">;
23
+ export declare const EqualBy: Equalitor<Url>;
24
+ type UrlBuilderPathPart = MergeExclusive<{
25
+ path?: string | null;
26
+ }, {
27
+ pathSegments?: Array<string>;
28
+ relative?: boolean;
29
+ }>;
30
+ type UrlBuilderQueryPart = MergeExclusive<{
31
+ query?: string | null;
32
+ }, {
33
+ parameters?: Dictionary<string | Array<string>>;
34
+ }>;
35
+ type UrlBuilderLocationPart = UrlBuilderPathPart & UrlBuilderQueryPart & {
36
+ fragment?: string | null;
37
+ };
38
+ export type UrlBuilder = UriBuilder & {
39
+ location?: UrlBuilderLocationPart | null | undefined;
40
+ };
41
+ export type UrlLike = Url | Uri | UriLiteral | UrlLiteral | UrlBuilder;
42
+ export declare const parseString: (value: string) => Result<Url, ErrorEvent>;
43
+ export declare function from(value: UrlLike | string): Url;
44
+ export declare function from(value: UrlLike | string | null): Url | null;
45
+ export declare function from(value: UrlLike | string | undefined): Url | undefined;
46
+ export declare function from(value: UrlLike | string | null | undefined): Url | null | undefined;
47
+ export declare function toLiteral(likeValue: UrlLike): UrlLiteral;
48
+ export declare function toLiteral(likeValue: UrlLike | null): UrlLiteral | null;
49
+ export declare function toLiteral(likeValue: UrlLike | undefined): UrlLiteral | undefined;
50
+ export declare function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined;
51
+ export declare const SchemaLiteral: Zod.ZodPipe<Zod.ZodString, Zod.ZodTransform<UrlLiteral, string>>;
52
+ export declare const isUrl: (value: unknown) => value is Url;
53
+ export declare const merge: (element: UrlLike, builder: UrlBuilder) => Url;
54
+ export declare const format: (uriLike: Uris.UriLike, excludedUriComponents?: Array<Uris.UriComponentType>) => UriLiteral;
55
+ export declare const getParameter: (url: UrlLike, name: string) => string | undefined;
56
+ export declare const getJsonParameter: <T>(url: UrlLike, name: string) => T | undefined;
57
+ export {};
58
+ //# sourceMappingURL=url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/net/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACrE,OAAO,KAAK,IAAI,MAAM,+BAA+B,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AACtG,OAAO,EAAa,MAAM,EAAW,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,UAAU,EAAgB,MAAM,yCAAyC,CAAA;AAKlF,OAAO,GAAG,MAAM,KAAK,CAAA;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAG1C,eAAO,MAAM,MAAM,wCAAc,CAAA;AAEjC,eAAO,MAAM,MAAM,wCAAc,CAAA;AAEjC,MAAM,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,EAAE,OAAO,SAAS,CAAC,CAAA;AAElE,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,QAAQ,EAAE,OAAO,CAAA;IACjB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CAC/C;AAED,MAAM,WAAW,GAAI,SAAQ,GAAG;IAC9B,KAAK,EAAE,OAAO,SAAS,CAAA;IACvB,QAAQ,EAAE,WAAW,CAAA;IACrB,IAAI,EAAE,UAAU,CAAA;CACjB;AAED,eAAO,MAAM,SAAS,oDAAoB,CAAA;AAC1C,eAAO,MAAM,OAAO,EAAE,SAAS,CAAC,GAAG,CAA4B,CAAA;AAE/D,KAAK,kBAAkB,GAAG,cAAc,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE;IAAE,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAAA;AACxH,KAAK,mBAAmB,GAAG,cAAc,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAAE;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC,CAAA;AACzH,KAAK,sBAAsB,GAAG,kBAAkB,GAC9C,mBAAmB,GAAG;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB,CAAA;AAEH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG;IACpC,QAAQ,CAAC,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAA;CACrD,CAAA;AAED,MAAM,MAAM,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAA;AAEtE,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAAM,CAAC,GAAG,EAAE,UAAU,CAOjE,CAAA;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,CAAA;AAClD,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAA;AAChE,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAAA;AAC1E,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,CAAA;AAkBxF,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,UAAU,CAAA;AACzD,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAAA;AACvE,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAA;AACjF,wBAAgB,SAAS,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CAAA;AAU/F,eAAO,MAAM,aAAa,kEAAuG,CAAA;AAIjI,eAAO,MAAM,KAAK,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,GAO/C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,SAAS,OAAO,EAAE,SAAS,UAAU,KAAG,GA6B7D,CAAA;AAED,eAAO,MAAM,MAAM,6FAAc,CAAA;AAqIjC,eAAO,MAAM,YAAY,GAAI,KAAK,OAAO,EAAE,MAAM,MAAM,KAAG,MAAM,GAAG,SAWlE,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAE,KAAK,OAAO,EAAE,MAAM,MAAM,KAAG,CAAC,GAAG,SAGpE,CAAA"}
@@ -0,0 +1,211 @@
1
+ // src/net/url.ts
2
+ import * as Uris from "@bessemer/cornerstone/net/uri";
3
+ import { mapResult, success } from "@bessemer/cornerstone/result";
4
+ import { unpackResult } from "@bessemer/cornerstone/error/error-event";
5
+ import * as Strings from "@bessemer/cornerstone/string";
6
+ import * as Arrays from "@bessemer/cornerstone/array";
7
+ import { first, isEmpty as isEmpty2 } from "@bessemer/cornerstone/array";
8
+ import { structuredTransform } from "@bessemer/cornerstone/zod-util";
9
+ import Zod from "zod";
10
+ import * as Equalitors from "@bessemer/cornerstone/equalitor";
11
+ import * as Objects from "@bessemer/cornerstone/object";
12
+ var encode2 = Uris.encode;
13
+ var decode2 = Uris.decode;
14
+ var Namespace = Uris.UrlNamespace;
15
+ var EqualBy = Equalitors.deepNatural();
16
+ var parseString2 = (value) => {
17
+ const result = Uris.parseString(value);
18
+ if (!result.isSuccess) {
19
+ return result;
20
+ }
21
+ return success(fromUri(result.value));
22
+ };
23
+ function from2(value) {
24
+ if (Objects.isNil(value)) {
25
+ return value;
26
+ }
27
+ if (isUrl(value)) {
28
+ return value;
29
+ }
30
+ if (Uris.isUri(value)) {
31
+ return fromUri(value);
32
+ }
33
+ if (Strings.isString(value)) {
34
+ return unpackResult(parseString2(value));
35
+ }
36
+ return build(value);
37
+ }
38
+ function toLiteral(likeValue) {
39
+ if (Objects.isNil(likeValue)) {
40
+ return likeValue;
41
+ }
42
+ const value = from2(likeValue);
43
+ return format2(value);
44
+ }
45
+ var SchemaLiteral = structuredTransform(Zod.string(), (it) => mapResult(parseString2(it), (it2) => toLiteral(it2)));
46
+ var isUrl = (value) => {
47
+ if (!Objects.isObject(value)) {
48
+ return false;
49
+ }
50
+ const uriValue = value;
51
+ return uriValue._type === Namespace;
52
+ };
53
+ var merge = (element, builder) => {
54
+ const url = from2(element);
55
+ let location;
56
+ if (Strings.isString(builder.location) || Objects.isNull(builder.location)) {
57
+ location = builder.location;
58
+ } else {
59
+ const usePathSegments = !Objects.isUndefined(builder.location?.pathSegments);
60
+ const useParameters = !Objects.isUndefined(builder.location?.parameters);
61
+ location = {
62
+ ...usePathSegments ? { pathSegments: builder.location?.pathSegments } : { path: Objects.isUndefined(builder.location?.path) ? url.location.path : builder.location.path },
63
+ ...useParameters ? { parameters: builder.location?.parameters } : { query: Objects.isUndefined(builder.location?.query) ? url.location.query : builder.location.query },
64
+ fragment: Objects.isUndefined(builder.location?.fragment) ? url.location.fragment : builder.location.fragment
65
+ };
66
+ }
67
+ const uriBuilder = {
68
+ scheme: Objects.isUndefined(builder.scheme) ? url.scheme : builder.scheme,
69
+ host: Objects.isUndefined(builder.host) ? url.host : builder.host,
70
+ authentication: Objects.isUndefined(builder.authentication) ? url.authentication : builder.authentication,
71
+ location
72
+ };
73
+ return from2(uriBuilder);
74
+ };
75
+ var format2 = Uris.format;
76
+ var build = (builder) => {
77
+ if ((builder.location?.relative ?? false) && Objects.isPresent(builder.host)) {
78
+ throw new Error(`[${Namespace}]: Unable to construct a relative url with a non-null host: ${builder}`);
79
+ }
80
+ const uriBuilder = convertUrlBuilderToUriBuilder(builder);
81
+ const uri = Uris.from(uriBuilder);
82
+ return fromUri(uri);
83
+ };
84
+ var convertUrlBuilderToUriBuilder = (builder) => {
85
+ if (Objects.isNil(builder.location)) {
86
+ if (Objects.isNil(builder.host)) {
87
+ return {
88
+ ...builder,
89
+ location: { path: "/" }
90
+ };
91
+ }
92
+ return builder;
93
+ }
94
+ const relative = builder.location.relative ?? false;
95
+ let path = builder.location.path;
96
+ if (Objects.isPresent(builder.location.pathSegments)) {
97
+ path = formatPathSegments(builder.location.pathSegments, Objects.isPresent(builder.host), relative);
98
+ }
99
+ let query = builder.location.query;
100
+ if (Objects.isPresent(builder.location.parameters)) {
101
+ query = formatQueryParameters(builder.location.parameters);
102
+ }
103
+ return {
104
+ ...builder,
105
+ location: { path, query, fragment: builder.location.fragment }
106
+ };
107
+ };
108
+ var fromUri = (uri) => {
109
+ let relative = false;
110
+ let pathSegments = [];
111
+ const parameters = {};
112
+ if (Objects.isPresent(uri.location.path)) {
113
+ if (!uri.location.path.startsWith("/")) {
114
+ relative = true;
115
+ }
116
+ pathSegments = Strings.removeStart(uri.location.path, "/").split("/").filter((it) => !Strings.isBlank(it)).map((urlPathPart) => decode2(urlPathPart));
117
+ } else {
118
+ if (Objects.isNil(uri.host)) {
119
+ relative = true;
120
+ }
121
+ }
122
+ if (Objects.isPresent(uri.location.query)) {
123
+ uri.location.query.split("&").forEach((parameterPair) => {
124
+ let splitParameters = parameterPair.split("=");
125
+ if (!Strings.isBlank(first(splitParameters))) {
126
+ let key = decode2(splitParameters[0]);
127
+ let value = "";
128
+ if (splitParameters.length === 2) {
129
+ value = splitParameters[1];
130
+ }
131
+ if (Objects.isNil(parameters[key])) {
132
+ parameters[key] = decode2(value);
133
+ } else if (!Array.isArray(parameters[key])) {
134
+ let paramList = [parameters[key]];
135
+ paramList.push(decode2(value));
136
+ parameters[key] = paramList;
137
+ } else {
138
+ parameters[key].push(decode2(value));
139
+ }
140
+ }
141
+ });
142
+ }
143
+ const url = {
144
+ ...uri,
145
+ _type: Namespace,
146
+ location: {
147
+ path: formatPathSegments(pathSegments, Objects.isPresent(uri.host), relative),
148
+ relative,
149
+ pathSegments,
150
+ query: formatQueryParameters(parameters),
151
+ parameters,
152
+ fragment: uri.location.fragment
153
+ },
154
+ href: uri.href
155
+ };
156
+ url.href = format2(url);
157
+ return url;
158
+ };
159
+ var formatPathSegments = (pathSegments, hasHost, relative) => {
160
+ if (Arrays.isEmpty(pathSegments)) {
161
+ if (!hasHost && !relative) {
162
+ return "/";
163
+ } else {
164
+ return null;
165
+ }
166
+ }
167
+ return (relative ? "" : "/") + pathSegments.map((it) => encode2(it)).join("/");
168
+ };
169
+ var formatQueryParameters = (parameters) => {
170
+ const parameterEntries = Object.entries(parameters);
171
+ if (isEmpty2(parameterEntries)) {
172
+ return null;
173
+ }
174
+ return Object.entries(parameters).flatMap(([key, value]) => {
175
+ if (Array.isArray(value)) {
176
+ return value.map((it) => `${encode2(key)}=${encode2(it)}`);
177
+ } else {
178
+ return [`${encode2(key)}=${encode2(value)}`];
179
+ }
180
+ }).join("&");
181
+ };
182
+ var getParameter = (url, name) => {
183
+ const parameter = from2(url).location.parameters[name];
184
+ if (Objects.isNil(parameter)) {
185
+ return void 0;
186
+ }
187
+ if (Array.isArray(parameter)) {
188
+ throw new Error(`Expected a single parameter value but found multiple for parameter: ${name}`);
189
+ }
190
+ return parameter;
191
+ };
192
+ var getJsonParameter = (url, name) => {
193
+ const value = getParameter(url, name);
194
+ return Objects.isPresent(value) ? JSON.parse(value) : void 0;
195
+ };
196
+ export {
197
+ EqualBy,
198
+ Namespace,
199
+ SchemaLiteral,
200
+ decode2 as decode,
201
+ encode2 as encode,
202
+ format2 as format,
203
+ from2 as from,
204
+ getJsonParameter,
205
+ getParameter,
206
+ isUrl,
207
+ merge,
208
+ parseString2 as parseString,
209
+ toLiteral
210
+ };
211
+ //# sourceMappingURL=url.js.map
@@ -0,0 +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 } from '@bessemer/cornerstone/net/uri'\nimport { mapResult, Result, success } 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 relative: boolean\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}\n\nexport const Namespace = Uris.UrlNamespace\nexport const EqualBy: Equalitor<Url> = Equalitors.deepNatural()\n\ntype UrlBuilderPathPart = MergeExclusive<{ path?: string | null }, { pathSegments?: Array<string>; relative?: boolean }>\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}\n\nexport type UrlLike = Url | Uri | UriLiteral | UrlLiteral | UrlBuilder\n\nexport const parseString = (value: string): Result<Url, ErrorEvent> => {\n const result = Uris.parseString(value)\n if (!result.isSuccess) {\n return result\n }\n\n return success(fromUri(result.value))\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) => mapResult(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 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 merge = (element: UrlLike, builder: UrlBuilder): Url => {\n const url = from(element)\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: UriBuilder = {\n scheme: Objects.isUndefined(builder.scheme) ? url.scheme : builder.scheme,\n host: Objects.isUndefined(builder.host) ? url.host : builder.host,\n authentication: Objects.isUndefined(builder.authentication) ? url.authentication : builder.authentication,\n location,\n }\n\n return from(uriBuilder)\n}\n\nexport const format = Uris.format\n\nconst build = (builder: UrlBuilder): Url => {\n if ((builder.location?.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: '/' },\n }\n }\n\n return builder\n }\n\n const relative = builder.location.relative ?? false\n\n let 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 relative,\n pathSegments,\n query: formatQueryParameters(parameters),\n parameters,\n fragment: uri.location.fragment,\n },\n href: uri.href as UrlLiteral,\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"]}
@@ -4,7 +4,7 @@ import { InferObjectPath, ObjectPathConcreteType, ObjectPathType, ParseObjectPat
4
4
  import { TypePath } from '@bessemer/cornerstone/object/type-path';
5
5
  export type ObjectPath<T extends TypePathType = TypePathType> = TaggedType<ObjectPathConcreteType, ['TypePath', T]>;
6
6
  export declare const of: <T extends ObjectPathConcreteType>(value: T) => ObjectPath<InferObjectPath<T>>;
7
- export declare const fromString: <T extends string>(path: T) => ObjectPath<ParseObjectPath<T>>;
7
+ export declare const from: <T extends string>(path: T) => ObjectPath<ParseObjectPath<T>>;
8
8
  export declare const Schema: Zod.ZodPipe<Zod.ZodUnion<readonly [Zod.ZodArray<Zod.ZodString>, Zod.ZodString]>, Zod.ZodTransform<ObjectPath<ObjectPathType>, string | string[]>>;
9
9
  export declare const getValue: <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N) => TypePathGet<T, N>;
10
10
  export declare const applyValue: <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N, valueToApply: TypePathGet<T, N>) => N;
@@ -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,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAYnF,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,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,7 +1,7 @@
1
1
  // src/object/object-path.ts
2
2
  import Zod from "zod";
3
3
  import {
4
- fromString as typePathFromString,
4
+ from as typePathFromString,
5
5
  getValue as typePathGetValue,
6
6
  intersect as typePathIntersect,
7
7
  matches as typePathMatches
@@ -13,7 +13,7 @@ import { isObject } from "@bessemer/cornerstone/object";
13
13
  var of = (value) => {
14
14
  return value;
15
15
  };
16
- var fromString = (path) => {
16
+ var from = (path) => {
17
17
  const typePath = typePathFromString(path);
18
18
  typePath.forEach((it) => {
19
19
  assert(it !== "*", () => "ObjectPaths do not allow for wildcard selectors");
@@ -27,7 +27,7 @@ var Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) =
27
27
  if (Array.isArray(it)) {
28
28
  return of(it);
29
29
  } else {
30
- return fromString(it);
30
+ return from(it);
31
31
  }
32
32
  });
33
33
  var getValue = (path, object) => {
@@ -63,7 +63,7 @@ export {
63
63
  Schema,
64
64
  applyAnyValue,
65
65
  applyValue,
66
- fromString,
66
+ from,
67
67
  getValue,
68
68
  intersect,
69
69
  matches,
@@ -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 fromString 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 fromString = <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 fromString(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,cAAc;AAAA,EACd,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,aAAa,CAAmB,SAA4C;AACvF,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,WAAW,EAAE;AAAA,EACtB;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 {\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":[]}
@@ -4,7 +4,7 @@ import { InferTypePath, ParseTypePath, TypePathConcreteType, TypePathGet, TypePa
4
4
  import { Result } from '@bessemer/cornerstone/result';
5
5
  export type TypePath<T extends TypePathType = TypePathType> = TaggedType<TypePathConcreteType, ['TypePath', T]>;
6
6
  export declare const of: <T extends TypePathConcreteType>(value: T) => TypePath<InferTypePath<T>>;
7
- export declare const fromString: <T extends string>(path: T) => TypePath<ParseTypePath<T>>;
7
+ export declare const from: <T extends string>(path: T) => TypePath<ParseTypePath<T>>;
8
8
  export declare const Schema: Zod.ZodPipe<Zod.ZodUnion<readonly [Zod.ZodArray<Zod.ZodString>, Zod.ZodString]>, Zod.ZodTransform<TypePath<TypePathType>, string | string[]>>;
9
9
  export declare const getValue: <T extends TypePathType, N>(path: TypePath<T>, object: N) => TypePathGet<T, N>;
10
10
  export declare const isWildcardSelector: (selector: TypePathSelector) => selector is WildcardSelector;
@@ -1 +1 @@
1
- {"version":3,"file":"type-path.d.ts","sourceRoot":"","sources":["../../src/object/type-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAEL,aAAa,EAEb,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EACjB,MAAM,6CAA6C,CAAA;AAIpD,OAAO,EAAW,MAAM,EAAW,MAAM,8BAA8B,CAAA;AAGvE,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;AAE/G,eAAO,MAAM,EAAE,GAAI,CAAC,SAAS,oBAAoB,EAAE,OAAO,CAAC,KAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAEtF,CAAA;AAKD,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAmE/E,CAAA;AAED,eAAO,MAAM,MAAM,+IAMjB,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAgClG,CAAA;AAsDD,eAAO,MAAM,kBAAkB,GAAI,UAAU,gBAAgB,KAAG,QAAQ,IAAI,gBAE3E,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,YAAY,SAAS,YAAY,EACvD,YAAY,QAAQ,EACpB,cAAc,QAAQ,CAAC,YAAY,CAAC,KACnC,UAAU,IAAI,QAAQ,CAAC,YAAY,CA8CrC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,YAAY,QAAQ,EAAE,kBAAkB,QAAQ,KAAG,MAAM,CAAC,QAAQ,CA0D9F,CAAA;AAGD,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,YAAY,EAAE,gBAAgB,SAAS,YAAY,EAC9F,YAAY,QAAQ,CAAC,UAAU,CAAC,EAChC,kBAAkB,QAAQ,CAAC,gBAAgB,CAAC,KAC3C,QAOF,CAAA"}
1
+ {"version":3,"file":"type-path.d.ts","sourceRoot":"","sources":["../../src/object/type-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAEL,aAAa,EAEb,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EACjB,MAAM,6CAA6C,CAAA;AAIpD,OAAO,EAAW,MAAM,EAAW,MAAM,8BAA8B,CAAA;AAGvE,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;AAE/G,eAAO,MAAM,EAAE,GAAI,CAAC,SAAS,oBAAoB,EAAE,OAAO,CAAC,KAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAEtF,CAAA;AAKD,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAmEzE,CAAA;AAED,eAAO,MAAM,MAAM,+IAMjB,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAgClG,CAAA;AAsDD,eAAO,MAAM,kBAAkB,GAAI,UAAU,gBAAgB,KAAG,QAAQ,IAAI,gBAE3E,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,YAAY,SAAS,YAAY,EACvD,YAAY,QAAQ,EACpB,cAAc,QAAQ,CAAC,YAAY,CAAC,KACnC,UAAU,IAAI,QAAQ,CAAC,YAAY,CA8CrC,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,YAAY,QAAQ,EAAE,kBAAkB,QAAQ,KAAG,MAAM,CAAC,QAAQ,CA0D9F,CAAA;AAGD,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,YAAY,EAAE,gBAAgB,SAAS,YAAY,EAC9F,YAAY,QAAQ,CAAC,UAAU,CAAC,EAChC,kBAAkB,QAAQ,CAAC,gBAAgB,CAAC,KAC3C,QAOF,CAAA"}
@@ -9,7 +9,7 @@ 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
- var fromString = (path) => {
12
+ var from = (path) => {
13
13
  assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`);
14
14
  if (path === "") {
15
15
  return [];
@@ -65,7 +65,7 @@ var Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) =
65
65
  if (Array.isArray(it)) {
66
66
  return of(it);
67
67
  } else {
68
- return fromString(it);
68
+ return from(it);
69
69
  }
70
70
  });
71
71
  var getValue = (path, object) => {
@@ -238,7 +238,7 @@ var intersect = (targetPath, intersectingPath) => {
238
238
  };
239
239
  export {
240
240
  Schema,
241
- fromString,
241
+ from,
242
242
  getValue,
243
243
  intersect,
244
244
  intersectAny,
@@ -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 { failure, Result, success } 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 fromString = <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 fromString(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 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 success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return 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 failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return failure(makeError())\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return 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 if (!result.isSuccess) {\n throw result.value\n }\n\n return result.value\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 { 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 { failure, Result, success } 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 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 success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return 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 failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return failure(makeError())\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return 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 if (!result.isSuccess) {\n throw result.value\n }\n\n return result.value\n}\n"],"mappings":"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","names":[]}
package/dist/object.d.ts CHANGED
@@ -2,6 +2,7 @@ import { mergeWith as unsafeMergeWith } from 'lodash-es';
2
2
  import { BasicType, Dictionary, TaggedType } from '@bessemer/cornerstone/types';
3
3
  import { Primitive, UnknownRecord } from 'type-fest';
4
4
  export declare const isUndefined: (value: unknown) => value is undefined;
5
+ export declare const isNull: (value: unknown) => value is null;
5
6
  export declare const isNil: (value: unknown) => value is null | undefined;
6
7
  export declare const isPresent: <T>(value: T) => value is NonNullable<T>;
7
8
  export declare const isObject: (value?: any) => value is Dictionary<unknown>;
@@ -21,7 +22,6 @@ export declare const mapValues: {
21
22
  <T extends object>(obj: T): T;
22
23
  <T extends object>(obj: T | null | undefined): import("lodash").PartialObject<T>;
23
24
  };
24
- export declare const clone: <T>(value: T) => T;
25
25
  export declare const cloneDeep: <T>(value: T) => T;
26
26
  export declare function deepMerge<TObject, TSource>(object: TObject, source: TSource): TObject & TSource;
27
27
  export declare function deepMerge<TObject, TSource1, TSource2>(object: TObject, source1: TSource1, source2: TSource2): TObject & TSource1 & TSource2;