@10up/block-renderer-validator 0.1.5 → 0.2.0
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/block-rules-validator.d.ts +26 -0
- package/dist/block-rules-validator.d.ts.map +1 -0
- package/dist/block-rules-validator.js +155 -0
- package/dist/block-rules-validator.js.map +1 -0
- package/dist/ignite-validator.d.ts +32 -0
- package/dist/ignite-validator.d.ts.map +1 -0
- package/dist/ignite-validator.js +182 -0
- package/dist/ignite-validator.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/schema-validator.d.ts.map +1 -1
- package/dist/schema-validator.js +5 -0
- package/dist/schema-validator.js.map +1 -1
- package/dist/tree-validator.d.ts.map +1 -1
- package/dist/tree-validator.js +19 -1
- package/dist/tree-validator.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { BlockTree, BlockElement, ValidationResult } from '@10up/block-renderer-core';
|
|
2
|
+
/**
|
|
3
|
+
* Validates that a block follows block-specific rules.
|
|
4
|
+
*
|
|
5
|
+
* @param element - The block element to validate
|
|
6
|
+
* @param tree - The full block tree (for checking children)
|
|
7
|
+
* @returns Validation result
|
|
8
|
+
*/
|
|
9
|
+
export declare function validateBlockRules(element: BlockElement, tree: BlockTree): ValidationResult;
|
|
10
|
+
/**
|
|
11
|
+
* Validates all elements in a tree against block-specific rules.
|
|
12
|
+
*
|
|
13
|
+
* @param tree - The block tree to validate
|
|
14
|
+
* @returns Combined validation result
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateTreeBlockRules(tree: BlockTree): ValidationResult;
|
|
17
|
+
/**
|
|
18
|
+
* Gets guidance for blocks that have special requirements.
|
|
19
|
+
* Used by prompt generator to provide context about block usage.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getBlockSpecialRequirements(): Array<{
|
|
22
|
+
blockType: string;
|
|
23
|
+
requirement: string;
|
|
24
|
+
example: string;
|
|
25
|
+
}>;
|
|
26
|
+
//# sourceMappingURL=block-rules-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-rules-validator.d.ts","sourceRoot":"","sources":["../src/block-rules-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AA4B3F;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,GACd,gBAAgB,CAqDlB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAiBxE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,KAAK,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC,CA0DD"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Block-specific validation rules.
|
|
3
|
+
* These rules enforce proper usage patterns for specific block types.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Blocks that require inner blocks instead of certain attributes.
|
|
7
|
+
* Maps block type to { deprecatedAttr, requiredChildType, description }.
|
|
8
|
+
*/
|
|
9
|
+
const INNER_BLOCKS_REQUIRED = {
|
|
10
|
+
'core/list': {
|
|
11
|
+
deprecatedAttr: 'values',
|
|
12
|
+
requiredChildType: 'core/list-item',
|
|
13
|
+
description: 'List blocks must use core/list-item inner blocks instead of the deprecated "values" attribute',
|
|
14
|
+
},
|
|
15
|
+
'core/navigation': {
|
|
16
|
+
deprecatedAttr: 'items',
|
|
17
|
+
requiredChildType: 'core/navigation-link',
|
|
18
|
+
description: 'Navigation blocks must use inner blocks (core/navigation-link, core/navigation-submenu) instead of "items" attribute',
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Validates that a block follows block-specific rules.
|
|
23
|
+
*
|
|
24
|
+
* @param element - The block element to validate
|
|
25
|
+
* @param tree - The full block tree (for checking children)
|
|
26
|
+
* @returns Validation result
|
|
27
|
+
*/
|
|
28
|
+
export function validateBlockRules(element, tree) {
|
|
29
|
+
const errors = [];
|
|
30
|
+
const warnings = [];
|
|
31
|
+
// Check inner blocks requirements
|
|
32
|
+
const innerBlocksRule = INNER_BLOCKS_REQUIRED[element.type];
|
|
33
|
+
if (innerBlocksRule) {
|
|
34
|
+
const hasDeprecatedAttr = element.props[innerBlocksRule.deprecatedAttr] !== undefined;
|
|
35
|
+
const hasRequiredChildren = element.children?.some(key => {
|
|
36
|
+
const child = tree.elements[key];
|
|
37
|
+
return child?.type === innerBlocksRule.requiredChildType;
|
|
38
|
+
});
|
|
39
|
+
if (hasDeprecatedAttr && !hasRequiredChildren) {
|
|
40
|
+
errors.push(`[${element.key}] ${innerBlocksRule.description}. ` +
|
|
41
|
+
`Found "${innerBlocksRule.deprecatedAttr}" attribute but no ${innerBlocksRule.requiredChildType} children.`);
|
|
42
|
+
}
|
|
43
|
+
else if (hasDeprecatedAttr) {
|
|
44
|
+
warnings.push(`[${element.key}] Block uses deprecated "${innerBlocksRule.deprecatedAttr}" attribute. ` +
|
|
45
|
+
`Consider using ${innerBlocksRule.requiredChildType} inner blocks instead.`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Validate core/button is inside core/buttons
|
|
49
|
+
if (element.type === 'core/button') {
|
|
50
|
+
const parent = element.parentKey ? tree.elements[element.parentKey] : null;
|
|
51
|
+
if (parent && parent.type !== 'core/buttons') {
|
|
52
|
+
errors.push(`[${element.key}] core/button must be a direct child of core/buttons, ` +
|
|
53
|
+
`but found parent "${parent.type}"`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Validate core/column is inside core/columns
|
|
57
|
+
if (element.type === 'core/column') {
|
|
58
|
+
const parent = element.parentKey ? tree.elements[element.parentKey] : null;
|
|
59
|
+
if (parent && parent.type !== 'core/columns') {
|
|
60
|
+
errors.push(`[${element.key}] core/column must be a direct child of core/columns, ` +
|
|
61
|
+
`but found parent "${parent.type}"`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
valid: errors.length === 0,
|
|
66
|
+
errors,
|
|
67
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Validates all elements in a tree against block-specific rules.
|
|
72
|
+
*
|
|
73
|
+
* @param tree - The block tree to validate
|
|
74
|
+
* @returns Combined validation result
|
|
75
|
+
*/
|
|
76
|
+
export function validateTreeBlockRules(tree) {
|
|
77
|
+
const errors = [];
|
|
78
|
+
const warnings = [];
|
|
79
|
+
for (const element of Object.values(tree.elements)) {
|
|
80
|
+
const result = validateBlockRules(element, tree);
|
|
81
|
+
errors.push(...result.errors);
|
|
82
|
+
if (result.warnings) {
|
|
83
|
+
warnings.push(...result.warnings);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
valid: errors.length === 0,
|
|
88
|
+
errors,
|
|
89
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Gets guidance for blocks that have special requirements.
|
|
94
|
+
* Used by prompt generator to provide context about block usage.
|
|
95
|
+
*/
|
|
96
|
+
export function getBlockSpecialRequirements() {
|
|
97
|
+
return [
|
|
98
|
+
{
|
|
99
|
+
blockType: 'core/list',
|
|
100
|
+
requirement: 'Must use core/list-item inner blocks for list items. The deprecated "values" attribute is not supported.',
|
|
101
|
+
example: `{
|
|
102
|
+
"key": "list-1",
|
|
103
|
+
"type": "core/list",
|
|
104
|
+
"props": { "ordered": false },
|
|
105
|
+
"children": ["item-1", "item-2"]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"key": "item-1",
|
|
109
|
+
"type": "core/list-item",
|
|
110
|
+
"props": { "content": "First item" },
|
|
111
|
+
"parentKey": "list-1"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"key": "item-2",
|
|
115
|
+
"type": "core/list-item",
|
|
116
|
+
"props": { "content": "Second item" },
|
|
117
|
+
"parentKey": "list-1"
|
|
118
|
+
}`,
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
blockType: 'core/button',
|
|
122
|
+
requirement: 'Must be a direct child of core/buttons wrapper block.',
|
|
123
|
+
example: `{
|
|
124
|
+
"key": "buttons-1",
|
|
125
|
+
"type": "core/buttons",
|
|
126
|
+
"props": { "layout": { "type": "flex" } },
|
|
127
|
+
"children": ["button-1"]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"key": "button-1",
|
|
131
|
+
"type": "core/button",
|
|
132
|
+
"props": { "text": "Click me", "url": "/page" },
|
|
133
|
+
"parentKey": "buttons-1"
|
|
134
|
+
}`,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
blockType: 'core/column',
|
|
138
|
+
requirement: 'Must be a direct child of core/columns container.',
|
|
139
|
+
example: `{
|
|
140
|
+
"key": "columns-1",
|
|
141
|
+
"type": "core/columns",
|
|
142
|
+
"props": {},
|
|
143
|
+
"children": ["col-1", "col-2"]
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"key": "col-1",
|
|
147
|
+
"type": "core/column",
|
|
148
|
+
"props": { "width": "50%" },
|
|
149
|
+
"children": ["para-1"],
|
|
150
|
+
"parentKey": "columns-1"
|
|
151
|
+
}`,
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=block-rules-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-rules-validator.js","sourceRoot":"","sources":["../src/block-rules-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignite WP Extension Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates that blocks using Ignite extension attributes include
|
|
5
|
+
* the required classNames for proper frontend rendering.
|
|
6
|
+
*/
|
|
7
|
+
import type { BlockTree, BlockElement, ValidationResult } from '@10up/block-renderer-core';
|
|
8
|
+
/**
|
|
9
|
+
* Validates a single element for Ignite extension className requirements.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateIgniteElement(element: BlockElement): ValidationResult;
|
|
12
|
+
/**
|
|
13
|
+
* Validates all elements in a tree for Ignite extension className requirements.
|
|
14
|
+
*
|
|
15
|
+
* @param tree - The block tree to validate
|
|
16
|
+
* @returns Validation result with errors for missing required classNames
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateTreeIgniteExtensions(tree: BlockTree): ValidationResult;
|
|
19
|
+
/**
|
|
20
|
+
* Checks if a tree uses any Ignite extension attributes.
|
|
21
|
+
* Useful to determine if Ignite validation should be run.
|
|
22
|
+
*/
|
|
23
|
+
export declare function treeUsesIgniteExtensions(tree: BlockTree): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Gets a list of all Ignite extension attributes found in a tree.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getIgniteExtensionsUsed(tree: BlockTree): Array<{
|
|
28
|
+
elementKey: string;
|
|
29
|
+
attribute: string;
|
|
30
|
+
value: unknown;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=ignite-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignite-validator.d.ts","sourceRoot":"","sources":["../src/ignite-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAuGnC;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,YAAY,GACpB,gBAAgB,CAgDlB;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,CAqB9E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAajE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,GACd,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAkBlE"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ignite WP Extension Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates that blocks using Ignite extension attributes include
|
|
5
|
+
* the required classNames for proper frontend rendering.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Validation rules for Ignite extensions that require className
|
|
9
|
+
*/
|
|
10
|
+
const IGNITE_VALIDATION_RULES = [
|
|
11
|
+
{
|
|
12
|
+
attribute: 'typographyPreset',
|
|
13
|
+
isActive: (value) => typeof value === 'string' && value.length > 0,
|
|
14
|
+
getRequiredClasses: (value) => [`is-typography-preset-${value}`],
|
|
15
|
+
description: 'Typography preset',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
attribute: 'modalAnchorToTrigger',
|
|
19
|
+
isActive: (value) => typeof value === 'string' && value.length > 0,
|
|
20
|
+
getRequiredClasses: () => ['is-modal-trigger'],
|
|
21
|
+
description: 'Modal trigger',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
attribute: 'animation',
|
|
25
|
+
isActive: (value) => {
|
|
26
|
+
if (typeof value !== 'object' || value === null)
|
|
27
|
+
return false;
|
|
28
|
+
const anim = value;
|
|
29
|
+
return typeof anim.name === 'string' && anim.name.length > 0;
|
|
30
|
+
},
|
|
31
|
+
getRequiredClasses: (value) => {
|
|
32
|
+
const anim = value;
|
|
33
|
+
const classes = ['has-block-animation'];
|
|
34
|
+
if (anim.name) {
|
|
35
|
+
classes.push(anim.name);
|
|
36
|
+
classes.push(`duration-${anim.duration || 300}`);
|
|
37
|
+
}
|
|
38
|
+
if (anim.delay) {
|
|
39
|
+
classes.push(`delay-${anim.delay}`);
|
|
40
|
+
}
|
|
41
|
+
if (anim.easing) {
|
|
42
|
+
classes.push(`timing-${anim.easing}`);
|
|
43
|
+
}
|
|
44
|
+
return classes;
|
|
45
|
+
},
|
|
46
|
+
description: 'Animation',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
attribute: 'enableMobileCarousel',
|
|
50
|
+
isActive: (value) => value === true,
|
|
51
|
+
getRequiredClasses: () => ['has-mobile-carousel'],
|
|
52
|
+
description: 'Mobile carousel',
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
/**
|
|
56
|
+
* Parses the className string into an array of class names.
|
|
57
|
+
*/
|
|
58
|
+
function parseClassName(className) {
|
|
59
|
+
if (typeof className !== 'string')
|
|
60
|
+
return [];
|
|
61
|
+
return className.split(/\s+/).filter((c) => c.length > 0);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Checks if all required classes are present in the className.
|
|
65
|
+
*/
|
|
66
|
+
function hasRequiredClasses(className, requiredClasses) {
|
|
67
|
+
const missing = [];
|
|
68
|
+
const present = [];
|
|
69
|
+
for (const required of requiredClasses) {
|
|
70
|
+
if (className.includes(required)) {
|
|
71
|
+
present.push(required);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
missing.push(required);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { missing, present };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validates a single element for Ignite extension className requirements.
|
|
81
|
+
*/
|
|
82
|
+
export function validateIgniteElement(element) {
|
|
83
|
+
const errors = [];
|
|
84
|
+
const warnings = [];
|
|
85
|
+
const props = element.props || {};
|
|
86
|
+
const classNames = parseClassName(props.className);
|
|
87
|
+
for (const rule of IGNITE_VALIDATION_RULES) {
|
|
88
|
+
const attrValue = props[rule.attribute];
|
|
89
|
+
// Skip if attribute is not set or not active
|
|
90
|
+
if (attrValue === undefined || !rule.isActive(attrValue)) {
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
// Get required classes for this attribute
|
|
94
|
+
const requiredClasses = rule.getRequiredClasses(attrValue);
|
|
95
|
+
const { missing } = hasRequiredClasses(classNames, requiredClasses);
|
|
96
|
+
if (missing.length > 0) {
|
|
97
|
+
// For animation, only require the core class for clearer error messages
|
|
98
|
+
if (rule.attribute === 'animation') {
|
|
99
|
+
const coreClassMissing = missing.includes('has-block-animation');
|
|
100
|
+
if (coreClassMissing) {
|
|
101
|
+
errors.push(`[${element.key}] ${rule.description} requires className to include: "${missing.join(' ')}". ` +
|
|
102
|
+
`Add className: "${requiredClasses.join(' ')}" to the block props.`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Animation name/duration/etc classes are missing - warn but don't error
|
|
106
|
+
warnings.push(`[${element.key}] ${rule.description} className is missing some classes: "${missing.join(' ')}". ` +
|
|
107
|
+
`Expected: "${requiredClasses.join(' ')}"`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
errors.push(`[${element.key}] ${rule.description} requires className to include: "${missing.join(' ')}". ` +
|
|
112
|
+
`When using "${rule.attribute}", add the corresponding className.`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
valid: errors.length === 0,
|
|
118
|
+
errors,
|
|
119
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Validates all elements in a tree for Ignite extension className requirements.
|
|
124
|
+
*
|
|
125
|
+
* @param tree - The block tree to validate
|
|
126
|
+
* @returns Validation result with errors for missing required classNames
|
|
127
|
+
*/
|
|
128
|
+
export function validateTreeIgniteExtensions(tree) {
|
|
129
|
+
const errors = [];
|
|
130
|
+
const warnings = [];
|
|
131
|
+
for (const element of Object.values(tree.elements)) {
|
|
132
|
+
const result = validateIgniteElement(element);
|
|
133
|
+
if (!result.valid) {
|
|
134
|
+
errors.push(...result.errors);
|
|
135
|
+
}
|
|
136
|
+
if (result.warnings) {
|
|
137
|
+
warnings.push(...result.warnings);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
valid: errors.length === 0,
|
|
142
|
+
errors,
|
|
143
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Checks if a tree uses any Ignite extension attributes.
|
|
148
|
+
* Useful to determine if Ignite validation should be run.
|
|
149
|
+
*/
|
|
150
|
+
export function treeUsesIgniteExtensions(tree) {
|
|
151
|
+
const igniteAttributes = IGNITE_VALIDATION_RULES.map((r) => r.attribute);
|
|
152
|
+
for (const element of Object.values(tree.elements)) {
|
|
153
|
+
const props = element.props || {};
|
|
154
|
+
for (const attr of igniteAttributes) {
|
|
155
|
+
if (props[attr] !== undefined) {
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Gets a list of all Ignite extension attributes found in a tree.
|
|
164
|
+
*/
|
|
165
|
+
export function getIgniteExtensionsUsed(tree) {
|
|
166
|
+
const results = [];
|
|
167
|
+
const igniteAttributes = IGNITE_VALIDATION_RULES.map((r) => r.attribute);
|
|
168
|
+
for (const element of Object.values(tree.elements)) {
|
|
169
|
+
const props = element.props || {};
|
|
170
|
+
for (const attr of igniteAttributes) {
|
|
171
|
+
if (props[attr] !== undefined) {
|
|
172
|
+
results.push({
|
|
173
|
+
elementKey: element.key,
|
|
174
|
+
attribute: attr,
|
|
175
|
+
value: props[attr],
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return results;
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=ignite-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignite-validator.js","sourceRoot":"","sources":["../src/ignite-validator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export { validateColorTokens, validateTypographyTokens, validateSpacingTokens, v
|
|
|
7
7
|
export { isPatternReference, validatePatternReference, validateTreePatterns, getPatternReferences, } from './pattern-validator.js';
|
|
8
8
|
export { validateTemplateStructure, validateTemplateBlockTypes, validateTemplateNesting, validateTemplate, } from './template-validator.js';
|
|
9
9
|
export type { TemplateValidationResult, ValidateTemplateOptions, } from './template-validator.js';
|
|
10
|
+
export { validateIgniteElement, validateTreeIgniteExtensions, treeUsesIgniteExtensions, getIgniteExtensionsUsed, } from './ignite-validator.js';
|
|
11
|
+
export { validateBlockRules, validateTreeBlockRules, getBlockSpecialRequirements, } from './block-rules-validator.js';
|
|
10
12
|
/**
|
|
11
13
|
* Options for full tree validation.
|
|
12
14
|
*/
|
|
@@ -25,6 +27,10 @@ export interface ValidateTreeOptions {
|
|
|
25
27
|
validateTokens?: boolean;
|
|
26
28
|
/** Whether to validate pattern references (default: true if patterns provided) */
|
|
27
29
|
validatePatterns?: boolean;
|
|
30
|
+
/** Whether to validate Ignite extension classNames (default: false) */
|
|
31
|
+
validateIgnite?: boolean;
|
|
32
|
+
/** Whether to validate block-specific rules like list inner blocks (default: true) */
|
|
33
|
+
validateBlockRules?: boolean;
|
|
28
34
|
}
|
|
29
35
|
/**
|
|
30
36
|
* Validates a complete block tree with all available validations.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEZ,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EAEZ,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAUrE,OAAO,EAEL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAEL,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAEL,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAEL,yBAAyB,EACzB,0BAA0B,EAC1B,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAEL,qBAAqB,EACrB,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAEL,kBAAkB,EAClB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,4BAA4B,CAAC;AAEpC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,wCAAwC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4EAA4E;IAC5E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,EACf,OAAO,GAAE,mBAAwB,GAChC,oBAAoB,CA8DtB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,mBAAmB,GAC3B,CAAC,IAAI,EAAE,SAAS,KAAK,oBAAoB,CAE3C"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,8 @@ import { validateTreeSchemas } from './schema-validator.js';
|
|
|
2
2
|
import { validateTreeNesting } from './tree-validator.js';
|
|
3
3
|
import { validateTreeTokens } from './token-validator.js';
|
|
4
4
|
import { validateTreePatterns } from './pattern-validator.js';
|
|
5
|
+
import { validateTreeIgniteExtensions } from './ignite-validator.js';
|
|
6
|
+
import { validateTreeBlockRules } from './block-rules-validator.js';
|
|
5
7
|
// Re-export individual validators
|
|
6
8
|
export {
|
|
7
9
|
// Schema validation
|
|
@@ -18,6 +20,12 @@ isPatternReference, validatePatternReference, validateTreePatterns, getPatternRe
|
|
|
18
20
|
export {
|
|
19
21
|
// Template validation
|
|
20
22
|
validateTemplateStructure, validateTemplateBlockTypes, validateTemplateNesting, validateTemplate, } from './template-validator.js';
|
|
23
|
+
export {
|
|
24
|
+
// Ignite extension validation
|
|
25
|
+
validateIgniteElement, validateTreeIgniteExtensions, treeUsesIgniteExtensions, getIgniteExtensionsUsed, } from './ignite-validator.js';
|
|
26
|
+
export {
|
|
27
|
+
// Block-specific rules validation
|
|
28
|
+
validateBlockRules, validateTreeBlockRules, getBlockSpecialRequirements, } from './block-rules-validator.js';
|
|
21
29
|
/**
|
|
22
30
|
* Validates a complete block tree with all available validations.
|
|
23
31
|
*
|
|
@@ -58,6 +66,22 @@ export function validateTree(tree, options = {}) {
|
|
|
58
66
|
const patternResult = validateTreePatterns(tree, options.patterns);
|
|
59
67
|
errors.push(...patternResult.errors);
|
|
60
68
|
}
|
|
69
|
+
// Ignite extension validation (validates className requirements)
|
|
70
|
+
if (options.validateIgnite) {
|
|
71
|
+
const igniteResult = validateTreeIgniteExtensions(tree);
|
|
72
|
+
errors.push(...igniteResult.errors);
|
|
73
|
+
if (igniteResult.warnings) {
|
|
74
|
+
warnings.push(...igniteResult.warnings);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Block-specific rules validation (default: enabled)
|
|
78
|
+
if (options.validateBlockRules !== false) {
|
|
79
|
+
const blockRulesResult = validateTreeBlockRules(tree);
|
|
80
|
+
errors.push(...blockRulesResult.errors);
|
|
81
|
+
if (blockRulesResult.warnings) {
|
|
82
|
+
warnings.push(...blockRulesResult.warnings);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
61
85
|
return {
|
|
62
86
|
valid: errors.length === 0,
|
|
63
87
|
errors,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAGnC;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,eAAe,GAC1B,gBAAgB,CA8BlB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,GACpB,gBAAgB,CAkClB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,eAAe,GAC1B,CAAC,KAAK,EAAE,OAAO,KAAK,gBAAgB,CAetC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,EAAE,CAGxE"}
|
package/dist/schema-validator.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FRAGMENT_BLOCK_TYPE } from '@10up/block-renderer-core';
|
|
1
2
|
/**
|
|
2
3
|
* Validates a block element's props against its schema.
|
|
3
4
|
*/
|
|
@@ -31,6 +32,10 @@ export function validateTreeSchemas(tree, catalog) {
|
|
|
31
32
|
const errors = [];
|
|
32
33
|
const warnings = [];
|
|
33
34
|
for (const element of Object.values(tree.elements)) {
|
|
35
|
+
// Skip fragment pseudo-blocks (they have no attributes to validate)
|
|
36
|
+
if (element.type === FRAGMENT_BLOCK_TYPE) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
34
39
|
const definition = catalog.get(element.type);
|
|
35
40
|
if (!definition) {
|
|
36
41
|
// Unknown block type - could be a 3rd party block
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../src/schema-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-validator.d.ts","sourceRoot":"","sources":["../src/tree-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"tree-validator.d.ts","sourceRoot":"","sources":["../src/tree-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,gBAAgB,EACjB,MAAM,2BAA2B,CAAC;AAwDnC;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,eAAe,GAC1B,gBAAgB,CA4BlB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,eAAe,GAC1B,gBAAgB,CAwBlB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,eAAe,GAC1B,gBAAgB,CAyBlB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,GACpB,gBAAgB,CAuBlB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,YAAY,GACpB,gBAAgB,CAsDlB"}
|
package/dist/tree-validator.js
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
|
+
import { FRAGMENT_BLOCK_TYPE } from '@10up/block-renderer-core';
|
|
1
2
|
/**
|
|
2
3
|
* Gets the parent element of a block in the tree.
|
|
4
|
+
* Returns null for root-level blocks or blocks whose parent is a fragment
|
|
5
|
+
* (fragments are transparent for nesting validation purposes).
|
|
3
6
|
*/
|
|
4
7
|
function getParentElement(element, tree) {
|
|
5
8
|
if (!element.parentKey)
|
|
6
9
|
return null;
|
|
7
|
-
|
|
10
|
+
const parent = tree.elements[element.parentKey];
|
|
11
|
+
if (!parent)
|
|
12
|
+
return null;
|
|
13
|
+
// Fragments are transparent - treat fragment children as root-level
|
|
14
|
+
if (parent.type === FRAGMENT_BLOCK_TYPE) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return parent;
|
|
8
18
|
}
|
|
9
19
|
/**
|
|
10
20
|
* Gets all ancestor elements of a block (from immediate parent to root).
|
|
@@ -125,6 +135,14 @@ export function validateTreeNesting(tree, catalog) {
|
|
|
125
135
|
const warnings = [];
|
|
126
136
|
// Validate each element's nesting
|
|
127
137
|
for (const element of Object.values(tree.elements)) {
|
|
138
|
+
// Fragment pseudo-blocks: only allowed at root level
|
|
139
|
+
if (element.type === FRAGMENT_BLOCK_TYPE) {
|
|
140
|
+
if (element.key !== tree.root) {
|
|
141
|
+
errors.push(`[${element.key}] Fragment blocks can only be used at the root level of a tree`);
|
|
142
|
+
}
|
|
143
|
+
// Skip further nesting validation for fragments (no definition needed)
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
128
146
|
const definition = catalog.get(element.type);
|
|
129
147
|
if (!definition) {
|
|
130
148
|
// Unknown block type - skip nesting validation
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-validator.js","sourceRoot":"","sources":["../src/tree-validator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-validator.js","sourceRoot":"","sources":["../src/tree-validator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@10up/block-renderer-validator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Validation for WordPress block trees - schema, nesting, and token validation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"zod": "^3.24.0",
|
|
20
|
-
"@10up/block-renderer-core": "0.
|
|
21
|
-
"@10up/block-renderer-theme-json": "0.1.
|
|
22
|
-
"@10up/block-renderer-patterns": "0.1.
|
|
20
|
+
"@10up/block-renderer-core": "0.2.0",
|
|
21
|
+
"@10up/block-renderer-theme-json": "0.1.7",
|
|
22
|
+
"@10up/block-renderer-patterns": "0.1.7"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"typescript": "^5.7.0",
|