export declare const COMPOUND_PARENT_EDIT_TEMPLATE = "import type { BlockEditProps } from '@wp-typia/block-types/blocks/registration';\nimport { __ } from '@wordpress/i18n';\nimport {\n InspectorControls,\n InnerBlocks,\n RichText,\n useBlockProps,\n} from '@wordpress/block-editor';\nimport { Notice, PanelBody, ToggleControl } from '@wordpress/components';\n\nimport { getRootInnerBlocksPropsOptions } from './children';\nimport { useTypiaValidation } from './hooks';\nimport type { {{pascalCase}}Attributes } from './types';\nimport {\n createAttributeUpdater,\n validate{{pascalCase}}Attributes,\n} from './validators';\n\ntype EditProps = BlockEditProps<{{pascalCase}}Attributes>;\ntype CompoundInnerBlocksProps = Parameters[0] & {\n defaultBlock?: [string, Record];\n directInsert?: boolean;\n};\n\nconst TypedInnerBlocks = InnerBlocks as unknown as (\n props: CompoundInnerBlocksProps,\n) => ReturnType;\n\nexport default function Edit({ attributes, setAttributes }: EditProps) {\n const { errorMessages, isValid } = useTypiaValidation(\n attributes,\n validate{{pascalCase}}Attributes,\n );\n const updateAttribute = createAttributeUpdater(attributes, setAttributes);\n const blockProps = useBlockProps({\n className: '{{cssClassName}}',\n });\n const rootInnerBlocksPropsOptions = getRootInnerBlocksPropsOptions();\n\n return (\n <>\n \n \n updateAttribute('showDividers', value)}\n />\n \n {!isValid && (\n \n {errorMessages.map((error, index) => (\n \n {error}\n \n ))}\n \n )}\n \n
\n updateAttribute('heading', heading)}\n placeholder={__({{titleTsLiteral}}, '{{textDomain}}')}\n />\n updateAttribute('intro', intro)}\n placeholder={__(\n 'Add and reorder internal items inside this compound block.',\n '{{textDomain}}',\n )}\n />\n {!isValid && (\n \n
    \n {errorMessages.map((error, index) => (\n
  • {error}
  • \n ))}\n
\n
\n )}\n
\n \n
\n
\n \n );\n}\n"; export declare const COMPOUND_PARENT_SAVE_TEMPLATE = "import { InnerBlocks, RichText, useBlockProps } from '@wordpress/block-editor';\n\nimport type { {{pascalCase}}Attributes } from './types';\n\nexport default function Save({\n attributes,\n}: {\n attributes: {{pascalCase}}Attributes;\n}) {\n return (\n \n \n \n
\n \n
\n \n );\n}\n"; export declare const COMPOUND_PARENT_INDEX_TEMPLATE = "import {\n registerScaffoldBlockType,\n type BlockConfiguration,\n} from '@wp-typia/block-types/blocks/registration';\nimport {\n buildScaffoldBlockRegistration,\n parseScaffoldBlockMetadata,\n} from '@wp-typia/block-runtime/blocks';\n\nimport Edit from './edit';\nimport Save from './save';\nimport metadata from './block-metadata';\nimport './style.scss';\n\nimport type { {{pascalCase}}Attributes } from './types';\n\nconst registration = buildScaffoldBlockRegistration(\n parseScaffoldBlockMetadata<\n BlockConfiguration<{{pascalCase}}Attributes>\n >(metadata),\n {\n edit: Edit,\n save: Save,\n },\n);\n\nregisterScaffoldBlockType(registration.name, registration.settings);\n"; export declare const COMPOUND_LOCAL_HOOKS_TEMPLATE = "export {\n formatValidationError,\n formatValidationErrors,\n useTypiaValidation,\n} from '../../hooks';\n\nexport type {\n TypiaValidationError,\n ValidationResult,\n ValidationState,\n} from '../../hooks';\n"; export declare const COMPOUND_PARENT_VALIDATORS_TEMPLATE = "import typia from 'typia';\nimport currentManifest from './manifest-defaults-document';\n{{validationTypesImport}}\nimport { createTemplateValidatorToolkit } from '../../validator-toolkit';\n\nconst scaffoldValidators =\n createTemplateValidatorToolkit<{{pascalCase}}Attributes>({\n assert: typia.createAssert<{{pascalCase}}Attributes>(),\n clone: typia.plain.createClone<{{pascalCase}}Attributes>() as (\n value: {{pascalCase}}Attributes,\n ) => {{pascalCase}}Attributes,\n is: typia.createIs<{{pascalCase}}Attributes>(),\n manifest: currentManifest,\n prune: typia.plain.createPrune<{{pascalCase}}Attributes>(),\n random: typia.createRandom<{{pascalCase}}Attributes>() as (\n ...args: unknown[]\n ) => {{pascalCase}}Attributes,\n validate: typia.createValidate<{{pascalCase}}Attributes>(),\n });\n\nexport const validate{{pascalCase}}Attributes =\n scaffoldValidators.validateAttributes as (\n attributes: unknown,\n ) => {{pascalCase}}ValidationResult;\n\nexport const validators = scaffoldValidators.validators;\n\nexport const sanitize{{pascalCase}}Attributes =\n scaffoldValidators.sanitizeAttributes as (\n attributes: Partial<{{pascalCase}}Attributes>,\n ) => {{pascalCase}}Attributes;\n\nexport const createAttributeUpdater = scaffoldValidators.createAttributeUpdater;\n"; export declare const COMPOUND_CHILDREN_TEMPLATE = "import type { BlockTemplate } from '@wp-typia/block-types/blocks/registration';\nimport { InnerBlocks } from '@wordpress/block-editor';\n\nexport const DEFAULT_CHILD_BLOCK_NAME =\n '{{namespace}}/{{slugKebabCase}}-item';\n\nexport interface CompoundChildSpec {\n ancestorKeys: string[];\n blockName: string;\n bodyPlaceholder: string;\n container: boolean;\n folderSlug: string;\n key: string;\n placement: 'nested' | 'root';\n supportsInserter: boolean;\n templateInstances: Array>;\n title: string;\n}\n\nexport interface CompoundInnerBlocksConfig {\n defaultBlock?: [string, Record];\n directInsert: boolean;\n orientation?: 'horizontal' | 'vertical';\n template?: BlockTemplate;\n templateLock: false | 'insert' | 'all';\n}\n\nexport type CompoundInnerBlocksPropsOptions = CompoundInnerBlocksConfig & {\n renderAppender?: typeof InnerBlocks.ButtonBlockAppender;\n};\n\nexport const ROOT_INNER_BLOCKS_PRESET_ID = '{{compoundInnerBlocksPreset}}';\nexport const ROOT_INNER_BLOCKS_PRESET_DESCRIPTION =\n '{{compoundInnerBlocksPresetDescription}}';\n\nconst BASE_INNER_BLOCKS_CONFIG: Omit<\n CompoundInnerBlocksConfig,\n 'defaultBlock' | 'template'\n> = {\n directInsert: {{compoundInnerBlocksDirectInsert}},\n orientation: {{compoundInnerBlocksOrientationExpression}},\n templateLock: {{compoundInnerBlocksTemplateLockExpression}},\n};\n\nconst ROOT_BLOCK_NAME = '{{namespace}}/{{slugKebabCase}}';\n\nexport const COMPOUND_CHILD_SPECS: CompoundChildSpec[] = [\n {\n ancestorKeys: [],\n blockName: DEFAULT_CHILD_BLOCK_NAME,\n bodyPlaceholder: 'Add supporting details for this internal item.',\n container: false,\n folderSlug: '{{slugKebabCase}}-item',\n key: 'item',\n placement: 'root',\n supportsInserter: false,\n templateInstances: [\n {\n body: 'Add supporting details for the first internal item.',\n title: 'First Item',\n },\n {\n body: 'Add supporting details for the second internal item.',\n title: 'Second Item',\n },\n ],\n title: '{{compoundChildTitle}}',\n },\n // add-child: insert new child specs here\n];\n\nfunction buildTemplateEntriesForSpec(spec: CompoundChildSpec): BlockTemplate {\n const nestedTemplate = buildNestedTemplateForKey(spec.key);\n\n return spec.templateInstances.map((attributes) =>\n nestedTemplate.length > 0\n ? [spec.blockName, attributes, nestedTemplate]\n : [spec.blockName, attributes],\n );\n}\n\nfunction buildNestedTemplateForKey(key: string): BlockTemplate {\n return COMPOUND_CHILD_SPECS.filter(\n (spec) =>\n spec.placement === 'nested' &&\n spec.ancestorKeys[spec.ancestorKeys.length - 1] === key,\n ).flatMap((spec) => buildTemplateEntriesForSpec(spec));\n}\n\nexport const DEFAULT_CHILD_TEMPLATE: BlockTemplate =\n COMPOUND_CHILD_SPECS.filter((spec) => spec.placement === 'root').flatMap(\n (spec) => buildTemplateEntriesForSpec(spec),\n );\n\nfunction buildDefaultBlockEntry(\n template?: BlockTemplate,\n): [string, Record] | undefined {\n if (!BASE_INNER_BLOCKS_CONFIG.directInsert) {\n return undefined;\n }\n if (!Array.isArray(template) || template.length === 0) {\n return undefined;\n }\n\n const firstBlockName = template[0]?.[0];\n if (typeof firstBlockName !== 'string') {\n return undefined;\n }\n\n return [firstBlockName, {}];\n}\n\nfunction buildInnerBlocksPropsOptions(\n config: CompoundInnerBlocksConfig,\n): CompoundInnerBlocksPropsOptions {\n return {\n ...config,\n renderAppender:\n config.templateLock === 'all'\n ? undefined\n : InnerBlocks.ButtonBlockAppender,\n };\n}\n\nexport function getRootInnerBlocksConfig(): CompoundInnerBlocksConfig {\n return {\n ...BASE_INNER_BLOCKS_CONFIG,\n defaultBlock: buildDefaultBlockEntry(DEFAULT_CHILD_TEMPLATE),\n template: DEFAULT_CHILD_TEMPLATE,\n };\n}\n\nexport function getRootInnerBlocksPropsOptions(): CompoundInnerBlocksPropsOptions {\n return buildInnerBlocksPropsOptions(getRootInnerBlocksConfig());\n}\n\nexport function getChildSpec(blockName: string): CompoundChildSpec | undefined {\n return COMPOUND_CHILD_SPECS.find((spec) => spec.blockName === blockName);\n}\n\nexport function getChildTemplate(blockName: string): BlockTemplate | undefined {\n const childSpec = getChildSpec(blockName);\n if (!childSpec) {\n return undefined;\n }\n\n const nestedTemplate = buildNestedTemplateForKey(childSpec.key);\n if (nestedTemplate.length > 0) {\n return nestedTemplate;\n }\n\n return childSpec.container ? [] : undefined;\n}\n\nexport function getChildInnerBlocksConfig(\n blockName: string,\n): CompoundInnerBlocksConfig | undefined {\n const childSpec = getChildSpec(blockName);\n if (!childSpec) {\n return undefined;\n }\n\n const template = getChildTemplate(blockName);\n\n if (!childSpec.container && !template) {\n return undefined;\n }\n\n return {\n ...BASE_INNER_BLOCKS_CONFIG,\n defaultBlock: buildDefaultBlockEntry(template),\n template,\n };\n}\n\nexport function getChildInnerBlocksPropsOptions(\n blockName: string,\n): CompoundInnerBlocksPropsOptions | undefined {\n const config = getChildInnerBlocksConfig(blockName);\n if (!config) {\n return undefined;\n }\n\n return buildInnerBlocksPropsOptions(config);\n}\n\nexport function hasNestedChildBlocks(blockName: string): boolean {\n const childSpec = getChildSpec(blockName);\n if (!childSpec) {\n return false;\n }\n\n return (\n childSpec.container || buildNestedTemplateForKey(childSpec.key).length > 0\n );\n}\n\nexport function isRootCompoundChildBlock(blockName: string): boolean {\n const childSpec = getChildSpec(blockName);\n return childSpec?.placement === 'root';\n}\n\nexport { ROOT_BLOCK_NAME };\n";