{"_id":"@10up/block-renderer-patterns","_rev":"5-9a9e3add20e970221380e34b149659ea","name":"@10up/block-renderer-patterns","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.4":{"name":"@10up/block-renderer-patterns","version":"0.1.4","keywords":["wordpress","blocks","patterns","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-patterns@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":"06c5e13b986e1c9a5606c3badf5d26886aaa918b","tarball":"https://registry.npmjs.org/@10up/block-renderer-patterns/-/block-renderer-patterns-0.1.4.tgz","fileCount":18,"integrity":"sha512-mRemHSM1JA7hif/VL4Izb91RleEyPLPbgwNyUZVgCYBCzmXKcxTPT2zRAXNviRfA2lKBtSMex4LEQO6LFzkz3A==","signatures":[{"sig":"MEUCIGkgF7H1X9EACRXxgiTuyyzQv9AmLOiGuaPczC44/Qd6AiEA4SeuK6nEBXajN17RNPsViYs7foQshh6w6aqWW5NErHs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39286},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-patterns-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/a98ace39fd4d1dbf63a9c435f2c3330a/10up-block-renderer-patterns-0.1.4.tgz","_integrity":"sha512-mRemHSM1JA7hif/VL4Izb91RleEyPLPbgwNyUZVgCYBCzmXKcxTPT2zRAXNviRfA2lKBtSMex4LEQO6LFzkz3A==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/patterns"},"_npmVersion":"11.7.0","description":"Pattern directory scanner and PHP header parser for WordPress block patterns","directories":{},"_nodeVersion":"25.3.0","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.1.4"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-patterns_0.1.4_1768823470518_0.8499842075003399","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@10up/block-renderer-patterns","version":"0.1.5","keywords":["wordpress","blocks","patterns","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-patterns@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":"0967e61e1b5f381275e29a862cb8ee47853e7a69","tarball":"https://registry.npmjs.org/@10up/block-renderer-patterns/-/block-renderer-patterns-0.1.5.tgz","fileCount":18,"integrity":"sha512-RnL55qey2POgLGyCyAK3EzCdcpFuiL0k4V58zu9gkF4qFk6cL00IpuHvwmB0nKd1PhX1H6yKub4t5gpcjTPZeg==","signatures":[{"sig":"MEQCIHTnEotlHiriFpucEg+bYJYvyLa9tgRApbu24PJNdmS2AiARpqmxVH8UcbO2r3vvLFi7ma4Yfk2q4Wex3L8MHUojMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39286},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-patterns-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:d69b49ff-20ec-41ac-a8a1-e20568cfa75a"}},"_resolved":"/tmp/f17e3344f30ad85d3aa7a8ad98a05f91/10up-block-renderer-patterns-0.1.5.tgz","_integrity":"sha512-RnL55qey2POgLGyCyAK3EzCdcpFuiL0k4V58zu9gkF4qFk6cL00IpuHvwmB0nKd1PhX1H6yKub4t5gpcjTPZeg==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/patterns"},"_npmVersion":"11.7.0","description":"Pattern directory scanner and PHP header parser for WordPress block patterns","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.1.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-patterns_0.1.5_1768824023768_0.9438138700388343","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@10up/block-renderer-patterns","version":"0.1.6","keywords":["wordpress","blocks","patterns","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-patterns@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":"979a5e87501c9f0f374277773796eec609234506","tarball":"https://registry.npmjs.org/@10up/block-renderer-patterns/-/block-renderer-patterns-0.1.6.tgz","fileCount":18,"integrity":"sha512-DCiOpeH+pI94LTSWjMwwxCBHDMbLCueArnhVJihpFVAe0szDYUnvwIOJ9xU9/3emf0l5IkG5cZEaty+S2JhN2Q==","signatures":[{"sig":"MEUCIQD1WmLenOwJrdHtJZBOjLoL0+/ibWMmn/nEgySv3RbjYAIgCDO3k2u0OqBumRHgeHB6AdzSPtiU4oH7O/JJD/9E3dQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39286},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-patterns-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:d69b49ff-20ec-41ac-a8a1-e20568cfa75a"}},"_resolved":"/tmp/080fedfebfec765da8566c7003e4ff80/10up-block-renderer-patterns-0.1.6.tgz","_integrity":"sha512-DCiOpeH+pI94LTSWjMwwxCBHDMbLCueArnhVJihpFVAe0szDYUnvwIOJ9xU9/3emf0l5IkG5cZEaty+S2JhN2Q==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/patterns"},"_npmVersion":"11.7.0","description":"Pattern directory scanner and PHP header parser for WordPress block patterns","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.1.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-patterns_0.1.6_1768824509865_0.39654462357773923","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@10up/block-renderer-patterns","version":"0.1.7","keywords":["wordpress","blocks","patterns","gutenberg"],"license":"MIT","_id":"@10up/block-renderer-patterns@0.1.7","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":"9e640434ce2407cf86dc822d4cb3567d625c6448","tarball":"https://registry.npmjs.org/@10up/block-renderer-patterns/-/block-renderer-patterns-0.1.7.tgz","fileCount":18,"integrity":"sha512-kbJtRoaBiNb5S2sUmlNrouuLp1GZj484bb2gilVdQ3O8Eg4KMD+gVz/XQTmvR0RLhhmTtznWF8+fT1qrmrodnQ==","signatures":[{"sig":"MEUCIE1aq2hhK+lgqBf4zYi5JSAi9hZenQaVpOzqdL7ii20lAiEAmXnk07aVkcdc/QvvEoGGgg5orcxoJVOQvqZvVJBBZP0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":39286},"main":"./dist/index.js","type":"module","_from":"file:10up-block-renderer-patterns-0.1.7.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:d69b49ff-20ec-41ac-a8a1-e20568cfa75a"}},"_resolved":"/tmp/7f16d4eb3c56ac1fc751f35ff989c042/10up-block-renderer-patterns-0.1.7.tgz","_integrity":"sha512-kbJtRoaBiNb5S2sUmlNrouuLp1GZj484bb2gilVdQ3O8Eg4KMD+gVz/XQTmvR0RLhhmTtznWF8+fT1qrmrodnQ==","repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/patterns"},"_npmVersion":"11.8.0","description":"Pattern directory scanner and PHP header parser for WordPress block patterns","directories":{},"_nodeVersion":"22.21.1","dependencies":{"zod":"^3.24.0","@10up/block-renderer-core":"0.2.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","typescript":"^5.7.0"},"_npmOperationalInternal":{"tmp":"tmp/block-renderer-patterns_0.1.7_1769077368885_0.6428974364046907","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-01-19T11:51:10.422Z","modified":"2026-08-21T19:38:47.676Z","0.1.4":"2026-01-19T11:51:10.653Z","0.1.5":"2026-01-19T12:00:23.916Z","0.1.6":"2026-01-19T12:08:30.016Z","0.1.7":"2026-01-22T10:22:49.035Z"},"bugs":{"url":"https://github.com/10up/json-block-renderer/issues"},"license":"MIT","homepage":"https://github.com/10up/json-block-renderer#readme","keywords":["wordpress","blocks","patterns","gutenberg"],"repository":{"url":"git+https://github.com/10up/json-block-renderer.git","type":"git","directory":"packages/patterns"},"description":"Pattern directory scanner and PHP header parser for WordPress block patterns","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-patterns\n\nScan WordPress theme pattern directories and parse PHP file headers to extract pattern metadata and content.\n\n## Installation\n\n```bash\nnpm install @10up/block-renderer-patterns\n# or\npnpm add @10up/block-renderer-patterns\n```\n\n## Overview\n\nWordPress themes can define [block patterns](https://developer.wordpress.org/themes/patterns/) in PHP files within the `/patterns` directory. This package:\n\n1. **Scans pattern directories** - Both `/patterns` and `/synced-patterns`\n2. **Parses PHP headers** - Extracts metadata from PHP file docblocks\n3. **Extracts block content** - Gets the actual block markup\n4. **Creates a searchable registry** - Query patterns by category, block type, or keywords\n\n## Usage\n\n### Load All Patterns from Theme\n\nThe main entry point - loads all patterns and returns a registry:\n\n```typescript\nimport { loadPatterns } from '@10up/block-renderer-patterns';\n\nconst registry = loadPatterns('/path/to/theme');\n\n// Iterate over all patterns\nfor (const [slug, pattern] of registry) {\n  console.log(pattern.slug);        // 'theme-name/hero-section'\n  console.log(pattern.title);       // 'Hero Section'\n  console.log(pattern.categories);  // ['featured', 'banner']\n  console.log(pattern.content);     // '<!-- wp:group -->...'\n}\n\n// Get a specific pattern\nconst heroPattern = registry.get('theme-name/hero-section');\n```\n\n### Scan Patterns with Error Reporting\n\nGet detailed scan results including errors:\n\n```typescript\nimport { scanPatterns, createPatternRegistry } from '@10up/block-renderer-patterns';\n\nconst result = scanPatterns('/path/to/theme');\n\n// Check for errors\nif (result.errors.length > 0) {\n  console.log('Failed to parse:');\n  for (const error of result.errors) {\n    console.log(`  ${error.filePath}: ${error.error}`);\n  }\n}\n\n// Access successfully parsed patterns\nconsole.log(`Found ${result.patterns.length} patterns`);\n\n// Create a registry from results\nconst registry = createPatternRegistry(result);\n```\n\n### Parse Single Pattern File\n\n```typescript\nimport { parsePatternFile } from '@10up/block-renderer-patterns';\n\nconst pattern = parsePatternFile(\n  '/path/to/theme/patterns/hero.php',\n  'theme-name',  // Theme name for slug prefix\n  false          // isSynced flag\n);\n\nconsole.log(pattern);\n// {\n//   slug: 'theme-name/hero',\n//   title: 'Hero Section',\n//   description: 'A hero section with...',\n//   categories: ['featured'],\n//   keywords: ['hero', 'banner'],\n//   blockTypes: ['core/post-content'],\n//   inserter: true,\n//   content: '<!-- wp:group -->...',\n//   filePath: '/path/to/theme/patterns/hero.php',\n//   isSynced: false\n// }\n```\n\n### Parse PHP Header Only\n\nExtract metadata from a PHP file's docblock:\n\n```typescript\nimport { parsePatternHeader } from '@10up/block-renderer-patterns';\n\nconst phpContent = `<?php\n/**\n * Title: Hero Section\n * Slug: theme-name/hero\n * Categories: featured, banner\n * Keywords: hero, cta\n * Block Types: core/post-content\n * Viewport Width: 1200\n */\n?>\n<!-- wp:group -->...`;\n\nconst metadata = parsePatternHeader(phpContent);\n// {\n//   title: 'Hero Section',\n//   slug: 'theme-name/hero',\n//   categories: ['featured', 'banner'],\n//   keywords: ['hero', 'cta'],\n//   blockTypes: ['core/post-content'],\n//   viewportWidth: 1200\n// }\n```\n\n### Extract Block Content\n\nGet the block markup without the PHP header:\n\n```typescript\nimport { extractPatternContent } from '@10up/block-renderer-patterns';\n\nconst content = extractPatternContent(phpContent);\n// '<!-- wp:group -->...'\n```\n\n## Querying Patterns\n\n### Get Patterns by Category\n\n```typescript\nimport { loadPatterns, getPatternsByCategory } from '@10up/block-renderer-patterns';\n\nconst registry = loadPatterns('/path/to/theme');\nconst featuredPatterns = getPatternsByCategory(registry, 'featured');\n// Returns PatternDefinition[]\n```\n\n### Get Patterns by Block Type\n\nPatterns can be associated with specific block types:\n\n```typescript\nimport { getPatternsByBlockType } from '@10up/block-renderer-patterns';\n\n// Get patterns for the post content block\nconst contentPatterns = getPatternsByBlockType(registry, 'core/post-content');\n```\n\n### Search Patterns\n\nSearch across title, description, keywords, and slug:\n\n```typescript\nimport { searchPatterns } from '@10up/block-renderer-patterns';\n\nconst results = searchPatterns(registry, 'hero');\n// Returns patterns matching \"hero\" in any searchable field\n```\n\n### Get All Categories\n\n```typescript\nimport { getAllCategories } from '@10up/block-renderer-patterns';\n\nconst categories = getAllCategories(registry);\n// ['banner', 'featured', 'footer', 'header', ...]\n```\n\n## Types\n\n### PatternDefinition\n\n```typescript\ninterface PatternDefinition {\n  /** Human-readable title */\n  title: string;\n  /** Pattern slug, e.g., \"theme-name/hero\" */\n  slug: string;\n  /** Pattern categories */\n  categories?: string[];\n  /** Search keywords */\n  keywords?: string[];\n  /** Pattern description (for screen readers) */\n  description?: string;\n  /** Block types this pattern applies to */\n  blockTypes?: string[];\n  /** Post types where this pattern can be used */\n  postTypes?: string[];\n  /** Preview iframe width */\n  viewportWidth?: number;\n  /** Whether to show in inserter (default true) */\n  inserter?: boolean;\n  /** The actual block markup content */\n  content: string;\n  /** Source file path */\n  filePath: string;\n  /** Whether this is a synced pattern (reusable block) */\n  isSynced: boolean;\n}\n```\n\n### PatternRegistry\n\n```typescript\ntype PatternRegistry = Map<string, PatternDefinition>;\n```\n\n### PatternScanResult\n\n```typescript\ninterface PatternScanResult {\n  /** Successfully parsed patterns */\n  patterns: PatternDefinition[];\n  /** Files that failed to parse */\n  errors: Array<{\n    filePath: string;\n    error: string;\n  }>;\n}\n```\n\n### PatternMetadata\n\n```typescript\ninterface PatternMetadata {\n  title?: string;\n  slug?: string;\n  categories?: string[];\n  keywords?: string[];\n  description?: string;\n  blockTypes?: string[];\n  postTypes?: string[];\n  viewportWidth?: number;\n  inserter?: boolean;\n}\n```\n\n## Complete Exports\n\n### Functions\n\n| Function | Description |\n|----------|-------------|\n| `loadPatterns(themePath)` | Load all patterns and return a registry |\n| `scanPatterns(themePath)` | Scan patterns with error reporting |\n| `createPatternRegistry(scanResult)` | Create registry from scan results |\n| `parsePatternFile(filePath, themeName, isSynced)` | Parse single pattern file |\n| `parsePatternHeader(content)` | Parse PHP header to metadata |\n| `extractPhpCommentHeader(content)` | Extract raw PHP docblock |\n| `extractPatternContent(content)` | Extract block markup from PHP |\n| `getPatternsByCategory(registry, category)` | Filter patterns by category |\n| `getPatternsByBlockType(registry, blockType)` | Filter patterns by block type |\n| `searchPatterns(registry, query)` | Search patterns by keyword |\n| `getAllCategories(registry)` | Get all unique categories |\n\n### Types\n\n| Type | Description |\n|------|-------------|\n| `PatternDefinition` | Complete pattern with metadata and content |\n| `PatternRegistry` | Map of slug to pattern definition |\n| `PatternScanResult` | Scan results with patterns and errors |\n| `PatternMetadata` | Metadata extracted from PHP header |\n\n### Zod Schemas\n\n| Schema | Description |\n|--------|-------------|\n| `patternMetadataSchema` | Validate pattern metadata objects |\n| `patternDefinitionSchema` | Validate complete pattern definitions |\n\n## License\n\nMIT\n","readmeFilename":"README.md"}