canopycms 0.0.34 → 0.0.35
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/ai/json-to-markdown.d.ts.map +1 -1
- package/dist/ai/json-to-markdown.js +4 -3
- package/dist/ai/json-to-markdown.js.map +1 -1
- package/dist/cli/generate-ai-content.js +34 -7
- package/dist/cli/init.js +12 -3
- package/dist/cli/template-files/schemas.ts.template +45 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schemas/field.d.ts +19 -0
- package/dist/config/schemas/field.d.ts.map +1 -1
- package/dist/config/schemas/field.js +9 -0
- package/dist/config/schemas/field.js.map +1 -1
- package/dist/config/types.d.ts +15 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +1 -0
- package/dist/config/types.js.map +1 -1
- package/dist/config/validation.d.ts +13 -0
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +130 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/content-store.d.ts.map +1 -1
- package/dist/content-store.js +6 -0
- package/dist/content-store.js.map +1 -1
- package/dist/editor/FormRenderer.d.ts.map +1 -1
- package/dist/editor/FormRenderer.js +6 -0
- package/dist/editor/FormRenderer.js.map +1 -1
- package/dist/editor/client-reference-resolver.d.ts.map +1 -1
- package/dist/editor/client-reference-resolver.js +2 -1
- package/dist/editor/client-reference-resolver.js.map +1 -1
- package/dist/editor/fields/InlineGroupField.d.ts +17 -0
- package/dist/editor/fields/InlineGroupField.d.ts.map +1 -0
- package/dist/editor/fields/InlineGroupField.js +16 -0
- package/dist/editor/fields/InlineGroupField.js.map +1 -0
- package/dist/editor/hooks/useReferenceResolution.d.ts.map +1 -1
- package/dist/editor/hooks/useReferenceResolution.js +2 -1
- package/dist/editor/hooks/useReferenceResolution.js.map +1 -1
- package/dist/entry-schema-registry.d.ts.map +1 -1
- package/dist/entry-schema-registry.js +4 -2
- package/dist/entry-schema-registry.js.map +1 -1
- package/dist/entry-schema.d.ts +69 -1
- package/dist/entry-schema.d.ts.map +1 -1
- package/dist/entry-schema.js +43 -0
- package/dist/entry-schema.js.map +1 -1
- package/dist/utils/body-field.d.ts.map +1 -1
- package/dist/utils/body-field.js +4 -3
- package/dist/utils/body-field.js.map +1 -1
- package/dist/utils/flatten-group-fields.d.ts +13 -0
- package/dist/utils/flatten-group-fields.d.ts.map +1 -0
- package/dist/utils/flatten-group-fields.js +23 -0
- package/dist/utils/flatten-group-fields.js.map +1 -0
- package/dist/utils/title-field.d.ts.map +1 -1
- package/dist/utils/title-field.js +55 -24
- package/dist/utils/title-field.js.map +1 -1
- package/dist/validation/deletion-checker.d.ts.map +1 -1
- package/dist/validation/deletion-checker.js +5 -0
- package/dist/validation/deletion-checker.js.map +1 -1
- package/dist/validation/field-traversal.d.ts.map +1 -1
- package/dist/validation/field-traversal.js +7 -1
- package/dist/validation/field-traversal.js.map +1 -1
- package/package.json +1 -1
package/dist/entry-schema.d.ts
CHANGED
|
@@ -18,6 +18,18 @@ type InferableField = {
|
|
|
18
18
|
/** For reference fields: collection paths to scope the search. */
|
|
19
19
|
collections?: readonly string[];
|
|
20
20
|
};
|
|
21
|
+
/**
|
|
22
|
+
* Recursively flatten inline groups (type: 'group') out of a field tuple so that
|
|
23
|
+
* InferContentShape sees only data-carrying fields. Inline groups contribute no
|
|
24
|
+
* key to the content shape — their children are merged into the parent level.
|
|
25
|
+
*/
|
|
26
|
+
type FlattenInlineGroups<Fields extends readonly InferableField[]> = Fields extends readonly [
|
|
27
|
+
infer Head,
|
|
28
|
+
...infer Rest extends readonly InferableField[]
|
|
29
|
+
] ? Head extends {
|
|
30
|
+
type: 'group';
|
|
31
|
+
fields: infer GFields extends readonly InferableField[];
|
|
32
|
+
} ? [...FlattenInlineGroups<GFields>, ...FlattenInlineGroups<Rest>] : [Head, ...FlattenInlineGroups<Rest>] : [];
|
|
21
33
|
type RequiredValue<F extends InferableField, V> = F['required'] extends false ? V | undefined : V;
|
|
22
34
|
type ScalarValue<F extends InferableField, V> = RequiredValue<F, F['list'] extends true ? V[] : V>;
|
|
23
35
|
type ObjectValue<F extends InferableField & {
|
|
@@ -77,11 +89,13 @@ type FieldValue<F extends InferableField> = F extends {
|
|
|
77
89
|
* - Blocks become arrays of tagged templates with their value shapes
|
|
78
90
|
* - Lists become arrays of the scalar/object type
|
|
79
91
|
* - Non-required fields include `undefined`
|
|
92
|
+
* - Inline groups (type: 'group') are flattened — their fields contribute directly
|
|
93
|
+
* to the parent shape with no intermediate key.
|
|
80
94
|
*
|
|
81
95
|
* Works with any structurally compatible array; importing FieldConfig is not required.
|
|
82
96
|
*/
|
|
83
97
|
type InferContentShape<Fields extends readonly InferableField[]> = {
|
|
84
|
-
[F in Fields[number] as F['name']]: FieldValue<F>;
|
|
98
|
+
[F in FlattenInlineGroups<Fields>[number] as F['name']]: FieldValue<F>;
|
|
85
99
|
};
|
|
86
100
|
/**
|
|
87
101
|
* Helper to define entry schema field arrays with literal inference without sprinkling `as const`.
|
|
@@ -91,5 +105,59 @@ export declare const defineEntrySchema: <const T extends readonly InferableField
|
|
|
91
105
|
* Convenience alias to derive the content shape from a `defineEntrySchema` result.
|
|
92
106
|
*/
|
|
93
107
|
export type TypeFromEntrySchema<T extends readonly InferableField[]> = InferContentShape<T>;
|
|
108
|
+
/**
|
|
109
|
+
* Define a reusable inline field group — a visual container in the editor that groups
|
|
110
|
+
* related fields together without creating a nested data key. The group's fields are
|
|
111
|
+
* stored flat alongside the other fields in the content file.
|
|
112
|
+
*
|
|
113
|
+
* Use this when you want consistent visual organization across schemas without
|
|
114
|
+
* changing your content file structure.
|
|
115
|
+
*
|
|
116
|
+
* For data-nested grouping (fields stored under a named key), use defineNestedFieldGroup().
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* const seoGroup = defineInlineFieldGroup({
|
|
120
|
+
* name: 'seo',
|
|
121
|
+
* label: 'SEO',
|
|
122
|
+
* fields: [
|
|
123
|
+
* { name: 'metaTitle', type: 'string', label: 'Meta Title' },
|
|
124
|
+
* { name: 'metaDescription', type: 'string', label: 'Meta Description' },
|
|
125
|
+
* ],
|
|
126
|
+
* })
|
|
127
|
+
* // TypeFromEntrySchema: { ..., metaTitle: string, metaDescription: string }
|
|
128
|
+
*/
|
|
129
|
+
export declare const defineInlineFieldGroup: <const T extends {
|
|
130
|
+
name: string;
|
|
131
|
+
label?: string;
|
|
132
|
+
description?: string;
|
|
133
|
+
fields: readonly InferableField[];
|
|
134
|
+
}>(group: T) => T & {
|
|
135
|
+
readonly type: "group";
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Define a reusable nested field group — a visual container in the editor that groups
|
|
139
|
+
* related fields under a named key in the content file.
|
|
140
|
+
*
|
|
141
|
+
* Use this when the fields logically belong together as a sub-object (e.g., seo.metaTitle)
|
|
142
|
+
* and you want that structure reflected in your content files.
|
|
143
|
+
*
|
|
144
|
+
* For visual-only grouping without data nesting, use defineInlineFieldGroup().
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* const seoGroup = defineNestedFieldGroup({
|
|
148
|
+
* name: 'seo',
|
|
149
|
+
* label: 'SEO',
|
|
150
|
+
* fields: [
|
|
151
|
+
* { name: 'metaTitle', type: 'string', label: 'Meta Title' },
|
|
152
|
+
* { name: 'metaDescription', type: 'string', label: 'Meta Description' },
|
|
153
|
+
* ],
|
|
154
|
+
* })
|
|
155
|
+
* // TypeFromEntrySchema: { ..., seo: { metaTitle: string, metaDescription: string } }
|
|
156
|
+
*/
|
|
157
|
+
export declare const defineNestedFieldGroup: <const T extends Omit<InferableField, "type"> & {
|
|
158
|
+
fields: readonly InferableField[];
|
|
159
|
+
}>(group: T) => T & {
|
|
160
|
+
readonly type: "object";
|
|
161
|
+
};
|
|
94
162
|
export {};
|
|
95
163
|
//# sourceMappingURL=entry-schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-schema.d.ts","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"entry-schema.d.ts","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"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"}
|
package/dist/entry-schema.js
CHANGED
|
@@ -2,4 +2,47 @@
|
|
|
2
2
|
* Helper to define entry schema field arrays with literal inference without sprinkling `as const`.
|
|
3
3
|
*/
|
|
4
4
|
export const defineEntrySchema = (fields) => fields;
|
|
5
|
+
/**
|
|
6
|
+
* Define a reusable inline field group — a visual container in the editor that groups
|
|
7
|
+
* related fields together without creating a nested data key. The group's fields are
|
|
8
|
+
* stored flat alongside the other fields in the content file.
|
|
9
|
+
*
|
|
10
|
+
* Use this when you want consistent visual organization across schemas without
|
|
11
|
+
* changing your content file structure.
|
|
12
|
+
*
|
|
13
|
+
* For data-nested grouping (fields stored under a named key), use defineNestedFieldGroup().
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* const seoGroup = defineInlineFieldGroup({
|
|
17
|
+
* name: 'seo',
|
|
18
|
+
* label: 'SEO',
|
|
19
|
+
* fields: [
|
|
20
|
+
* { name: 'metaTitle', type: 'string', label: 'Meta Title' },
|
|
21
|
+
* { name: 'metaDescription', type: 'string', label: 'Meta Description' },
|
|
22
|
+
* ],
|
|
23
|
+
* })
|
|
24
|
+
* // TypeFromEntrySchema: { ..., metaTitle: string, metaDescription: string }
|
|
25
|
+
*/
|
|
26
|
+
export const defineInlineFieldGroup = (group) => ({ ...group, type: 'group' });
|
|
27
|
+
/**
|
|
28
|
+
* Define a reusable nested field group — a visual container in the editor that groups
|
|
29
|
+
* related fields under a named key in the content file.
|
|
30
|
+
*
|
|
31
|
+
* Use this when the fields logically belong together as a sub-object (e.g., seo.metaTitle)
|
|
32
|
+
* and you want that structure reflected in your content files.
|
|
33
|
+
*
|
|
34
|
+
* For visual-only grouping without data nesting, use defineInlineFieldGroup().
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* const seoGroup = defineNestedFieldGroup({
|
|
38
|
+
* name: 'seo',
|
|
39
|
+
* label: 'SEO',
|
|
40
|
+
* fields: [
|
|
41
|
+
* { name: 'metaTitle', type: 'string', label: 'Meta Title' },
|
|
42
|
+
* { name: 'metaDescription', type: 'string', label: 'Meta Description' },
|
|
43
|
+
* ],
|
|
44
|
+
* })
|
|
45
|
+
* // TypeFromEntrySchema: { ..., seo: { metaTitle: string, metaDescription: string } }
|
|
46
|
+
*/
|
|
47
|
+
export const defineNestedFieldGroup = (group) => ({ ...group, type: 'object' });
|
|
5
48
|
//# sourceMappingURL=entry-schema.js.map
|
package/dist/entry-schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-schema.js","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entry-schema.js","sourceRoot":"","sources":["../src/entry-schema.ts"],"names":[],"mappings":"AA2GA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA4C,MAAS,EAAK,EAAE,CAAC,MAAM,CAAA;AAOpG;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAQpC,KAAQ,EACwB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAgB,EAAE,CAAC,CAAA;AAE3E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAGpC,KAAQ,EACyB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-field.d.ts","sourceRoot":"","sources":["../../src/utils/body-field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"body-field.d.ts","sourceRoot":"","sources":["../../src/utils/body-field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAK5C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAMtE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAKxE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,EAAE,CAQ9E"}
|
package/dist/utils/body-field.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { flattenGroupFields } from './flatten-group-fields.js';
|
|
1
2
|
const BODY_FIELD_TYPES = new Set(['markdown', 'mdx']);
|
|
2
3
|
/**
|
|
3
4
|
* Count the number of top-level fields marked `isBody: true` in a schema.
|
|
@@ -6,7 +7,7 @@ const BODY_FIELD_TYPES = new Set(['markdown', 'mdx']);
|
|
|
6
7
|
*/
|
|
7
8
|
export function countBodyFields(fields) {
|
|
8
9
|
let count = 0;
|
|
9
|
-
for (const field of fields) {
|
|
10
|
+
for (const field of flattenGroupFields(fields)) {
|
|
10
11
|
if ('isBody' in field && field.isBody)
|
|
11
12
|
count++;
|
|
12
13
|
}
|
|
@@ -17,7 +18,7 @@ export function countBodyFields(fields) {
|
|
|
17
18
|
* Used at read time to map the markdown file's content to the correct data field.
|
|
18
19
|
*/
|
|
19
20
|
export function findBodyFieldName(fields) {
|
|
20
|
-
for (const field of fields) {
|
|
21
|
+
for (const field of flattenGroupFields(fields)) {
|
|
21
22
|
if ('isBody' in field && field.isBody)
|
|
22
23
|
return field.name;
|
|
23
24
|
}
|
|
@@ -29,7 +30,7 @@ export function findBodyFieldName(fields) {
|
|
|
29
30
|
*/
|
|
30
31
|
export function findInvalidBodyFields(fields) {
|
|
31
32
|
const invalid = [];
|
|
32
|
-
for (const field of fields) {
|
|
33
|
+
for (const field of flattenGroupFields(fields)) {
|
|
33
34
|
if ('isBody' in field && field.isBody && !BODY_FIELD_TYPES.has(field.type)) {
|
|
34
35
|
invalid.push(field.name);
|
|
35
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-field.js","sourceRoot":"","sources":["../../src/utils/body-field.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"body-field.js","sourceRoot":"","sources":["../../src/utils/body-field.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAA;AAErD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAA8B;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,EAAE,CAAA;IAChD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA8B;IAC9D,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,IAAI,CAAA;IAC1D,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAA8B;IAClE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,IAAI,QAAQ,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FieldConfig } from '../config';
|
|
2
|
+
/**
|
|
3
|
+
* Recursively flatten inline groups out of a field array.
|
|
4
|
+
* Group children are inlined at the parent level — groups are transparent to data.
|
|
5
|
+
*
|
|
6
|
+
* Use this when iterating fields for data-layer purposes (reference resolution,
|
|
7
|
+
* change detection, body-field lookup, etc.) where you need all data-carrying
|
|
8
|
+
* fields without group wrappers.
|
|
9
|
+
*
|
|
10
|
+
* Not needed when using traverseFields() — that already handles groups transparently.
|
|
11
|
+
*/
|
|
12
|
+
export declare function flattenGroupFields(fields: readonly FieldConfig[]): FieldConfig[];
|
|
13
|
+
//# sourceMappingURL=flatten-group-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-group-fields.d.ts","sourceRoot":"","sources":["../../src/utils/flatten-group-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,WAAW,CAAA;AAEpE;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,EAAE,CAUhF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recursively flatten inline groups out of a field array.
|
|
3
|
+
* Group children are inlined at the parent level — groups are transparent to data.
|
|
4
|
+
*
|
|
5
|
+
* Use this when iterating fields for data-layer purposes (reference resolution,
|
|
6
|
+
* change detection, body-field lookup, etc.) where you need all data-carrying
|
|
7
|
+
* fields without group wrappers.
|
|
8
|
+
*
|
|
9
|
+
* Not needed when using traverseFields() — that already handles groups transparently.
|
|
10
|
+
*/
|
|
11
|
+
export function flattenGroupFields(fields) {
|
|
12
|
+
const result = [];
|
|
13
|
+
for (const field of fields) {
|
|
14
|
+
if (field.type === 'group') {
|
|
15
|
+
result.push(...flattenGroupFields(field.fields));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
result.push(field);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=flatten-group-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-group-fields.js","sourceRoot":"","sources":["../../src/utils/flatten-group-fields.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA8B;IAC/D,MAAM,MAAM,GAAkB,EAAE,CAAA;IAChC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAE,KAAgC,CAAC,MAAM,CAAC,CAAC,CAAA;QAC9E,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"title-field.d.ts","sourceRoot":"","sources":["../../src/utils/title-field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"title-field.d.ts","sourceRoot":"","sources":["../../src/utils/title-field.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,WAAW,CAAA;AAOpE;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,GAAG,SAAS,CAEpB;AA0BD,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GACA,MAAM,CAaR;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAavE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,EAAE,CAgBV;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,EAAE,CAkBV"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/** Type guard: true if field is an inline group (type === 'group'). */
|
|
2
|
+
function isGroupField(field) {
|
|
3
|
+
return field.type === 'group';
|
|
4
|
+
}
|
|
1
5
|
/**
|
|
2
6
|
* Find the field marked `isTitle: true` in a schema and extract its value from data.
|
|
3
7
|
* Recurses into object fields to support nested title fields (e.g., hero.title).
|
|
@@ -8,12 +12,18 @@ export function extractTitleFromSchema(fields, data) {
|
|
|
8
12
|
}
|
|
9
13
|
function findTitleValue(fields, data) {
|
|
10
14
|
for (const field of fields) {
|
|
11
|
-
|
|
15
|
+
// Inline groups are transparent — recurse at the same data level
|
|
16
|
+
if (isGroupField(field)) {
|
|
17
|
+
const result = findTitleValue(field.fields, data);
|
|
18
|
+
if (result !== undefined)
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
else if ('isTitle' in field && field.isTitle) {
|
|
12
22
|
const value = data[field.name];
|
|
13
23
|
return typeof value === 'string' ? value : undefined;
|
|
14
24
|
}
|
|
15
|
-
|
|
16
|
-
|
|
25
|
+
else if (field.type === 'object' && 'fields' in field && field.fields && !field.list) {
|
|
26
|
+
// Recurse into non-list object fields (list objects can't provide a single title value)
|
|
17
27
|
const nested = data[field.name];
|
|
18
28
|
if (nested != null && typeof nested === 'object' && !Array.isArray(nested)) {
|
|
19
29
|
const result = findTitleValue(field.fields, nested);
|
|
@@ -64,11 +74,16 @@ export function resolveEntryTitle(data, options) {
|
|
|
64
74
|
export function countTitleFields(fields) {
|
|
65
75
|
let count = 0;
|
|
66
76
|
for (const field of fields) {
|
|
67
|
-
if (field
|
|
68
|
-
count++;
|
|
69
|
-
if (field.type === 'object' && 'fields' in field && field.fields && !field.list) {
|
|
77
|
+
if (isGroupField(field)) {
|
|
70
78
|
count += countTitleFields(field.fields);
|
|
71
79
|
}
|
|
80
|
+
else {
|
|
81
|
+
if ('isTitle' in field && field.isTitle)
|
|
82
|
+
count++;
|
|
83
|
+
if (field.type === 'object' && 'fields' in field && field.fields && !field.list) {
|
|
84
|
+
count += countTitleFields(field.fields);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
72
87
|
}
|
|
73
88
|
return count;
|
|
74
89
|
}
|
|
@@ -80,12 +95,17 @@ export function countTitleFields(fields) {
|
|
|
80
95
|
export function findInvalidTitleFields(fields, parentPath) {
|
|
81
96
|
const invalid = [];
|
|
82
97
|
for (const field of fields) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
invalid.push(fieldPath);
|
|
98
|
+
if (isGroupField(field)) {
|
|
99
|
+
invalid.push(...findInvalidTitleFields(field.fields, parentPath));
|
|
86
100
|
}
|
|
87
|
-
|
|
88
|
-
|
|
101
|
+
else {
|
|
102
|
+
const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name;
|
|
103
|
+
if ('isTitle' in field && field.isTitle && field.type !== 'string') {
|
|
104
|
+
invalid.push(fieldPath);
|
|
105
|
+
}
|
|
106
|
+
if (field.type === 'object' && 'fields' in field && field.fields && !field.list) {
|
|
107
|
+
invalid.push(...findInvalidTitleFields(field.fields, fieldPath));
|
|
108
|
+
}
|
|
89
109
|
}
|
|
90
110
|
}
|
|
91
111
|
return invalid;
|
|
@@ -97,14 +117,19 @@ export function findInvalidTitleFields(fields, parentPath) {
|
|
|
97
117
|
export function findTitleFieldsInLists(fields, parentPath) {
|
|
98
118
|
const found = [];
|
|
99
119
|
for (const field of fields) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
120
|
+
if (isGroupField(field)) {
|
|
121
|
+
found.push(...findTitleFieldsInLists(field.fields, parentPath));
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name;
|
|
125
|
+
if (field.type === 'object' && 'fields' in field && field.fields) {
|
|
126
|
+
if (field.list) {
|
|
127
|
+
// Any isTitle inside a list object is invalid — collect them
|
|
128
|
+
found.push(...collectAllTitleFields(field.fields, fieldPath));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
found.push(...findTitleFieldsInLists(field.fields, fieldPath));
|
|
132
|
+
}
|
|
108
133
|
}
|
|
109
134
|
}
|
|
110
135
|
}
|
|
@@ -114,11 +139,17 @@ export function findTitleFieldsInLists(fields, parentPath) {
|
|
|
114
139
|
function collectAllTitleFields(fields, parentPath) {
|
|
115
140
|
const found = [];
|
|
116
141
|
for (const field of fields) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
found.push(
|
|
120
|
-
|
|
121
|
-
|
|
142
|
+
if (isGroupField(field)) {
|
|
143
|
+
// Inline groups are transparent — recurse at the same data level (no new path segment)
|
|
144
|
+
found.push(...collectAllTitleFields(field.fields, parentPath));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const fieldPath = `${parentPath}.${field.name}`;
|
|
148
|
+
if ('isTitle' in field && field.isTitle)
|
|
149
|
+
found.push(fieldPath);
|
|
150
|
+
if (field.type === 'object' && 'fields' in field && field.fields) {
|
|
151
|
+
found.push(...collectAllTitleFields(field.fields, fieldPath));
|
|
152
|
+
}
|
|
122
153
|
}
|
|
123
154
|
}
|
|
124
155
|
return found;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"title-field.js","sourceRoot":"","sources":["../../src/utils/title-field.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAA8B,EAC9B,IAA6B;IAE7B,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACrC,CAAC;AAED,SAAS,cAAc,CACrB,MAA8B,EAC9B,IAA6B;IAE7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"title-field.js","sourceRoot":"","sources":["../../src/utils/title-field.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deletion-checker.d.ts","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"deletion-checker.d.ts","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,EAAqB,MAAM,UAAU,CAAA;AAEzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,WAAW,CAAA;IACvB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,aAAa,EAAE,CAAA;CAC9B;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBAFX,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE;QAAE,MAAM,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC;IAGlE;;;;;OAKG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQzD;;;;;OAKG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAYhE;;OAEG;YACW,cAAc;IAkC5B;;;OAGG;IACH,OAAO,CAAC,YAAY;IA4FpB;;OAEG;IACH,OAAO,CAAC,uBAAuB;CAgChC"}
|
|
@@ -83,6 +83,11 @@ export class DeletionChecker {
|
|
|
83
83
|
findIdInData(data, targetId, schema, pathPrefix = '') {
|
|
84
84
|
const found = [];
|
|
85
85
|
for (const field of schema) {
|
|
86
|
+
// Inline groups are transparent — recurse into their children at the same data level
|
|
87
|
+
if (field.type === 'group') {
|
|
88
|
+
found.push(...this.findIdInData(data, targetId, field.fields, pathPrefix));
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
86
91
|
const fieldPath = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;
|
|
87
92
|
const value = data[field.name];
|
|
88
93
|
if (value === undefined || value === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deletion-checker.js","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"deletion-checker.js","sourceRoot":"","sources":["../../src/validation/deletion-checker.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,eAAe;IAC1B,YACU,KAAmB,EACnB,OAAuB,EACvB,WAAwD;QAFxD,UAAK,GAAL,KAAK,CAAc;QACnB,YAAO,GAAP,OAAO,CAAgB;QACvB,gBAAW,GAAX,WAAW,CAA6C;IAC/D,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;QAClD,OAAO;YACL,SAAS,EAAE,YAAY,CAAC,MAAM,KAAK,CAAC;YACpC,YAAY;SACb,CAAA;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,MAAM,UAAU,GAAoB,EAAE,CAAA;QAEtC,sCAAsC;QACtC,KAAK,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACzE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;YACtF,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;QAC1B,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAC1B,cAA2B,EAC3B,MAAqB,EACrB,QAAgB;QAEhB,MAAM,UAAU,GAAoB,EAAE,CAAA;QAEtC,uDAAuD;QACvD,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAA;QAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAE1D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpB,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;oBACtD,UAAU,CAAC,IAAI,CAAC;wBACd,SAAS,EAAE,EAAE,IAAI,EAAE;wBACnB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAA2B;wBAChD,UAAU,EAAE,KAAK,CAAC,UAAU;wBAC5B,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,MAAM,EAAE,IAAI;qBACb,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;gBAClC,SAAQ;YACV,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAA;IACnB,CAAC;IAED;;;OAGG;IACK,YAAY,CAClB,IAA6B,EAC7B,QAAgB,EAChB,MAAqB,EACrB,UAAU,GAAG,EAAE;QAEf,MAAM,KAAK,GAAa,EAAE,CAAA;QAE1B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,qFAAqF;YACrF,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC3B,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,YAAY,CAClB,IAAI,EACJ,QAAQ,EACP,KAAgC,CAAC,MAAM,EACxC,UAAU,CACX,CACF,CAAA;gBACD,SAAQ;YACV,CAAC;YAED,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA;YACzE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAE9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAAE,SAAQ;YAEnD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC/B,uDAAuD;gBACvD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;oBACvB,CAAC;gBACH,CAAC;qBAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACnC,4FAA4F;gBAC5F,MAAM,WAAW,GAAG,KAA0B,CAAA;gBAC9C,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;oBACvB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,4CAA4C;wBAC5C,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;4BAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gCAC9C,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,YAAY,CAClB,IAA+B,EAC/B,QAAQ,EACR,WAAW,CAAC,MAAO,EACnB,GAAG,SAAS,IAAI,KAAK,GAAG,CACzB,CACF,CAAA;4BACH,CAAC;wBACH,CAAC,CAAC,CAAA;oBACJ,CAAC;yBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;wBACvD,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,YAAY,CAClB,KAAgC,EAChC,QAAQ,EACR,WAAW,CAAC,MAAM,EAClB,SAAS,CACV,CACF,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,sBAAsB;gBACtB,MAAM,UAAU,GAAG,KAAyB,CAAA;gBAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;wBAC5B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;4BAC9C,MAAM,SAAS,GAAI,IAAgC,CAAC,KAAK,CAAA;4BACzD,MAAM,QAAQ,GAAG,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;4BACxE,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gCAChC,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,YAAY,CAClB,IAA+B,EAC/B,QAAQ,EACR,QAAQ,CAAC,MAAM,EACf,GAAG,SAAS,IAAI,KAAK,GAAG,CACzB,CACF,CAAA;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,cAA2B;QAKzD,MAAM,OAAO,GAIR,EAAE,CAAA;QAEP,mCAAmC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA;QAEnD,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC9B,kDAAkD;gBAClD,IACE,QAAQ,CAAC,UAAU,KAAK,cAAc;oBACtC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC,cAAc,GAAG,GAAG,CAAC,EACrD,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC;wBACX,YAAY,EAAE,QAAQ,CAAC,YAAY;wBACnC,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,IAAI,EAAE,QAAQ,CAAC,IAAK;qBACrB,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-traversal.d.ts","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"field-traversal.d.ts","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,WAAW,CAAA;AAElB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,KAAK,EAAE,WAAW,CAAA;IAClB,0CAA0C;IAC1C,KAAK,EAAE,OAAO,CAAA;IACd,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAA;CACb;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,KAAK,CAAC,EAAE,CAAA;AAiBhE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EACxB,UAAU,SAAK,GACd,CAAC,EAAE,CA0EL;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,GAChB,gBAAgB,EAAE,CAOpB"}
|
|
@@ -48,7 +48,13 @@ export function traverseFields(fields, data, visitor, pathPrefix = '') {
|
|
|
48
48
|
for (const field of fields) {
|
|
49
49
|
const fieldPath = pathPrefix ? `${pathPrefix}.${field.name}` : field.name;
|
|
50
50
|
const value = data[field.name];
|
|
51
|
-
//
|
|
51
|
+
// Inline groups are transparent to the data — their children live at the parent
|
|
52
|
+
// data level, not under field.name, so skip the null/undefined guard for them.
|
|
53
|
+
if (field.type === 'group') {
|
|
54
|
+
results.push(...traverseFields(field.fields, data, visitor, pathPrefix));
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Skip undefined/null values for all other field types
|
|
52
58
|
if (value === undefined || value === null)
|
|
53
59
|
continue;
|
|
54
60
|
// Let visitor handle this field first
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-traversal.js","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"field-traversal.js","sourceRoot":"","sources":["../../src/validation/field-traversal.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"//": "@codemirror/language, @lezer/highlight: workaround — @mdxeditor/editor uses cm6-theme-basic-light which peer-requires these but mdxeditor doesn't declare them as dependencies",
|
|
3
3
|
"name": "canopycms",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.35",
|
|
5
5
|
"description": "CanopyCMS core package: schema-driven content, branch-aware editing, and editor UI for Next.js.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|