{"_id":"@10up/block-renderer-validator","_rev":"5-7a6f551cdbb4960e9bb0ad1a28410c01","name":"@10up/block-renderer-validator","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.4":{"name":"@10up/block-renderer-validator","version":"0.1.4","keywords":["wordpress","blocks","validation","schema","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-validator@0.1.4","maintainers":[{"name":"fabiankaegy","email":"mail@fabian-kaegy.de"},{"name":"eugene-manuilov","email":"eugene.manuilov@gmail.com"},{"name":"christianc1","email":"christian.m.chung@gmail.com"},{"name":"nicholasio","email":"nicholasio.oliveira@gmail.com"},{"name":"joesnellpdx","email":"joesnellpdx@gmail.com"},{"name":"devinle","email":"devin.leggett@gmail.com"},{"name":"darylldoyle","email":"daryll.doyle@10up.com"}],"homepage":"https://github.com/10up/json-block-renderer#readme","bugs":{"url":"https://github.com/10up/json-block-renderer/issues"},"dist":{"shasum":"9fd35473ffc61034fbe36e55d57463a70080a566","tarball":"https://registry.npmjs.org/@10up/block-renderer-validator/-/block-renderer-validator-0.1.4.tgz","fileCount":26,"integrity":"sha512-BOfxgCNg0072Mn1YcQwVBe4E3Ug9GxZIsv1lxmyOXIqPAyyaj2fKX53HFVcO7BvaxmySPtnnIR8cVTb/EMk/Vw==","signatures":[{"sig":"MEQCICPshHl3yRFM1mRt0YSu76FpDtK8J+cCNXdviCC20FurAiAgAqsYaqWLwYbouzdNI2bnXBNqF65pSshBQ7eBexK+iA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74057},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-validator-0.1.4.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"fabiankaegy","email":"mail@fabian-kaegy.de"},"_resolved":"/private/var/folders/j3/yjw_92c17dxg7b0pcdntvnqh0000gn/T/4463d3e31b89cb68b2f5b781ad7bd1d9/10up-block-renderer-validator-0.1.4.tgz","_integrity":"sha512-BOfxgCNg0072Mn1YcQwVBe4E3Ug9GxZIsv1lxmyOXIqPAyyaj2fKX53HFVcO7BvaxmySPtnnIR8cVTb/EMk/Vw==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/validator"},"_npmVersion":"11.7.0","description":"Validation for WordPress block trees - schema, nesting, and token validation","directories":{},"_nodeVersion":"25.3.0","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.1.4","@10up/block-renderer-patterns":"0.1.4","@10up/block-renderer-theme-json":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-validator_0.1.4_1768823484892_0.15837972456293992","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@10up/block-renderer-validator","version":"0.1.5","keywords":["wordpress","blocks","validation","schema","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-validator@0.1.5","maintainers":[{"name":"fabiankaegy","email":"mail@fabian-kaegy.de"},{"name":"eugene-manuilov","email":"eugene.manuilov@gmail.com"},{"name":"christianc1","email":"christian.m.chung@gmail.com"},{"name":"nicholasio","email":"nicholasio.oliveira@gmail.com"},{"name":"joesnellpdx","email":"joesnellpdx@gmail.com"},{"name":"devinle","email":"devin.leggett@gmail.com"},{"name":"darylldoyle","email":"daryll.doyle@10up.com"}],"homepage":"https://github.com/10up/json-block-renderer#readme","bugs":{"url":"https://github.com/10up/json-block-renderer/issues"},"dist":{"shasum":"084c7656f80fc250ef7a21e16fb960d0f6037301","tarball":"https://registry.npmjs.org/@10up/block-renderer-validator/-/block-renderer-validator-0.1.5.tgz","fileCount":26,"integrity":"sha512-7QRMGkaU4Cb9FnvNvPOM4Vv49stnMuPQl0JQVzxn1Olmsb4VxjoJRos/X994SMBryOYJhLh8dTeLIpL3NJCOXQ==","signatures":[{"sig":"MEYCIQDZT2tDBGS4yzfqf99KKo1mueiLmBvpSWGZp57TE7CgrgIhAJfQmyRibtndE2Y+16eQqQ5fP+iPNOnEmt8/kA3i80Nd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74057},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-validator-0.1.5.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cefdf0c7-18d8-4170-b266-3b2231ea324c"}},"_resolved":"/tmp/89f37f82537c0ddd737825df3c86baf5/10up-block-renderer-validator-0.1.5.tgz","_integrity":"sha512-7QRMGkaU4Cb9FnvNvPOM4Vv49stnMuPQl0JQVzxn1Olmsb4VxjoJRos/X994SMBryOYJhLh8dTeLIpL3NJCOXQ==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/validator"},"_npmVersion":"11.7.0","description":"Validation for WordPress block trees - schema, nesting, and token validation","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.1.5","@10up/block-renderer-patterns":"0.1.5","@10up/block-renderer-theme-json":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-validator_0.1.5_1768824034953_0.06317309104374513","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@10up/block-renderer-validator","version":"0.1.6","keywords":["wordpress","blocks","validation","schema","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-validator@0.1.6","maintainers":[{"name":"fabiankaegy","email":"mail@fabian-kaegy.de"},{"name":"eugene-manuilov","email":"eugene.manuilov@gmail.com"},{"name":"christianc1","email":"christian.m.chung@gmail.com"},{"name":"nicholasio","email":"nicholasio.oliveira@gmail.com"},{"name":"joesnellpdx","email":"joesnellpdx@gmail.com"},{"name":"devinle","email":"devin.leggett@gmail.com"},{"name":"darylldoyle","email":"daryll.doyle@10up.com"}],"homepage":"https://github.com/10up/json-block-renderer#readme","bugs":{"url":"https://github.com/10up/json-block-renderer/issues"},"dist":{"shasum":"034a6f4011fb770fb5c398a53889415bf3951919","tarball":"https://registry.npmjs.org/@10up/block-renderer-validator/-/block-renderer-validator-0.1.6.tgz","fileCount":26,"integrity":"sha512-V1dd7chPtRkK20bb0P/TIWabS8kJ0CP38nhrEI7lXWf4SnEIHd5Bx7cdd2HN2pM53ptIy5SExSIuDzWWCLBcWg==","signatures":[{"sig":"MEUCIQDEZivVVXTiF1CpfCtMqIJUnfYKRi0ZQUZoarYC6z6jaQIgdpuT1W+nq8reeCpKhx11VrZbdis3mxZkbZuyBVQI8Yc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":74057},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-validator-0.1.6.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cefdf0c7-18d8-4170-b266-3b2231ea324c"}},"_resolved":"/tmp/aa6ead98dff020feb73e505d69551a4b/10up-block-renderer-validator-0.1.6.tgz","_integrity":"sha512-V1dd7chPtRkK20bb0P/TIWabS8kJ0CP38nhrEI7lXWf4SnEIHd5Bx7cdd2HN2pM53ptIy5SExSIuDzWWCLBcWg==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/validator"},"_npmVersion":"11.7.0","description":"Validation for WordPress block trees - schema, nesting, and token validation","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.1.6","@10up/block-renderer-patterns":"0.1.6","@10up/block-renderer-theme-json":"0.1.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-validator_0.1.6_1768824513518_0.7166571411562153","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@10up/block-renderer-validator","version":"0.2.0","keywords":["wordpress","blocks","validation","schema","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-validator@0.2.0","maintainers":[{"name":"fabiankaegy","email":"mail@fabian-kaegy.de"},{"name":"eugene-manuilov","email":"eugene.manuilov@gmail.com"},{"name":"christianc1","email":"christian.m.chung@gmail.com"},{"name":"nicholasio","email":"nicholasio.oliveira@gmail.com"},{"name":"joesnellpdx","email":"joesnellpdx@gmail.com"},{"name":"devinle","email":"devin.leggett@gmail.com"},{"name":"darylldoyle","email":"daryll.doyle@10up.com"}],"homepage":"https://github.com/10up/json-block-renderer#readme","bugs":{"url":"https://github.com/10up/json-block-renderer/issues"},"dist":{"shasum":"99d709540e66f9970e702bd767b07c0578bcbea4","tarball":"https://registry.npmjs.org/@10up/block-renderer-validator/-/block-renderer-validator-0.2.0.tgz","fileCount":34,"integrity":"sha512-w3F2zgv5EtULAZ3Vysi29352oUM0Z2uXCqi4LqcO/lmoKwdJzKs3j7UeHUFs00OV7rqfnDZEaVh9GDLyVy+jsQ==","signatures":[{"sig":"MEYCIQD/hhlGKdhXU1qNhDhUlhmLIFlBSsRJgiyvprDfkQhCRAIhAJX4C5Wca7AGhgXM0HHjK1Ub9WJX9rlofDxgFobXhjG3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":101509},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-validator-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:cefdf0c7-18d8-4170-b266-3b2231ea324c"}},"_resolved":"/tmp/8603df6acef1d701caf6a1a35c4c0a1b/10up-block-renderer-validator-0.2.0.tgz","_integrity":"sha512-w3F2zgv5EtULAZ3Vysi29352oUM0Z2uXCqi4LqcO/lmoKwdJzKs3j7UeHUFs00OV7rqfnDZEaVh9GDLyVy+jsQ==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/validator"},"_npmVersion":"11.8.0","description":"Validation for WordPress block trees - schema, nesting, and token validation","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.2.0","@10up/block-renderer-patterns":"0.1.7","@10up/block-renderer-theme-json":"0.1.7"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-validator_0.2.0_1769077371901_0.4568076826833929","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-01-19T11:51:24.766Z","modified":"2026-08-21T19:38:48.342Z","0.1.4":"2026-01-19T11:51:25.035Z","0.1.5":"2026-01-19T12:00:35.098Z","0.1.6":"2026-01-19T12:08:33.685Z","0.2.0":"2026-01-22T10:22:52.051Z"},"bugs":{"url":"https://github.com/10up/json-block-renderer/issues"},"license":"MIT","homepage":"https://github.com/10up/json-block-renderer#readme","keywords":["wordpress","blocks","validation","schema","gutenberg"],"repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/validator"},"description":"Validation for WordPress block trees - schema, nesting, and token validation","maintainers":[{"email":"mail@fabian-kaegy.de","name":"fabiankaegy"},{"email":"eugene.manuilov@gmail.com","name":"eugene-manuilov"},{"email":"christian.m.chung@gmail.com","name":"christianc1"},{"email":"nicholasio.oliveira@gmail.com","name":"nicholasio"},{"email":"joesnellpdx@gmail.com","name":"joesnellpdx"},{"email":"devin.leggett@gmail.com","name":"devinle"},{"email":"daryll.doyle@10up.com","name":"darylldoyle"},{"email":"jeffpaul@hotmail.com","name":"jeffpaul"}],"readme":"# @10up/block-renderer-validator\n\nValidate JSON block trees against schemas, nesting rules, and theme tokens. This package ensures block trees are valid before rendering.\n\n## Installation\n\n```bash\nnpm install @10up/block-renderer-validator\n# or\npnpm add @10up/block-renderer-validator\n```\n\n## Overview\n\nThis package provides comprehensive validation for block trees:\n\n1. **Schema Validation** - Validates block props against Zod schemas from block definitions\n2. **Nesting Validation** - Checks parent/ancestor/allowedBlocks constraints\n3. **Token Validation** - Verifies theme token references (colors, spacing, etc.)\n4. **Pattern Validation** - Confirms pattern slugs exist in the registry\n\n## Usage\n\n### Full Tree Validation\n\nThe main entry point - validates a tree with all available validators:\n\n```typescript\nimport { validateTree } from '@10up/block-renderer-validator';\n\nconst tree = {\n  root: 'para-1',\n  elements: {\n    'para-1': {\n      key: 'para-1',\n      type: 'core/paragraph',\n      props: {\n        content: 'Hello',\n        style: { color: { background: 'var:preset|color|primary' } }\n      }\n    }\n  }\n};\n\nconst result = validateTree(tree, {\n  catalog: blockCatalog,     // Block definitions for schema/nesting\n  tokens: themeTokens,       // Theme tokens for color/spacing validation\n  patterns: patternRegistry  // Pattern definitions\n});\n\nif (result.valid) {\n  console.log('Tree is valid');\n} else {\n  console.log('Errors:', result.errors);\n  // ['Unknown color token: primary', 'Invalid block type: core/unknown']\n}\n```\n\n### Validation Options\n\n```typescript\ninterface ValidateTreeOptions {\n  /** Block catalog for schema and nesting validation */\n  catalog?: BlockCatalog;\n  /** Theme tokens for token validation */\n  tokens?: ThemeTokens;\n  /** Pattern registry for pattern validation */\n  patterns?: PatternRegistry;\n  /** Whether to validate schemas (default: true if catalog provided) */\n  validateSchemas?: boolean;\n  /** Whether to validate nesting rules (default: true if catalog provided) */\n  validateNesting?: boolean;\n  /** Whether to validate theme tokens (default: true if tokens provided) */\n  validateTokens?: boolean;\n  /** Whether to validate pattern references (default: true if patterns provided) */\n  validatePatterns?: boolean;\n}\n```\n\n### Create Reusable Validator\n\n```typescript\nimport { createTreeValidator } from '@10up/block-renderer-validator';\n\nconst validator = createTreeValidator({\n  catalog: blockCatalog,\n  tokens: themeTokens,\n  patterns: patternRegistry,\n});\n\n// Use the pre-configured validator\nconst result1 = validator(tree1);\nconst result2 = validator(tree2);\n```\n\n## Schema Validation\n\nValidate block props against their Zod schemas:\n\n```typescript\nimport { validateBlockProps, validateTreeSchemas } from '@10up/block-renderer-validator';\n\n// Validate a single element's props\nconst result = validateBlockProps(element.props, blockDefinition.schema);\nif (!result.valid) {\n  console.log(result.errors);\n  // ['content: Expected string, received number']\n}\n\n// Validate all elements in a tree\nconst treeResult = validateTreeSchemas(tree, catalog);\n```\n\n### Create Block Validator\n\nCreate a validator for a specific block:\n\n```typescript\nimport { createBlockValidator } from '@10up/block-renderer-validator';\n\nconst validateParagraph = createBlockValidator(paragraphDefinition);\nconst result = validateParagraph({ content: 'Hello', dropCap: true });\n```\n\n### Get Valid Attributes\n\nFilter props to only include valid attributes:\n\n```typescript\nimport { getValidAttributes } from '@10up/block-renderer-validator';\n\nconst cleanProps = getValidAttributes(props, blockDefinition.schema);\n// Returns only props that match the schema\n```\n\n## Nesting Validation\n\nValidate block nesting rules:\n\n```typescript\nimport { validateTreeNesting } from '@10up/block-renderer-validator';\n\nconst result = validateTreeNesting(tree, catalog);\nif (!result.valid) {\n  console.log(result.errors);\n  // ['core/column must be inside core/columns']\n}\n```\n\n### Individual Nesting Validators\n\n```typescript\nimport {\n  validateParent,\n  validateAncestor,\n  validateChildren,\n  validateMultiple,\n} from '@10up/block-renderer-validator';\n\n// Check if element has valid parent\nvalidateParent(element, parentElement, blockDefinition);\n\n// Check if element has valid ancestor chain\nvalidateAncestor(element, ancestorChain, blockDefinition);\n\n// Check if children are valid for this block\nvalidateChildren(element, childElements, blockDefinition);\n\n// Check if multiple instances are allowed\nvalidateMultiple(elements, blockDefinition);\n```\n\n## Token Validation\n\nValidate theme token references in block props:\n\n```typescript\nimport { validateTreeTokens, validateElementTokens } from '@10up/block-renderer-validator';\n\n// Validate all tokens in a tree\nconst result = validateTreeTokens(tree, themeTokens);\nif (!result.valid) {\n  console.log(result.errors);\n  // ['Unknown color token: invalid-color']\n}\n\n// Validate a single element's tokens\nconst elementResult = validateElementTokens(element, themeTokens);\n```\n\n### Specific Token Validators\n\n```typescript\nimport {\n  validateColorTokens,\n  validateTypographyTokens,\n  validateSpacingTokens,\n} from '@10up/block-renderer-validator';\n\n// Validate specific token types\nvalidateColorTokens(props, themeTokens);\nvalidateTypographyTokens(props, themeTokens);\nvalidateSpacingTokens(props, themeTokens);\n```\n\n## Pattern Validation\n\nValidate pattern block references:\n\n```typescript\nimport {\n  validatePatternReference,\n  validateTreePatterns,\n  isPatternReference,\n  getPatternReferences,\n} from '@10up/block-renderer-validator';\n\n// Check if an element is a pattern reference\nif (isPatternReference(element)) {\n  const result = validatePatternReference(element, patternRegistry);\n  if (!result.valid) {\n    console.log(result.errors);\n    // ['Unknown pattern: theme/nonexistent-pattern']\n  }\n}\n\n// Validate all patterns in a tree\nconst treeResult = validateTreePatterns(tree, patternRegistry);\n\n// Get all pattern references from a tree\nconst patternRefs = getPatternReferences(tree);\n// ['theme/hero-section', 'theme/footer']\n```\n\n## Template Validation\n\nValidate BlockTemplate format (PHP-style nested arrays):\n\n```typescript\nimport {\n  validateTemplate,\n  validateTemplateStructure,\n  validateTemplateBlockTypes,\n  validateTemplateNesting,\n} from '@10up/block-renderer-validator';\n\nconst template = [\n  ['core/group', { layout: { type: 'constrained' } }, [\n    ['core/heading', { content: 'Title', level: 2 }],\n    ['core/paragraph', { content: 'Content' }],\n  ]],\n];\n\n// Full template validation\nconst result = validateTemplate(template, {\n  catalog: blockCatalog,\n});\n\nif (!result.valid) {\n  console.log('Errors:', result.errors);\n}\n\n// Validate just structure (correct array format)\nconst structureResult = validateTemplateStructure(template);\n\n// Validate block types exist\nconst typesResult = validateTemplateBlockTypes(template, catalog);\n\n// Validate nesting rules\nconst nestingResult = validateTemplateNesting(template, catalog);\n```\n\n### Template Validation Options\n\n```typescript\ninterface ValidateTemplateOptions {\n  /** Block catalog for type and nesting validation */\n  catalog?: BlockCatalog;\n  /** Whether to validate that block types exist (default: true if catalog provided) */\n  validateBlockTypes?: boolean;\n  /** Whether to validate nesting rules (default: true if catalog provided) */\n  validateNesting?: boolean;\n}\n```\n\n## Complete Exports\n\n### Main Functions\n\n| Function | Description |\n|----------|-------------|\n| `validateTree(tree, options)` | Full tree validation with all validators |\n| `createTreeValidator(options)` | Create reusable validator function |\n\n### Schema Validation\n\n| Function | Description |\n|----------|-------------|\n| `validateBlockProps(props, schema)` | Validate props against Zod schema |\n| `validateTreeSchemas(tree, catalog)` | Validate all elements in tree |\n| `createBlockValidator(definition)` | Create validator for specific block |\n| `getValidAttributes(props, schema)` | Filter to valid attributes only |\n\n### Nesting Validation\n\n| Function | Description |\n|----------|-------------|\n| `validateTreeNesting(tree, catalog)` | Validate all nesting rules in tree |\n| `validateParent(element, parent, def)` | Check valid parent constraint |\n| `validateAncestor(element, ancestors, def)` | Check valid ancestor constraint |\n| `validateChildren(element, children, def)` | Check valid children constraint |\n| `validateMultiple(elements, def)` | Check multiple instance constraint |\n\n### Token Validation\n\n| Function | Description |\n|----------|-------------|\n| `validateTreeTokens(tree, tokens)` | Validate all tokens in tree |\n| `validateElementTokens(element, tokens)` | Validate single element tokens |\n| `validateColorTokens(props, tokens)` | Validate color token references |\n| `validateTypographyTokens(props, tokens)` | Validate typography tokens |\n| `validateSpacingTokens(props, tokens)` | Validate spacing tokens |\n\n### Pattern Validation\n\n| Function | Description |\n|----------|-------------|\n| `validateTreePatterns(tree, patterns)` | Validate all pattern refs in tree |\n| `validatePatternReference(element, patterns)` | Validate single pattern ref |\n| `isPatternReference(element)` | Check if element is a pattern |\n| `getPatternReferences(tree)` | Get all pattern slugs from tree |\n\n### Template Validation\n\n| Function | Description |\n|----------|-------------|\n| `validateTemplate(template, options)` | Full template validation |\n| `validateTemplateStructure(template)` | Validate template array structure |\n| `validateTemplateBlockTypes(template, catalog)` | Validate block types exist |\n| `validateTemplateNesting(template, catalog)` | Validate nesting rules |\n\n### Types\n\n| Type | Description |\n|------|-------------|\n| `ValidateTreeOptions` | Options for validateTree |\n| `ValidateTemplateOptions` | Options for validateTemplate |\n| `TemplateValidationResult` | Result from template validation |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}