@wp-typia/project-tools 0.16.10 → 0.16.12
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/README.md +9 -3
- package/dist/runtime/built-in-block-artifact-documents.d.ts +3 -0
- package/dist/runtime/built-in-block-artifact-documents.js +2 -0
- package/dist/runtime/built-in-block-artifact-types.d.ts +51 -0
- package/dist/runtime/built-in-block-artifact-types.js +304 -0
- package/dist/runtime/built-in-block-artifacts.js +4 -803
- package/dist/runtime/built-in-block-attribute-emitters.d.ts +71 -0
- package/dist/runtime/built-in-block-attribute-emitters.js +176 -0
- package/dist/runtime/built-in-block-attribute-specs.d.ts +38 -0
- package/dist/runtime/built-in-block-attribute-specs.js +358 -0
- package/dist/runtime/built-in-block-code-templates/basic.d.ts +4 -0
- package/dist/runtime/built-in-block-code-templates/basic.js +249 -0
- package/dist/runtime/built-in-block-code-templates/compound-child.d.ts +4 -0
- package/dist/runtime/built-in-block-code-templates/compound-child.js +138 -0
- package/dist/runtime/built-in-block-code-templates/compound-parent.d.ts +6 -0
- package/dist/runtime/built-in-block-code-templates/compound-parent.js +227 -0
- package/dist/runtime/built-in-block-code-templates/compound-persistence.d.ts +4 -0
- package/dist/runtime/built-in-block-code-templates/compound-persistence.js +478 -0
- package/dist/runtime/built-in-block-code-templates/compound.d.ts +3 -0
- package/dist/runtime/built-in-block-code-templates/compound.js +3 -0
- package/dist/runtime/built-in-block-code-templates/interactivity.d.ts +5 -0
- package/dist/runtime/built-in-block-code-templates/interactivity.js +547 -0
- package/dist/runtime/built-in-block-code-templates/persistence.d.ts +5 -0
- package/dist/runtime/built-in-block-code-templates/persistence.js +550 -0
- package/dist/runtime/built-in-block-code-templates/shared.d.ts +16 -0
- package/dist/runtime/built-in-block-code-templates/shared.js +53 -0
- package/dist/runtime/built-in-block-code-templates.d.ts +5 -32
- package/dist/runtime/built-in-block-code-templates.js +5 -2230
- package/dist/runtime/cli-add-block-config.d.ts +6 -0
- package/dist/runtime/cli-add-block-config.js +143 -0
- package/dist/runtime/cli-add-block-legacy-validator.d.ts +4 -0
- package/dist/runtime/cli-add-block-legacy-validator.js +168 -0
- package/dist/runtime/cli-add-block.js +3 -301
- package/dist/runtime/cli-add-workspace-assets.d.ts +38 -0
- package/dist/runtime/cli-add-workspace-assets.js +399 -0
- package/dist/runtime/cli-add-workspace.d.ts +2 -38
- package/dist/runtime/cli-add-workspace.js +5 -396
- package/dist/runtime/cli-doctor-environment.d.ts +12 -0
- package/dist/runtime/cli-doctor-environment.js +123 -0
- package/dist/runtime/cli-doctor-workspace.d.ts +14 -0
- package/dist/runtime/cli-doctor-workspace.js +296 -0
- package/dist/runtime/cli-doctor.d.ts +4 -2
- package/dist/runtime/cli-doctor.js +10 -405
- package/dist/runtime/cli-help.js +1 -1
- package/dist/runtime/cli-scaffold.js +1 -1
- package/dist/runtime/migration-command-surface.d.ts +67 -0
- package/dist/runtime/migration-command-surface.js +189 -0
- package/dist/runtime/migration-diff-rename.d.ts +13 -0
- package/dist/runtime/migration-diff-rename.js +192 -0
- package/dist/runtime/migration-diff-transform.d.ts +14 -0
- package/dist/runtime/migration-diff-transform.js +105 -0
- package/dist/runtime/migration-diff.js +12 -297
- package/dist/runtime/migration-generated-artifacts.d.ts +3 -0
- package/dist/runtime/migration-generated-artifacts.js +41 -0
- package/dist/runtime/migration-maintenance.d.ts +51 -0
- package/dist/runtime/migration-maintenance.js +380 -0
- package/dist/runtime/migration-planning.d.ts +23 -0
- package/dist/runtime/migration-planning.js +131 -0
- package/dist/runtime/migration-project-config-source.d.ts +6 -0
- package/dist/runtime/migration-project-config-source.js +424 -0
- package/dist/runtime/migration-project-layout-discovery.d.ts +61 -0
- package/dist/runtime/migration-project-layout-discovery.js +337 -0
- package/dist/runtime/migration-project-layout-paths.d.ts +135 -0
- package/dist/runtime/migration-project-layout-paths.js +288 -0
- package/dist/runtime/migration-project-layout.d.ts +3 -0
- package/dist/runtime/migration-project-layout.js +2 -0
- package/dist/runtime/migration-project-workspace.d.ts +47 -0
- package/dist/runtime/migration-project-workspace.js +212 -0
- package/dist/runtime/migration-project.d.ts +4 -94
- package/dist/runtime/migration-project.js +3 -1101
- package/dist/runtime/migration-render-diff-rule.d.ts +5 -0
- package/dist/runtime/migration-render-diff-rule.js +120 -0
- package/dist/runtime/migration-render-execution.d.ts +3 -0
- package/dist/runtime/migration-render-execution.js +428 -0
- package/dist/runtime/migration-render-generated.d.ts +27 -0
- package/dist/runtime/migration-render-generated.js +230 -0
- package/dist/runtime/migration-render-support.d.ts +3 -0
- package/dist/runtime/migration-render-support.js +16 -0
- package/dist/runtime/migration-render.d.ts +3 -33
- package/dist/runtime/migration-render.js +3 -789
- package/dist/runtime/migration-ui-capability.js +1 -1
- package/dist/runtime/migrations.d.ts +24 -118
- package/dist/runtime/migrations.js +12 -700
- package/dist/runtime/scaffold-bootstrap.d.ts +45 -0
- package/dist/runtime/scaffold-bootstrap.js +185 -0
- package/dist/runtime/scaffold-package-manager-files.d.ts +35 -0
- package/dist/runtime/scaffold-package-manager-files.js +79 -0
- package/dist/runtime/scaffold.d.ts +1 -12
- package/dist/runtime/scaffold.js +10 -393
- package/dist/runtime/template-source-contracts.d.ts +81 -0
- package/dist/runtime/template-source-contracts.js +1 -0
- package/dist/runtime/template-source-external.d.ts +21 -0
- package/dist/runtime/template-source-external.js +184 -0
- package/dist/runtime/template-source-locators.d.ts +4 -0
- package/dist/runtime/template-source-locators.js +72 -0
- package/dist/runtime/template-source-normalization.d.ts +7 -0
- package/dist/runtime/template-source-normalization.js +53 -0
- package/dist/runtime/template-source-remote.d.ts +23 -0
- package/dist/runtime/template-source-remote.js +336 -0
- package/dist/runtime/template-source-seeds.d.ts +12 -0
- package/dist/runtime/template-source-seeds.js +243 -0
- package/dist/runtime/template-source.d.ts +4 -86
- package/dist/runtime/template-source.js +9 -828
- package/package.json +5 -5
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
export const BASIC_EDIT_TEMPLATE = `/**
|
|
2
|
+
* Editor component for {{title}} Block
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { BlockEditProps } from '@wp-typia/block-types/blocks/registration';
|
|
6
|
+
import {
|
|
7
|
+
InspectorControls,
|
|
8
|
+
RichText,
|
|
9
|
+
useBlockProps,
|
|
10
|
+
} from '@wordpress/block-editor';
|
|
11
|
+
import { Notice, PanelBody, TextControl } from '@wordpress/components';
|
|
12
|
+
import { __ } from '@wordpress/i18n';
|
|
13
|
+
import currentManifest from './manifest-document';
|
|
14
|
+
import {
|
|
15
|
+
InspectorFromManifest,
|
|
16
|
+
useEditorFields,
|
|
17
|
+
useTypedAttributeUpdater,
|
|
18
|
+
} from '@wp-typia/block-runtime/inspector';
|
|
19
|
+
import { {{pascalCase}}Attributes } from './types';
|
|
20
|
+
import {
|
|
21
|
+
sanitize{{pascalCase}}Attributes,
|
|
22
|
+
validate{{pascalCase}}Attributes,
|
|
23
|
+
} from './validators';
|
|
24
|
+
import { useTypiaValidation } from './hooks';
|
|
25
|
+
|
|
26
|
+
type EditProps = BlockEditProps<{{pascalCase}}Attributes>;
|
|
27
|
+
|
|
28
|
+
const validationErrorItemStyle = { color: '#cc1818', fontSize: '12px' };
|
|
29
|
+
const validationListStyle = { margin: 0, paddingLeft: '1em' };
|
|
30
|
+
|
|
31
|
+
function Edit({ attributes, setAttributes }: EditProps) {
|
|
32
|
+
const isVisible = attributes.isVisible !== false;
|
|
33
|
+
const blockProps = useBlockProps({
|
|
34
|
+
className: \`{{cssClassName}}\${isVisible ? '' : ' is-hidden'}\`,
|
|
35
|
+
});
|
|
36
|
+
const editorFields = useEditorFields(currentManifest, {
|
|
37
|
+
hidden: ['id', 'schemaVersion'],
|
|
38
|
+
manual: ['content'],
|
|
39
|
+
labels: {
|
|
40
|
+
alignment: __('Alignment', '{{textDomain}}'),
|
|
41
|
+
className: __('CSS Class', '{{textDomain}}'),
|
|
42
|
+
content: __('Content', '{{textDomain}}'),
|
|
43
|
+
isVisible: __('Visible', '{{textDomain}}'),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
const classNameField = editorFields.getField('className');
|
|
47
|
+
const { errorMessages, isValid } = useTypiaValidation(
|
|
48
|
+
attributes,
|
|
49
|
+
validate{{pascalCase}}Attributes
|
|
50
|
+
);
|
|
51
|
+
const validateEditorUpdate = (nextAttributes: {{pascalCase}}Attributes) => {
|
|
52
|
+
try {
|
|
53
|
+
return {
|
|
54
|
+
data: sanitize{{pascalCase}}Attributes(nextAttributes),
|
|
55
|
+
errors: [],
|
|
56
|
+
isValid: true as const,
|
|
57
|
+
};
|
|
58
|
+
} catch {
|
|
59
|
+
return validate{{pascalCase}}Attributes(nextAttributes);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const { updateField } = useTypedAttributeUpdater(
|
|
63
|
+
attributes,
|
|
64
|
+
setAttributes,
|
|
65
|
+
validateEditorUpdate
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<>
|
|
70
|
+
<InspectorControls>
|
|
71
|
+
<InspectorFromManifest
|
|
72
|
+
attributes={attributes}
|
|
73
|
+
fieldLookup={editorFields}
|
|
74
|
+
onChange={updateField}
|
|
75
|
+
paths={['alignment', 'isVisible']}
|
|
76
|
+
title={__('Settings', '{{textDomain}}')}
|
|
77
|
+
>
|
|
78
|
+
<TextControl
|
|
79
|
+
label={__('Content', '{{textDomain}}')}
|
|
80
|
+
value={attributes.content || ''}
|
|
81
|
+
onChange={(value) => updateField('content', value)}
|
|
82
|
+
help={__('Mirrors the main block content.', '{{textDomain}}')}
|
|
83
|
+
/>
|
|
84
|
+
|
|
85
|
+
<TextControl
|
|
86
|
+
label={classNameField?.label || __('CSS Class', '{{textDomain}}')}
|
|
87
|
+
value={attributes.className || ''}
|
|
88
|
+
onChange={(value) => updateField('className', value)}
|
|
89
|
+
help={__('Add an optional CSS class name.', '{{textDomain}}')}
|
|
90
|
+
/>
|
|
91
|
+
</InspectorFromManifest>
|
|
92
|
+
|
|
93
|
+
{!isValid && (
|
|
94
|
+
<PanelBody title={__('Validation Errors', '{{textDomain}}')} initialOpen>
|
|
95
|
+
{errorMessages.map((error, index) => (
|
|
96
|
+
<div key={index} style={validationErrorItemStyle}>
|
|
97
|
+
• {error}
|
|
98
|
+
</div>
|
|
99
|
+
))}
|
|
100
|
+
</PanelBody>
|
|
101
|
+
)}
|
|
102
|
+
</InspectorControls>
|
|
103
|
+
|
|
104
|
+
<div {...blockProps}>
|
|
105
|
+
<div className="{{cssClassName}}__content">
|
|
106
|
+
<RichText
|
|
107
|
+
tagName="p"
|
|
108
|
+
value={attributes.content || ''}
|
|
109
|
+
onChange={(value) => updateField('content', value)}
|
|
110
|
+
placeholder={__('Add your content...', '{{textDomain}}')}
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
{!isValid && (
|
|
114
|
+
<Notice status="error" isDismissible={false}>
|
|
115
|
+
<p>
|
|
116
|
+
<strong>{__('Validation Errors', '{{textDomain}}')}</strong>
|
|
117
|
+
</p>
|
|
118
|
+
<ul style={validationListStyle}>
|
|
119
|
+
{errorMessages.map((error, index) => (
|
|
120
|
+
<li key={index}>{error}</li>
|
|
121
|
+
))}
|
|
122
|
+
</ul>
|
|
123
|
+
</Notice>
|
|
124
|
+
)}
|
|
125
|
+
</div>
|
|
126
|
+
</>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export default Edit;
|
|
131
|
+
`;
|
|
132
|
+
export const BASIC_SAVE_TEMPLATE = `/**
|
|
133
|
+
* Save/Frontend component for {{title}} Block
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
import { RichText, useBlockProps } from '@wordpress/block-editor';
|
|
137
|
+
import { {{pascalCase}}Attributes } from './types';
|
|
138
|
+
|
|
139
|
+
interface SaveProps {
|
|
140
|
+
attributes: {{pascalCase}}Attributes;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export default function Save({ attributes }: SaveProps) {
|
|
144
|
+
const isVisible = attributes.isVisible !== false;
|
|
145
|
+
const blockProps = useBlockProps.save({
|
|
146
|
+
className: \`{{cssClassName}}\${isVisible ? '' : ' is-hidden'}\`,
|
|
147
|
+
hidden: isVisible ? undefined : true,
|
|
148
|
+
'aria-hidden': isVisible ? undefined : 'true',
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<div {...blockProps}>
|
|
153
|
+
<div
|
|
154
|
+
className="{{cssClassName}}__content"
|
|
155
|
+
data-align={attributes.alignment || 'left'}
|
|
156
|
+
>
|
|
157
|
+
<RichText.Content tagName="p" value={attributes.content} />
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
export const BASIC_INDEX_TEMPLATE = `/**
|
|
164
|
+
* WordPress {{title}} Block
|
|
165
|
+
*
|
|
166
|
+
* Typia-powered type-safe block
|
|
167
|
+
*/
|
|
168
|
+
|
|
169
|
+
import {
|
|
170
|
+
registerScaffoldBlockType,
|
|
171
|
+
type BlockConfiguration,
|
|
172
|
+
} from '@wp-typia/block-types/blocks/registration';
|
|
173
|
+
import type { BlockSupports } from '@wp-typia/block-types/blocks/supports';
|
|
174
|
+
import { __ } from '@wordpress/i18n';
|
|
175
|
+
import {
|
|
176
|
+
buildScaffoldBlockRegistration,
|
|
177
|
+
parseScaffoldBlockMetadata,
|
|
178
|
+
} from '@wp-typia/block-runtime/blocks';
|
|
179
|
+
|
|
180
|
+
// Import components
|
|
181
|
+
import Edit from './edit';
|
|
182
|
+
import Save from './save';
|
|
183
|
+
import metadata from './block-metadata';
|
|
184
|
+
import './editor.scss';
|
|
185
|
+
import './style.scss';
|
|
186
|
+
|
|
187
|
+
// Import types
|
|
188
|
+
import { {{pascalCase}}Attributes } from './types';
|
|
189
|
+
import { validators } from './validators';
|
|
190
|
+
|
|
191
|
+
const scaffoldSupports = {
|
|
192
|
+
html: false,
|
|
193
|
+
multiple: true,
|
|
194
|
+
align: ['wide', 'full'],
|
|
195
|
+
} satisfies BlockSupports;
|
|
196
|
+
|
|
197
|
+
// Register the block
|
|
198
|
+
const registration = buildScaffoldBlockRegistration(
|
|
199
|
+
parseScaffoldBlockMetadata<BlockConfiguration<{{pascalCase}}Attributes>>(metadata),
|
|
200
|
+
{
|
|
201
|
+
supports: scaffoldSupports,
|
|
202
|
+
example: {
|
|
203
|
+
attributes: validators.random(),
|
|
204
|
+
},
|
|
205
|
+
edit: Edit,
|
|
206
|
+
save: Save,
|
|
207
|
+
}
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
registerScaffoldBlockType(registration.name, registration.settings);
|
|
211
|
+
`;
|
|
212
|
+
export const BASIC_VALIDATORS_TEMPLATE = `import typia from 'typia';
|
|
213
|
+
import currentManifest from "./manifest-defaults-document";
|
|
214
|
+
import { {{pascalCase}}Attributes, {{pascalCase}}ValidationResult } from "./types";
|
|
215
|
+
import { generateBlockId } from "@wp-typia/block-runtime/identifiers";
|
|
216
|
+
import { createTemplateValidatorToolkit } from "./validator-toolkit";
|
|
217
|
+
|
|
218
|
+
const scaffoldValidators = createTemplateValidatorToolkit<{{pascalCase}}Attributes>({
|
|
219
|
+
assert: typia.createAssert<{{pascalCase}}Attributes>(),
|
|
220
|
+
clone: typia.misc.createClone<{{pascalCase}}Attributes>() as (
|
|
221
|
+
value: {{pascalCase}}Attributes,
|
|
222
|
+
) => {{pascalCase}}Attributes,
|
|
223
|
+
is: typia.createIs<{{pascalCase}}Attributes>(),
|
|
224
|
+
manifest: currentManifest,
|
|
225
|
+
prune: typia.misc.createPrune<{{pascalCase}}Attributes>(),
|
|
226
|
+
random: typia.createRandom<{{pascalCase}}Attributes>() as (
|
|
227
|
+
...args: unknown[]
|
|
228
|
+
) => {{pascalCase}}Attributes,
|
|
229
|
+
finalize: (normalized) => ({
|
|
230
|
+
...normalized,
|
|
231
|
+
id: normalized.id && normalized.id.length > 0 ? normalized.id : generateBlockId(),
|
|
232
|
+
}),
|
|
233
|
+
validate: typia.createValidate<{{pascalCase}}Attributes>(),
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
export const validate{{pascalCase}}Attributes =
|
|
237
|
+
scaffoldValidators.validateAttributes as (
|
|
238
|
+
attributes: unknown,
|
|
239
|
+
) => {{pascalCase}}ValidationResult;
|
|
240
|
+
|
|
241
|
+
export const validators = scaffoldValidators.validators;
|
|
242
|
+
|
|
243
|
+
export const sanitize{{pascalCase}}Attributes =
|
|
244
|
+
scaffoldValidators.sanitizeAttributes as (
|
|
245
|
+
attributes: Partial<{{pascalCase}}Attributes>,
|
|
246
|
+
) => {{pascalCase}}Attributes;
|
|
247
|
+
|
|
248
|
+
export const createAttributeUpdater = scaffoldValidators.createAttributeUpdater;
|
|
249
|
+
`;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const COMPOUND_CHILD_EDIT_TEMPLATE = "import type { BlockEditProps } from '@wp-typia/block-types/blocks/registration';\nimport { RichText, useBlockProps } from '@wordpress/block-editor';\nimport { Notice } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\n\nimport { useTypiaValidation } from './hooks';\nimport type { {{pascalCase}}ItemAttributes } from './types';\nimport {\n\tcreateAttributeUpdater,\n\tvalidate{{pascalCase}}ItemAttributes,\n} from './validators';\n\ntype EditProps = BlockEditProps< {{pascalCase}}ItemAttributes >;\n\nexport default function Edit( {\n\tattributes,\n\tsetAttributes,\n}: EditProps ) {\n\tconst updateAttribute = createAttributeUpdater( attributes, setAttributes );\n\tconst { errorMessages, isValid } = useTypiaValidation(\n\t\tattributes,\n\t\tvalidate{{pascalCase}}ItemAttributes\n\t);\n\n\treturn (\n\t\t<div { ...useBlockProps( { className: '{{compoundChildCssClassName}}' } ) }>\n\t\t\t<RichText\n\t\t\t\ttagName=\"h4\"\n\t\t\t\tclassName=\"{{compoundChildCssClassName}}__title\"\n\t\t\t\tvalue={ attributes.title ?? '' }\n\t\t\t\tonChange={ ( title ) => updateAttribute( 'title', title ) }\n\t\t\t\tplaceholder={ __( {{compoundChildTitleJson}}, '{{textDomain}}' ) }\n\t\t\t/>\n\t\t\t<RichText\n\t\t\t\ttagName=\"p\"\n\t\t\t\tclassName=\"{{compoundChildCssClassName}}__body\"\n\t\t\t\tvalue={ attributes.body ?? '' }\n\t\t\t\tonChange={ ( body ) => updateAttribute( 'body', body ) }\n\t\t\t\tplaceholder={ __( 'Add supporting details for this internal item.', '{{textDomain}}' ) }\n\t\t\t/>\n\t\t\t{ ! isValid && (\n\t\t\t\t<Notice status=\"error\" isDismissible={ false }>\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t{ errorMessages.map( ( error, index ) => <li key={ index }>{ error }</li> ) }\n\t\t\t\t\t</ul>\n\t\t\t\t</Notice>\n\t\t\t) }\n\t\t</div>\n\t);\n}\n";
|
|
2
|
+
export declare const COMPOUND_CHILD_SAVE_TEMPLATE = "import { RichText, useBlockProps } from '@wordpress/block-editor';\n\nimport type { {{pascalCase}}ItemAttributes } from './types';\n\nexport default function Save( {\n\tattributes,\n}: {\n\tattributes: {{pascalCase}}ItemAttributes;\n} ) {\n\treturn (\n\t\t<div { ...useBlockProps.save( { className: '{{compoundChildCssClassName}}' } ) }>\n\t\t\t<RichText.Content\n\t\t\t\ttagName=\"h4\"\n\t\t\t\tclassName=\"{{compoundChildCssClassName}}__title\"\n\t\t\t\tvalue={ attributes.title }\n\t\t\t/>\n\t\t\t<RichText.Content\n\t\t\t\ttagName=\"p\"\n\t\t\t\tclassName=\"{{compoundChildCssClassName}}__body\"\n\t\t\t\tvalue={ attributes.body }\n\t\t\t/>\n\t\t</div>\n\t);\n}\n";
|
|
3
|
+
export declare const COMPOUND_CHILD_INDEX_TEMPLATE = "import {\n\tregisterScaffoldBlockType,\n\ttype BlockConfiguration,\n} from '@wp-typia/block-types/blocks/registration';\nimport {\n\tbuildScaffoldBlockRegistration,\n\tparseScaffoldBlockMetadata,\n} from '@wp-typia/block-runtime/blocks';\n\nimport Edit from './edit';\nimport Save from './save';\nimport metadata from './block-metadata';\nimport '../{{slugKebabCase}}/style.scss';\n\nimport type { {{pascalCase}}ItemAttributes } from './types';\n\nconst registration = buildScaffoldBlockRegistration(\n\tparseScaffoldBlockMetadata<BlockConfiguration< {{pascalCase}}ItemAttributes >>( metadata ),\n\t{\n\t\tedit: Edit,\n\t\tsave: Save,\n\t}\n);\n\nregisterScaffoldBlockType(registration.name, registration.settings);\n";
|
|
4
|
+
export declare const COMPOUND_CHILD_VALIDATORS_TEMPLATE = "import typia from 'typia';\nimport currentManifest from './manifest-defaults-document';\nimport type {\n\t{{pascalCase}}ItemAttributes,\n\t{{pascalCase}}ItemValidationResult,\n} from './types';\nimport { createTemplateValidatorToolkit } from '../../validator-toolkit';\n\nconst scaffoldValidators = createTemplateValidatorToolkit< {{pascalCase}}ItemAttributes >( {\n\tassert: typia.createAssert< {{pascalCase}}ItemAttributes >(),\n\tclone: typia.misc.createClone< {{pascalCase}}ItemAttributes >() as (\n\t\tvalue: {{pascalCase}}ItemAttributes,\n\t) => {{pascalCase}}ItemAttributes,\n\tis: typia.createIs< {{pascalCase}}ItemAttributes >(),\n\tmanifest: currentManifest,\n\tprune: typia.misc.createPrune< {{pascalCase}}ItemAttributes >(),\n\trandom: typia.createRandom< {{pascalCase}}ItemAttributes >() as (\n\t\t...args: unknown[]\n\t) => {{pascalCase}}ItemAttributes,\n\tvalidate: typia.createValidate< {{pascalCase}}ItemAttributes >(),\n} );\n\nexport const validate{{pascalCase}}ItemAttributes =\n\tscaffoldValidators.validateAttributes as (\n\t\tattributes: unknown\n\t) => {{pascalCase}}ItemValidationResult;\n\nexport const validators = scaffoldValidators.validators;\n\nexport const sanitize{{pascalCase}}ItemAttributes =\n\tscaffoldValidators.sanitizeAttributes as (\n\t\tattributes: Partial< {{pascalCase}}ItemAttributes >\n\t) => {{pascalCase}}ItemAttributes;\n\nexport const createAttributeUpdater = scaffoldValidators.createAttributeUpdater;\n";
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
export const COMPOUND_CHILD_EDIT_TEMPLATE = `import type { BlockEditProps } from '@wp-typia/block-types/blocks/registration';
|
|
2
|
+
import { RichText, useBlockProps } from '@wordpress/block-editor';
|
|
3
|
+
import { Notice } from '@wordpress/components';
|
|
4
|
+
import { __ } from '@wordpress/i18n';
|
|
5
|
+
|
|
6
|
+
import { useTypiaValidation } from './hooks';
|
|
7
|
+
import type { {{pascalCase}}ItemAttributes } from './types';
|
|
8
|
+
import {
|
|
9
|
+
\tcreateAttributeUpdater,
|
|
10
|
+
\tvalidate{{pascalCase}}ItemAttributes,
|
|
11
|
+
} from './validators';
|
|
12
|
+
|
|
13
|
+
type EditProps = BlockEditProps< {{pascalCase}}ItemAttributes >;
|
|
14
|
+
|
|
15
|
+
export default function Edit( {
|
|
16
|
+
\tattributes,
|
|
17
|
+
\tsetAttributes,
|
|
18
|
+
}: EditProps ) {
|
|
19
|
+
\tconst updateAttribute = createAttributeUpdater( attributes, setAttributes );
|
|
20
|
+
\tconst { errorMessages, isValid } = useTypiaValidation(
|
|
21
|
+
\t\tattributes,
|
|
22
|
+
\t\tvalidate{{pascalCase}}ItemAttributes
|
|
23
|
+
\t);
|
|
24
|
+
|
|
25
|
+
\treturn (
|
|
26
|
+
\t\t<div { ...useBlockProps( { className: '{{compoundChildCssClassName}}' } ) }>
|
|
27
|
+
\t\t\t<RichText
|
|
28
|
+
\t\t\t\ttagName="h4"
|
|
29
|
+
\t\t\t\tclassName="{{compoundChildCssClassName}}__title"
|
|
30
|
+
\t\t\t\tvalue={ attributes.title ?? '' }
|
|
31
|
+
\t\t\t\tonChange={ ( title ) => updateAttribute( 'title', title ) }
|
|
32
|
+
\t\t\t\tplaceholder={ __( {{compoundChildTitleJson}}, '{{textDomain}}' ) }
|
|
33
|
+
\t\t\t/>
|
|
34
|
+
\t\t\t<RichText
|
|
35
|
+
\t\t\t\ttagName="p"
|
|
36
|
+
\t\t\t\tclassName="{{compoundChildCssClassName}}__body"
|
|
37
|
+
\t\t\t\tvalue={ attributes.body ?? '' }
|
|
38
|
+
\t\t\t\tonChange={ ( body ) => updateAttribute( 'body', body ) }
|
|
39
|
+
\t\t\t\tplaceholder={ __( 'Add supporting details for this internal item.', '{{textDomain}}' ) }
|
|
40
|
+
\t\t\t/>
|
|
41
|
+
\t\t\t{ ! isValid && (
|
|
42
|
+
\t\t\t\t<Notice status="error" isDismissible={ false }>
|
|
43
|
+
\t\t\t\t\t<ul>
|
|
44
|
+
\t\t\t\t\t\t{ errorMessages.map( ( error, index ) => <li key={ index }>{ error }</li> ) }
|
|
45
|
+
\t\t\t\t\t</ul>
|
|
46
|
+
\t\t\t\t</Notice>
|
|
47
|
+
\t\t\t) }
|
|
48
|
+
\t\t</div>
|
|
49
|
+
\t);
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
export const COMPOUND_CHILD_SAVE_TEMPLATE = `import { RichText, useBlockProps } from '@wordpress/block-editor';
|
|
53
|
+
|
|
54
|
+
import type { {{pascalCase}}ItemAttributes } from './types';
|
|
55
|
+
|
|
56
|
+
export default function Save( {
|
|
57
|
+
\tattributes,
|
|
58
|
+
}: {
|
|
59
|
+
\tattributes: {{pascalCase}}ItemAttributes;
|
|
60
|
+
} ) {
|
|
61
|
+
\treturn (
|
|
62
|
+
\t\t<div { ...useBlockProps.save( { className: '{{compoundChildCssClassName}}' } ) }>
|
|
63
|
+
\t\t\t<RichText.Content
|
|
64
|
+
\t\t\t\ttagName="h4"
|
|
65
|
+
\t\t\t\tclassName="{{compoundChildCssClassName}}__title"
|
|
66
|
+
\t\t\t\tvalue={ attributes.title }
|
|
67
|
+
\t\t\t/>
|
|
68
|
+
\t\t\t<RichText.Content
|
|
69
|
+
\t\t\t\ttagName="p"
|
|
70
|
+
\t\t\t\tclassName="{{compoundChildCssClassName}}__body"
|
|
71
|
+
\t\t\t\tvalue={ attributes.body }
|
|
72
|
+
\t\t\t/>
|
|
73
|
+
\t\t</div>
|
|
74
|
+
\t);
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
export const COMPOUND_CHILD_INDEX_TEMPLATE = `import {
|
|
78
|
+
\tregisterScaffoldBlockType,
|
|
79
|
+
\ttype BlockConfiguration,
|
|
80
|
+
} from '@wp-typia/block-types/blocks/registration';
|
|
81
|
+
import {
|
|
82
|
+
\tbuildScaffoldBlockRegistration,
|
|
83
|
+
\tparseScaffoldBlockMetadata,
|
|
84
|
+
} from '@wp-typia/block-runtime/blocks';
|
|
85
|
+
|
|
86
|
+
import Edit from './edit';
|
|
87
|
+
import Save from './save';
|
|
88
|
+
import metadata from './block-metadata';
|
|
89
|
+
import '../{{slugKebabCase}}/style.scss';
|
|
90
|
+
|
|
91
|
+
import type { {{pascalCase}}ItemAttributes } from './types';
|
|
92
|
+
|
|
93
|
+
const registration = buildScaffoldBlockRegistration(
|
|
94
|
+
\tparseScaffoldBlockMetadata<BlockConfiguration< {{pascalCase}}ItemAttributes >>( metadata ),
|
|
95
|
+
\t{
|
|
96
|
+
\t\tedit: Edit,
|
|
97
|
+
\t\tsave: Save,
|
|
98
|
+
\t}
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
registerScaffoldBlockType(registration.name, registration.settings);
|
|
102
|
+
`;
|
|
103
|
+
export const COMPOUND_CHILD_VALIDATORS_TEMPLATE = `import typia from 'typia';
|
|
104
|
+
import currentManifest from './manifest-defaults-document';
|
|
105
|
+
import type {
|
|
106
|
+
\t{{pascalCase}}ItemAttributes,
|
|
107
|
+
\t{{pascalCase}}ItemValidationResult,
|
|
108
|
+
} from './types';
|
|
109
|
+
import { createTemplateValidatorToolkit } from '../../validator-toolkit';
|
|
110
|
+
|
|
111
|
+
const scaffoldValidators = createTemplateValidatorToolkit< {{pascalCase}}ItemAttributes >( {
|
|
112
|
+
\tassert: typia.createAssert< {{pascalCase}}ItemAttributes >(),
|
|
113
|
+
\tclone: typia.misc.createClone< {{pascalCase}}ItemAttributes >() as (
|
|
114
|
+
\t\tvalue: {{pascalCase}}ItemAttributes,
|
|
115
|
+
\t) => {{pascalCase}}ItemAttributes,
|
|
116
|
+
\tis: typia.createIs< {{pascalCase}}ItemAttributes >(),
|
|
117
|
+
\tmanifest: currentManifest,
|
|
118
|
+
\tprune: typia.misc.createPrune< {{pascalCase}}ItemAttributes >(),
|
|
119
|
+
\trandom: typia.createRandom< {{pascalCase}}ItemAttributes >() as (
|
|
120
|
+
\t\t...args: unknown[]
|
|
121
|
+
\t) => {{pascalCase}}ItemAttributes,
|
|
122
|
+
\tvalidate: typia.createValidate< {{pascalCase}}ItemAttributes >(),
|
|
123
|
+
} );
|
|
124
|
+
|
|
125
|
+
export const validate{{pascalCase}}ItemAttributes =
|
|
126
|
+
\tscaffoldValidators.validateAttributes as (
|
|
127
|
+
\t\tattributes: unknown
|
|
128
|
+
\t) => {{pascalCase}}ItemValidationResult;
|
|
129
|
+
|
|
130
|
+
export const validators = scaffoldValidators.validators;
|
|
131
|
+
|
|
132
|
+
export const sanitize{{pascalCase}}ItemAttributes =
|
|
133
|
+
\tscaffoldValidators.sanitizeAttributes as (
|
|
134
|
+
\t\tattributes: Partial< {{pascalCase}}ItemAttributes >
|
|
135
|
+
\t) => {{pascalCase}}ItemAttributes;
|
|
136
|
+
|
|
137
|
+
export const createAttributeUpdater = scaffoldValidators.createAttributeUpdater;
|
|
138
|
+
`;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const COMPOUND_PARENT_EDIT_TEMPLATE = "import type { BlockEditProps } from '@wp-typia/block-types/blocks/registration';\nimport { __ } from '@wordpress/i18n';\nimport {\n\tInspectorControls,\n\tInnerBlocks,\n\tRichText,\n\tuseBlockProps,\n} from '@wordpress/block-editor';\nimport { Notice, PanelBody, ToggleControl } from '@wordpress/components';\n\nimport {\n\tALLOWED_CHILD_BLOCKS,\n\tDEFAULT_CHILD_TEMPLATE,\n} from './children';\nimport { useTypiaValidation } from './hooks';\nimport type { {{pascalCase}}Attributes } from './types';\nimport {\n\tcreateAttributeUpdater,\n\tvalidate{{pascalCase}}Attributes,\n} from './validators';\n\ntype EditProps = BlockEditProps< {{pascalCase}}Attributes >;\n\nexport default function Edit( {\n\tattributes,\n\tsetAttributes,\n}: EditProps ) {\n\tconst { errorMessages, isValid } = useTypiaValidation(\n\t\tattributes,\n\t\tvalidate{{pascalCase}}Attributes\n\t);\n\tconst updateAttribute = createAttributeUpdater( attributes, setAttributes );\n\tconst blockProps = useBlockProps( {\n\t\tclassName: '{{cssClassName}}',\n\t} );\n\n\treturn (\n\t\t<>\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Compound Settings', '{{textDomain}}' ) }>\n\t\t\t\t\t<ToggleControl\n\t\t\t\t\t\tlabel={ __( 'Show dividers between items', '{{textDomain}}' ) }\n\t\t\t\t\t\tchecked={ attributes.showDividers ?? true }\n\t\t\t\t\t\tonChange={ ( value ) => updateAttribute( 'showDividers', value ) }\n\t\t\t\t\t/>\n\t\t\t\t</PanelBody>\n\t\t\t\t{ ! isValid && (\n\t\t\t\t\t<PanelBody title={ __( 'Validation Errors', '{{textDomain}}' ) } initialOpen>\n\t\t\t\t\t\t{ errorMessages.map( ( error, index ) => (\n\t\t\t\t\t\t\t<Notice key={ index } status=\"error\" isDismissible={ false }>\n\t\t\t\t\t\t\t\t{ error }\n\t\t\t\t\t\t\t</Notice>\n\t\t\t\t\t\t) ) }\n\t\t\t\t\t</PanelBody>\n\t\t\t\t) }\n\t\t\t</InspectorControls>\n\t\t\t<div { ...blockProps }>\n\t\t\t\t<RichText\n\t\t\t\t\ttagName=\"h3\"\n\t\t\t\t\tclassName=\"{{cssClassName}}__heading\"\n\t\t\t\t\tvalue={ attributes.heading }\n\t\t\t\t\tonChange={ ( heading ) => updateAttribute( 'heading', heading ) }\n\t\t\t\t\tplaceholder={ __( {{titleJson}}, '{{textDomain}}' ) }\n\t\t\t\t/>\n\t\t\t\t<RichText\n\t\t\t\t\ttagName=\"p\"\n\t\t\t\t\tclassName=\"{{cssClassName}}__intro\"\n\t\t\t\t\tvalue={ attributes.intro ?? '' }\n\t\t\t\t\tonChange={ ( intro ) => updateAttribute( 'intro', intro ) }\n\t\t\t\t\tplaceholder={ __(\n\t\t\t\t\t\t'Add and reorder internal items inside this compound block.',\n\t\t\t\t\t\t'{{textDomain}}'\n\t\t\t\t\t) }\n\t\t\t\t/>\n\t\t\t\t{ ! isValid && (\n\t\t\t\t\t<Notice status=\"error\" isDismissible={ false }>\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t{ errorMessages.map( ( error, index ) => <li key={ index }>{ error }</li> ) }\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</Notice>\n\t\t\t\t) }\n\t\t\t\t<div className=\"{{cssClassName}}__items\">\n\t\t\t\t\t<InnerBlocks\n\t\t\t\t\t\tallowedBlocks={ ALLOWED_CHILD_BLOCKS }\n\t\t\t\t\t\trenderAppender={ InnerBlocks.ButtonBlockAppender }\n\t\t\t\t\t\ttemplate={ DEFAULT_CHILD_TEMPLATE }\n\t\t\t\t\t\ttemplateLock={ false }\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n";
|
|
2
|
+
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\tattributes,\n}: {\n\tattributes: {{pascalCase}}Attributes;\n} ) {\n\treturn (\n\t\t<div\n\t\t\t{ ...useBlockProps.save( {\n\t\t\t\tclassName: '{{cssClassName}}',\n\t\t\t\t'data-show-dividers': ( attributes.showDividers ?? true ) ? 'true' : 'false',\n\t\t\t} ) }\n\t\t>\n\t\t\t<RichText.Content\n\t\t\t\ttagName=\"h3\"\n\t\t\t\tclassName=\"{{cssClassName}}__heading\"\n\t\t\t\tvalue={ attributes.heading }\n\t\t\t/>\n\t\t\t<RichText.Content\n\t\t\t\ttagName=\"p\"\n\t\t\t\tclassName=\"{{cssClassName}}__intro\"\n\t\t\t\tvalue={ attributes.intro ?? '' }\n\t\t\t/>\n\t\t\t<div className=\"{{cssClassName}}__items\">\n\t\t\t\t<InnerBlocks.Content />\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n";
|
|
3
|
+
export declare const COMPOUND_PARENT_INDEX_TEMPLATE = "import {\n\tregisterScaffoldBlockType,\n\ttype BlockConfiguration,\n} from '@wp-typia/block-types/blocks/registration';\nimport {\n\tbuildScaffoldBlockRegistration,\n\tparseScaffoldBlockMetadata,\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\tparseScaffoldBlockMetadata<BlockConfiguration< {{pascalCase}}Attributes >>( metadata ),\n\t{\n\t\tedit: Edit,\n\t\tsave: Save,\n\t}\n);\n\nregisterScaffoldBlockType(registration.name, registration.settings);\n";
|
|
4
|
+
export declare const COMPOUND_LOCAL_HOOKS_TEMPLATE = "export {\n\tformatValidationError,\n\tformatValidationErrors,\n\tuseTypiaValidation,\n} from '../../hooks';\n\nexport type {\n\tTypiaValidationError,\n\tValidationResult,\n\tValidationState,\n} from '../../hooks';\n";
|
|
5
|
+
export declare const COMPOUND_PARENT_VALIDATORS_TEMPLATE = "import typia from 'typia';\nimport currentManifest from './manifest-defaults-document';\nimport type {\n\t{{pascalCase}}Attributes,\n\t{{pascalCase}}ValidationResult,\n} from './types';\nimport { createTemplateValidatorToolkit } from '../../validator-toolkit';\n\nconst scaffoldValidators = createTemplateValidatorToolkit< {{pascalCase}}Attributes >( {\n\tassert: typia.createAssert< {{pascalCase}}Attributes >(),\n\tclone: typia.misc.createClone< {{pascalCase}}Attributes >() as (\n\t\tvalue: {{pascalCase}}Attributes,\n\t) => {{pascalCase}}Attributes,\n\tis: typia.createIs< {{pascalCase}}Attributes >(),\n\tmanifest: currentManifest,\n\tprune: typia.misc.createPrune< {{pascalCase}}Attributes >(),\n\trandom: typia.createRandom< {{pascalCase}}Attributes >() as (\n\t\t...args: unknown[]\n\t) => {{pascalCase}}Attributes,\n\tvalidate: typia.createValidate< {{pascalCase}}Attributes >(),\n} );\n\nexport const validate{{pascalCase}}Attributes =\n\tscaffoldValidators.validateAttributes as (\n\t\tattributes: unknown\n\t) => {{pascalCase}}ValidationResult;\n\nexport const validators = scaffoldValidators.validators;\n\nexport const sanitize{{pascalCase}}Attributes =\n\tscaffoldValidators.sanitizeAttributes as (\n\t\tattributes: Partial< {{pascalCase}}Attributes >\n\t) => {{pascalCase}}Attributes;\n\nexport const createAttributeUpdater = scaffoldValidators.createAttributeUpdater;\n";
|
|
6
|
+
export declare const COMPOUND_CHILDREN_TEMPLATE = "import type { BlockTemplate } from '@wp-typia/block-types/blocks/registration';\n\nexport const DEFAULT_CHILD_BLOCK_NAME = '{{namespace}}/{{slugKebabCase}}-item';\n\nexport const ALLOWED_CHILD_BLOCKS = [\n\tDEFAULT_CHILD_BLOCK_NAME,\n\t// add-child: insert new allowed child block names here\n];\n\nexport const DEFAULT_CHILD_TEMPLATE: BlockTemplate = [\n\t[\n\t\tDEFAULT_CHILD_BLOCK_NAME,\n\t\t{\n\t\t\tbody: 'Add supporting details for the first internal item.',\n\t\t\ttitle: 'First Item',\n\t\t},\n\t],\n\t[\n\t\tDEFAULT_CHILD_BLOCK_NAME,\n\t\t{\n\t\t\tbody: 'Add supporting details for the second internal item.',\n\t\t\ttitle: 'Second Item',\n\t\t},\n\t],\n];\n";
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
export const COMPOUND_PARENT_EDIT_TEMPLATE = `import type { BlockEditProps } from '@wp-typia/block-types/blocks/registration';
|
|
2
|
+
import { __ } from '@wordpress/i18n';
|
|
3
|
+
import {
|
|
4
|
+
InspectorControls,
|
|
5
|
+
InnerBlocks,
|
|
6
|
+
RichText,
|
|
7
|
+
useBlockProps,
|
|
8
|
+
} from '@wordpress/block-editor';
|
|
9
|
+
import { Notice, PanelBody, ToggleControl } from '@wordpress/components';
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
ALLOWED_CHILD_BLOCKS,
|
|
13
|
+
DEFAULT_CHILD_TEMPLATE,
|
|
14
|
+
} from './children';
|
|
15
|
+
import { useTypiaValidation } from './hooks';
|
|
16
|
+
import type { {{pascalCase}}Attributes } from './types';
|
|
17
|
+
import {
|
|
18
|
+
createAttributeUpdater,
|
|
19
|
+
validate{{pascalCase}}Attributes,
|
|
20
|
+
} from './validators';
|
|
21
|
+
|
|
22
|
+
type EditProps = BlockEditProps< {{pascalCase}}Attributes >;
|
|
23
|
+
|
|
24
|
+
export default function Edit( {
|
|
25
|
+
attributes,
|
|
26
|
+
setAttributes,
|
|
27
|
+
}: EditProps ) {
|
|
28
|
+
const { errorMessages, isValid } = useTypiaValidation(
|
|
29
|
+
attributes,
|
|
30
|
+
validate{{pascalCase}}Attributes
|
|
31
|
+
);
|
|
32
|
+
const updateAttribute = createAttributeUpdater( attributes, setAttributes );
|
|
33
|
+
const blockProps = useBlockProps( {
|
|
34
|
+
className: '{{cssClassName}}',
|
|
35
|
+
} );
|
|
36
|
+
|
|
37
|
+
return (
|
|
38
|
+
<>
|
|
39
|
+
<InspectorControls>
|
|
40
|
+
<PanelBody title={ __( 'Compound Settings', '{{textDomain}}' ) }>
|
|
41
|
+
<ToggleControl
|
|
42
|
+
label={ __( 'Show dividers between items', '{{textDomain}}' ) }
|
|
43
|
+
checked={ attributes.showDividers ?? true }
|
|
44
|
+
onChange={ ( value ) => updateAttribute( 'showDividers', value ) }
|
|
45
|
+
/>
|
|
46
|
+
</PanelBody>
|
|
47
|
+
{ ! isValid && (
|
|
48
|
+
<PanelBody title={ __( 'Validation Errors', '{{textDomain}}' ) } initialOpen>
|
|
49
|
+
{ errorMessages.map( ( error, index ) => (
|
|
50
|
+
<Notice key={ index } status="error" isDismissible={ false }>
|
|
51
|
+
{ error }
|
|
52
|
+
</Notice>
|
|
53
|
+
) ) }
|
|
54
|
+
</PanelBody>
|
|
55
|
+
) }
|
|
56
|
+
</InspectorControls>
|
|
57
|
+
<div { ...blockProps }>
|
|
58
|
+
<RichText
|
|
59
|
+
tagName="h3"
|
|
60
|
+
className="{{cssClassName}}__heading"
|
|
61
|
+
value={ attributes.heading }
|
|
62
|
+
onChange={ ( heading ) => updateAttribute( 'heading', heading ) }
|
|
63
|
+
placeholder={ __( {{titleJson}}, '{{textDomain}}' ) }
|
|
64
|
+
/>
|
|
65
|
+
<RichText
|
|
66
|
+
tagName="p"
|
|
67
|
+
className="{{cssClassName}}__intro"
|
|
68
|
+
value={ attributes.intro ?? '' }
|
|
69
|
+
onChange={ ( intro ) => updateAttribute( 'intro', intro ) }
|
|
70
|
+
placeholder={ __(
|
|
71
|
+
'Add and reorder internal items inside this compound block.',
|
|
72
|
+
'{{textDomain}}'
|
|
73
|
+
) }
|
|
74
|
+
/>
|
|
75
|
+
{ ! isValid && (
|
|
76
|
+
<Notice status="error" isDismissible={ false }>
|
|
77
|
+
<ul>
|
|
78
|
+
{ errorMessages.map( ( error, index ) => <li key={ index }>{ error }</li> ) }
|
|
79
|
+
</ul>
|
|
80
|
+
</Notice>
|
|
81
|
+
) }
|
|
82
|
+
<div className="{{cssClassName}}__items">
|
|
83
|
+
<InnerBlocks
|
|
84
|
+
allowedBlocks={ ALLOWED_CHILD_BLOCKS }
|
|
85
|
+
renderAppender={ InnerBlocks.ButtonBlockAppender }
|
|
86
|
+
template={ DEFAULT_CHILD_TEMPLATE }
|
|
87
|
+
templateLock={ false }
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
export const COMPOUND_PARENT_SAVE_TEMPLATE = `import { InnerBlocks, RichText, useBlockProps } from '@wordpress/block-editor';
|
|
96
|
+
|
|
97
|
+
import type { {{pascalCase}}Attributes } from './types';
|
|
98
|
+
|
|
99
|
+
export default function Save( {
|
|
100
|
+
attributes,
|
|
101
|
+
}: {
|
|
102
|
+
attributes: {{pascalCase}}Attributes;
|
|
103
|
+
} ) {
|
|
104
|
+
return (
|
|
105
|
+
<div
|
|
106
|
+
{ ...useBlockProps.save( {
|
|
107
|
+
className: '{{cssClassName}}',
|
|
108
|
+
'data-show-dividers': ( attributes.showDividers ?? true ) ? 'true' : 'false',
|
|
109
|
+
} ) }
|
|
110
|
+
>
|
|
111
|
+
<RichText.Content
|
|
112
|
+
tagName="h3"
|
|
113
|
+
className="{{cssClassName}}__heading"
|
|
114
|
+
value={ attributes.heading }
|
|
115
|
+
/>
|
|
116
|
+
<RichText.Content
|
|
117
|
+
tagName="p"
|
|
118
|
+
className="{{cssClassName}}__intro"
|
|
119
|
+
value={ attributes.intro ?? '' }
|
|
120
|
+
/>
|
|
121
|
+
<div className="{{cssClassName}}__items">
|
|
122
|
+
<InnerBlocks.Content />
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
`;
|
|
128
|
+
export const COMPOUND_PARENT_INDEX_TEMPLATE = `import {
|
|
129
|
+
\tregisterScaffoldBlockType,
|
|
130
|
+
\ttype BlockConfiguration,
|
|
131
|
+
} from '@wp-typia/block-types/blocks/registration';
|
|
132
|
+
import {
|
|
133
|
+
\tbuildScaffoldBlockRegistration,
|
|
134
|
+
\tparseScaffoldBlockMetadata,
|
|
135
|
+
} from '@wp-typia/block-runtime/blocks';
|
|
136
|
+
|
|
137
|
+
import Edit from './edit';
|
|
138
|
+
import Save from './save';
|
|
139
|
+
import metadata from './block-metadata';
|
|
140
|
+
import './style.scss';
|
|
141
|
+
|
|
142
|
+
import type { {{pascalCase}}Attributes } from './types';
|
|
143
|
+
|
|
144
|
+
const registration = buildScaffoldBlockRegistration(
|
|
145
|
+
\tparseScaffoldBlockMetadata<BlockConfiguration< {{pascalCase}}Attributes >>( metadata ),
|
|
146
|
+
\t{
|
|
147
|
+
\t\tedit: Edit,
|
|
148
|
+
\t\tsave: Save,
|
|
149
|
+
\t}
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
registerScaffoldBlockType(registration.name, registration.settings);
|
|
153
|
+
`;
|
|
154
|
+
export const COMPOUND_LOCAL_HOOKS_TEMPLATE = `export {
|
|
155
|
+
formatValidationError,
|
|
156
|
+
formatValidationErrors,
|
|
157
|
+
useTypiaValidation,
|
|
158
|
+
} from '../../hooks';
|
|
159
|
+
|
|
160
|
+
export type {
|
|
161
|
+
TypiaValidationError,
|
|
162
|
+
ValidationResult,
|
|
163
|
+
ValidationState,
|
|
164
|
+
} from '../../hooks';
|
|
165
|
+
`;
|
|
166
|
+
export const COMPOUND_PARENT_VALIDATORS_TEMPLATE = `import typia from 'typia';
|
|
167
|
+
import currentManifest from './manifest-defaults-document';
|
|
168
|
+
import type {
|
|
169
|
+
\t{{pascalCase}}Attributes,
|
|
170
|
+
\t{{pascalCase}}ValidationResult,
|
|
171
|
+
} from './types';
|
|
172
|
+
import { createTemplateValidatorToolkit } from '../../validator-toolkit';
|
|
173
|
+
|
|
174
|
+
const scaffoldValidators = createTemplateValidatorToolkit< {{pascalCase}}Attributes >( {
|
|
175
|
+
\tassert: typia.createAssert< {{pascalCase}}Attributes >(),
|
|
176
|
+
\tclone: typia.misc.createClone< {{pascalCase}}Attributes >() as (
|
|
177
|
+
\t\tvalue: {{pascalCase}}Attributes,
|
|
178
|
+
\t) => {{pascalCase}}Attributes,
|
|
179
|
+
\tis: typia.createIs< {{pascalCase}}Attributes >(),
|
|
180
|
+
\tmanifest: currentManifest,
|
|
181
|
+
\tprune: typia.misc.createPrune< {{pascalCase}}Attributes >(),
|
|
182
|
+
\trandom: typia.createRandom< {{pascalCase}}Attributes >() as (
|
|
183
|
+
\t\t...args: unknown[]
|
|
184
|
+
\t) => {{pascalCase}}Attributes,
|
|
185
|
+
\tvalidate: typia.createValidate< {{pascalCase}}Attributes >(),
|
|
186
|
+
} );
|
|
187
|
+
|
|
188
|
+
export const validate{{pascalCase}}Attributes =
|
|
189
|
+
\tscaffoldValidators.validateAttributes as (
|
|
190
|
+
\t\tattributes: unknown
|
|
191
|
+
\t) => {{pascalCase}}ValidationResult;
|
|
192
|
+
|
|
193
|
+
export const validators = scaffoldValidators.validators;
|
|
194
|
+
|
|
195
|
+
export const sanitize{{pascalCase}}Attributes =
|
|
196
|
+
\tscaffoldValidators.sanitizeAttributes as (
|
|
197
|
+
\t\tattributes: Partial< {{pascalCase}}Attributes >
|
|
198
|
+
\t) => {{pascalCase}}Attributes;
|
|
199
|
+
|
|
200
|
+
export const createAttributeUpdater = scaffoldValidators.createAttributeUpdater;
|
|
201
|
+
`;
|
|
202
|
+
export const COMPOUND_CHILDREN_TEMPLATE = `import type { BlockTemplate } from '@wp-typia/block-types/blocks/registration';
|
|
203
|
+
|
|
204
|
+
export const DEFAULT_CHILD_BLOCK_NAME = '{{namespace}}/{{slugKebabCase}}-item';
|
|
205
|
+
|
|
206
|
+
export const ALLOWED_CHILD_BLOCKS = [
|
|
207
|
+
\tDEFAULT_CHILD_BLOCK_NAME,
|
|
208
|
+
\t// add-child: insert new allowed child block names here
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
export const DEFAULT_CHILD_TEMPLATE: BlockTemplate = [
|
|
212
|
+
\t[
|
|
213
|
+
\t\tDEFAULT_CHILD_BLOCK_NAME,
|
|
214
|
+
\t\t{
|
|
215
|
+
\t\t\tbody: 'Add supporting details for the first internal item.',
|
|
216
|
+
\t\t\ttitle: 'First Item',
|
|
217
|
+
\t\t},
|
|
218
|
+
\t],
|
|
219
|
+
\t[
|
|
220
|
+
\t\tDEFAULT_CHILD_BLOCK_NAME,
|
|
221
|
+
\t\t{
|
|
222
|
+
\t\t\tbody: 'Add supporting details for the second internal item.',
|
|
223
|
+
\t\t\ttitle: 'Second Item',
|
|
224
|
+
\t\t},
|
|
225
|
+
\t],
|
|
226
|
+
];
|
|
227
|
+
`;
|