@bessemer/cornerstone 0.5.77 → 0.5.79
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/object/object-diff.d.ts +16 -16
- package/dist/object/object-diff.d.ts.map +1 -1
- package/dist/object/object-diff.js.map +1 -1
- package/dist/object/object-path.d.ts +11 -11
- package/dist/object/object-path.d.ts.map +1 -1
- package/dist/object/object-path.js +36 -53
- package/dist/object/object-path.js.map +1 -1
- package/dist/object/type-path-type.d.ts +70 -0
- package/dist/object/type-path-type.d.ts.map +1 -0
- package/dist/object/type-path-type.js +1 -0
- package/dist/object/type-path-type.js.map +1 -0
- package/dist/object/type-path.d.ts +10 -8
- package/dist/object/type-path.d.ts.map +1 -1
- package/dist/object/type-path.js +221 -16
- package/dist/object/type-path.js.map +1 -1
- package/package.json +2 -1
@@ -1,37 +1,37 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import { ObjectPath } from '@bessemer/cornerstone/object/object-path';
|
2
|
+
import { ObjectPathType, TypePathGet } from '@bessemer/cornerstone/object/type-path-type';
|
3
3
|
export declare enum ObjectDiffType {
|
4
4
|
Add = "Add",
|
5
5
|
Remove = "Remove",
|
6
6
|
Update = "Update",
|
7
7
|
Move = "Move"
|
8
8
|
}
|
9
|
-
export type AddObjectDiff<N, T extends
|
9
|
+
export type AddObjectDiff<N, T extends ObjectPathType> = {
|
10
10
|
type: ObjectDiffType.Add;
|
11
11
|
path: ObjectPath<T>;
|
12
|
-
value:
|
12
|
+
value: TypePathGet<T, N>;
|
13
13
|
};
|
14
|
-
export type RemoveObjectDiff<N, T extends
|
14
|
+
export type RemoveObjectDiff<N, T extends ObjectPathType> = {
|
15
15
|
type: ObjectDiffType.Remove;
|
16
16
|
path: ObjectPath<T>;
|
17
|
-
originalValue:
|
17
|
+
originalValue: TypePathGet<T, N>;
|
18
18
|
};
|
19
|
-
export type UpdateObjectDiff<N, T extends
|
19
|
+
export type UpdateObjectDiff<N, T extends ObjectPathType> = {
|
20
20
|
type: ObjectDiffType.Update;
|
21
21
|
path: ObjectPath<T>;
|
22
|
-
value:
|
23
|
-
originalValue:
|
22
|
+
value: TypePathGet<T, N>;
|
23
|
+
originalValue: TypePathGet<T, N>;
|
24
24
|
};
|
25
|
-
export type MoveObjectDiff<N, T extends
|
25
|
+
export type MoveObjectDiff<N, T extends ObjectPathType> = {
|
26
26
|
type: ObjectDiffType.Move;
|
27
27
|
path: ObjectPath<T>;
|
28
|
-
value:
|
28
|
+
value: TypePathGet<T, N>;
|
29
29
|
position: number;
|
30
30
|
originalPosition: number;
|
31
31
|
};
|
32
|
-
export type ObjectDiffEntry<N, T extends
|
33
|
-
export type ObjectDiff<N> = Array<ObjectDiffEntry<N>>;
|
34
|
-
export declare const add: <N, T extends
|
35
|
-
export declare const remove: <N, T extends
|
36
|
-
export declare const update: <N, T extends
|
32
|
+
export type ObjectDiffEntry<N, T extends ObjectPathType> = AddObjectDiff<N, T> | RemoveObjectDiff<N, T> | UpdateObjectDiff<N, T> | MoveObjectDiff<N, T>;
|
33
|
+
export type ObjectDiff<N> = Array<ObjectDiffEntry<N, ObjectPathType>>;
|
34
|
+
export declare const add: <N, T extends ObjectPathType>(path: ObjectPath<T>, value: TypePathGet<T, N>) => AddObjectDiff<N, T>;
|
35
|
+
export declare const remove: <N, T extends ObjectPathType>(path: ObjectPath<T>, originalValue: TypePathGet<T, N>) => RemoveObjectDiff<N, T>;
|
36
|
+
export declare const update: <N, T extends ObjectPathType>(path: ObjectPath<T>, value: TypePathGet<T, N>, originalValue: TypePathGet<T, N>) => UpdateObjectDiff<N, T>;
|
37
37
|
//# sourceMappingURL=object-diff.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"object-diff.d.ts","sourceRoot":"","sources":["../../src/object/object-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
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,cAAc,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAA;AAEzF,oBAAY,cAAc;IACxB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,cAAc,IAAI;IACvD,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,cAAc,IAAI;IAC1D,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,cAAc,IAAI;IAC1D,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,cAAc,IAAI;IACxD,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,cAAc,IACnD,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,EAAE,cAAc,CAAC,CAAC,CAAA;AAErE,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,SAAS,cAAc,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,CAAC,EAAE,CAAC,CAElH,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,SAAS,cAAc,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,eAAe,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAEhI,CAAA;AAED,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,CAAC,SAAS,cAAc,EAChD,MAAM,UAAU,CAAC,CAAC,CAAC,EACnB,OAAO,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EACxB,eAAe,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAC/B,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAEvB,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/object/object-diff.ts"],"sourcesContent":["import {
|
1
|
+
{"version":3,"sources":["../../src/object/object-diff.ts"],"sourcesContent":["import { ObjectPath } from '@bessemer/cornerstone/object/object-path'\nimport { ObjectPathType, TypePathGet } from '@bessemer/cornerstone/object/type-path-type'\n\nexport enum ObjectDiffType {\n Add = 'Add',\n Remove = 'Remove',\n Update = 'Update',\n Move = 'Move',\n}\n\nexport type AddObjectDiff<N, T extends ObjectPathType> = {\n type: ObjectDiffType.Add\n path: ObjectPath<T>\n value: TypePathGet<T, N>\n}\n\nexport type RemoveObjectDiff<N, T extends ObjectPathType> = {\n type: ObjectDiffType.Remove\n path: ObjectPath<T>\n originalValue: TypePathGet<T, N>\n}\n\nexport type UpdateObjectDiff<N, T extends ObjectPathType> = {\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 ObjectPathType> = {\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 ObjectPathType> =\n | AddObjectDiff<N, T>\n | RemoveObjectDiff<N, T>\n | UpdateObjectDiff<N, T>\n | MoveObjectDiff<N, T>\n\nexport type ObjectDiff<N> = Array<ObjectDiffEntry<N, ObjectPathType>>\n\nexport const add = <N, T extends ObjectPathType>(path: ObjectPath<T>, value: TypePathGet<T, N>): AddObjectDiff<N, T> => {\n return { type: ObjectDiffType.Add, path, value }\n}\n\nexport const remove = <N, T extends ObjectPathType>(path: ObjectPath<T>, originalValue: TypePathGet<T, N>): RemoveObjectDiff<N, T> => {\n return { type: ObjectDiffType.Remove, path, originalValue }\n}\n\nexport const update = <N, T extends ObjectPathType>(\n path: ObjectPath<T>,\n value: TypePathGet<T, N>,\n originalValue: TypePathGet<T, N>\n): UpdateObjectDiff<N, T> => {\n return { type: ObjectDiffType.Update, path, value, originalValue }\n}\n"],"mappings":";AAGO,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,MAAM,CAA8B,MAAqB,UAAkD;AACtH,SAAO,EAAE,MAAM,iBAAoB,MAAM,MAAM;AACjD;AAEO,IAAM,SAAS,CAA8B,MAAqB,kBAA6D;AACpI,SAAO,EAAE,MAAM,uBAAuB,MAAM,cAAc;AAC5D;AAEO,IAAM,SAAS,CACpB,MACA,OACA,kBAC2B;AAC3B,SAAO,EAAE,MAAM,uBAAuB,MAAM,OAAO,cAAc;AACnE;","names":["ObjectDiffType"]}
|
@@ -1,13 +1,13 @@
|
|
1
1
|
import Zod from 'zod';
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
|
5
|
-
export type
|
6
|
-
export
|
7
|
-
export declare const
|
8
|
-
export declare const
|
9
|
-
export declare const
|
10
|
-
export declare const
|
11
|
-
export declare const
|
12
|
-
export declare const
|
2
|
+
import { NominalType } from '@bessemer/cornerstone/types';
|
3
|
+
import { InferObjectPath, ObjectPathConcreteType, ObjectPathType, ParseObjectPath, TypePathGet, TypePathType } from '@bessemer/cornerstone/object/type-path-type';
|
4
|
+
import { TypePath } from '@bessemer/cornerstone/object/type-path';
|
5
|
+
export type ObjectPath<T extends ObjectPathType = ObjectPathType> = NominalType<ObjectPathConcreteType, ['TypePath', T]>;
|
6
|
+
export declare const of: <T extends ObjectPathConcreteType>(value: T) => ObjectPath<InferObjectPath<T>>;
|
7
|
+
export declare const fromString: <T extends string>(path: T) => ObjectPath<ParseObjectPath<T>>;
|
8
|
+
export declare const Schema: Zod.ZodPipe<Zod.ZodUnion<readonly [Zod.ZodArray<Zod.ZodString>, Zod.ZodString]>, Zod.ZodTransform<ObjectPath<ObjectPathType>, string | string[]>>;
|
9
|
+
export declare const getValue: <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N) => TypePathGet<T, N>;
|
10
|
+
export declare const applyValue: <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N, valueToApply: TypePathGet<T, N>) => N;
|
11
|
+
export declare const applyAnyValue: (path: ObjectPath, object: unknown, valueToApply: unknown) => unknown;
|
12
|
+
export declare const intersect: <TargetPath extends ObjectPathType, IntersectingPath extends TypePathType>(targetPath: ObjectPath<TargetPath>, intersectingPath: TypePath<IntersectingPath>) => ObjectPath;
|
13
13
|
//# sourceMappingURL=object-path.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../../src/object/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"object-path.d.ts","sourceRoot":"","sources":["../../src/object/object-path.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AACzD,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,cAAc,EACd,eAAe,EACf,WAAW,EACX,YAAY,EACb,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAIL,QAAQ,EACT,MAAM,wCAAwC,CAAA;AAM/C,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,WAAW,CAAC,sBAAsB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;AAExH,eAAO,MAAM,EAAE,GAAI,CAAC,SAAS,sBAAsB,EAAE,OAAO,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAE5F,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAanF,CAAA;AAED,eAAO,MAAM,MAAM,mJAMjB,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAEtG,CAAA;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,cAAc,EAAE,CAAC,EAAE,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,cAAc,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAEzH,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,UAAU,EAAE,QAAQ,OAAO,EAAE,cAAc,OAAO,KAAG,OAkBxF,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,UAAU,SAAS,cAAc,EAAE,gBAAgB,SAAS,YAAY,EAChG,YAAY,UAAU,CAAC,UAAU,CAAC,EAClC,kBAAkB,QAAQ,CAAC,gBAAgB,CAAC,KAC3C,UAEF,CAAA"}
|
@@ -1,86 +1,69 @@
|
|
1
1
|
// src/object/object-path.ts
|
2
2
|
import Zod from "zod";
|
3
|
-
import {
|
4
|
-
|
3
|
+
import {
|
4
|
+
fromString as typePathFromString,
|
5
|
+
getValue as typePathGetValue,
|
6
|
+
intersect as typePathIntersect
|
7
|
+
} from "@bessemer/cornerstone/object/type-path";
|
8
|
+
import { isEmpty, only } from "@bessemer/cornerstone/array";
|
5
9
|
import { assert } from "@bessemer/cornerstone/assertion";
|
6
|
-
import {
|
7
|
-
import {
|
10
|
+
import { produce } from "immer";
|
11
|
+
import { isObject } from "@bessemer/cornerstone/object";
|
8
12
|
var of = (value) => {
|
9
|
-
return value
|
13
|
+
return value;
|
10
14
|
};
|
11
|
-
var ObjectPathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\.[a-zA-Z_$][a-zA-Z0-9_$]*|\.\d+)*$/;
|
12
15
|
var fromString = (path) => {
|
13
|
-
|
14
|
-
|
16
|
+
const typePath = typePathFromString(path);
|
17
|
+
typePath.forEach((it) => {
|
18
|
+
assert(it !== "*", () => "ObjectPaths do not allow for wildcard selectors");
|
19
|
+
if (Array.isArray(it)) {
|
20
|
+
assert(it.length === 1, () => "ObjectPaths do not allow for multiple index selectors or array slices");
|
21
|
+
const value = only(it);
|
22
|
+
assert(value !== "*", () => "ObjectPaths do not allow for wildcard selectors");
|
23
|
+
}
|
24
|
+
});
|
25
|
+
return typePath;
|
15
26
|
};
|
16
|
-
var Schema = Zod.union([Zod.array(Zod.
|
27
|
+
var Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {
|
17
28
|
if (Array.isArray(it)) {
|
18
29
|
return of(it);
|
19
30
|
} else {
|
20
31
|
return fromString(it);
|
21
32
|
}
|
22
33
|
});
|
23
|
-
var getValue = (
|
24
|
-
|
25
|
-
if (result.isSuccess) {
|
26
|
-
return result.value;
|
27
|
-
} else {
|
28
|
-
throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
|
29
|
-
}
|
34
|
+
var getValue = (path, object) => {
|
35
|
+
return typePathGetValue(path, object);
|
30
36
|
};
|
31
|
-
var
|
32
|
-
|
33
|
-
if (result.isSuccess) {
|
34
|
-
return result.value;
|
35
|
-
} else {
|
36
|
-
return void 0;
|
37
|
-
}
|
37
|
+
var applyValue = (path, object, valueToApply) => {
|
38
|
+
return applyAnyValue(path, object, valueToApply);
|
38
39
|
};
|
39
|
-
var
|
40
|
+
var applyAnyValue = (path, object, valueToApply) => {
|
40
41
|
if (isEmpty(path)) {
|
41
42
|
return valueToApply;
|
42
43
|
}
|
43
44
|
return produce(object, (draft) => {
|
44
45
|
const rest = path.slice(0, -1);
|
45
46
|
const last = path[path.length - 1];
|
46
|
-
const parent =
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
var getValueResult = (object, path) => {
|
52
|
-
let value = object;
|
53
|
-
for (const key of path) {
|
54
|
-
if (Array.isArray(value)) {
|
55
|
-
const numberKey = Number(key);
|
56
|
-
if (numberKey < 0 || numberKey >= value.length) {
|
57
|
-
return failure();
|
58
|
-
}
|
59
|
-
value = value[numberKey];
|
60
|
-
} else if (isObject(value)) {
|
61
|
-
if (!(key in value)) {
|
62
|
-
return failure();
|
63
|
-
}
|
64
|
-
value = value[key];
|
47
|
+
const parent = getValue(of(rest), draft);
|
48
|
+
assert(isObject(parent) || Array.isArray(parent), () => `Unable to apply value: ${valueToApply} at ObjectPath: ${path} against object: ${object}`);
|
49
|
+
if (Array.isArray(last)) {
|
50
|
+
const index = only(last);
|
51
|
+
parent[index] = valueToApply;
|
65
52
|
} else {
|
66
|
-
|
53
|
+
parent[last] = valueToApply;
|
67
54
|
}
|
68
|
-
}
|
69
|
-
return success(value);
|
55
|
+
});
|
70
56
|
};
|
71
|
-
var
|
72
|
-
|
73
|
-
return;
|
74
|
-
} else {
|
75
|
-
throw new Error(`Unable to resolve ObjectPath: ${path} against record: ${JSON.stringify(object)}`);
|
76
|
-
}
|
57
|
+
var intersect = (targetPath, intersectingPath) => {
|
58
|
+
return typePathIntersect(targetPath, intersectingPath);
|
77
59
|
};
|
78
60
|
export {
|
79
61
|
Schema,
|
62
|
+
applyAnyValue,
|
80
63
|
applyValue,
|
81
|
-
findValue,
|
82
64
|
fromString,
|
83
65
|
getValue,
|
66
|
+
intersect,
|
84
67
|
of
|
85
68
|
};
|
86
69
|
//# sourceMappingURL=object-path.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/object/object-path.ts"],"sourcesContent":["import Zod from 'zod'\nimport {
|
1
|
+
{"version":3,"sources":["../../src/object/object-path.ts"],"sourcesContent":["import Zod from 'zod'\nimport { NominalType } from '@bessemer/cornerstone/types'\nimport {\n InferObjectPath,\n ObjectPathConcreteType,\n ObjectPathType,\n ParseObjectPath,\n TypePathGet,\n TypePathType,\n} from '@bessemer/cornerstone/object/type-path-type'\nimport {\n fromString as typePathFromString,\n getValue as typePathGetValue,\n intersect as typePathIntersect,\n TypePath,\n} from '@bessemer/cornerstone/object/type-path'\nimport { isEmpty, only } from '@bessemer/cornerstone/array'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport { produce } from 'immer'\nimport { isObject } from '@bessemer/cornerstone/object'\n\nexport type ObjectPath<T extends ObjectPathType = ObjectPathType> = NominalType<ObjectPathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends ObjectPathConcreteType>(value: T): ObjectPath<InferObjectPath<T>> => {\n return value as ObjectPath<InferObjectPath<T>>\n}\n\nexport const fromString = <T extends string>(path: T): ObjectPath<ParseObjectPath<T>> => {\n const typePath = typePathFromString(path)\n\n typePath.forEach((it) => {\n assert(it !== '*', () => 'ObjectPaths do not allow for wildcard selectors')\n if (Array.isArray(it)) {\n assert(it.length === 1, () => 'ObjectPaths do not allow for multiple index selectors or array slices')\n const value = only<string | number>(it)\n assert(value !== '*', () => 'ObjectPaths do not allow for wildcard selectors')\n }\n })\n\n return typePath as ObjectPath<ParseObjectPath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return fromString(it)\n }\n})\n\nexport const getValue = <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N): TypePathGet<T, N> => {\n return typePathGetValue(path, object)\n}\n\nexport const applyValue = <T extends ObjectPathType, N>(path: ObjectPath<T>, object: N, valueToApply: TypePathGet<T, N>): N => {\n return applyAnyValue(path, object, valueToApply) as N\n}\n\nexport const applyAnyValue = (path: ObjectPath, object: unknown, valueToApply: unknown): unknown => {\n if (isEmpty(path)) {\n return valueToApply\n }\n\n return produce(object, (draft) => {\n const rest = path.slice(0, -1)\n const last = path[path.length - 1]!\n const parent = getValue(of(rest), draft) as any\n\n assert(isObject(parent) || Array.isArray(parent), () => `Unable to apply value: ${valueToApply} at ObjectPath: ${path} against object: ${object}`)\n if (Array.isArray(last)) {\n const index = only(last)\n parent[index] = valueToApply\n } else {\n parent[last] = valueToApply\n }\n })\n}\n\nexport const intersect = <TargetPath extends ObjectPathType, IntersectingPath extends TypePathType>(\n targetPath: ObjectPath<TargetPath>,\n intersectingPath: TypePath<IntersectingPath>\n): ObjectPath => {\n return typePathIntersect(targetPath, intersectingPath) as ObjectPath\n}\n"],"mappings":";AAAA,OAAO,SAAS;AAUhB;AAAA,EACE,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,aAAa;AAAA,OAER;AACP,SAAS,SAAS,YAAY;AAC9B,SAAS,cAAc;AACvB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AAIlB,IAAM,KAAK,CAAmC,UAA6C;AAChG,SAAO;AACT;AAEO,IAAM,aAAa,CAAmB,SAA4C;AACvF,QAAM,WAAW,mBAAmB,IAAI;AAExC,WAAS,QAAQ,CAAC,OAAO;AACvB,WAAO,OAAO,KAAK,MAAM,iDAAiD;AAC1E,QAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,aAAO,GAAG,WAAW,GAAG,MAAM,uEAAuE;AACrG,YAAM,QAAQ,KAAsB,EAAE;AACtC,aAAO,UAAU,KAAK,MAAM,iDAAiD;AAAA,IAC/E;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,IAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO;AACzF,MAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,WAAO,GAAG,EAAE;AAAA,EACd,OAAO;AACL,WAAO,WAAW,EAAE;AAAA,EACtB;AACF,CAAC;AAEM,IAAM,WAAW,CAA8B,MAAqB,WAAiC;AAC1G,SAAO,iBAAiB,MAAM,MAAM;AACtC;AAEO,IAAM,aAAa,CAA8B,MAAqB,QAAW,iBAAuC;AAC7H,SAAO,cAAc,MAAM,QAAQ,YAAY;AACjD;AAEO,IAAM,gBAAgB,CAAC,MAAkB,QAAiB,iBAAmC;AAClG,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,CAAC,UAAU;AAChC,UAAM,OAAO,KAAK,MAAM,GAAG,EAAE;AAC7B,UAAM,OAAO,KAAK,KAAK,SAAS,CAAC;AACjC,UAAM,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK;AAEvC,WAAO,SAAS,MAAM,KAAK,MAAM,QAAQ,MAAM,GAAG,MAAM,0BAA0B,YAAY,mBAAmB,IAAI,oBAAoB,MAAM,EAAE;AACjJ,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,YAAM,QAAQ,KAAK,IAAI;AACvB,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF,CAAC;AACH;AAEO,IAAM,YAAY,CACvB,YACA,qBACe;AACf,SAAO,kBAAkB,YAAY,gBAAgB;AACvD;","names":[]}
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import { Arrayable } from 'type-fest';
|
2
|
+
export type TypePathParse<TPath extends string, TValue extends any> = TypePathGet<ParseTypePath<TPath>, TValue>;
|
3
|
+
export type NameSelector = string;
|
4
|
+
export type IndexSelector = Array<number>;
|
5
|
+
export type WildcardSelector = '*';
|
6
|
+
export type WildcardIndexSelector = ['*'];
|
7
|
+
export type ObjectPathSelector = NameSelector | IndexSelector;
|
8
|
+
export type TypePathSelector = ObjectPathSelector | WildcardSelector | WildcardIndexSelector;
|
9
|
+
export type ObjectPathConcreteType = Array<ObjectPathSelector>;
|
10
|
+
export type TypePathConcreteType = Array<TypePathSelector>;
|
11
|
+
export interface NameSelectorType<TKey extends string> {
|
12
|
+
type: 'NameSelector';
|
13
|
+
key: TKey;
|
14
|
+
}
|
15
|
+
export interface AnyNameSelectorType extends NameSelectorType<string> {
|
16
|
+
}
|
17
|
+
export interface IndexSelectorType<TIndex extends number> {
|
18
|
+
type: 'IndexSelector';
|
19
|
+
index: TIndex;
|
20
|
+
}
|
21
|
+
export interface AnyIndexSelectorType extends IndexSelectorType<number> {
|
22
|
+
}
|
23
|
+
export interface WildcardSelectorType {
|
24
|
+
type: 'WildcardSelector';
|
25
|
+
}
|
26
|
+
export interface AnyWildcardSelectorType extends WildcardSelectorType {
|
27
|
+
}
|
28
|
+
export interface ArraySliceSelectorType<TStart extends number | never = never, TEnd extends number | never = never, TStep extends number | never = never> {
|
29
|
+
type: 'ArraySliceSelector';
|
30
|
+
start: TStart;
|
31
|
+
end: TEnd;
|
32
|
+
step: TStep;
|
33
|
+
}
|
34
|
+
export interface AnySliceSelectorType extends ArraySliceSelectorType<any, any, any> {
|
35
|
+
}
|
36
|
+
type AnyObjectPathSelectorType = AnyIndexSelectorType | AnyNameSelectorType;
|
37
|
+
type AnyTypePathSelectorType = AnyObjectPathSelectorType | AnySliceSelectorType | AnyWildcardSelectorType;
|
38
|
+
type ParseBracketSelector<TInner extends string> = TInner extends `${infer TStart extends number}:${infer TEnd extends number}:${infer TStep extends number}` ? ArraySliceSelectorType<TStart, TEnd, TStep> : TInner extends `:${infer TEnd extends number}:${infer TStep extends number}` ? ArraySliceSelectorType<never, TEnd, TStep> : TInner extends `::${infer TStep extends number}` ? ArraySliceSelectorType<never, never, TStep> : TInner extends `${infer TStart extends number}:${infer TEnd extends number}` ? ArraySliceSelectorType<TStart, TEnd, never> : TInner extends `:${infer TEnd extends number}` ? ArraySliceSelectorType<never, TEnd, never> : TInner extends `${string}"${infer TKey}"${string}` ? NameSelectorType<FormatString<TKey>> : TInner extends `${string}'${infer TKey}'${string}` ? NameSelectorType<FormatString<TKey>> : TInner extends `${string}*${string}` ? WildcardSelectorType : TInner extends `${infer TStart extends number}` ? IndexSelectorType<TStart> : never;
|
39
|
+
type ParseBracketIndexInner<T> = T extends `${infer TFirst},${infer TRest}` ? [ParseBracketSelector<TFirst>, ...ParseBracketIndexInner<TRest>] : T extends `${infer TIndex}` ? [ParseBracketSelector<TIndex>] : [];
|
40
|
+
type ParsePathInner<TPathInner extends string> = TPathInner extends `*` ? [WildcardSelectorType] : TPathInner extends `[${infer TInner}]${infer TRest}` ? [ParseBracketIndexInner<TInner>, ...ParsePathInner<TRest>] : TPathInner extends `.${infer TKey}[${infer TRest}` ? [...ParsePathInner<TKey>, ...ParsePathInner<`[${TRest}`>] : TPathInner extends `.${infer TKey}` ? ParsePathInner<TKey> : TPathInner extends `${infer TKey}.${infer TRest}` ? [...ParsePathInner<TKey>, ...ParsePathInner<`.${TRest}`>] : TPathInner extends `${infer TKey}[${infer TInner}]${infer TRest}` ? [NameSelectorType<TKey>, ParseBracketIndexInner<TInner>, ...ParsePathInner<TRest>] : TPathInner extends '' ? [] : [NameSelectorType<TPathInner>];
|
41
|
+
export type ParseTypePath<TPath extends string> = ParsePathInner<TPath>;
|
42
|
+
type FilterObjectPathSelectors<T> = T extends readonly any[] ? {
|
43
|
+
[K in keyof T]: T[K] extends AnyObjectPathSelectorType ? T[K] : T[K] extends readonly any[] ? T[K] extends readonly AnyObjectPathSelectorType[] ? T[K]['length'] extends 1 ? T[K] : never : never : never;
|
44
|
+
} : never;
|
45
|
+
export type ParseObjectPath<TPath extends string> = FilterObjectPathSelectors<ParsePathInner<TPath>>;
|
46
|
+
export type ObjectPathType = Array<Arrayable<AnyObjectPathSelectorType>>;
|
47
|
+
export type TypePathType = Array<Arrayable<AnyTypePathSelectorType>>;
|
48
|
+
export type InferObjectPath<TPath extends TypePathConcreteType> = ObjectPathType;
|
49
|
+
export type InferTypePath<TPath extends TypePathConcreteType> = TypePathType;
|
50
|
+
type ExtractRecordSelection<TSelector extends AnyTypePathSelectorType, TValue extends AnyRecord> = TSelector extends AnyWildcardSelectorType ? Array<TValue[keyof TValue]> : TSelector extends NameSelectorType<infer TKey> ? TKey extends keyof TValue ? TValue[TKey] : never : never;
|
51
|
+
type ExtractArraySelection<TSelector extends AnyTypePathSelectorType, TValue extends AnyArray> = TSelector extends AnyWildcardSelectorType ? TValue : TSelector extends IndexSelectorType<infer TIndex> ? PickArray<TIndex, TValue> : TSelector extends ArraySliceSelectorType<infer TStart, infer TEnd> ? Slice<TValue, OrDefault<TStart, 0>, OrDefault<TEnd, TValue['length']>> : TSelector extends NameSelectorType<infer TKey> ? PickArrayField<TValue, TKey> : TSelector extends WildcardSelectorType ? TValue : [];
|
52
|
+
type ExtractMultipleArraySelections<TSelectors extends AnyTypePathSelectorType[], TValue extends AnyArray> = TSelectors['length'] extends 0 ? [] : TSelectors extends [infer TFirst, ...infer TRest] ? TFirst extends AnyTypePathSelectorType ? TRest extends AnyTypePathSelectorType[] ? [ExtractArraySelection<TFirst, TValue>, ...ExtractMultipleArraySelections<TRest, TValue>] : ExtractArraySelection<TFirst, TValue> : [] : [];
|
53
|
+
type ExtractSelection<TSelector extends AnyTypePathSelectorType | AnyTypePathSelectorType[], TValue> = TValue extends any ? TValue extends undefined ? undefined : TValue extends null ? undefined : TValue extends AnyArray ? TSelector extends AnyTypePathSelectorType[] ? TSelector['length'] extends 1 ? ExtractArraySelection<TSelector[0], Extract<TValue, AnyArray>> : ExtractMultipleArraySelections<TSelector, Extract<TValue, AnyArray>> : TSelector extends AnyTypePathSelectorType ? ExtractArraySelection<TSelector, Extract<TValue, AnyArray>> : never : TValue extends AnyRecord ? TSelector extends AnyTypePathSelectorType ? ExtractRecordSelection<TSelector, Extract<TValue, AnyRecord>> : never : never : never;
|
54
|
+
export type TypePathGet<TSelectors extends TypePathType, TValue> = TSelectors['length'] extends 0 ? TValue : TSelectors extends [infer TFirst, ...infer TRest] ? TFirst extends AnyTypePathSelectorType | AnyTypePathSelectorType[] ? TRest extends TypePathType ? TypePathGet<TRest, ExtractSelection<TFirst, TValue>> : ExtractSelection<TFirst, TValue> : [] : [];
|
55
|
+
type AnyRecord = Record<PropertyKey, any>;
|
56
|
+
type AnyArray = any[];
|
57
|
+
type StripWhitespace<T extends string> = T extends ` ${infer TRest}` ? StripWhitespace<TRest> : T extends `${infer TRest} ` ? StripWhitespace<TRest> : T;
|
58
|
+
type StripQuotes<T extends string> = T extends `'${infer TValue}'` ? TValue : T extends `"${infer TValue}"` ? TValue : T;
|
59
|
+
type FormatString<T extends string> = '' extends T ? never : StripQuotes<StripWhitespace<T>>;
|
60
|
+
type PickArray<TIndex extends number, TArray extends any[]> = TArray['length'] extends 0 ? never : TArray extends [...infer TRest, infer TLast] ? TIndex extends TRest['length'] ? TLast : PickArray<TIndex, TRest> : TArray extends Array<infer T> ? T | undefined : never;
|
61
|
+
type ToPositive<N extends number, Arr extends unknown[]> = `${N}` extends `-${infer P extends number}` ? Slice<Arr, P>['length'] : N;
|
62
|
+
type InitialN<Arr extends unknown[], N extends number, _Acc extends unknown[] = []> = _Acc['length'] extends N | Arr['length'] ? _Acc : InitialN<Arr, N, [..._Acc, Arr[_Acc['length']]]>;
|
63
|
+
type Slice<Arr extends unknown[], Start extends number = 0, End extends number = Arr['length']> = InitialN<Arr, ToPositive<End, Arr>> extends [
|
64
|
+
...InitialN<Arr, ToPositive<Start, Arr>>,
|
65
|
+
...infer Rest
|
66
|
+
] ? Rest : [];
|
67
|
+
type PickArrayField<TArr extends any[], TKey extends string> = TArr extends [infer TFirst, ...infer TRest] ? [TFirst[TKey & keyof TFirst], ...PickArrayField<TRest, TKey>] : TArr extends [] ? [] : TArr extends Array<infer T> ? Array<T extends any ? (TKey extends keyof T ? T[TKey] : undefined) : never> : [];
|
68
|
+
type OrDefault<T, D> = [T] extends [never] ? D : T;
|
69
|
+
export {};
|
70
|
+
//# sourceMappingURL=type-path-type.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"type-path-type.d.ts","sourceRoot":"","sources":["../../src/object/type-path-type.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
//# sourceMappingURL=type-path-type.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
@@ -1,10 +1,12 @@
|
|
1
|
-
import {
|
1
|
+
import { NominalType } from '@bessemer/cornerstone/types';
|
2
2
|
import Zod from 'zod';
|
3
|
-
import {
|
4
|
-
export type TypePathType =
|
5
|
-
export
|
6
|
-
export declare const
|
7
|
-
export declare const
|
8
|
-
export declare const
|
9
|
-
export declare const
|
3
|
+
import { InferTypePath, ParseTypePath, TypePathConcreteType, TypePathGet, TypePathSelector, TypePathType, WildcardIndexSelector, WildcardSelector } from '@bessemer/cornerstone/object/type-path-type';
|
4
|
+
export type TypePath<T extends TypePathType = TypePathType> = NominalType<TypePathConcreteType, ['TypePath', T]>;
|
5
|
+
export declare const of: <T extends TypePathConcreteType>(value: T) => TypePath<InferTypePath<T>>;
|
6
|
+
export declare const fromString: <T extends string>(path: T) => TypePath<ParseTypePath<T>>;
|
7
|
+
export declare const Schema: Zod.ZodPipe<Zod.ZodUnion<readonly [Zod.ZodArray<Zod.ZodString>, Zod.ZodString]>, Zod.ZodTransform<TypePath<TypePathType>, string | string[]>>;
|
8
|
+
export declare const getValue: <T extends TypePathType, N>(path: TypePath<T>, object: N) => TypePathGet<T, N>;
|
9
|
+
export declare const isWildcardSelector: (selector: TypePathSelector) => selector is WildcardSelector | WildcardIndexSelector;
|
10
|
+
export declare const matches: <IntersectingPath extends TypePathType>(targetPath: TypePath, matchingPath: TypePath<IntersectingPath>) => targetPath is TypePath<IntersectingPath>;
|
11
|
+
export declare const intersect: <TargetPath extends TypePathType, IntersectingPath extends TypePathType>(targetPath: TypePath<TargetPath>, intersectingPath: TypePath<IntersectingPath>) => TypePath;
|
10
12
|
//# sourceMappingURL=type-path.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"type-path.d.ts","sourceRoot":"","sources":["../../src/object/type-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
1
|
+
{"version":3,"file":"type-path.d.ts","sourceRoot":"","sources":["../../src/object/type-path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,OAAO,GAAG,MAAM,KAAK,CAAA;AACrB,OAAO,EAEL,aAAa,EAEb,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,6CAA6C,CAAA;AAKpD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI,WAAW,CAAC,oBAAoB,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAA;AAEhH,eAAO,MAAM,EAAE,GAAI,CAAC,SAAS,oBAAoB,EAAE,OAAO,CAAC,KAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAEtF,CAAA;AAKD,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,MAAM,EAAE,MAAM,CAAC,KAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAmE/E,CAAA;AAED,eAAO,MAAM,MAAM,+IAMjB,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAgClG,CAAA;AAsDD,eAAO,MAAM,kBAAkB,GAAI,UAAU,gBAAgB,KAAG,QAAQ,IAAI,gBAAgB,GAAG,qBAM9F,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,gBAAgB,SAAS,YAAY,EAC3D,YAAY,QAAQ,EACpB,cAAc,QAAQ,CAAC,gBAAgB,CAAC,KACvC,UAAU,IAAI,QAAQ,CAAC,gBAAgB,CA4CzC,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,QAgEF,CAAA"}
|
package/dist/object/type-path.js
CHANGED
@@ -1,13 +1,64 @@
|
|
1
1
|
// src/object/type-path.ts
|
2
2
|
import { assert } from "@bessemer/cornerstone/assertion";
|
3
3
|
import Zod from "zod";
|
4
|
+
import { isNil, isObject } from "@bessemer/cornerstone/object";
|
5
|
+
import { isNumber } from "@bessemer/cornerstone/math";
|
6
|
+
import { contains, containsAll, isEmpty, only } from "@bessemer/cornerstone/array";
|
4
7
|
var of = (value) => {
|
5
|
-
return value
|
8
|
+
return value;
|
6
9
|
};
|
7
|
-
var TypePathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\.[a-zA-Z_$][a-zA-Z0-9_$]
|
10
|
+
var TypePathRegex = /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\*|\d+|\[\s*(?:\*|\d+(?:\s*,\s*\d+)*)\s*])(?:\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\*|\d+)|\[\s*(?:\*|\d+(?:\s*,\s*\d+)*)\s*])*$|^$/;
|
8
11
|
var fromString = (path) => {
|
9
|
-
assert(TypePathRegex.test(path), () => `Unable to parse
|
10
|
-
|
12
|
+
assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`);
|
13
|
+
if (path === "") {
|
14
|
+
return [];
|
15
|
+
}
|
16
|
+
const segments = [];
|
17
|
+
let current = "";
|
18
|
+
let i = 0;
|
19
|
+
while (i < path.length) {
|
20
|
+
const char = path[i];
|
21
|
+
if (char === ".") {
|
22
|
+
if (current) {
|
23
|
+
segments.push(current);
|
24
|
+
current = "";
|
25
|
+
}
|
26
|
+
i++;
|
27
|
+
} else if (char === "[") {
|
28
|
+
if (current) {
|
29
|
+
segments.push(current);
|
30
|
+
current = "";
|
31
|
+
}
|
32
|
+
let bracketContent = "";
|
33
|
+
i++;
|
34
|
+
let depth = 1;
|
35
|
+
while (i < path.length && depth > 0) {
|
36
|
+
const bracketChar = path[i];
|
37
|
+
if (bracketChar === "[") {
|
38
|
+
depth++;
|
39
|
+
} else if (bracketChar === "]") {
|
40
|
+
depth--;
|
41
|
+
}
|
42
|
+
if (depth > 0) {
|
43
|
+
bracketContent += bracketChar;
|
44
|
+
}
|
45
|
+
i++;
|
46
|
+
}
|
47
|
+
if (bracketContent === "*") {
|
48
|
+
segments.push(["*"]);
|
49
|
+
} else {
|
50
|
+
const indices = bracketContent.split(",").map((s) => s.trim()).map((s) => parseInt(s, 10));
|
51
|
+
segments.push(indices);
|
52
|
+
}
|
53
|
+
} else {
|
54
|
+
current += char;
|
55
|
+
i++;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
if (current) {
|
59
|
+
segments.push(current);
|
60
|
+
}
|
61
|
+
return segments;
|
11
62
|
};
|
12
63
|
var Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {
|
13
64
|
if (Array.isArray(it)) {
|
@@ -16,28 +67,182 @@ var Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) =
|
|
16
67
|
return fromString(it);
|
17
68
|
}
|
18
69
|
});
|
19
|
-
var
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
const targetSegment = targetPath[i];
|
26
|
-
if (evaluatingSegment === "*") {
|
27
|
-
continue;
|
70
|
+
var getValue = (path, object) => {
|
71
|
+
let current = object;
|
72
|
+
let collectorMode = false;
|
73
|
+
for (const selector of path) {
|
74
|
+
if (isNil(current)) {
|
75
|
+
return void 0;
|
28
76
|
}
|
29
|
-
if (
|
30
|
-
|
77
|
+
if (collectorMode) {
|
78
|
+
if (!Array.isArray(current)) {
|
79
|
+
throw new Error("Illegal State - in collectorMode but current value is not an Array");
|
80
|
+
}
|
81
|
+
const result = current.flatMap((it) => {
|
82
|
+
const [value, isCollecting] = evaluateSelector(selector, it);
|
83
|
+
if (isCollecting) {
|
84
|
+
return value;
|
85
|
+
} else {
|
86
|
+
return [value];
|
87
|
+
}
|
88
|
+
});
|
89
|
+
current = result;
|
90
|
+
} else {
|
91
|
+
const [result, isCollecting] = evaluateSelector(selector, current);
|
92
|
+
current = result;
|
93
|
+
collectorMode = isCollecting;
|
31
94
|
}
|
32
|
-
|
95
|
+
}
|
96
|
+
return current;
|
97
|
+
};
|
98
|
+
var evaluateSelector = (selector, current) => {
|
99
|
+
if (isWildcardSelector(selector)) {
|
100
|
+
return evaluateWildcardSelector(current);
|
101
|
+
}
|
102
|
+
if (Array.isArray(selector)) {
|
103
|
+
return evaluateIndexSelector(selector, current);
|
104
|
+
}
|
105
|
+
return evaluateNameSelector(selector, current);
|
106
|
+
};
|
107
|
+
var evaluateNameSelector = (selector, current) => {
|
108
|
+
if (Array.isArray(current)) {
|
109
|
+
const numberSelector = Number(selector);
|
110
|
+
assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`);
|
111
|
+
return evaluateIndexSelector([numberSelector], current);
|
112
|
+
}
|
113
|
+
if (!isObject(current)) {
|
114
|
+
return [void 0, false];
|
115
|
+
}
|
116
|
+
return [current[selector], false];
|
117
|
+
};
|
118
|
+
var evaluateWildcardSelector = (current) => {
|
119
|
+
if (Array.isArray(current)) {
|
120
|
+
return [current, true];
|
121
|
+
}
|
122
|
+
if (isObject(current)) {
|
123
|
+
throw new Error("Wildcard operations on Objects is not yet supported");
|
124
|
+
}
|
125
|
+
throw new Error(`Unable to apply wildcard operator to value: ${current}`);
|
126
|
+
};
|
127
|
+
var evaluateIndexSelector = (selector, current) => {
|
128
|
+
if (!Array.isArray(current)) {
|
129
|
+
throw new Error(`Unable to apply index operator to value: ${current}`);
|
130
|
+
}
|
131
|
+
if (selector.length === 1) {
|
132
|
+
return [current[only(selector)], false];
|
133
|
+
}
|
134
|
+
const indexSelector = selector;
|
135
|
+
const result = indexSelector.map((it) => current[it]);
|
136
|
+
return [result, true];
|
137
|
+
};
|
138
|
+
var isWildcardSelector = (selector) => {
|
139
|
+
if (Array.isArray(selector) && selector.length === 1) {
|
140
|
+
return only(selector) === "*";
|
141
|
+
} else {
|
142
|
+
return selector === "*";
|
143
|
+
}
|
144
|
+
};
|
145
|
+
var matches = (targetPath, matchingPath) => {
|
146
|
+
assert(targetPath.length >= matchingPath.length, () => `TypePath: ${matchingPath} can't match target TypePath: ${targetPath}`);
|
147
|
+
let index = 0;
|
148
|
+
for (const targetPathSelector of targetPath) {
|
149
|
+
const matchingPathSelector = matchingPath[index];
|
150
|
+
if (isNil(matchingPathSelector)) {
|
151
|
+
return true;
|
152
|
+
} else if (isWildcardSelector(matchingPathSelector)) {
|
153
|
+
} else if (isWildcardSelector(targetPathSelector)) {
|
33
154
|
return false;
|
155
|
+
} else if (Array.isArray(matchingPathSelector)) {
|
156
|
+
if (Array.isArray(targetPathSelector)) {
|
157
|
+
if (!containsAll(matchingPathSelector, targetPathSelector)) {
|
158
|
+
return false;
|
159
|
+
}
|
160
|
+
} else {
|
161
|
+
if (!contains(matchingPathSelector, Number(targetPathSelector))) {
|
162
|
+
return false;
|
163
|
+
}
|
164
|
+
}
|
165
|
+
} else {
|
166
|
+
if (Array.isArray(targetPathSelector)) {
|
167
|
+
if (targetPathSelector.length !== 1) {
|
168
|
+
return false;
|
169
|
+
}
|
170
|
+
const targetPathSelectorIndex = only(targetPathSelector);
|
171
|
+
if (targetPathSelectorIndex !== Number(matchingPathSelector)) {
|
172
|
+
return false;
|
173
|
+
}
|
174
|
+
} else {
|
175
|
+
if (targetPathSelector !== matchingPathSelector) {
|
176
|
+
return false;
|
177
|
+
}
|
178
|
+
}
|
34
179
|
}
|
180
|
+
index++;
|
35
181
|
}
|
36
182
|
return true;
|
37
183
|
};
|
184
|
+
var intersect = (targetPath, intersectingPath) => {
|
185
|
+
assert(targetPath.length >= intersectingPath.length, () => `TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`);
|
186
|
+
let index = 0;
|
187
|
+
let result = [];
|
188
|
+
for (const targetPathSelector of targetPath) {
|
189
|
+
const intersectingPathSelector = intersectingPath[index];
|
190
|
+
if (isNil(intersectingPathSelector)) {
|
191
|
+
return of(result);
|
192
|
+
} else if (isWildcardSelector(intersectingPathSelector)) {
|
193
|
+
result.push(targetPathSelector);
|
194
|
+
} else if (isWildcardSelector(targetPathSelector)) {
|
195
|
+
result.push(intersectingPathSelector);
|
196
|
+
} else if (Array.isArray(intersectingPathSelector)) {
|
197
|
+
if (Array.isArray(targetPathSelector)) {
|
198
|
+
const filteredTargetPaths = targetPathSelector.filter((it) => contains(intersectingPathSelector, it));
|
199
|
+
if (isEmpty(filteredTargetPaths)) {
|
200
|
+
throw new Error(
|
201
|
+
`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`
|
202
|
+
);
|
203
|
+
}
|
204
|
+
result.push(filteredTargetPaths);
|
205
|
+
} else {
|
206
|
+
if (!contains(intersectingPathSelector, Number(targetPathSelector))) {
|
207
|
+
throw new Error(
|
208
|
+
`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`
|
209
|
+
);
|
210
|
+
}
|
211
|
+
result.push(targetPathSelector);
|
212
|
+
}
|
213
|
+
} else {
|
214
|
+
if (Array.isArray(targetPathSelector)) {
|
215
|
+
if (targetPathSelector.length !== 1) {
|
216
|
+
throw new Error(
|
217
|
+
`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`
|
218
|
+
);
|
219
|
+
}
|
220
|
+
const targetPathSelectorIndex = only(targetPathSelector);
|
221
|
+
if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {
|
222
|
+
throw new Error(
|
223
|
+
`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`
|
224
|
+
);
|
225
|
+
}
|
226
|
+
result.push(targetPathSelector);
|
227
|
+
} else {
|
228
|
+
if (targetPathSelector !== intersectingPathSelector) {
|
229
|
+
throw new Error(
|
230
|
+
`Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`
|
231
|
+
);
|
232
|
+
}
|
233
|
+
result.push(targetPathSelector);
|
234
|
+
}
|
235
|
+
}
|
236
|
+
index++;
|
237
|
+
}
|
238
|
+
return of(result);
|
239
|
+
};
|
38
240
|
export {
|
39
241
|
Schema,
|
40
242
|
fromString,
|
243
|
+
getValue,
|
244
|
+
intersect,
|
245
|
+
isWildcardSelector,
|
41
246
|
matches,
|
42
247
|
of
|
43
248
|
};
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { JoinPath, NominalType, ToStringArray } from '@bessemer/cornerstone/types'\nimport { assert } from '@bessemer/cornerstone/assertion'\nimport Zod from 'zod'\nimport { ObjectPath } from '@bessemer/cornerstone/object/object-path'\n\n// see https://github.com/sinclairnick/jsonpath-ts for type inference examples!\n\nexport type TypePathType = string\nexport type TypePath<T extends TypePathType = TypePathType> = NominalType<Array<string>, ['TypePath', T]>\n\nexport const of = <T extends Array<string | number>>(value: T): TypePath<JoinPath<ToStringArray<T>>> => {\n return value.map((it) => `${it}`) as TypePath<JoinPath<ToStringArray<T>>>\n}\n\nconst TypePathRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*(?:\\.[a-zA-Z_$][a-zA-Z0-9_$]*|\\[\\d+]|\\[\\*])*$/\n\nexport const fromString = <T extends TypePathType>(path: T): TypePath<T> => {\n assert(TypePathRegex.test(path), () => `Unable to parse ObjectPath from string: ${path}`)\n return of(path.split('.')) as TypePath<T>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return fromString(it)\n }\n})\n\nexport const matches = (evaluatingPath: TypePath, targetPath: TypePath | ObjectPath): boolean => {\n if (targetPath.length !== evaluatingPath.length) {\n return false\n }\n\n for (let i = 0; i < targetPath.length; i++) {\n const evaluatingSegment = evaluatingPath[i]\n const targetSegment = targetPath[i]\n\n if (evaluatingSegment === '*') {\n continue\n }\n\n if (targetSegment === '*') {\n return false\n }\n\n if (targetSegment !== evaluatingSegment) {\n return false\n }\n }\n\n return true\n}\n"],"mappings":";AACA,SAAS,cAAc;AACvB,OAAO,SAAS;AAQT,IAAM,KAAK,CAAmC,UAAmD;AACtG,SAAO,MAAM,IAAI,CAAC,OAAO,GAAG,EAAE,EAAE;AAClC;AAEA,IAAM,gBAAgB;AAEf,IAAM,aAAa,CAAyB,SAAyB;AAC1E,SAAO,cAAc,KAAK,IAAI,GAAG,MAAM,2CAA2C,IAAI,EAAE;AACxF,SAAO,GAAG,KAAK,MAAM,GAAG,CAAC;AAC3B;AAEO,IAAM,SAAS,IAAI,MAAM,CAAC,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO;AACzF,MAAI,MAAM,QAAQ,EAAE,GAAG;AACrB,WAAO,GAAG,EAAE;AAAA,EACd,OAAO;AACL,WAAO,WAAW,EAAE;AAAA,EACtB;AACF,CAAC;AAEM,IAAM,UAAU,CAAC,gBAA0B,eAA+C;AAC/F,MAAI,WAAW,WAAW,eAAe,QAAQ;AAC/C,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,oBAAoB,eAAe,CAAC;AAC1C,UAAM,gBAAgB,WAAW,CAAC;AAElC,QAAI,sBAAsB,KAAK;AAC7B;AAAA,IACF;AAEA,QAAI,kBAAkB,KAAK;AACzB,aAAO;AAAA,IACT;AAEA,QAAI,kBAAkB,mBAAmB;AACvC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
|
1
|
+
{"version":3,"sources":["../../src/object/type-path.ts"],"sourcesContent":["import { NominalType } 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 WildcardIndexSelector,\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'\n\nexport type TypePath<T extends TypePathType = TypePathType> = NominalType<TypePathConcreteType, ['TypePath', T]>\n\nexport const of = <T extends TypePathConcreteType>(value: T): TypePath<InferTypePath<T>> => {\n return value as TypePath<InferTypePath<T>>\n}\n\nconst TypePathRegex =\n /^(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])(?:\\.(?:[a-zA-Z_$][a-zA-Z0-9_$]*|\\*|\\d+)|\\[\\s*(?:\\*|\\d+(?:\\s*,\\s*\\d+)*)\\s*])*$|^$/\n\nexport const fromString = <T extends string>(path: T): TypePath<ParseTypePath<T>> => {\n assert(TypePathRegex.test(path), () => `Unable to parse TypePath from string: ${path}`)\n\n if (path === '') {\n return [] as TypePath<ParseTypePath<T>>\n }\n\n const segments: Array<string | Array<string | number>> = []\n let current = ''\n let i = 0\n\n while (i < path.length) {\n const char = path[i]\n\n if (char === '.') {\n if (current) {\n segments.push(current)\n current = ''\n }\n i++\n } else if (char === '[') {\n if (current) {\n segments.push(current)\n current = ''\n }\n\n // Find the matching closing bracket\n let bracketContent = ''\n i++ // Skip opening bracket\n let depth = 1\n\n while (i < path.length && depth > 0) {\n const bracketChar = path[i]\n if (bracketChar === '[') {\n depth++\n } else if (bracketChar === ']') {\n depth--\n }\n\n if (depth > 0) {\n bracketContent += bracketChar\n }\n i++\n }\n\n if (bracketContent === '*') {\n segments.push(['*'])\n } else {\n const indices = bracketContent\n .split(',')\n .map((s) => s.trim())\n .map((s) => parseInt(s, 10))\n\n segments.push(indices)\n }\n } else {\n current += char\n i++\n }\n }\n\n // Add any remaining current segment\n if (current) {\n segments.push(current)\n }\n\n return segments as TypePath<ParseTypePath<T>>\n}\n\nexport const Schema = Zod.union([Zod.array(Zod.string()), Zod.string()]).transform((it) => {\n if (Array.isArray(it)) {\n return of(it)\n } else {\n return fromString(it)\n }\n})\n\nexport const getValue = <T extends TypePathType, N>(path: TypePath<T>, object: N): TypePathGet<T, N> => {\n let current: unknown = object\n let collectorMode = false\n\n for (const selector of path) {\n if (isNil(current)) {\n return undefined as TypePathGet<T, N>\n }\n\n if (collectorMode) {\n if (!Array.isArray(current)) {\n throw new Error('Illegal State - in collectorMode but current value is not an Array')\n }\n\n const result = current.flatMap((it) => {\n const [value, isCollecting] = evaluateSelector(selector, it)\n if (isCollecting) {\n return value\n } else {\n return [value]\n }\n })\n\n current = result\n } else {\n const [result, isCollecting] = evaluateSelector(selector, current)\n current = result\n collectorMode = isCollecting\n }\n }\n\n return current as TypePathGet<T, N>\n}\n\nconst evaluateSelector = (selector: TypePathSelector, current: unknown): [unknown, boolean] => {\n if (isWildcardSelector(selector)) {\n return evaluateWildcardSelector(current)\n }\n\n if (Array.isArray(selector)) {\n return evaluateIndexSelector(selector as IndexSelector, current)\n }\n\n return evaluateNameSelector(selector, current)\n}\n\nconst evaluateNameSelector = (selector: NameSelector, current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n const numberSelector = Number(selector)\n assert(isNumber(numberSelector), () => `Can't apply non-numeric selector: ${selector} to array: ${current}`)\n return evaluateIndexSelector([numberSelector], current)\n }\n\n if (!isObject(current)) {\n return [undefined, false]\n }\n\n return [current[selector], false]\n}\n\nconst evaluateWildcardSelector = (current: unknown): [unknown, boolean] => {\n if (Array.isArray(current)) {\n return [current, true]\n }\n\n if (isObject(current)) {\n throw new Error('Wildcard operations on Objects is not yet supported')\n }\n\n throw new Error(`Unable to apply wildcard operator to value: ${current}`)\n}\n\nconst evaluateIndexSelector = (selector: IndexSelector, current: unknown): [unknown, boolean] => {\n if (!Array.isArray(current)) {\n throw new Error(`Unable to apply index operator to value: ${current}`)\n }\n\n if (selector.length === 1) {\n return [current[only(selector)], false]\n }\n\n const indexSelector = selector as IndexSelector\n const result = indexSelector.map((it) => current[it])\n return [result, true]\n}\n\nexport const isWildcardSelector = (selector: TypePathSelector): selector is WildcardSelector | WildcardIndexSelector => {\n if (Array.isArray(selector) && selector.length === 1) {\n return only<string | number>(selector) === '*'\n } else {\n return selector === '*'\n }\n}\n\nexport const matches = <IntersectingPath extends TypePathType>(\n targetPath: TypePath,\n matchingPath: TypePath<IntersectingPath>\n): targetPath is TypePath<IntersectingPath> => {\n assert(targetPath.length >= matchingPath.length, () => `TypePath: ${matchingPath} can't match target TypePath: ${targetPath}`)\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\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 assert(targetPath.length >= intersectingPath.length, () => `TypePath: ${intersectingPath} can't intersect target TypePath: ${targetPath}`)\n\n let index = 0\n let result: TypePathConcreteType = []\n for (const targetPathSelector of targetPath) {\n const intersectingPathSelector = intersectingPath[index]\n\n if (isNil(intersectingPathSelector)) {\n return of(result)\n } else if (isWildcardSelector(intersectingPathSelector)) {\n result.push(targetPathSelector)\n } else if (isWildcardSelector(targetPathSelector)) {\n result.push(intersectingPathSelector)\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 throw new Error(\n `Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`\n )\n }\n\n result.push(filteredTargetPaths)\n } else {\n if (!contains(intersectingPathSelector, Number(targetPathSelector))) {\n throw new Error(\n `Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`\n )\n }\n\n result.push(targetPathSelector)\n }\n } else {\n if (Array.isArray(targetPathSelector)) {\n if (targetPathSelector.length !== 1) {\n throw new Error(\n `Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`\n )\n }\n\n const targetPathSelectorIndex = only(targetPathSelector)\n if (targetPathSelectorIndex !== Number(intersectingPathSelector)) {\n throw new Error(\n `Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`\n )\n }\n\n result.push(targetPathSelector)\n } else {\n if (targetPathSelector !== intersectingPathSelector) {\n throw new Error(\n `Path mismatch when intersecting. targetPath: ${targetPathSelector} does not match intersectingPath: ${intersectingPathSelector}`\n )\n }\n\n result.push(targetPathSelector)\n }\n }\n\n index++\n }\n\n return of(result)\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@bessemer/cornerstone",
|
3
3
|
"type": "module",
|
4
|
-
"version": "0.5.
|
4
|
+
"version": "0.5.79",
|
5
5
|
"module": "./dist/index.js",
|
6
6
|
"types": "./dist/index.d.ts",
|
7
7
|
"sideEffects": false,
|
@@ -33,6 +33,7 @@
|
|
33
33
|
"zod": "4.0.15"
|
34
34
|
},
|
35
35
|
"devDependencies": {
|
36
|
+
"expect-type": "1.2.2",
|
36
37
|
"pino-pretty": "13.0.0"
|
37
38
|
},
|
38
39
|
"files": [
|