@bessemer/cornerstone 0.5.109 → 0.5.113

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 (123) hide show
  1. package/dist/array.d.ts +4 -3
  2. package/dist/array.d.ts.map +1 -1
  3. package/dist/array.js +18 -5
  4. package/dist/array.js.map +1 -1
  5. package/dist/either.d.ts +23 -40
  6. package/dist/either.d.ts.map +1 -1
  7. package/dist/either.js +50 -88
  8. package/dist/either.js.map +1 -1
  9. package/dist/error/error-event.d.ts.map +1 -1
  10. package/dist/error/error-event.js +3 -2
  11. package/dist/error/error-event.js.map +1 -1
  12. package/dist/error/error.d.ts +10 -0
  13. package/dist/error/error.d.ts.map +1 -1
  14. package/dist/error/error.js +21 -2
  15. package/dist/error/error.js.map +1 -1
  16. package/dist/generators.d.ts +4 -0
  17. package/dist/generators.d.ts.map +1 -0
  18. package/dist/generators.js +24 -0
  19. package/dist/generators.js.map +1 -0
  20. package/dist/index.d.ts +6 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +10 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/json.d.ts +2 -1
  25. package/dist/json.d.ts.map +1 -1
  26. package/dist/json.js.map +1 -1
  27. package/dist/math.d.ts +3 -0
  28. package/dist/math.d.ts.map +1 -1
  29. package/dist/math.js +11 -1
  30. package/dist/math.js.map +1 -1
  31. package/dist/mime-type.d.ts +4 -3
  32. package/dist/mime-type.d.ts.map +1 -1
  33. package/dist/mime-type.js +9 -6
  34. package/dist/mime-type.js.map +1 -1
  35. package/dist/net/content-type.d.ts +21 -0
  36. package/dist/net/content-type.d.ts.map +1 -0
  37. package/dist/net/content-type.js +120 -0
  38. package/dist/net/content-type.js.map +1 -0
  39. package/dist/net/fetch.d.ts +18 -0
  40. package/dist/net/fetch.d.ts.map +1 -0
  41. package/dist/net/fetch.js +65 -0
  42. package/dist/net/fetch.js.map +1 -0
  43. package/dist/net/http-method.d.ts +18 -0
  44. package/dist/net/http-method.d.ts.map +1 -0
  45. package/dist/net/http-method.js +37 -0
  46. package/dist/net/http-method.js.map +1 -0
  47. package/dist/net/http-request.d.ts +12 -0
  48. package/dist/net/http-request.d.ts.map +1 -0
  49. package/dist/net/http-request.js +1 -0
  50. package/dist/net/http-request.js.map +1 -0
  51. package/dist/net/uri-host-name.d.ts +1 -1
  52. package/dist/net/uri-host-name.d.ts.map +1 -1
  53. package/dist/net/uri-host-name.js +6 -6
  54. package/dist/net/uri-host-name.js.map +1 -1
  55. package/dist/net/uri.d.ts +12 -4
  56. package/dist/net/uri.d.ts.map +1 -1
  57. package/dist/net/uri.js +87 -36
  58. package/dist/net/uri.js.map +1 -1
  59. package/dist/net/url.d.ts +9 -6
  60. package/dist/net/url.d.ts.map +1 -1
  61. package/dist/net/url.js +58 -21
  62. package/dist/net/url.js.map +1 -1
  63. package/dist/object/object-diff.d.ts.map +1 -1
  64. package/dist/object/object-diff.js.map +1 -1
  65. package/dist/object/type-path.d.ts.map +1 -1
  66. package/dist/object/type-path.js +12 -14
  67. package/dist/object/type-path.js.map +1 -1
  68. package/dist/object.d.ts +2 -0
  69. package/dist/object.d.ts.map +1 -1
  70. package/dist/object.js +17 -1
  71. package/dist/object.js.map +1 -1
  72. package/dist/promise.d.ts +3 -1
  73. package/dist/promise.d.ts.map +1 -1
  74. package/dist/promise.js +9 -0
  75. package/dist/promise.js.map +1 -1
  76. package/dist/proxy.d.ts +2 -0
  77. package/dist/proxy.d.ts.map +1 -0
  78. package/dist/proxy.js +20 -0
  79. package/dist/proxy.js.map +1 -0
  80. package/dist/range.d.ts +0 -1
  81. package/dist/range.d.ts.map +1 -1
  82. package/dist/range.js.map +1 -1
  83. package/dist/result.d.ts +18 -20
  84. package/dist/result.d.ts.map +1 -1
  85. package/dist/result.js +41 -61
  86. package/dist/result.js.map +1 -1
  87. package/dist/retry.d.ts.map +1 -1
  88. package/dist/retry.js +3 -3
  89. package/dist/retry.js.map +1 -1
  90. package/dist/sql/sql-expression-parser.d.ts.map +1 -1
  91. package/dist/sql/sql-expression-parser.js +5 -5
  92. package/dist/sql/sql-expression-parser.js.map +1 -1
  93. package/dist/string.d.ts +1 -0
  94. package/dist/string.d.ts.map +1 -1
  95. package/dist/string.js +4 -0
  96. package/dist/string.js.map +1 -1
  97. package/dist/temporal/duration.d.ts.map +1 -1
  98. package/dist/temporal/duration.js +2 -1
  99. package/dist/temporal/duration.js.map +1 -1
  100. package/dist/temporal/instant.d.ts.map +1 -1
  101. package/dist/temporal/instant.js +2 -1
  102. package/dist/temporal/instant.js.map +1 -1
  103. package/dist/temporal/plain-date-time.d.ts.map +1 -1
  104. package/dist/temporal/plain-date-time.js +2 -1
  105. package/dist/temporal/plain-date-time.js.map +1 -1
  106. package/dist/temporal/plain-date.d.ts.map +1 -1
  107. package/dist/temporal/plain-date.js +2 -1
  108. package/dist/temporal/plain-date.js.map +1 -1
  109. package/dist/temporal/plain-time.d.ts.map +1 -1
  110. package/dist/temporal/plain-time.js +2 -1
  111. package/dist/temporal/plain-time.js.map +1 -1
  112. package/dist/temporal/zoned-date-time.d.ts.map +1 -1
  113. package/dist/temporal/zoned-date-time.js +2 -1
  114. package/dist/temporal/zoned-date-time.js.map +1 -1
  115. package/dist/types.d.ts +23 -0
  116. package/dist/types.d.ts.map +1 -1
  117. package/dist/types.js +6 -0
  118. package/dist/types.js.map +1 -1
  119. package/dist/zod-util.d.ts +55 -6
  120. package/dist/zod-util.d.ts.map +1 -1
  121. package/dist/zod-util.js +99 -11
  122. package/dist/zod-util.js.map +1 -1
  123. package/package.json +2 -2
package/dist/net/url.js CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/net/url.ts
2
2
  import * as Uris from "@bessemer/cornerstone/net/uri";
3
- import { success } from "@bessemer/cornerstone/result";
3
+ import { UriParseMode } from "@bessemer/cornerstone/net/uri";
4
+ import * as Results from "@bessemer/cornerstone/result";
4
5
  import { unpackResult } from "@bessemer/cornerstone/error/error-event";
5
6
  import * as Strings from "@bessemer/cornerstone/string";
6
7
  import * as Arrays from "@bessemer/cornerstone/array";
@@ -13,12 +14,8 @@ var encode2 = Uris.encode;
13
14
  var decode2 = Uris.decode;
14
15
  var Namespace = Uris.UrlNamespace;
15
16
  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));
17
+ var parseString2 = (value, mode = UriParseMode.Strict) => {
18
+ return Results.map(Uris.parseString(value, mode), (it) => Results.success(fromUri(it)));
22
19
  };
