@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.
- package/dist/array.d.ts +4 -3
- package/dist/array.d.ts.map +1 -1
- package/dist/array.js +18 -5
- package/dist/array.js.map +1 -1
- package/dist/either.d.ts +23 -40
- package/dist/either.d.ts.map +1 -1
- package/dist/either.js +50 -88
- package/dist/either.js.map +1 -1
- package/dist/error/error-event.d.ts.map +1 -1
- package/dist/error/error-event.js +3 -2
- package/dist/error/error-event.js.map +1 -1
- package/dist/error/error.d.ts +10 -0
- package/dist/error/error.d.ts.map +1 -1
- package/dist/error/error.js +21 -2
- package/dist/error/error.js.map +1 -1
- package/dist/generators.d.ts +4 -0
- package/dist/generators.d.ts.map +1 -0
- package/dist/generators.js +24 -0
- package/dist/generators.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +2 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js.map +1 -1
- package/dist/math.d.ts +3 -0
- package/dist/math.d.ts.map +1 -1
- package/dist/math.js +11 -1
- package/dist/math.js.map +1 -1
- package/dist/mime-type.d.ts +4 -3
- package/dist/mime-type.d.ts.map +1 -1
- package/dist/mime-type.js +9 -6
- package/dist/mime-type.js.map +1 -1
- package/dist/net/content-type.d.ts +21 -0
- package/dist/net/content-type.d.ts.map +1 -0
- package/dist/net/content-type.js +120 -0
- package/dist/net/content-type.js.map +1 -0
- package/dist/net/fetch.d.ts +18 -0
- package/dist/net/fetch.d.ts.map +1 -0
- package/dist/net/fetch.js +65 -0
- package/dist/net/fetch.js.map +1 -0
- package/dist/net/http-method.d.ts +18 -0
- package/dist/net/http-method.d.ts.map +1 -0
- package/dist/net/http-method.js +37 -0
- package/dist/net/http-method.js.map +1 -0
- package/dist/net/http-request.d.ts +12 -0
- package/dist/net/http-request.d.ts.map +1 -0
- package/dist/net/http-request.js +1 -0
- package/dist/net/http-request.js.map +1 -0
- package/dist/net/uri-host-name.d.ts +1 -1
- package/dist/net/uri-host-name.d.ts.map +1 -1
- package/dist/net/uri-host-name.js +6 -6
- package/dist/net/uri-host-name.js.map +1 -1
- package/dist/net/uri.d.ts +12 -4
- package/dist/net/uri.d.ts.map +1 -1
- package/dist/net/uri.js +87 -36
- package/dist/net/uri.js.map +1 -1
- package/dist/net/url.d.ts +9 -6
- package/dist/net/url.d.ts.map +1 -1
- package/dist/net/url.js +58 -21
- package/dist/net/url.js.map +1 -1
- package/dist/object/object-diff.d.ts.map +1 -1
- package/dist/object/object-diff.js.map +1 -1
- package/dist/object/type-path.d.ts.map +1 -1
- package/dist/object/type-path.js +12 -14
- package/dist/object/type-path.js.map +1 -1
- package/dist/object.d.ts +2 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +17 -1
- package/dist/object.js.map +1 -1
- package/dist/promise.d.ts +3 -1
- package/dist/promise.d.ts.map +1 -1
- package/dist/promise.js +9 -0
- package/dist/promise.js.map +1 -1
- package/dist/proxy.d.ts +2 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +20 -0
- package/dist/proxy.js.map +1 -0
- package/dist/range.d.ts +0 -1
- package/dist/range.d.ts.map +1 -1
- package/dist/range.js.map +1 -1
- package/dist/result.d.ts +18 -20
- package/dist/result.d.ts.map +1 -1
- package/dist/result.js +41 -61
- package/dist/result.js.map +1 -1
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +3 -3
- package/dist/retry.js.map +1 -1
- package/dist/sql/sql-expression-parser.d.ts.map +1 -1
- package/dist/sql/sql-expression-parser.js +5 -5
- package/dist/sql/sql-expression-parser.js.map +1 -1
- package/dist/string.d.ts +1 -0
- package/dist/string.d.ts.map +1 -1
- package/dist/string.js +4 -0
- package/dist/string.js.map +1 -1
- package/dist/temporal/duration.d.ts.map +1 -1
- package/dist/temporal/duration.js +2 -1
- package/dist/temporal/duration.js.map +1 -1
- package/dist/temporal/instant.d.ts.map +1 -1
- package/dist/temporal/instant.js +2 -1
- package/dist/temporal/instant.js.map +1 -1
- package/dist/temporal/plain-date-time.d.ts.map +1 -1
- package/dist/temporal/plain-date-time.js +2 -1
- package/dist/temporal/plain-date-time.js.map +1 -1
- package/dist/temporal/plain-date.d.ts.map +1 -1
- package/dist/temporal/plain-date.js +2 -1
- package/dist/temporal/plain-date.js.map +1 -1
- package/dist/temporal/plain-time.d.ts.map +1 -1
- package/dist/temporal/plain-time.js +2 -1
- package/dist/temporal/plain-time.js.map +1 -1
- package/dist/temporal/zoned-date-time.d.ts.map +1 -1
- package/dist/temporal/zoned-date-time.js +2 -1
- package/dist/temporal/zoned-date-time.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/zod-util.d.ts +55 -6
- package/dist/zod-util.d.ts.map +1 -1
- package/dist/zod-util.js +99 -11
- package/dist/zod-util.js.map +1 -1
- 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 {
|
|
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
|
-
|
|
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)
|
|
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
|
|
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.
|
|
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
|
-
|
|
95
|
-
|
|
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
|
-
|
|
243
|
+
navigate,
|
|
208
244
|
parseString2 as parseString,
|
|
209
|
-
toLiteral
|
|
245
|
+
toLiteral,
|
|
246
|
+
update
|
|
210
247
|
};
|
|
211
248
|
//# sourceMappingURL=url.js.map
|
package/dist/net/url.js.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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;
|
|
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"}
|
package/dist/object/type-path.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
235
|
-
|
|
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
|
package/dist/object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0E,SAAS,IAAI,eAAe,EAAE,MAAM,WAAW,CAAA;AAEhI,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC/E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAMpD,eAAO,MAAM,WAAW,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,SAErD,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,IAEhD,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,IAAI,GAAG,SAEtD,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAE7D,CAAA;AAED,eAAO,MAAM,QAAQ,GAAI,QAAQ,GAAG,KAAG,KAAK,IAAI,UAAU,CAAC,OAAO,CAOjE,CAAA;AAGD,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,KAAG,OAE1E,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,QAAQ,OAAO,EAAE,QAAQ,OAAO,KAAG,OAsD5D,CAAA;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;CAAa,CAAA;AAEnC,eAAO,MAAM,SAAS,oBAAa,CAAA;AAEnC,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAA;AAChG,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAC5I,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAC7D,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,GAChB,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAC3C,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EACvE,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE,QAAQ,GAChB,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAKtD,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,KAAG,CAEnD,CAAA;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,GAAG,OAAO,CAErH;AAED,eAAO,MAAM,aAAa,EAAE,OAAO,eAGlC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAClF,aAAa,EAAE,aAAa,CAAA;IAC5B,eAAe,EAAE,aAAa,CAAA;CAC/B,CAAA;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAuB7F;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,WAAW,EAAE,KAAK,MAAM,KAAG,KAAK,IAAI,MAAM,OAAO,GAElF,CAAA;AAED,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAC/D,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,GACf,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC;KAAG,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAErE;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,GAAG,KAAG,KAAK,IAAI,SAEjD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,OAAO,GAAG,KAAG,KAAK,IAAI,SAE7C,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OAEnD,CAAA;AA4BD,MAAM,MAAM,eAAe,CAAC,IAAI,GAAG,OAAO,EAAE,KAAK,SAAS,MAAM,GAAG,iBAAiB,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AACzH,KAAK,mBAAmB,CAAC,SAAS,IAAI,SAAS,SAAS,eAAe,CAAC,MAAM,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,KAAK,CAAA;AAE1G,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,QAAQ,aAAa,EAAE,WAAW,CAAC,KAAG,mBAAmB,CAAC,CAAC,CAAC,GAAG,SAEvI,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,KAAG,CAAC,GAAG,SAE9D,CAAA"}
|
|
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
|
package/dist/object.js.map
CHANGED
|
@@ -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:
|
|
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
|
package/dist/promise.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"
|
|
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
|
package/dist/promise.js.map
CHANGED
|
@@ -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:
|
|
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":[]}
|
package/dist/proxy.d.ts
ADDED
|
@@ -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"}
|