@byline/core 0.9.3
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/LICENSE +373 -0
- package/README.md +17 -0
- package/dist/@types/admin-types.d.ts +275 -0
- package/dist/@types/admin-types.d.ts.map +1 -0
- package/dist/@types/admin-types.js +18 -0
- package/dist/@types/admin-types.js.map +1 -0
- package/dist/@types/collection-types.d.ts +816 -0
- package/dist/@types/collection-types.d.ts.map +1 -0
- package/dist/@types/collection-types.js +217 -0
- package/dist/@types/collection-types.js.map +1 -0
- package/dist/@types/db-types.d.ts +463 -0
- package/dist/@types/db-types.d.ts.map +1 -0
- package/dist/@types/db-types.js +2 -0
- package/dist/@types/db-types.js.map +1 -0
- package/dist/@types/field-data-types.d.ts +147 -0
- package/dist/@types/field-data-types.d.ts.map +1 -0
- package/dist/@types/field-data-types.js +38 -0
- package/dist/@types/field-data-types.js.map +1 -0
- package/dist/@types/field-types.d.ts +579 -0
- package/dist/@types/field-types.d.ts.map +1 -0
- package/dist/@types/field-types.js +32 -0
- package/dist/@types/field-types.js.map +1 -0
- package/dist/@types/index.d.ts +18 -0
- package/dist/@types/index.d.ts.map +1 -0
- package/dist/@types/index.js +18 -0
- package/dist/@types/index.js.map +1 -0
- package/dist/@types/populate-types.d.ts +54 -0
- package/dist/@types/populate-types.d.ts.map +1 -0
- package/dist/@types/populate-types.js +9 -0
- package/dist/@types/populate-types.js.map +1 -0
- package/dist/@types/query-predicate.d.ts +74 -0
- package/dist/@types/query-predicate.d.ts.map +1 -0
- package/dist/@types/query-predicate.js +9 -0
- package/dist/@types/query-predicate.js.map +1 -0
- package/dist/@types/site-config.d.ts +212 -0
- package/dist/@types/site-config.d.ts.map +1 -0
- package/dist/@types/site-config.js +9 -0
- package/dist/@types/site-config.js.map +1 -0
- package/dist/@types/storage-types.d.ts +86 -0
- package/dist/@types/storage-types.d.ts.map +1 -0
- package/dist/@types/storage-types.js +9 -0
- package/dist/@types/storage-types.js.map +1 -0
- package/dist/@types/store-types.d.ts +134 -0
- package/dist/@types/store-types.d.ts.map +1 -0
- package/dist/@types/store-types.js +24 -0
- package/dist/@types/store-types.js.map +1 -0
- package/dist/@types/type-utils.d.ts +17 -0
- package/dist/@types/type-utils.d.ts.map +1 -0
- package/dist/@types/type-utils.js +9 -0
- package/dist/@types/type-utils.js.map +1 -0
- package/dist/auth/apply-before-read.d.ts +36 -0
- package/dist/auth/apply-before-read.d.ts.map +1 -0
- package/dist/auth/apply-before-read.js +68 -0
- package/dist/auth/apply-before-read.js.map +1 -0
- package/dist/auth/apply-before-read.test.node.d.ts +9 -0
- package/dist/auth/apply-before-read.test.node.d.ts.map +1 -0
- package/dist/auth/apply-before-read.test.node.js +144 -0
- package/dist/auth/apply-before-read.test.node.js.map +1 -0
- package/dist/auth/assert-actor-can-perform.d.ts +39 -0
- package/dist/auth/assert-actor-can-perform.d.ts.map +1 -0
- package/dist/auth/assert-actor-can-perform.js +64 -0
- package/dist/auth/assert-actor-can-perform.js.map +1 -0
- package/dist/auth/assert-actor-can-perform.test.node.d.ts +9 -0
- package/dist/auth/assert-actor-can-perform.test.node.d.ts.map +1 -0
- package/dist/auth/assert-actor-can-perform.test.node.js +119 -0
- package/dist/auth/assert-actor-can-perform.test.node.js.map +1 -0
- package/dist/auth/index.d.ts +11 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +11 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/register-collection-abilities.d.ts +40 -0
- package/dist/auth/register-collection-abilities.d.ts.map +1 -0
- package/dist/auth/register-collection-abilities.js +87 -0
- package/dist/auth/register-collection-abilities.js.map +1 -0
- package/dist/auth/register-collection-abilities.test.node.d.ts +9 -0
- package/dist/auth/register-collection-abilities.test.node.d.ts.map +1 -0
- package/dist/auth/register-collection-abilities.test.node.js +124 -0
- package/dist/auth/register-collection-abilities.test.node.js.map +1 -0
- package/dist/config/config.d.ts +10 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +108 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/routes.d.ts +16 -0
- package/dist/config/routes.d.ts.map +1 -0
- package/dist/config/routes.js +26 -0
- package/dist/config/routes.js.map +1 -0
- package/dist/config/validate-admin-configs.d.ts +33 -0
- package/dist/config/validate-admin-configs.d.ts.map +1 -0
- package/dist/config/validate-admin-configs.js +250 -0
- package/dist/config/validate-admin-configs.js.map +1 -0
- package/dist/config/validate-admin-configs.test.node.d.ts +9 -0
- package/dist/config/validate-admin-configs.test.node.d.ts.map +1 -0
- package/dist/config/validate-admin-configs.test.node.js +224 -0
- package/dist/config/validate-admin-configs.test.node.js.map +1 -0
- package/dist/config/validate-collections.d.ts +33 -0
- package/dist/config/validate-collections.d.ts.map +1 -0
- package/dist/config/validate-collections.js +70 -0
- package/dist/config/validate-collections.js.map +1 -0
- package/dist/config/validate-collections.test.node.d.ts +9 -0
- package/dist/config/validate-collections.test.node.d.ts.map +1 -0
- package/dist/config/validate-collections.test.node.js +149 -0
- package/dist/config/validate-collections.test.node.js.map +1 -0
- package/dist/core.d.ts +89 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +99 -0
- package/dist/core.js.map +1 -0
- package/dist/defaults/default-values.d.ts +13 -0
- package/dist/defaults/default-values.d.ts.map +1 -0
- package/dist/defaults/default-values.js +60 -0
- package/dist/defaults/default-values.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/errors.d.ts +98 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +134 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/logger.d.ts +62 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +120 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/registry.d.ts +65 -0
- package/dist/lib/registry.d.ts.map +1 -0
- package/dist/lib/registry.js +133 -0
- package/dist/lib/registry.js.map +1 -0
- package/dist/logger/index.d.ts +3 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/patches/apply-patches.d.ts +21 -0
- package/dist/patches/apply-patches.d.ts.map +1 -0
- package/dist/patches/apply-patches.js +357 -0
- package/dist/patches/apply-patches.js.map +1 -0
- package/dist/patches/index.d.ts +3 -0
- package/dist/patches/index.d.ts.map +1 -0
- package/dist/patches/index.js +4 -0
- package/dist/patches/index.js.map +1 -0
- package/dist/patches/patch-types.d.ts +82 -0
- package/dist/patches/patch-types.d.ts.map +1 -0
- package/dist/patches/patch-types.js +3 -0
- package/dist/patches/patch-types.js.map +1 -0
- package/dist/patches/patch.test.node.d.ts +2 -0
- package/dist/patches/patch.test.node.d.ts.map +1 -0
- package/dist/patches/patch.test.node.js +193 -0
- package/dist/patches/patch.test.node.js.map +1 -0
- package/dist/query/parse-where.d.ts +100 -0
- package/dist/query/parse-where.d.ts.map +1 -0
- package/dist/query/parse-where.js +352 -0
- package/dist/query/parse-where.js.map +1 -0
- package/dist/query/parse-where.test.node.d.ts +9 -0
- package/dist/query/parse-where.test.node.d.ts.map +1 -0
- package/dist/query/parse-where.test.node.js +581 -0
- package/dist/query/parse-where.test.node.js.map +1 -0
- package/dist/schemas/zod/builder.d.ts +466 -0
- package/dist/schemas/zod/builder.d.ts.map +1 -0
- package/dist/schemas/zod/builder.js +276 -0
- package/dist/schemas/zod/builder.js.map +1 -0
- package/dist/schemas/zod/cache.d.ts +14 -0
- package/dist/schemas/zod/cache.d.ts.map +1 -0
- package/dist/schemas/zod/cache.js +40 -0
- package/dist/schemas/zod/cache.js.map +1 -0
- package/dist/schemas/zod/index.d.ts +4 -0
- package/dist/schemas/zod/index.d.ts.map +1 -0
- package/dist/schemas/zod/index.js +4 -0
- package/dist/schemas/zod/index.js.map +1 -0
- package/dist/schemas/zod/types.d.ts +13 -0
- package/dist/schemas/zod/types.d.ts.map +1 -0
- package/dist/schemas/zod/types.js +2 -0
- package/dist/schemas/zod/types.js.map +1 -0
- package/dist/services/collection-bootstrap.d.ts +46 -0
- package/dist/services/collection-bootstrap.d.ts.map +1 -0
- package/dist/services/collection-bootstrap.js +108 -0
- package/dist/services/collection-bootstrap.js.map +1 -0
- package/dist/services/collection-bootstrap.test.node.d.ts +9 -0
- package/dist/services/collection-bootstrap.test.node.d.ts.map +1 -0
- package/dist/services/collection-bootstrap.test.node.js +208 -0
- package/dist/services/collection-bootstrap.test.node.js.map +1 -0
- package/dist/services/document-lifecycle.d.ts +245 -0
- package/dist/services/document-lifecycle.d.ts.map +1 -0
- package/dist/services/document-lifecycle.js +481 -0
- package/dist/services/document-lifecycle.js.map +1 -0
- package/dist/services/document-lifecycle.test.node.d.ts +9 -0
- package/dist/services/document-lifecycle.test.node.d.ts.map +1 -0
- package/dist/services/document-lifecycle.test.node.js +781 -0
- package/dist/services/document-lifecycle.test.node.js.map +1 -0
- package/dist/services/document-read.d.ts +26 -0
- package/dist/services/document-read.d.ts.map +1 -0
- package/dist/services/document-read.js +60 -0
- package/dist/services/document-read.js.map +1 -0
- package/dist/services/field-upload.d.ts +100 -0
- package/dist/services/field-upload.d.ts.map +1 -0
- package/dist/services/field-upload.js +328 -0
- package/dist/services/field-upload.js.map +1 -0
- package/dist/services/field-upload.test.node.d.ts +9 -0
- package/dist/services/field-upload.test.node.d.ts.map +1 -0
- package/dist/services/field-upload.test.node.js +337 -0
- package/dist/services/field-upload.test.node.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +11 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/populate.d.ts +299 -0
- package/dist/services/populate.d.ts.map +1 -0
- package/dist/services/populate.js +484 -0
- package/dist/services/populate.js.map +1 -0
- package/dist/services/populate.test.node.d.ts +9 -0
- package/dist/services/populate.test.node.d.ts.map +1 -0
- package/dist/services/populate.test.node.js +910 -0
- package/dist/services/populate.test.node.js.map +1 -0
- package/dist/services/relation-projection.d.ts +52 -0
- package/dist/services/relation-projection.d.ts.map +1 -0
- package/dist/services/relation-projection.js +81 -0
- package/dist/services/relation-projection.js.map +1 -0
- package/dist/services/richtext-populate.d.ts +87 -0
- package/dist/services/richtext-populate.d.ts.map +1 -0
- package/dist/services/richtext-populate.js +189 -0
- package/dist/services/richtext-populate.js.map +1 -0
- package/dist/services/richtext-populate.test.node.d.ts +9 -0
- package/dist/services/richtext-populate.test.node.d.ts.map +1 -0
- package/dist/services/richtext-populate.test.node.js +197 -0
- package/dist/services/richtext-populate.test.node.js.map +1 -0
- package/dist/storage/collection-fingerprint.d.ts +21 -0
- package/dist/storage/collection-fingerprint.d.ts.map +1 -0
- package/dist/storage/collection-fingerprint.js +172 -0
- package/dist/storage/collection-fingerprint.js.map +1 -0
- package/dist/storage/collection-fingerprint.test.node.d.ts +9 -0
- package/dist/storage/collection-fingerprint.test.node.d.ts.map +1 -0
- package/dist/storage/collection-fingerprint.test.node.js +256 -0
- package/dist/storage/collection-fingerprint.test.node.js.map +1 -0
- package/dist/storage/field-store-map.d.ts +59 -0
- package/dist/storage/field-store-map.d.ts.map +1 -0
- package/dist/storage/field-store-map.js +75 -0
- package/dist/storage/field-store-map.js.map +1 -0
- package/dist/storage/field-store-map.test.node.d.ts +9 -0
- package/dist/storage/field-store-map.test.node.d.ts.map +1 -0
- package/dist/storage/field-store-map.test.node.js +117 -0
- package/dist/storage/field-store-map.test.node.js.map +1 -0
- package/dist/storage/index.d.ts +10 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +10 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/utils/normalise-dates.d.ts +15 -0
- package/dist/utils/normalise-dates.d.ts.map +1 -0
- package/dist/utils/normalise-dates.js +22 -0
- package/dist/utils/normalise-dates.js.map +1 -0
- package/dist/utils/slugify.d.ts +56 -0
- package/dist/utils/slugify.d.ts.map +1 -0
- package/dist/utils/slugify.js +91 -0
- package/dist/utils/slugify.js.map +1 -0
- package/dist/utils/slugify.test.node.d.ts +9 -0
- package/dist/utils/slugify.test.node.d.ts.map +1 -0
- package/dist/utils/slugify.test.node.js +86 -0
- package/dist/utils/slugify.test.node.js.map +1 -0
- package/dist/utils/storage-utils.d.ts +36 -0
- package/dist/utils/storage-utils.d.ts.map +1 -0
- package/dist/utils/storage-utils.js +38 -0
- package/dist/utils/storage-utils.js.map +1 -0
- package/dist/utils/utils.general.d.ts +64 -0
- package/dist/utils/utils.general.d.ts.map +1 -0
- package/dist/utils/utils.general.js +219 -0
- package/dist/utils/utils.general.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/shared.d.ts +36 -0
- package/dist/validation/shared.d.ts.map +1 -0
- package/dist/validation/shared.js +42 -0
- package/dist/validation/shared.js.map +1 -0
- package/dist/workflow/index.d.ts +2 -0
- package/dist/workflow/index.d.ts.map +1 -0
- package/dist/workflow/index.js +3 -0
- package/dist/workflow/index.js.map +1 -0
- package/dist/workflow/workflow.d.ts +40 -0
- package/dist/workflow/workflow.d.ts.map +1 -0
- package/dist/workflow/workflow.js +96 -0
- package/dist/workflow/workflow.js.map +1 -0
- package/dist/workflow/workflow.test.node.d.ts +2 -0
- package/dist/workflow/workflow.test.node.d.ts.map +1 -0
- package/dist/workflow/workflow.test.node.js +198 -0
- package/dist/workflow/workflow.test.node.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This Source Code is subject to the terms of the Mozilla Public
|
|
3
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
4
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Infonomic Company Limited
|
|
7
|
+
*
|
|
8
|
+
* Typed dependency injection registry. Ported from the Modulus project
|
|
9
|
+
* (https://github.com/infonomic/modulus) with permission.
|
|
10
|
+
*
|
|
11
|
+
* Provides compile-time validation of dependency graphs via TypeScript
|
|
12
|
+
* conditional types. Services declare their dependencies via constructor
|
|
13
|
+
* or factory signatures; the registry validates that all requirements
|
|
14
|
+
* are satisfied before composition.
|
|
15
|
+
*/
|
|
16
|
+
export class Registry {
|
|
17
|
+
providers = [];
|
|
18
|
+
addClass(name, value) {
|
|
19
|
+
this.providers.push({
|
|
20
|
+
type: 'class',
|
|
21
|
+
name,
|
|
22
|
+
value,
|
|
23
|
+
});
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
addFactory(name, value) {
|
|
27
|
+
this.providers.push({
|
|
28
|
+
type: 'factory',
|
|
29
|
+
name,
|
|
30
|
+
value,
|
|
31
|
+
});
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
addValue(name, value) {
|
|
35
|
+
this.providers.push({
|
|
36
|
+
type: 'value',
|
|
37
|
+
name,
|
|
38
|
+
value,
|
|
39
|
+
});
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
addNested(name, nested) {
|
|
43
|
+
this.providers.push({ type: 'nested', name, value: nested });
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
compose(requirements) {
|
|
47
|
+
const result = {};
|
|
48
|
+
const context = { ...requirements };
|
|
49
|
+
for (const { type, name, value } of this.providers) {
|
|
50
|
+
if (type === 'value') {
|
|
51
|
+
context[name] = result[name] = value;
|
|
52
|
+
}
|
|
53
|
+
else if (type === 'class') {
|
|
54
|
+
context[name] = result[name] = new value(context);
|
|
55
|
+
}
|
|
56
|
+
else if (type === 'factory') {
|
|
57
|
+
context[name] = result[name] = value(context);
|
|
58
|
+
}
|
|
59
|
+
else if (type === 'nested') {
|
|
60
|
+
const nestedResult = value.compose(context);
|
|
61
|
+
context[name] = result[name] = nestedResult;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class AsyncRegistry {
|
|
68
|
+
providers = [];
|
|
69
|
+
addClass(name, value) {
|
|
70
|
+
this.providers.push({
|
|
71
|
+
type: 'class',
|
|
72
|
+
name,
|
|
73
|
+
value,
|
|
74
|
+
});
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
addAsyncClass(name, value) {
|
|
78
|
+
this.providers.push({
|
|
79
|
+
type: 'async-class',
|
|
80
|
+
name,
|
|
81
|
+
value,
|
|
82
|
+
});
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
addFactory(name, value) {
|
|
86
|
+
this.providers.push({
|
|
87
|
+
type: 'factory',
|
|
88
|
+
name,
|
|
89
|
+
value,
|
|
90
|
+
});
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
addValue(name, value) {
|
|
94
|
+
this.providers.push({
|
|
95
|
+
type: 'value',
|
|
96
|
+
name,
|
|
97
|
+
value,
|
|
98
|
+
});
|
|
99
|
+
return this;
|
|
100
|
+
}
|
|
101
|
+
addNested(name, nested) {
|
|
102
|
+
this.providers.push({ type: 'nested', name, value: nested });
|
|
103
|
+
return this;
|
|
104
|
+
}
|
|
105
|
+
addNestedAsync(name, nested) {
|
|
106
|
+
this.providers.push({ type: 'nested', name, value: nested });
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
async compose(requirements) {
|
|
110
|
+
const result = {};
|
|
111
|
+
const context = { ...requirements };
|
|
112
|
+
for (const { type, name, value } of this.providers) {
|
|
113
|
+
if (type === 'value') {
|
|
114
|
+
context[name] = result[name] = await value;
|
|
115
|
+
}
|
|
116
|
+
else if (type === 'class') {
|
|
117
|
+
context[name] = result[name] = new value(context);
|
|
118
|
+
}
|
|
119
|
+
else if (type === 'async-class') {
|
|
120
|
+
context[name] = result[name] = await value.create(context);
|
|
121
|
+
}
|
|
122
|
+
else if (type === 'factory') {
|
|
123
|
+
context[name] = result[name] = await value(context);
|
|
124
|
+
}
|
|
125
|
+
else if (type === 'nested') {
|
|
126
|
+
const nestedResult = await value.compose(context);
|
|
127
|
+
context[name] = result[name] = nestedResult;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAA;AACzB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,OAAO,EACP,QAAQ,EACR,kBAAkB,GACnB,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/logger/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,cAAc,GACf,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CollectionDefinition } from '../@types/collection-types.js';
|
|
2
|
+
import type { Field } from '../@types/field-types.js';
|
|
3
|
+
import type { ApplyPatchesResult, DocumentPatch, PatchPath } from './patch-types.js';
|
|
4
|
+
interface PathSegmentField {
|
|
5
|
+
kind: 'field';
|
|
6
|
+
key: string;
|
|
7
|
+
}
|
|
8
|
+
interface PathSegmentIndex {
|
|
9
|
+
kind: 'index';
|
|
10
|
+
index: number;
|
|
11
|
+
}
|
|
12
|
+
interface PathSegmentId {
|
|
13
|
+
kind: 'id';
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
type PathSegment = PathSegmentField | PathSegmentIndex | PathSegmentId;
|
|
17
|
+
export declare function parsePatchPath(path: PatchPath): PathSegment[];
|
|
18
|
+
export declare function resolveFieldForPath(definition: CollectionDefinition | null | undefined, path: PatchPath): Field | null;
|
|
19
|
+
export declare function applyPatches(definition: CollectionDefinition, doc: Record<string, any>, patches: DocumentPatch[]): ApplyPatchesResult;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=apply-patches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-patches.d.ts","sourceRoot":"","sources":["../../src/patches/apply-patches.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAe,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,KAAK,EACV,kBAAkB,EAGlB,aAAa,EAGb,SAAS,EACV,MAAM,kBAAkB,CAAA;AAEzB,UAAU,gBAAgB;IACxB,IAAI,EAAE,OAAO,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,UAAU,gBAAgB;IACxB,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd;AAED,UAAU,aAAa;IACrB,IAAI,EAAE,IAAI,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;CACX;AAED,KAAK,WAAW,GAAG,gBAAgB,GAAG,gBAAgB,GAAG,aAAa,CAAA;AAOtE,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,EAAE,CAgC7D;AAKD,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACnD,IAAI,EAAE,SAAS,GACd,KAAK,GAAG,IAAI,CAkDd;AAmOD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,oBAAoB,EAChC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxB,OAAO,EAAE,aAAa,EAAE,GACvB,kBAAkB,CAsDpB"}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
// Core implementation of the patch engine
|
|
2
|
+
import { isBlocksField, isStructureField } from '../@types/field-types.js';
|
|
3
|
+
// Very small path grammar:
|
|
4
|
+
// - "foo.bar" -> [{field: 'foo'}, {field: 'bar'}]
|
|
5
|
+
// - "reviews[0].rating" -> [{field: 'reviews'}, {index: 0}, {field: 'rating'}]
|
|
6
|
+
// - "reviews[id=abc].rating" -> [{field: 'reviews'}, {id: 'abc'}, {field: 'rating'}]
|
|
7
|
+
// - "content[id=xyz]" -> [{field: 'content'}, {id: 'xyz'}]
|
|
8
|
+
export function parsePatchPath(path) {
|
|
9
|
+
if (!path)
|
|
10
|
+
return [];
|
|
11
|
+
const segments = [];
|
|
12
|
+
const parts = String(path).split('.');
|
|
13
|
+
for (const part of parts) {
|
|
14
|
+
const fieldMatch = part.match(/^([^[]+)/);
|
|
15
|
+
if (!fieldMatch) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const field = fieldMatch[1];
|
|
19
|
+
segments.push({ kind: 'field', key: field });
|
|
20
|
+
const bracketRegex = /\[([^\]]+)\]/g;
|
|
21
|
+
let match;
|
|
22
|
+
// Biome: avoid assignment in the while condition
|
|
23
|
+
// eslint-disable-next-line no-constant-condition
|
|
24
|
+
while (true) {
|
|
25
|
+
match = bracketRegex.exec(part);
|
|
26
|
+
if (match === null)
|
|
27
|
+
break;
|
|
28
|
+
const token = match[1];
|
|
29
|
+
if (/^\d+$/.test(token)) {
|
|
30
|
+
segments.push({ kind: 'index', index: Number.parseInt(token, 10) });
|
|
31
|
+
}
|
|
32
|
+
else if (token.startsWith('id=')) {
|
|
33
|
+
segments.push({ kind: 'id', id: token.slice(3) });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return segments;
|
|
38
|
+
}
|
|
39
|
+
// Very small, best-effort resolver that walks the CollectionDefinition to find
|
|
40
|
+
// the field targeted by a patch path. This is intentionally conservative and
|
|
41
|
+
// currently only understands top-level fields and simple nested paths.
|
|
42
|
+
export function resolveFieldForPath(definition, path) {
|
|
43
|
+
if (!definition || !path)
|
|
44
|
+
return null;
|
|
45
|
+
const segments = parsePatchPath(path);
|
|
46
|
+
if (segments.length === 0)
|
|
47
|
+
return null;
|
|
48
|
+
const [first, ...rest] = segments;
|
|
49
|
+
if (!first || first.kind !== 'field')
|
|
50
|
+
return null;
|
|
51
|
+
let current = definition.fields.find((f) => f.name === first.key);
|
|
52
|
+
if (!current)
|
|
53
|
+
return null;
|
|
54
|
+
for (const segment of rest) {
|
|
55
|
+
if (!current)
|
|
56
|
+
return null;
|
|
57
|
+
if (segment.kind === 'index') {
|
|
58
|
+
// Index segments step into array/block children
|
|
59
|
+
if (isStructureField(current)) {
|
|
60
|
+
// For array/blocks fields, stay at the container level
|
|
61
|
+
// so the next field segment can find a child field.
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
else if (segment.kind === 'field') {
|
|
67
|
+
if (isBlocksField(current)) {
|
|
68
|
+
// BlocksField: search across all blocks' child fields by name.
|
|
69
|
+
// The segment may match a field in any of the block variants.
|
|
70
|
+
const blocksField = current;
|
|
71
|
+
let found;
|
|
72
|
+
for (const block of blocksField.blocks ?? []) {
|
|
73
|
+
found = block.fields.find((f) => f.name === segment.key);
|
|
74
|
+
if (found)
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
current = found;
|
|
78
|
+
}
|
|
79
|
+
else if (isStructureField(current) && current.fields) {
|
|
80
|
+
// Search child fields — handles array and group
|
|
81
|
+
current = current.fields.find((f) => f.name === segment.key);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else if (segment.kind === 'id') {
|
|
88
|
+
// ID-addressed arrays/blocks — stay at current level
|
|
89
|
+
if (isStructureField(current)) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return current ?? null;
|
|
96
|
+
}
|
|
97
|
+
function getBySegments(root, segments) {
|
|
98
|
+
let current = root;
|
|
99
|
+
let parent = null;
|
|
100
|
+
let key = null;
|
|
101
|
+
for (const segment of segments) {
|
|
102
|
+
parent = current;
|
|
103
|
+
if (parent == null) {
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
if (segment.kind === 'field') {
|
|
107
|
+
key = segment.key;
|
|
108
|
+
current = parent[key];
|
|
109
|
+
}
|
|
110
|
+
else if (segment.kind === 'index') {
|
|
111
|
+
if (!Array.isArray(parent)) {
|
|
112
|
+
throw new Error(`Expected array when resolving index segment in path`);
|
|
113
|
+
}
|
|
114
|
+
key = segment.index;
|
|
115
|
+
current = parent[segment.index];
|
|
116
|
+
}
|
|
117
|
+
else if (segment.kind === 'id') {
|
|
118
|
+
if (!Array.isArray(parent)) {
|
|
119
|
+
throw new Error(`Expected array when resolving id segment in path`);
|
|
120
|
+
}
|
|
121
|
+
const foundIndex = parent.findIndex((item) => item && item._id === segment.id);
|
|
122
|
+
if (foundIndex === -1) {
|
|
123
|
+
throw new Error(`Item with id=${segment.id} not found in array`);
|
|
124
|
+
}
|
|
125
|
+
key = foundIndex;
|
|
126
|
+
current = parent[foundIndex];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { parent, key };
|
|
130
|
+
}
|
|
131
|
+
function ensurePath(root, segments) {
|
|
132
|
+
if (segments.length === 0) {
|
|
133
|
+
return { parent: root, key: null };
|
|
134
|
+
}
|
|
135
|
+
let current = root;
|
|
136
|
+
let parent = null;
|
|
137
|
+
let key = null;
|
|
138
|
+
for (let i = 0; i < segments.length; i++) {
|
|
139
|
+
const segment = segments[i];
|
|
140
|
+
const next = segments[i + 1];
|
|
141
|
+
parent = current;
|
|
142
|
+
if (segment.kind === 'field') {
|
|
143
|
+
key = segment.key;
|
|
144
|
+
if (parent == null) {
|
|
145
|
+
throw new Error('ensurePath encountered null/undefined parent before field segment');
|
|
146
|
+
}
|
|
147
|
+
// If this field is followed by an index/id segment, it represents
|
|
148
|
+
// an array-like field (e.g. "content[0]", "reviews[id=...]"),
|
|
149
|
+
// so initialise it as [] when missing. Otherwise initialise as {}.
|
|
150
|
+
const isArrayLikeNext = next && (next.kind === 'index' || next.kind === 'id');
|
|
151
|
+
if (parent[key] === undefined || parent[key] === null) {
|
|
152
|
+
parent[key] = isArrayLikeNext ? [] : {};
|
|
153
|
+
}
|
|
154
|
+
current = parent[key];
|
|
155
|
+
}
|
|
156
|
+
else if (segment.kind === 'index') {
|
|
157
|
+
if (parent == null) {
|
|
158
|
+
throw new Error('ensurePath encountered null/undefined parent before index segment');
|
|
159
|
+
}
|
|
160
|
+
if (!Array.isArray(parent)) {
|
|
161
|
+
throw new Error('ensurePath expected array parent for index segment');
|
|
162
|
+
}
|
|
163
|
+
key = segment.index;
|
|
164
|
+
if (parent[key] === undefined || parent[key] === null) {
|
|
165
|
+
parent[key] = {};
|
|
166
|
+
}
|
|
167
|
+
current = parent[key];
|
|
168
|
+
}
|
|
169
|
+
else if (segment.kind === 'id') {
|
|
170
|
+
if (parent == null) {
|
|
171
|
+
throw new Error('ensurePath encountered null/undefined parent before id segment');
|
|
172
|
+
}
|
|
173
|
+
if (!Array.isArray(parent)) {
|
|
174
|
+
throw new Error('ensurePath expected array parent for id segment');
|
|
175
|
+
}
|
|
176
|
+
let idx = parent.findIndex((item) => item && item._id === segment.id);
|
|
177
|
+
if (idx === -1) {
|
|
178
|
+
idx = parent.length;
|
|
179
|
+
parent.push({ _id: segment.id });
|
|
180
|
+
}
|
|
181
|
+
key = idx;
|
|
182
|
+
current = parent[idx];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return { parent, key };
|
|
186
|
+
}
|
|
187
|
+
function applyFieldPatch(doc, patch) {
|
|
188
|
+
const segments = parsePatchPath(patch.path);
|
|
189
|
+
if (segments.length === 0) {
|
|
190
|
+
throw new Error('Empty path for field patch');
|
|
191
|
+
}
|
|
192
|
+
if (patch.kind === 'field.set') {
|
|
193
|
+
const { parent, key } = ensurePath(doc, segments);
|
|
194
|
+
if (key === null)
|
|
195
|
+
throw new Error('Invalid target for field.set');
|
|
196
|
+
parent[key] = patch.value;
|
|
197
|
+
}
|
|
198
|
+
else if (patch.kind === 'field.clear') {
|
|
199
|
+
const { parent, key } = getBySegments(doc, segments);
|
|
200
|
+
if (parent && key !== null && Object.hasOwn(parent, key)) {
|
|
201
|
+
if (Array.isArray(parent) && typeof key === 'number') {
|
|
202
|
+
parent.splice(key, 1);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
delete parent[key];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function resolveArrayAtPath(doc, path) {
|
|
211
|
+
const segments = parsePatchPath(path);
|
|
212
|
+
const { parent, key } = ensurePath(doc, segments);
|
|
213
|
+
if (key === null) {
|
|
214
|
+
throw new Error('Array path must point to an array field');
|
|
215
|
+
}
|
|
216
|
+
if (!Array.isArray(parent[key])) {
|
|
217
|
+
parent[key] = [];
|
|
218
|
+
}
|
|
219
|
+
return parent[key];
|
|
220
|
+
}
|
|
221
|
+
function applyArrayPatch(doc, patch, definition) {
|
|
222
|
+
const array = resolveArrayAtPath(doc, patch.path);
|
|
223
|
+
if (patch.kind === 'array.insert') {
|
|
224
|
+
const index = patch.index ?? array.length;
|
|
225
|
+
array.splice(index, 0, patch.item);
|
|
226
|
+
}
|
|
227
|
+
else if (patch.kind === 'array.move') {
|
|
228
|
+
const currentIndex = array.findIndex((item) => item && item._id === patch.itemId);
|
|
229
|
+
// Fallback for arrays without stable ids: treat itemId as an index
|
|
230
|
+
const index = currentIndex === -1 ? Number.parseInt(patch.itemId, 10) : currentIndex;
|
|
231
|
+
if (!Number.isFinite(index) || index < 0 || index >= array.length) {
|
|
232
|
+
throw new Error(`array.move: item with idOrIndex=${patch.itemId} not found`);
|
|
233
|
+
}
|
|
234
|
+
const [moved] = array.splice(index, 1);
|
|
235
|
+
const toIndex = patch.toIndex ?? array.length;
|
|
236
|
+
array.splice(toIndex, 0, moved);
|
|
237
|
+
}
|
|
238
|
+
else if (patch.kind === 'array.remove') {
|
|
239
|
+
const index = array.findIndex((item) => item && item._id === patch.itemId);
|
|
240
|
+
if (index === -1) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
array.splice(index, 1);
|
|
244
|
+
}
|
|
245
|
+
else if (patch.kind === 'array.updateItem') {
|
|
246
|
+
const index = array.findIndex((item) => item && item._id === patch.itemId);
|
|
247
|
+
if (index === -1) {
|
|
248
|
+
throw new Error(`array.updateItem: item with id=${patch.itemId} not found`);
|
|
249
|
+
}
|
|
250
|
+
const current = array[index];
|
|
251
|
+
const { doc: updated, errors } = applyPatches(definition, current, patch.patches);
|
|
252
|
+
if (errors.length > 0) {
|
|
253
|
+
throw new Error(`array.updateItem produced nested errors: ${errors.map((e) => e.message).join('; ')}`);
|
|
254
|
+
}
|
|
255
|
+
array[index] = updated;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
function applyBlockPatch(doc, patch, definition) {
|
|
259
|
+
// Blocks are just arrays of objects with stable ids under the hood.
|
|
260
|
+
const array = resolveArrayAtPath(doc, patch.path);
|
|
261
|
+
if (patch.kind === 'block.add') {
|
|
262
|
+
const _id = crypto.randomUUID();
|
|
263
|
+
const base = { _id, _type: patch.blockType };
|
|
264
|
+
if (patch.initialValue && typeof patch.initialValue === 'object') {
|
|
265
|
+
Object.assign(base, patch.initialValue);
|
|
266
|
+
}
|
|
267
|
+
const index = patch.index ?? array.length;
|
|
268
|
+
array.splice(index, 0, base);
|
|
269
|
+
}
|
|
270
|
+
else if (patch.kind === 'block.move') {
|
|
271
|
+
const index = array.findIndex((item) => item && item._id === patch.blockId);
|
|
272
|
+
if (index === -1) {
|
|
273
|
+
throw new Error(`block.move: block with id=${patch.blockId} not found`);
|
|
274
|
+
}
|
|
275
|
+
const [item] = array.splice(index, 1);
|
|
276
|
+
const toIndex = Math.max(0, Math.min(patch.toIndex, array.length));
|
|
277
|
+
array.splice(toIndex, 0, item);
|
|
278
|
+
}
|
|
279
|
+
else if (patch.kind === 'block.remove') {
|
|
280
|
+
const index = array.findIndex((item) => item && item._id === patch.blockId);
|
|
281
|
+
if (index === -1) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
array.splice(index, 1);
|
|
285
|
+
}
|
|
286
|
+
else if (patch.kind === 'block.updateField') {
|
|
287
|
+
const index = array.findIndex((item) => item && item._id === patch.blockId);
|
|
288
|
+
if (index === -1) {
|
|
289
|
+
throw new Error(`block.updateField: block with id=${patch.blockId} not found`);
|
|
290
|
+
}
|
|
291
|
+
const block = array[index];
|
|
292
|
+
const fieldPatch = {
|
|
293
|
+
kind: 'field.set',
|
|
294
|
+
path: patch.fieldPath,
|
|
295
|
+
value: patch.value,
|
|
296
|
+
};
|
|
297
|
+
const { doc: updated, errors } = applyPatches(definition, block, [fieldPatch]);
|
|
298
|
+
if (errors.length > 0) {
|
|
299
|
+
throw new Error(`block.updateField produced nested errors: ${errors.map((e) => e.message).join('; ')}`);
|
|
300
|
+
}
|
|
301
|
+
array[index] = updated;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// Main entry point: apply all patches against a cloned document.
|
|
305
|
+
export function applyPatches(definition, doc, patches) {
|
|
306
|
+
const working = structuredClone(doc);
|
|
307
|
+
const errors = [];
|
|
308
|
+
const warnings = [];
|
|
309
|
+
patches.forEach((patch, index) => {
|
|
310
|
+
try {
|
|
311
|
+
// Best-effort schema-aware validation: warn (but don't reject) patches
|
|
312
|
+
// whose paths do not resolve against the collection definition. This is
|
|
313
|
+
// intentionally conservative — the resolver only understands a subset of
|
|
314
|
+
// the path grammar, so a null result does not necessarily mean the path
|
|
315
|
+
// is invalid.
|
|
316
|
+
const resolvedField = resolveFieldForPath(definition, patch.path);
|
|
317
|
+
if (!resolvedField) {
|
|
318
|
+
warnings.push({
|
|
319
|
+
index,
|
|
320
|
+
message: `Patch path could not be resolved against schema: ${String(patch.path ?? '')}`,
|
|
321
|
+
patch,
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
if (patch.kind === 'field.set' || patch.kind === 'field.clear') {
|
|
325
|
+
applyFieldPatch(working, patch);
|
|
326
|
+
}
|
|
327
|
+
else if (patch.kind === 'array.insert' ||
|
|
328
|
+
patch.kind === 'array.move' ||
|
|
329
|
+
patch.kind === 'array.remove' ||
|
|
330
|
+
patch.kind === 'array.updateItem') {
|
|
331
|
+
applyArrayPatch(working, patch, definition);
|
|
332
|
+
}
|
|
333
|
+
else if (patch.kind === 'block.add' ||
|
|
334
|
+
patch.kind === 'block.move' ||
|
|
335
|
+
patch.kind === 'block.remove' ||
|
|
336
|
+
patch.kind === 'block.updateField') {
|
|
337
|
+
applyBlockPatch(working, patch, definition);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
errors.push({
|
|
341
|
+
index,
|
|
342
|
+
message: `Unsupported patch kind: ${patch.kind}`,
|
|
343
|
+
patch,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch (err) {
|
|
348
|
+
errors.push({
|
|
349
|
+
index,
|
|
350
|
+
message: err instanceof Error ? err.message : 'Unknown patch error',
|
|
351
|
+
patch,
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
return { doc: working, errors, warnings };
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=apply-patches.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-patches.js","sourceRoot":"","sources":["../../src/patches/apply-patches.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/patches/index.ts"],"names":[],"mappings":"AAEA,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/patches/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AAEvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { CollectionDefinition } from '../@types/collection-types.js';
|
|
2
|
+
/** Dot-notation path addressing a field within a document. */
|
|
3
|
+
export type PatchPath = string;
|
|
4
|
+
export interface BasePatch {
|
|
5
|
+
opId?: string;
|
|
6
|
+
timestamp?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FieldSetPatch extends BasePatch {
|
|
9
|
+
kind: 'field.set';
|
|
10
|
+
path: PatchPath;
|
|
11
|
+
value: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface FieldClearPatch extends BasePatch {
|
|
14
|
+
kind: 'field.clear';
|
|
15
|
+
path: PatchPath;
|
|
16
|
+
}
|
|
17
|
+
export type FieldPatch = FieldSetPatch | FieldClearPatch;
|
|
18
|
+
export interface ArrayInsertPatch extends BasePatch {
|
|
19
|
+
kind: 'array.insert';
|
|
20
|
+
path: PatchPath;
|
|
21
|
+
index?: number;
|
|
22
|
+
item: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface ArrayMovePatch extends BasePatch {
|
|
25
|
+
kind: 'array.move';
|
|
26
|
+
path: PatchPath;
|
|
27
|
+
itemId: string;
|
|
28
|
+
toIndex: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ArrayRemovePatch extends BasePatch {
|
|
31
|
+
kind: 'array.remove';
|
|
32
|
+
path: PatchPath;
|
|
33
|
+
itemId: string;
|
|
34
|
+
}
|
|
35
|
+
export interface ArrayUpdateItemPatch extends BasePatch {
|
|
36
|
+
kind: 'array.updateItem';
|
|
37
|
+
path: PatchPath;
|
|
38
|
+
itemId: string;
|
|
39
|
+
patches: DocumentPatch[];
|
|
40
|
+
}
|
|
41
|
+
export type ArrayPatch = ArrayInsertPatch | ArrayMovePatch | ArrayRemovePatch | ArrayUpdateItemPatch;
|
|
42
|
+
export interface BlockAddPatch extends BasePatch {
|
|
43
|
+
kind: 'block.add';
|
|
44
|
+
path: PatchPath;
|
|
45
|
+
index?: number;
|
|
46
|
+
blockType: string;
|
|
47
|
+
initialValue?: unknown;
|
|
48
|
+
}
|
|
49
|
+
export interface BlockMovePatch extends BasePatch {
|
|
50
|
+
kind: 'block.move';
|
|
51
|
+
path: PatchPath;
|
|
52
|
+
blockId: string;
|
|
53
|
+
toIndex: number;
|
|
54
|
+
}
|
|
55
|
+
export interface BlockRemovePatch extends BasePatch {
|
|
56
|
+
kind: 'block.remove';
|
|
57
|
+
path: PatchPath;
|
|
58
|
+
blockId: string;
|
|
59
|
+
}
|
|
60
|
+
export interface BlockUpdateFieldPatch extends BasePatch {
|
|
61
|
+
kind: 'block.updateField';
|
|
62
|
+
path: PatchPath;
|
|
63
|
+
blockId: string;
|
|
64
|
+
fieldPath: PatchPath;
|
|
65
|
+
value: unknown;
|
|
66
|
+
}
|
|
67
|
+
export type BlockPatch = BlockAddPatch | BlockMovePatch | BlockRemovePatch | BlockUpdateFieldPatch;
|
|
68
|
+
export type DocumentPatch = FieldPatch | ArrayPatch | BlockPatch;
|
|
69
|
+
export interface PatchError {
|
|
70
|
+
index: number;
|
|
71
|
+
message: string;
|
|
72
|
+
patch: DocumentPatch;
|
|
73
|
+
}
|
|
74
|
+
export interface ApplyPatchesResult {
|
|
75
|
+
doc: unknown;
|
|
76
|
+
errors: PatchError[];
|
|
77
|
+
warnings: PatchError[];
|
|
78
|
+
}
|
|
79
|
+
export interface PatchContext {
|
|
80
|
+
definition: CollectionDefinition;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=patch-types.d.ts.map
|