23
20
  function from2(value) {
24
21
  if (Objects.isNil(value)) {
@@ -42,7 +39,21 @@ function toLiteral(likeValue) {
42
39
  const value = from2(likeValue);
43
40
  return format2(value);
44
41
  }
45
- var SchemaLiteral = structuredTransform(Zod.string(), (it) => parseString2(it).map((it2) => toLiteral(it2)));
42
+ var SchemaLiteral = structuredTransform(Zod.string(), (it) => Results.map(parseString2(it), (it2) => toLiteral(it2)));
43
+ var empty2 = () => {
44
+ const result = Uris.empty();
45
+ return {
46
+ ...result,
47
+ _type: Namespace,
48
+ href: result.href,
49
+ location: {
50
+ ...result.location,
51
+ pathSegments: [],
52
+ parameters: {}
53
+ },
54
+ relative: true
55
+ };
56
+ };
46
57
  var isUrl = (value) => {
47
58
  if (!Objects.isObject(value)) {
48
59
  return false;
@@ -50,8 +61,9 @@ var isUrl = (value) => {
50
61
  const uriValue = value;
51
62
  return uriValue._type === Namespace;
52
63
  };
53
- var merge = (element, builder) => {
64
+ var update = (element, builder) => {
54
65
  const url = from2(element);
66
+ const buildRelative = builder.relative === true;
55
67
  let location;
56
68
  if (Strings.isString(builder.location) || Objects.isNull(builder.location)) {
57
69
  location = builder.location;
@@ -65,16 +77,35 @@ var merge = (element, builder) => {
65
77
  };
66
78
  }
67
79
  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
80
+ scheme: Objects.isUndefined(builder.scheme) && !buildRelative ? url.scheme : builder.scheme,
81
+ host: Objects.isUndefined(builder.host) && !buildRelative ? url.host : builder.host,
82
+ authentication: Objects.isUndefined(builder.authentication) && !buildRelative ? url.authentication : builder.authentication,
83
+ location,
84
+ relative: buildRelative
72
85
  };
73
86
  return from2(uriBuilder);
74
87
  };
88
+ var navigate = (base, next) => {
89
+ const baseUrl = from2(base);
90
+ const nextUrl = from2(next);
91
+ const isOnlyFragment = nextUrl.relative && Objects.isNil(nextUrl.location.path) && Objects.isNil(nextUrl.location.query);
92
+ const builder = {
93
+ scheme: nextUrl.scheme ?? void 0,
94
+ host: nextUrl.host ?? void 0,
95
+ authentication: Objects.isPresent(nextUrl.host) ? nextUrl.authentication : void 0,
96
+ location: {
97
+ pathSegments: nextUrl.relative ? [...baseUrl.location.pathSegments, ...nextUrl.location.pathSegments] : nextUrl.location.pathSegments,
98
+ query: isOnlyFragment ? void 0 : nextUrl.location.query,
99
+ fragment: nextUrl.location.fragment
100
+ }
101
+ };
102
+ const uri = update(baseUrl, builder);
103
+ return uri;
104
+ };
75
105
  var format2 = Uris.format;
106
+ var isComplete2 = Uris.isComplete;
76
107
  var build = (builder) => {
77
- if ((builder.location?.relative ?? false) && Objects.isPresent(builder.host)) {
108
+ if ((builder.relative ?? false) && Objects.isPresent(builder.host)) {
78
109
  throw new Error(`[${Namespace}]: Unable to construct a relative url with a non-null host: ${builder}`);
79
110
  }
80
111
  const uriBuilder = convertUrlBuilderToUriBuilder(builder);
@@ -86,13 +117,16 @@ var convertUrlBuilderToUriBuilder = (builder) => {
86
117
  if (Objects.isNil(builder.host)) {
87
118
  return {
88
119
  ...builder,
89
- location: { path: "/" }
120
+ location: { path: builder.relative === true ? "" : "/" }
90
121
  };
91
122
  }
92
123
  return builder;
93
124
  }
94
- const relative = builder.location.relative ?? false;
95
- let path = builder.location.path;
125
+ if (Strings.isString(builder.location)) {
126
+ return builder;
127
+ }
128
+ const relative = builder.relative ?? false;
129
+ let path = relative ? Strings.removeStart(builder.location.path ?? "", "/") : builder.location.path;
96
130
  if (Objects.isPresent(builder.location.pathSegments)) {
97
131
  path = formatPathSegments(builder.location.pathSegments, Objects.isPresent(builder.host), relative);
98
132
  }
@@ -145,13 +179,13 @@ var fromUri = (uri) => {
145
179
  _type: Namespace,
146
180
  location: {
147
181
  path: formatPathSegments(pathSegments, Objects.isPresent(uri.host), relative),
148
- relative,
149
182
  pathSegments,
150
183
  query: formatQueryParameters(parameters),
151
184
  parameters,
152
185
  fragment: uri.location.fragment
153
186
  },
154
- href: uri.href
187
+ href: uri.href,
188
+ relative
155
189
  };
156
190
  url.href = format2(url);
157
191
  return url;
@@ -198,14 +232,17 @@ export {
198
232
  Namespace,
199
233
  SchemaLiteral,
200
234
  decode2 as decode,
235
+ empty2 as empty,
201
236
  encode2 as encode,
202
237
  format2 as format,
203
238
  from2 as from,
204
239
  getJsonParameter,
205
240
  getParameter,
241
+ isComplete2 as isComplete,
206
242
  isUrl,
207
- merge,
243
+ navigate,
208
244
  parseString2 as parseString,
209
- toLiteral
245
+ toLiteral,
246
+ update
210
247
  };
211
248
  //# sourceMappingURL=url.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/net/url.ts"],"sourcesContent":["import { Dictionary, NominalType } from '@bessemer/cornerstone/types'\nimport * as Uris from '@bessemer/cornerstone/net/uri'\nimport { Uri, UriBuilder, UriComponent, UriLiteral, UriLocation } from '@bessemer/cornerstone/net/uri'\nimport { 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) => parseString(it).map((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"]}
1
+ {"version":3,"sources":["../../src/net/url.ts"],"sourcesContent":["import { Dictionary, NominalType } from '@bessemer/cornerstone/types'\nimport * as Uris from '@bessemer/cornerstone/net/uri'\nimport { Uri, UriBuilder, UriComponent, UriLiteral, UriLocation, UriParseMode } from '@bessemer/cornerstone/net/uri'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\nimport { ErrorEvent, unpackResult } from '@bessemer/cornerstone/error/error-event'\nimport * as Strings from '@bessemer/cornerstone/string'\nimport * as Arrays from '@bessemer/cornerstone/array'\nimport { first, isEmpty } from '@bessemer/cornerstone/array'\nimport { structuredTransform } from '@bessemer/cornerstone/zod-util'\nimport Zod from 'zod'\nimport * as Equalitors from '@bessemer/cornerstone/equalitor'\nimport { Equalitor } from '@bessemer/cornerstone/equalitor'\nimport { MergeExclusive } from 'type-fest'\nimport * as Objects from '@bessemer/cornerstone/object'\n\nexport const encode = Uris.encode\n\nexport const decode = Uris.decode\n\nexport type UrlLiteral = NominalType<UriLiteral, typeof Namespace>\n\nexport interface UrlLocation extends UriLocation {\n pathSegments: Array<string>\n parameters: Dictionary<string | Array<string>>\n}\n\nexport interface Url extends Uri {\n _type: typeof Namespace\n location: UrlLocation\n href: UrlLiteral\n relative: boolean\n}\n\nexport const Namespace = Uris.UrlNamespace\nexport const EqualBy: Equalitor<Url> = Equalitors.deepNatural()\n\ntype UrlBuilderPathPart = MergeExclusive<{ path?: string | null }, { pathSegments?: Array<string> }>\ntype UrlBuilderQueryPart = MergeExclusive<{ query?: string | null }, { parameters?: Dictionary<string | Array<string>> }>\ntype UrlBuilderLocationPart = UrlBuilderPathPart &\n UrlBuilderQueryPart & {\n fragment?: string | null\n }\n\nexport type UrlBuilder = UriBuilder & {\n location?: UrlBuilderLocationPart | null | undefined\n relative?: boolean\n}\n\nexport type UrlLike = Url | Uri | UrlBuilder | UriLiteral | UrlLiteral\n\nexport const parseString = (value: string, mode: UriParseMode = UriParseMode.Strict): Result<Url, ErrorEvent> => {\n return Results.map(Uris.parseString(value, mode), (it) => Results.success(fromUri(it)))\n}\n\nexport function from(value: UrlLike | string): Url\nexport function from(value: UrlLike | string | null): Url | null\nexport function from(value: UrlLike | string | undefined): Url | undefined\nexport function from(value: UrlLike | string | null | undefined): Url | null | undefined\nexport function from(value: UrlLike | string | null | undefined): Url | null | undefined {\n if (Objects.isNil(value)) {\n return value\n }\n if (isUrl(value)) {\n return value\n }\n if (Uris.isUri(value)) {\n return fromUri(value)\n }\n if (Strings.isString(value)) {\n return unpackResult(parseString(value))\n }\n\n return build(value as UrlBuilder)\n}\n\nexport function toLiteral(likeValue: UrlLike): UrlLiteral\nexport function toLiteral(likeValue: UrlLike | null): UrlLiteral | null\nexport function toLiteral(likeValue: UrlLike | undefined): UrlLiteral | undefined\nexport function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined\nexport function toLiteral(likeValue: UrlLike | null | undefined): UrlLiteral | null | undefined {\n if (Objects.isNil(likeValue)) {\n return likeValue\n }\n\n const value = from(likeValue)\n return format(value) as UrlLiteral\n}\n\nexport const SchemaLiteral = structuredTransform(Zod.string(), (it: string) => Results.map(parseString(it), (it) => toLiteral(it)))\n// JOHN need a schema for the object version...\n// export const SchemaInstance = structuredTransform(Zod.string(), parseString)\n\nexport const empty = (): Url => {\n const result = Uris.empty()\n\n return {\n ...result,\n _type: Namespace,\n href: result.href as UrlLiteral,\n location: {\n ...result.location,\n pathSegments: [],\n parameters: {},\n },\n relative: true,\n }\n}\n\nexport const isUrl = (value: unknown): value is Url => {\n if (!Objects.isObject(value)) {\n return false\n }\n\n const uriValue = value as any as Url\n return uriValue._type === Namespace\n}\n\nexport const update = (element: UrlLike, builder: UrlBuilder): Url => {\n const url = from(element)\n\n const buildRelative = builder.relative === true\n\n let location: UrlBuilderLocationPart | null | undefined\n if (Strings.isString(builder.location) || Objects.isNull(builder.location)) {\n location = builder.location\n } else {\n const usePathSegments = !Objects.isUndefined(builder.location?.pathSegments)\n const useParameters = !Objects.isUndefined(builder.location?.parameters)\n\n location = {\n ...(usePathSegments\n ? { pathSegments: builder.location?.pathSegments }\n : { path: Objects.isUndefined(builder.location?.path) ? url.location.path : builder.location.path }),\n ...(useParameters\n ? { parameters: builder.location?.parameters }\n : { query: Objects.isUndefined(builder.location?.query) ? url.location.query : builder.location.query }),\n fragment: Objects.isUndefined(builder.location?.fragment) ? url.location.fragment : builder.location.fragment,\n }\n }\n\n const uriBuilder: UrlBuilder = {\n scheme: Objects.isUndefined(builder.scheme) && !buildRelative ? url.scheme : builder.scheme,\n host: Objects.isUndefined(builder.host) && !buildRelative ? url.host : builder.host,\n authentication: Objects.isUndefined(builder.authentication) && !buildRelative ? url.authentication : builder.authentication,\n location,\n relative: buildRelative,\n }\n\n return from(uriBuilder)\n}\n\nexport const navigate = (base: UrlLike, next: UrlLike): Url => {\n const baseUrl = from(base)\n const nextUrl = from(next)\n\n const isOnlyFragment = nextUrl.relative && Objects.isNil(nextUrl.location.path) && Objects.isNil(nextUrl.location.query)\n\n const builder: UrlBuilder = {\n scheme: nextUrl.scheme ?? undefined,\n host: nextUrl.host ?? undefined,\n authentication: Objects.isPresent(nextUrl.host) ? nextUrl.authentication : undefined,\n location: {\n pathSegments: nextUrl.relative ? [...baseUrl.location.pathSegments, ...nextUrl.location.pathSegments] : nextUrl.location.pathSegments,\n query: isOnlyFragment ? undefined : nextUrl.location.query,\n fragment: nextUrl.location.fragment,\n },\n }\n\n const uri = update(baseUrl, builder)\n return uri\n}\n\nexport const format = Uris.format\nexport const isComplete = Uris.isComplete\n\nconst build = (builder: UrlBuilder): Url => {\n if ((builder.relative ?? false) && Objects.isPresent(builder.host)) {\n throw new Error(`[${Namespace}]: Unable to construct a relative url with a non-null host: ${builder}`)\n }\n\n const uriBuilder = convertUrlBuilderToUriBuilder(builder)\n const uri = Uris.from(uriBuilder)\n return fromUri(uri)\n}\n\nconst convertUrlBuilderToUriBuilder = (builder: UrlBuilder): UriBuilder => {\n if (Objects.isNil(builder.location)) {\n if (Objects.isNil(builder.host)) {\n return {\n ...builder,\n location: { path: builder.relative === true ? '' : '/' },\n }\n }\n\n return builder\n }\n\n if (Strings.isString(builder.location)) {\n return builder\n }\n\n const relative = builder.relative ?? false\n let path = relative ? Strings.removeStart(builder.location.path ?? '', '/') : builder.location.path\n if (Objects.isPresent(builder.location.pathSegments)) {\n path = formatPathSegments(builder.location.pathSegments, Objects.isPresent(builder.host), relative)\n }\n\n let query = builder.location.query\n if (Objects.isPresent(builder.location.parameters)) {\n query = formatQueryParameters(builder.location.parameters)\n }\n\n return {\n ...builder,\n location: { path, query, fragment: builder.location.fragment },\n }\n}\n\nconst fromUri = (uri: Uri): Url => {\n let relative: boolean = false\n let pathSegments: Array<string> = []\n const parameters: Dictionary<string | Array<string>> = {}\n\n if (Objects.isPresent(uri.location.path)) {\n if (!uri.location.path.startsWith('/')) {\n relative = true\n }\n\n pathSegments = Strings.removeStart(uri.location.path, '/')\n .split('/')\n .filter((it) => !Strings.isBlank(it))\n .map((urlPathPart) => decode(urlPathPart))\n } else {\n if (Objects.isNil(uri.host)) {\n relative = true\n }\n }\n\n if (Objects.isPresent(uri.location.query)) {\n uri.location.query.split('&').forEach((parameterPair) => {\n let splitParameters = parameterPair.split('=')\n\n if (!Strings.isBlank(first(splitParameters))) {\n let key = decode(splitParameters[0]!)\n let value = ''\n if (splitParameters.length === 2) {\n value = splitParameters[1]!\n }\n if (Objects.isNil(parameters[key])) {\n parameters[key] = decode(value)\n } else if (!Array.isArray(parameters[key])) {\n let paramList = [parameters[key]]\n paramList.push(decode(value))\n parameters[key] = paramList\n } else {\n parameters[key].push(decode(value))\n }\n }\n })\n }\n\n const url: Url = {\n ...uri,\n _type: Namespace,\n location: {\n path: formatPathSegments(pathSegments, Objects.isPresent(uri.host), relative),\n pathSegments,\n query: formatQueryParameters(parameters),\n parameters,\n fragment: uri.location.fragment,\n },\n href: uri.href as UrlLiteral,\n relative,\n }\n\n url.href = format(url) as UrlLiteral\n return url\n}\n\nconst formatPathSegments = (pathSegments: Array<string>, hasHost: boolean, relative: boolean): UriComponent | null => {\n if (Arrays.isEmpty(pathSegments)) {\n if (!hasHost && !relative) {\n return '/'\n } else {\n return null\n }\n }\n\n return (relative ? '' : '/') + pathSegments.map((it) => encode(it)).join('/')\n}\n\nconst formatQueryParameters = (parameters: Dictionary<string | Array<string>>): UriComponent | null => {\n const parameterEntries = Object.entries(parameters)\n if (isEmpty(parameterEntries)) {\n return null\n }\n\n return Object.entries(parameters)\n .flatMap(([key, value]) => {\n if (Array.isArray(value)) {\n return value.map((it) => `${encode(key)}=${encode(it)}`)\n } else {\n return [`${encode(key)}=${encode(value)}`]\n }\n })\n .join('&')\n}\n\n// JOHN I don't know about these two methods...\nexport const getParameter = (url: UrlLike, name: string): string | undefined => {\n const parameter = from(url).location.parameters[name]\n if (Objects.isNil(parameter)) {\n return undefined\n }\n\n if (Array.isArray(parameter)) {\n throw new Error(`Expected a single parameter value but found multiple for parameter: ${name}`)\n }\n\n return parameter\n}\n\nexport const getJsonParameter = <T>(url: UrlLike, name: string): T | undefined => {\n const value = getParameter(url, name)\n return Objects.isPresent(value) ? JSON.parse(value) : undefined\n}\n"],"mappings":"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","names":["isEmpty","encode","decode","parseString","from","format","it","empty","isComplete"]}
@@ -1 +1 @@
1
- {"version":3,"file":"object-diff.d.ts","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAA;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,6CAA6C,CAAA;AAC1H,OAAO,EAA8B,QAAQ,EAAE,MAAM,wCAAwC,CAAA;AAE7F,oBAAY,cAAc;IACxB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,IAAI;IACrD,IAAI,EAAE,cAAc,CAAC,GAAG,CAAA;IACxB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACnB,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,IAAI;IACxD,IAAI,EAAE,cAAc,CAAC,MAAM,CAAA;IAC3B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACnB,aAAa,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,IAAI;IACxD,IAAI,EAAE,cAAc,CAAC,MAAM,CAAA;IAC3B,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACnB,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,aAAa,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,IAAI;IACtD,IAAI,EAAE,cAAc,CAAC,IAAI,CAAA;IACzB,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAA;IACnB,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,gBAAgB,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,EAAE,CAAC,SAAS,YAAY,GAAG,YAAY,IAChE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtB,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GACtB,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAExB,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAA;AAErD,eAAO,MAAM,GAAG,GACb,CAAC,QACD,CAAC,SAAS,cAAc,EAAE,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAElH,CAAA;AAEH,eAAO,MAAM,MAAM,GAChB,CAAC,QACD,CAAC,SAAS,cAAc,EAAE,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAE7H,CAAA;AAEH,eAAO,MAAM,MAAM,GAChB,CAAC,QACD,CAAC,SAAS,cAAc,EACvB,MAAM,UAAU,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACzC,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,eAAe,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAC/B,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAEvB,CAAA;AAEH,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,YAAY,SAAS,YAAY,EAC9D,MAAM,eAAe,CAAC,CAAC,CAAC,EACxB,MAAM,QAAQ,CAAC,YAAY,CAAC,KAC3B,IAAI,IAAI,eAAe,CAAC,CAAC,EAAE,YAAY,CAEzC,CAAA"}
1
+ {"version":3,"file":"object-diff.d.ts","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/object/object-diff.ts"],"sourcesContent":["import { ObjectPath } from '@bessemer/cornerstone/object/object-path'\nimport { ConstrainTypePath, ObjectPathType, TypePathGet, TypePathType } from '@bessemer/cornerstone/object/type-path-type'\nimport { matches as typePathMatches, TypePath } from '@bessemer/cornerstone/object/type-path'\n\nexport enum ObjectDiffType {\n Add = 'Add',\n Remove = 'Remove',\n Update = 'Update',\n Move = 'Move',\n}\n\nexport type AddObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Add\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n}\n\nexport type RemoveObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Remove\n path: ObjectPath<T>\n originalValue: TypePathGet<T, N>\n}\n\nexport type UpdateObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Update\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n originalValue: TypePathGet<T, N>\n}\n\nexport type MoveObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Move\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n position: number\n originalPosition: number\n}\n\nexport type ObjectDiffEntry<N, T extends TypePathType = TypePathType> =\n | AddObjectDiff<N, T>\n | RemoveObjectDiff<N, T>\n | UpdateObjectDiff<N, T>\n | MoveObjectDiff<N, T>\n\nexport type ObjectDiff<N> = Array<ObjectDiffEntry<N>>\n\nexport const add =\n <N>() =>\n <T extends ObjectPathType>(path: ObjectPath<ConstrainTypePath<T, N>>, value: TypePathGet<T, N>): AddObjectDiff<N, T> => {\n return { type: ObjectDiffType.Add, path, value }\n }\n\nexport const remove =\n <N>() =>\n <T extends ObjectPathType>(path: ObjectPath<ConstrainTypePath<T, N>>, originalValue: TypePathGet<T, N>): RemoveObjectDiff<N, T> => {\n return { type: ObjectDiffType.Remove, path, originalValue }\n }\n\nexport const update =\n <N>() =>\n <T extends ObjectPathType>(\n path: ObjectPath<ConstrainTypePath<T, N>>,\n value: TypePathGet<T, N>,\n originalValue: TypePathGet<T, N>\n ): UpdateObjectDiff<N, T> => {\n return { type: ObjectDiffType.Update, path, value, originalValue }\n }\n\nexport const matchesPath = <N, MatchingPath extends TypePathType>(\n diff: ObjectDiffEntry<N>,\n path: TypePath<MatchingPath>\n): diff is ObjectDiffEntry<N, MatchingPath> => {\n return typePathMatches(diff.path, path)\n}\n"],"mappings":";AAEA,SAAS,WAAW,uBAAiC;AAE9C,IAAK,iBAAL,kBAAKA,oBAAL;AACL,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,UAAO;AAJG,SAAAA;AAAA,GAAA;AA0CL,IAAM,MACX,MACA,CAA2B,MAA2C,UAAkD;AACtH,SAAO,EAAE,MAAM,iBAAoB,MAAM,MAAM;AACjD;AAEK,IAAM,SACX,MACA,CAA2B,MAA2C,kBAA6D;AACjI,SAAO,EAAE,MAAM,uBAAuB,MAAM,cAAc;AAC5D;AAEK,IAAM,SACX,MACA,CACE,MACA,OACA,kBAC2B;AAC3B,SAAO,EAAE,MAAM,uBAAuB,MAAM,OAAO,cAAc;AACnE;AAEK,IAAM,cAAc,CACzB,MACA,SAC6C;AAC7C,SAAO,gBAAgB,KAAK,MAAM,IAAI;AACxC;","names":["ObjectDiffType"]}
1
+ {"version":3,"sources":["../../src/object/object-diff.ts"],"sourcesContent":["import { ObjectPath } from '@bessemer/cornerstone/object/object-path'\nimport { ConstrainTypePath, ObjectPathType, TypePathGet, TypePathType } from '@bessemer/cornerstone/object/type-path-type'\nimport { matches as typePathMatches, TypePath } from '@bessemer/cornerstone/object/type-path'\n\n// JOHN CHECK JSON PATCH INSTEAD!!! https://jsonpatch.com/\n\nexport enum ObjectDiffType {\n Add = 'Add',\n Remove = 'Remove',\n Update = 'Update',\n Move = 'Move',\n}\n\nexport type AddObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Add\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n}\n\nexport type RemoveObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Remove\n path: ObjectPath<T>\n originalValue: TypePathGet<T, N>\n}\n\nexport type UpdateObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Update\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n originalValue: TypePathGet<T, N>\n}\n\nexport type MoveObjectDiff<N, T extends TypePathType> = {\n type: ObjectDiffType.Move\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n position: number\n originalPosition: number\n}\n\nexport type ObjectDiffEntry<N, T extends TypePathType = TypePathType> =\n | AddObjectDiff<N, T>\n | RemoveObjectDiff<N, T>\n | UpdateObjectDiff<N, T>\n | MoveObjectDiff<N, T>\n\nexport type ObjectDiff<N> = Array<ObjectDiffEntry<N>>\n\nexport const add =\n <N>() =>\n <T extends ObjectPathType>(path: ObjectPath<ConstrainTypePath<T, N>>, value: TypePathGet<T, N>): AddObjectDiff<N, T> => {\n return { type: ObjectDiffType.Add, path, value }\n }\n\nexport const remove =\n <N>() =>\n <T extends ObjectPathType>(path: ObjectPath<ConstrainTypePath<T, N>>, originalValue: TypePathGet<T, N>): RemoveObjectDiff<N, T> => {\n return { type: ObjectDiffType.Remove, path, originalValue }\n }\n\nexport const update =\n <N>() =>\n <T extends ObjectPathType>(\n path: ObjectPath<ConstrainTypePath<T, N>>,\n value: TypePathGet<T, N>,\n originalValue: TypePathGet<T, N>\n ): UpdateObjectDiff<N, T> => {\n return { type: ObjectDiffType.Update, path, value, originalValue }\n }\n\nexport const matchesPath = <N, MatchingPath extends TypePathType>(\n diff: ObjectDiffEntry<N>,\n path: TypePath<MatchingPath>\n): diff is ObjectDiffEntry<N, MatchingPath> => {\n return typePathMatches(diff.path, path)\n}\n"],"mappings":";AAEA,SAAS,WAAW,uBAAiC;AAI9C,IAAK,iBAAL,kBAAKA,oBAAL;AACL,EAAAA,gBAAA,SAAM;AACN,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,YAAS;AACT,EAAAA,gBAAA,UAAO;AAJG,SAAAA;AAAA,GAAA;AA0CL,IAAM,MACX,MACA,CAA2B,MAA2C,UAAkD;AACtH,SAAO,EAAE,MAAM,iBAAoB,MAAM,MAAM;AACjD;AAEK,IAAM,SACX,MACA,CAA2B,MAA2C,kBAA6D;AACjI,SAAO,EAAE,MAAM,uBAAuB,MAAM,cAAc;AAC5D;AAEK,IAAM,SACX,MACA,CACE,MACA,OACA,kBAC2B;AAC3B,SAAO,EAAE,MAAM,uBAAuB,MAAM,OAAO,cAAc;AACnE;AAEK,IAAM,cAAc,CACzB,MACA,SAC6C;AAC7C,SAAO,gBAAgB,KAAK,MAAM,IAAI;AACxC;","names":["ObjectDiffType"]}
@@ -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,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"}
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;AAKpD,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAGrD,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,QAIF,CAAA"}
@@ -4,7 +4,7 @@ import Zod from "zod";
4
4
  import { isNil, isObject } from "@bessemer/cornerstone/object";
5
5
  import { isNumber } from "@bessemer/cornerstone/math";
6
6
  import { contains, containsAll, isEmpty, only } from "@bessemer/cornerstone/array";
7
- import { failure, success } from "@bessemer/cornerstone/result";
7
+ import * as Results from "@bessemer/cornerstone/result";
8
8
  var of = (value) => {
9
9
  return value;
10
10
  };
@@ -182,7 +182,7 @@ var matches = (targetPath, matchingPath) => {
182
182
  };
183
183
  var intersectAny = (targetPath, intersectingPath) => {
184
184
  if (targetPath.length < intersectingPath.length) {
185
- return failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`));
185
+ return Results.failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`));
186
186
  }
187
187
  let index = 0;
188
188
  let result = [];
@@ -190,51 +190,49 @@ var intersectAny = (targetPath, intersectingPath) => {
190
190
  const intersectingPathSelector = intersectingPath[index];
191
191
  const makeError = () => new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`);
192
192
  if (isNil(intersectingPathSelector)) {
193
- return success(of(result));
193
+ return Results.success(of(result));
194
194
  } else if (isWildcardSelector(intersectingPathSelector)) {
195
195
  result.push(targetPathSelector);
196
196
  } else if (isWildcardSelector(targetPathSelector)) {
197
- return failure(makeError());
197
+ return Results.failure(makeError());
198
198
  } else if (Array.isArray(intersectingPathSelector)) {
199
199
  if (Array.isArray(targetPathSelector)) {
200
200
  const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it));
201
201
  if (isEmpty(filteredTargetPaths)) {
202
- return failure(makeError());
202
+ return Results.failure(makeError());
203
203
  }
204
204
  result.push(filteredTargetPaths);
205
205
  } else {
206
206
  if (!contains(intersectingPathSelector, Number(targetPathSelector))) {
207
- return failure(makeError());
207
+ return Results.failure(makeError());
208
208
  }
209
209
  result.push(targetPathSelector);
210
210
  }
211
211
  } else {
212
212
  if (Array.isArray(targetPathSelector)) {
213
213
  if (targetPathSelector.length !== 1) {
214
- return failure(makeError());
214
+ return Results.failure(makeError());
215
215
  }
216
216
  const targetPathSelectorIndex = only(targetPathSelector);
217
217
  if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {
218
- return failure(makeError());
218
+ return Results.failure(makeError());
219
219
  }
220
220
  result.push(targetPathSelector);
221
221
  } else {
222
222
  if (targetPathSelector !== intersectingPathSelector) {
223
- return failure(makeError());
223
+ return Results.failure(makeError());
224
224
  }
225
225
  result.push(targetPathSelector);
226
226
  }
227
227
  }
228
228
  index++;
229
229
  }
230
- return success(of(result));
230
+ return Results.success(of(result));
231
231
  };
232
232
  var intersect = (targetPath, intersectingPath) => {
233
233
  const result = intersectAny(targetPath, intersectingPath);
234
- if (!result.isSuccess) {
235
- throw result.value;
236
- }
237
- return result.value;
234
+ Results.assertSuccess(result);
235
+ return result;
238
236
  };
239
237
  export {
240
238
  Schema,
@@ -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 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":[]}
1
+ {"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { TaggedType } from '@bessemer/cornerstone/types'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport Zod from 'zod'\nimport {\n IndexSelector,\n InferTypePath,\n NameSelector,\n ParseTypePath,\n TypePathConcreteType,\n TypePathGet,\n TypePathSelector,\n TypePathType,\n WildcardSelector,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport { isNil, isObject } from '@bessemer/cornerstone/object'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { contains, containsAll, isEmpty, only } from '@bessemer/cornerstone/array'\nimport * as Results from '@bessemer/cornerstone/result'\nimport { Result } from '@bessemer/cornerstone/result'\n\n// JOHN this probably should be brought into the structured transform regime\nexport type TypePath<T extends TypePathType = TypePathType> = TaggedType<TypePathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends TypePathConcreteType>(value: T): TypePath<InferTypePath<T>> => {\n return value as TypePath<InferTypePath<T>>\n}\n\nconst TypePathRegex =\n /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])(?:\\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+)|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])*$|^$/\n\nexport const from = <T extends string>(path: T): TypePath<ParseTypePath<T>> => {\n assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`)\n\n if (path === '') {\n return [] as TypePath<ParseTypePath<T>>\n }\n\n const segments: Array<string | Array<string | number>> = []\n let current = ''\n let i = 0\n\n while (i < path.length) {\n const char = path[i]\n\n if (char === '.') {\n if (current) {\n segments.push(current)\n current = ''\n }\n i++\n } else if (char === '[') {\n if (current) {\n segments.push(current)\n current = ''\n }\n\n // Find the matching closing bracket\n let bracketContent = ''\n i++ // Skip opening bracket\n let depth = 1\n\n while (i < path.length && depth > 0) {\n const bracketChar = path[i]\n if (bracketChar === '[') {\n depth++\n } else if (bracketChar === ']') {\n depth--\n }\n\n if (depth > 0) {\n bracketContent += bracketChar\n }\n i++\n }\n\n if (bracketContent === '*') {\n segments.push('*')\n } else {\n const indices = bracketContent\n .split(',')\n .map((s) => s.trim())\n .map((s) => parseInt(s, 10))\n\n segments.push(indices)\n }\n } else {\n current += char\n i++\n }\n }\n\n // Add any remaining current segment\n if (current) {\n segments.push(current)\n }\n\n return segments as TypePath<ParseTypePath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return from(it)\n }\n})\n\nexport const getValue = <T extends TypePathType, N>(path: TypePath<T>, object: N): TypePathGet<T, N> => {\n let current: unknown = object\n let collectorMode = false\n\n for (const selector of path) {\n if (isNil(current)) {\n return undefined as TypePathGet<T, N>\n }\n\n if (collectorMode) {\n if (!Array.isArray(current)) {\n throw new Error('Illegal State - in collectorMode but current value is not an Array')\n }\n\n const result = current.flatMap((it) => {\n const [value, isCollecting] = evaluateSelector(selector, it)\n if (isCollecting) {\n return value\n } else {\n return [value]\n }\n })\n\n current = result\n } else {\n const [result, isCollecting] = evaluateSelector(selector, current)\n current = result\n collectorMode = isCollecting\n }\n }\n\n return current as TypePathGet<T, N>\n}\n\nconst evaluateSelector = (selector: TypePathSelector, current: unknown): [unknown, boolean] => {\n if (isWildcardSelector(selector)) {\n return evaluateWildcardSelector(current)\n }\n\n if (Array.isArray(selector)) {\n return evaluateIndexSelector(selector as IndexSelector, current)\n }\n\n return evaluateNameSelector(selector, current)\n}\n\nconst evaluateNameSelector = (selector: NameSelector, current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n const numberSelector = Number(selector)\n assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`)\n return evaluateIndexSelector([numberSelector], current)\n }\n\n if (!isObject(current)) {\n return [undefined, false]\n }\n\n return [current[selector], false]\n}\n\nconst evaluateWildcardSelector = (current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n return [current, true]\n }\n\n if (isObject(current)) {\n throw new Error('Wildcard operations on Objects is not yet supported')\n }\n\n throw new Error(`Unable to apply wildcard operator to value: ${current}`)\n}\n\nconst evaluateIndexSelector = (selector: IndexSelector, current: unknown): [unknown, boolean] => {\n if (!Array.isArray(current)) {\n throw new Error(`Unable to apply index operator to value: ${current}`)\n }\n\n if (selector.length === 1) {\n return [current[only(selector)], false]\n }\n\n const indexSelector = selector as IndexSelector\n const result = indexSelector.map((it) => current[it])\n return [result, true]\n}\n\nexport const isWildcardSelector = (selector: TypePathSelector): selector is WildcardSelector => {\n return selector === '*'\n}\n\nexport const matches = <MatchingPath extends TypePathType>(\n targetPath: TypePath,\n matchingPath: TypePath<MatchingPath>\n): targetPath is TypePath<MatchingPath> => {\n if (targetPath.length < matchingPath.length) {\n return false\n }\n\n let index = 0\n for (const targetPathSelector of targetPath) {\n const matchingPathSelector = matchingPath[index]\n\n if (isNil(matchingPathSelector)) {\n return true\n } else if (isWildcardSelector(matchingPathSelector)) {\n // Matching path wildcards always match - they're wild\n } else if (isWildcardSelector(targetPathSelector)) {\n return false\n } else if (Array.isArray(matchingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n if (!containsAll(matchingPathSelector, targetPathSelector)) {\n return false\n }\n } else {\n if (!contains(matchingPathSelector, Number(targetPathSelector))) {\n return false\n }\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return false\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(matchingPathSelector)) {\n return false\n }\n } else {\n if (targetPathSelector !== matchingPathSelector) {\n return false\n }\n }\n }\n\n index++\n }\n\n return true\n}\n\nexport const intersectAny = (targetPath: TypePath, intersectingPath: TypePath): Result<TypePath> => {\n if (targetPath.length < intersectingPath.length) {\n return Results.failure(new Error(`TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`))\n }\n\n let index = 0\n let result: TypePathConcreteType = []\n for (const targetPathSelector of targetPath) {\n const intersectingPathSelector = intersectingPath[index]\n const makeError = () =>\n new Error(`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`)\n\n if (isNil(intersectingPathSelector)) {\n return Results.success(of(result))\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n return Results.failure(makeError())\n } else if (Array.isArray(intersectingPathSelector)) {\n if (Array.isArray(targetPathSelector)) {\n const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it))\n if (isEmpty(filteredTargetPaths)) {\n return Results.failure(makeError())\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n return Results.failure(makeError())\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n return Results.failure(makeError())\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return Results.success(of(result))\n}\n\n// JOHN this needs to do a type resolution step...\nexport const intersect = <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(\n targetPath: TypePath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): TypePath => {\n const result = intersectAny(targetPath, intersectingPath)\n Results.assertSuccess(result)\n return result\n}\n"],"mappings":"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","names":[]}
package/dist/object.d.ts CHANGED
@@ -51,5 +51,7 @@ export type RecordAttribute<Type = unknown, Class extends string = 'RecordAttrib
51
51
  type RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never;
52
52
  export declare const getAttribute: <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T) => RecordAttributeType<T> | undefined;
53
53
  export declare const coerceNil: <T>(value: T | null | undefined) => T | undefined;
54
+ export declare const omit: <T, K extends keyof T>(obj: T, keys: K[]) => Omit<T, K>;
55
+ export declare const pick: <T, K extends keyof T>(obj: T, keys: K[]) => Pick<T, K>;
54
56
  export {};
55
57
  //# sourceMappingURL=object.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}
package/dist/object.js CHANGED
@@ -126,6 +126,20 @@ var getAttribute = (record, attribute) => {
126
126
  var coerceNil = (value) => {
127
127
  return isNil(value) ? void 0 : value;
128
128
  };
129
+ var omit = (obj, keys) => {
130
+ const ret = { ...obj };
131
+ for (const key of keys) {
132
+ delete ret[key];
133
+ }
134
+ return ret;
135
+ };
136
+ var pick = (obj, keys) => {
137
+ const ret = {};
138
+ for (const key of keys) {
139
+ ret[key] = obj[key];
140
+ }
141
+ return ret;
142
+ };
129
143
  export {
130
144
  cloneDeep,
131
145
  coerceNil,
@@ -147,6 +161,8 @@ export {
147
161
  isPrimitive,
148
162
  isUndefined,
149
163
  isValidKey,
150
- mapValues
164
+ mapValues,
165
+ omit,
166
+ pick
151
167
  };
152
168
  //# sourceMappingURL=object.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/object.ts"],"sourcesContent":["import { cloneDeep as _cloneDeep, mapValues as _mapValues, merge as unsafeMerge, mergeWith as unsafeMergeWith } from 'lodash-es'\n\nimport { BasicType, Dictionary, TaggedType } from '@bessemer/cornerstone/types'\nimport { Primitive, UnknownRecord } from 'type-fest'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { isDate } from '@bessemer/cornerstone/temporal/date'\nimport { _isInstant } from '@bessemer/cornerstone/temporal/chrono'\n\nexport const isUndefined = (value: unknown): value is undefined => {\n return value === undefined\n}\n\nexport const isNull = (value: unknown): value is null => {\n return value === null\n}\n\nexport const isNil = (value: unknown): value is null | undefined => {\n return isNull(value) || isUndefined(value)\n}\n\nexport const isPresent = <T>(value: T): value is NonNullable<T> => {\n return !isNil(value)\n}\n\nexport const isObject = (value?: any): value is Dictionary<unknown> => {\n if (value === null || value === undefined || typeof value !== 'object') {\n return false\n }\n\n const proto = Object.getPrototypeOf(value)\n return proto !== null && Object.getPrototypeOf(proto) === null\n}\n\n// JOHN should this also check for the nil case?\nexport const isEmpty = (value: Record<string | number | symbol, unknown>): boolean => {\n return Object.keys(value).length === 0\n}\n\nexport const deepEqual = (value1: unknown, value2: unknown): boolean => {\n if (value1 === value2) {\n return true\n }\n\n // If either value is null or undefined, they're not equal (since we already checked ===)\n if (isNil(value1) || isNil(value2)) {\n return false\n }\n\n if (isDate(value1) && isDate(value2)) {\n return value1.getTime() === value2.getTime()\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString()\n }\n\n if (typeof value1 !== typeof value2) {\n return false\n }\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n if (value1.length !== value2.length) {\n return false\n }\n\n for (let i = 0; i < value1.length; i++) {\n if (!deepEqual(value1[i], value2[i])) {\n return false\n }\n }\n\n return true\n }\n\n if (isObject(value1) && isObject(value2)) {\n const keys1 = Object.keys(value1)\n const keys2 = Object.keys(value2)\n\n if (keys1.length !== keys2.length) {\n return false\n }\n\n for (const key of keys1) {\n if (!deepEqual(value1[key], value2[key])) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\nexport const mapValues = _mapValues\n\nexport const cloneDeep = _cloneDeep\n\nexport function deepMerge<TObject, TSource>(object: TObject, source: TSource): TObject & TSource\nexport function deepMerge<TObject, TSource1, TSource2>(object: TObject, source1: TSource1, source2: TSource2): TObject & TSource1 & TSource2\nexport function deepMerge<TObject, TSource1, TSource2, TSource3>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3\n): TObject & TSource1 & TSource2 & TSource3\nexport function deepMerge<TObject, TSource1, TSource2, TSource3, TSource4>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3,\n source4: TSource4\n): TObject & TSource1 & TSource2 & TSource3 & TSource4\nexport function deepMerge(object: any, ...otherArgs: any[]): any {\n return unsafeMerge({}, object, ...otherArgs)\n}\n\nexport const deepMergeAll = <T>(objects: Array<T>): T => {\n return objects.reduce((x, y) => deepMerge(x, y))\n}\n\nexport function deepMergeInto<Source1, Source2>(source: Source1, values: Source2): asserts source is Source1 & Source2 {\n unsafeMerge(source, values)\n}\n\nexport const deepMergeWith: typeof unsafeMergeWith = (...args: Array<any>) => {\n const clone = cloneDeep(args[0])\n return unsafeMergeWith.apply(null, [clone, ...args.slice(1)])\n}\n\nexport type ObjectDiffResult = {\n elementsUpdated: Record<string, { originalValue: unknown; updatedValue: unknown }>\n elementsAdded: UnknownRecord\n elementsRemoved: UnknownRecord\n}\n\nexport function diffShallow(original: UnknownRecord, updated: UnknownRecord): ObjectDiffResult {\n const result: ObjectDiffResult = {\n elementsUpdated: {},\n elementsAdded: {},\n elementsRemoved: {},\n }\n\n for (const [key, originalValue] of Object.entries(original)) {\n const updatedValue = updated[key]\n if (updatedValue === undefined) {\n result.elementsRemoved[key] = originalValue\n } else if (!deepEqual(originalValue, updatedValue)) {\n result.elementsUpdated[key] = { originalValue: originalValue, updatedValue: updatedValue }\n }\n }\n\n for (const [key, updatedValue] of Object.entries(updated)) {\n const originalValue = original[key]\n if (originalValue === undefined) {\n result.elementsAdded[key] = updatedValue\n }\n }\n return result\n}\n\nexport const isValidKey = (field: PropertyKey, obj: object): field is keyof typeof obj => {\n return field in obj\n}\n\n/** Determines if the list of fields are present on the object (not null or undefined), with type inference */\nexport function fieldsPresent<T extends object, K extends keyof T>(\n object: T,\n fields: Array<K>\n): object is Exclude<T, K> & Required<{ [P in K]: NonNullable<T[P]> }> {\n return fields.every((field) => isPresent(object[field]))\n}\n\nexport const isPrimitive = (value: any): value is Primitive => {\n return value === null || (typeof value !== 'object' && typeof value !== 'function')\n}\n\nexport const isBasic = (value: any): value is BasicType => {\n return isNumber(value) || isString(value) || isDate(value) || isBoolean(value) || _isInstant(value)\n}\n\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === 'boolean'\n}\n\ntype TransformFunction = (value: any, path: (string | number)[], key: string | number, parent: any) => any\n\nconst walk = (value: any, transform: TransformFunction, path: (string | number)[] = []): any => {\n if (isNil(value) || isPrimitive(value)) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((value, index) => {\n const currentPath = [...path, index]\n return walk(transform(value, currentPath, index, value), transform, currentPath)\n })\n }\n\n const result: any = {}\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const currentPath = [...path, key]\n const transformedValue = transform(value[key], currentPath, key, value)\n result[key] = walk(transformedValue, transform, currentPath)\n }\n }\n\n return result\n}\n\nexport type RecordAttribute<Type = unknown, Class extends string = 'RecordAttribute'> = TaggedType<string, [Type, Class]>\ntype RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never\n\nexport const getAttribute = <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T): RecordAttributeType<T> | undefined => {\n return record[attribute] as RecordAttributeType<T> | undefined\n}\n\nexport const coerceNil = <T>(value: T | null | undefined): T | undefined => {\n return isNil(value) ? undefined : value\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/object.ts"],"sourcesContent":["import { cloneDeep as _cloneDeep, mapValues as _mapValues, merge as unsafeMerge, mergeWith as unsafeMergeWith } from 'lodash-es'\n\nimport { BasicType, Dictionary, TaggedType } from '@bessemer/cornerstone/types'\nimport { Primitive, UnknownRecord } from 'type-fest'\nimport { isNumber } from '@bessemer/cornerstone/math'\nimport { isString } from '@bessemer/cornerstone/string'\nimport { isDate } from '@bessemer/cornerstone/temporal/date'\nimport { _isInstant } from '@bessemer/cornerstone/temporal/chrono'\n\nexport const isUndefined = (value: unknown): value is undefined => {\n return value === undefined\n}\n\nexport const isNull = (value: unknown): value is null => {\n return value === null\n}\n\nexport const isNil = (value: unknown): value is null | undefined => {\n return isNull(value) || isUndefined(value)\n}\n\nexport const isPresent = <T>(value: T): value is NonNullable<T> => {\n return !isNil(value)\n}\n\nexport const isObject = (value?: any): value is Dictionary<unknown> => {\n if (value === null || value === undefined || typeof value !== 'object') {\n return false\n }\n\n const proto = Object.getPrototypeOf(value)\n return proto !== null && Object.getPrototypeOf(proto) === null\n}\n\n// JOHN should this also check for the nil case?\nexport const isEmpty = (value: Record<string | number | symbol, unknown>): boolean => {\n return Object.keys(value).length === 0\n}\n\nexport const deepEqual = (value1: unknown, value2: unknown): boolean => {\n if (value1 === value2) {\n return true\n }\n\n // If either value is null or undefined, they're not equal (since we already checked ===)\n if (isNil(value1) || isNil(value2)) {\n return false\n }\n\n if (isDate(value1) && isDate(value2)) {\n return value1.getTime() === value2.getTime()\n }\n\n if (value1 instanceof RegExp && value2 instanceof RegExp) {\n return value1.toString() === value2.toString()\n }\n\n if (typeof value1 !== typeof value2) {\n return false\n }\n\n if (Array.isArray(value1) && Array.isArray(value2)) {\n if (value1.length !== value2.length) {\n return false\n }\n\n for (let i = 0; i < value1.length; i++) {\n if (!deepEqual(value1[i], value2[i])) {\n return false\n }\n }\n\n return true\n }\n\n if (isObject(value1) && isObject(value2)) {\n const keys1 = Object.keys(value1)\n const keys2 = Object.keys(value2)\n\n if (keys1.length !== keys2.length) {\n return false\n }\n\n for (const key of keys1) {\n if (!deepEqual(value1[key], value2[key])) {\n return false\n }\n }\n\n return true\n }\n\n return false\n}\n\nexport const mapValues = _mapValues\n\nexport const cloneDeep = _cloneDeep\n\nexport function deepMerge<TObject, TSource>(object: TObject, source: TSource): TObject & TSource\nexport function deepMerge<TObject, TSource1, TSource2>(object: TObject, source1: TSource1, source2: TSource2): TObject & TSource1 & TSource2\nexport function deepMerge<TObject, TSource1, TSource2, TSource3>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3\n): TObject & TSource1 & TSource2 & TSource3\nexport function deepMerge<TObject, TSource1, TSource2, TSource3, TSource4>(\n object: TObject,\n source1: TSource1,\n source2: TSource2,\n source3: TSource3,\n source4: TSource4\n): TObject & TSource1 & TSource2 & TSource3 & TSource4\nexport function deepMerge(object: any, ...otherArgs: any[]): any {\n return unsafeMerge({}, object, ...otherArgs)\n}\n\nexport const deepMergeAll = <T>(objects: Array<T>): T => {\n return objects.reduce((x, y) => deepMerge(x, y))\n}\n\nexport function deepMergeInto<Source1, Source2>(source: Source1, values: Source2): asserts source is Source1 & Source2 {\n unsafeMerge(source, values)\n}\n\nexport const deepMergeWith: typeof unsafeMergeWith = (...args: Array<any>) => {\n const clone = cloneDeep(args[0])\n return unsafeMergeWith.apply(null, [clone, ...args.slice(1)])\n}\n\nexport type ObjectDiffResult = {\n elementsUpdated: Record<string, { originalValue: unknown; updatedValue: unknown }>\n elementsAdded: UnknownRecord\n elementsRemoved: UnknownRecord\n}\n\nexport function diffShallow(original: UnknownRecord, updated: UnknownRecord): ObjectDiffResult {\n const result: ObjectDiffResult = {\n elementsUpdated: {},\n elementsAdded: {},\n elementsRemoved: {},\n }\n\n for (const [key, originalValue] of Object.entries(original)) {\n const updatedValue = updated[key]\n if (updatedValue === undefined) {\n result.elementsRemoved[key] = originalValue\n } else if (!deepEqual(originalValue, updatedValue)) {\n result.elementsUpdated[key] = { originalValue: originalValue, updatedValue: updatedValue }\n }\n }\n\n for (const [key, updatedValue] of Object.entries(updated)) {\n const originalValue = original[key]\n if (originalValue === undefined) {\n result.elementsAdded[key] = updatedValue\n }\n }\n return result\n}\n\nexport const isValidKey = (field: PropertyKey, obj: object): field is keyof typeof obj => {\n return field in obj\n}\n\n/** Determines if the list of fields are present on the object (not null or undefined), with type inference */\nexport function fieldsPresent<T extends object, K extends keyof T>(\n object: T,\n fields: Array<K>\n): object is Exclude<T, K> & Required<{ [P in K]: NonNullable<T[P]> }> {\n return fields.every((field) => isPresent(object[field]))\n}\n\nexport const isPrimitive = (value: any): value is Primitive => {\n return value === null || (typeof value !== 'object' && typeof value !== 'function')\n}\n\nexport const isBasic = (value: any): value is BasicType => {\n return isNumber(value) || isString(value) || isDate(value) || isBoolean(value) || _isInstant(value)\n}\n\nexport const isBoolean = (value: unknown): value is boolean => {\n return typeof value === 'boolean'\n}\n\ntype TransformFunction = (value: any, path: (string | number)[], key: string | number, parent: any) => any\n\nconst walk = (value: any, transform: TransformFunction, path: (string | number)[] = []): any => {\n if (isNil(value) || isPrimitive(value)) {\n return value\n }\n\n if (Array.isArray(value)) {\n return value.map((value, index) => {\n const currentPath = [...path, index]\n return walk(transform(value, currentPath, index, value), transform, currentPath)\n })\n }\n\n const result: any = {}\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n const currentPath = [...path, key]\n const transformedValue = transform(value[key], currentPath, key, value)\n result[key] = walk(transformedValue, transform, currentPath)\n }\n }\n\n return result\n}\n\nexport type RecordAttribute<Type = unknown, Class extends string = 'RecordAttribute'> = TaggedType<string, [Type, Class]>\ntype RecordAttributeType<Attribute> = Attribute extends RecordAttribute<infer Type, string> ? Type : never\n\nexport const getAttribute = <T extends RecordAttribute<unknown, string>>(record: UnknownRecord, attribute: T): RecordAttributeType<T> | undefined => {\n return record[attribute] as RecordAttributeType<T> | undefined\n}\n\nexport const coerceNil = <T>(value: T | null | undefined): T | undefined => {\n return isNil(value) ? undefined : value\n}\n\nexport const omit = <T, K extends keyof T>(obj: T, keys: K[]): Omit<T, K> => {\n const ret = { ...obj }\n for (const key of keys) {\n delete ret[key]\n }\n return ret\n}\n\nexport const pick = <T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> => {\n const ret = {} as Pick<T, K>\n for (const key of keys) {\n ret[key] = obj[key]\n }\n return ret\n}\n"],"mappings":"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","names":[]}
package/dist/promise.d.ts CHANGED
@@ -1,9 +1,11 @@
1
+ import { Promisable } from 'type-fest';
1
2
  export type PromiseContext<T> = {
2
3
  promise: Promise<T>;
3
4
  resolve: (value: T) => void;
4
5
  reject: (reason?: any) => void;
5
6
  };
6
- export declare const isPromise: <T>(element: T | Promise<T>) => element is Promise<T>;
7
+ export declare const isPromise: <T>(element: Promisable<T>) => element is PromiseLike<T>;
8
+ export declare const map: <T, N>(value: Promisable<T>, mapper: (value: T) => N) => Promisable<N>;
7
9
  export declare const toPromise: <T>(element: T | Promise<T>) => Promise<T>;
8
10
  export declare const create: <T>() => PromiseContext<T>;
9
11
  //# sourceMappingURL=promise.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAAE,CAAA;AAEpH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAM1E,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAQ/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,OAAK,cAAc,CAAC,CAAC,CAS5C,CAAA"}
1
+ {"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAGtC,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;CAAE,CAAA;AAEpH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,UAAU,CAAC,CAAC,CAAC,KAAG,OAAO,IAAI,WAAW,CAAC,CAAC,CAM7E,CAAA;AAED,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,EAAE,OAAO,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAG,UAAU,CAAC,CAAC,CAMrF,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAQ/D,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,OAAK,cAAc,CAAC,CAAC,CAS5C,CAAA"}
package/dist/promise.js CHANGED
@@ -1,11 +1,19 @@
1
1
  // src/promise.ts
2
2
  import { isNil } from "@bessemer/cornerstone/object";
3
+ import { executeAsync } from "@bessemer/cornerstone/internal";
3
4
  var isPromise = (element) => {
4
5
  if (isNil(element)) {
5
6
  return false;
6
7
  }
7
8
  return typeof element.then === "function";
8
9
  };
10
+ var map = (value, mapper) => {
11
+ if (isPromise(value)) {
12
+ return executeAsync(async () => mapper(await value));
13
+ } else {
14
+ return mapper(value);
15
+ }
16
+ };
9
17
  var toPromise = (element) => {
10
18
  if (isPromise(element)) {
11
19
  return element;
@@ -26,6 +34,7 @@ var create = () => {
26
34
  export {
27
35
  create,
28
36
  isPromise,
37
+ map,
29
38
  toPromise
30
39
  };
31
40
  //# sourceMappingURL=promise.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/promise.ts"],"sourcesContent":["import { isNil } from '@bessemer/cornerstone/object'\n\nexport type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element: T | Promise<T>): element is Promise<T> => {\n if (isNil(element)) {\n return false\n }\n\n return typeof (element as Promise<T>).then === 'function'\n}\n\nexport const toPromise = <T>(element: T | Promise<T>): Promise<T> => {\n if (isPromise(element)) {\n return element\n }\n\n const { resolve, promise } = create<T>()\n resolve(element)\n return promise\n}\n\nexport const create = <T>(): PromiseContext<T> => {\n let resolveVar\n let rejectVar\n const promise = new Promise<T>((resolve, reject) => {\n resolveVar = resolve\n rejectVar = reject\n })\n\n return { promise, resolve: resolveVar!, reject: rejectVar! }\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAIf,IAAM,YAAY,CAAI,YAAmD;AAC9E,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,OAAQ,QAAuB,SAAS;AACjD;AAEO,IAAM,YAAY,CAAI,YAAwC;AACnE,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAU;AACvC,UAAQ,OAAO;AACf,SAAO;AACT;AAEO,IAAM,SAAS,MAA4B;AAChD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAClD,iBAAa;AACb,gBAAY;AAAA,EACd,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,YAAa,QAAQ,UAAW;AAC7D;","names":[]}
1
+ {"version":3,"sources":["../src/promise.ts"],"sourcesContent":["import { isNil } from '@bessemer/cornerstone/object'\nimport { Promisable } from 'type-fest'\nimport { executeAsync } from '@bessemer/cornerstone/internal'\n\nexport type PromiseContext<T> = { promise: Promise<T>; resolve: (value: T) => void; reject: (reason?: any) => void }\n\nexport const isPromise = <T>(element: Promisable<T>): element is PromiseLike<T> => {\n if (isNil(element)) {\n return false\n }\n\n return typeof (element as Promise<T>).then === 'function'\n}\n\nexport const map = <T, N>(value: Promisable<T>, mapper: (value: T) => N): Promisable<N> => {\n if (isPromise(value)) {\n return executeAsync(async () => mapper(await value))\n } else {\n return mapper(value)\n }\n}\n\nexport const toPromise = <T>(element: T | Promise<T>): Promise<T> => {\n if (isPromise(element)) {\n return element\n }\n\n const { resolve, promise } = create<T>()\n resolve(element)\n return promise\n}\n\nexport const create = <T>(): PromiseContext<T> => {\n let resolveVar\n let rejectVar\n const promise = new Promise<T>((resolve, reject) => {\n resolveVar = resolve\n rejectVar = reject\n })\n\n return { promise, resolve: resolveVar!, reject: rejectVar! }\n}\n"],"mappings":";AAAA,SAAS,aAAa;AAEtB,SAAS,oBAAoB;AAItB,IAAM,YAAY,CAAI,YAAsD;AACjF,MAAI,MAAM,OAAO,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,SAAO,OAAQ,QAAuB,SAAS;AACjD;AAEO,IAAM,MAAM,CAAO,OAAsB,WAA2C;AACzF,MAAI,UAAU,KAAK,GAAG;AACpB,WAAO,aAAa,YAAY,OAAO,MAAM,KAAK,CAAC;AAAA,EACrD,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEO,IAAM,YAAY,CAAI,YAAwC;AACnE,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,QAAQ,IAAI,OAAU;AACvC,UAAQ,OAAO;AACf,SAAO;AACT;AAEO,IAAM,SAAS,MAA4B;AAChD,MAAI;AACJ,MAAI;AACJ,QAAM,UAAU,IAAI,QAAW,CAAC,SAAS,WAAW;AAClD,iBAAa;AACb,gBAAY;AAAA,EACd,CAAC;AAED,SAAO,EAAE,SAAS,SAAS,YAAa,QAAQ,UAAW;AAC7D;","names":[]}
@@ -0,0 +1,2 @@
1
+ export declare const extend: <Target extends object, E extends Record<string, unknown>>(target: Target, extensions: E) => Target & E;
2
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,GAAI,MAAM,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,MAAM,EAAE,YAAY,CAAC,KAAG,MAAM,GAAG,CAezH,CAAA"}