@wp-typia/block-types 0.2.4 → 0.3.1

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.
@@ -0,0 +1,19 @@
1
+ export function getDiagnosticSeverity(strict) {
2
+ return strict ? "error" : "warning";
3
+ }
4
+ export function handleDiagnostics(diagnostics, onDiagnostic, options) {
5
+ const errors = diagnostics.filter((diagnostic) => diagnostic.severity === "error");
6
+ if (errors.length > 0) {
7
+ throw new Error([
8
+ options.failureHeading,
9
+ ...errors.map((diagnostic) => `- ${diagnostic.message}`),
10
+ ].join("\n"));
11
+ }
12
+ for (const diagnostic of diagnostics) {
13
+ if (onDiagnostic) {
14
+ onDiagnostic(diagnostic);
15
+ continue;
16
+ }
17
+ options.logger?.warn(`[wp-typia] ${diagnostic.message}`, diagnostic);
18
+ }
19
+ }
@@ -0,0 +1,2 @@
1
+ export declare function isNonArrayObject(value: unknown): value is object;
2
+ export declare function isObjectRecord(value: unknown): value is Readonly<Record<string, unknown>>;
@@ -0,0 +1,10 @@
1
+ export function isNonArrayObject(value) {
2
+ return typeof value === "object" && value !== null && !Array.isArray(value);
3
+ }
4
+ export function isObjectRecord(value) {
5
+ if (!isNonArrayObject(value)) {
6
+ return false;
7
+ }
8
+ const prototype = Object.getPrototypeOf(value);
9
+ return prototype === Object.prototype || prototype === null;
10
+ }
@@ -0,0 +1,4 @@
1
+ export interface NormalizeStaticRegistrationValueOptions {
2
+ readonly description: string;
3
+ }
4
+ export declare function normalizeStaticRegistrationValue(value: unknown, path: string, options: NormalizeStaticRegistrationValueOptions): unknown;
@@ -0,0 +1,32 @@
1
+ import { isObjectRecord } from "./object-utils.js";
2
+ export function normalizeStaticRegistrationValue(value, path, options) {
3
+ if (value === undefined) {
4
+ return undefined;
5
+ }
6
+ if (value === null ||
7
+ typeof value === "boolean" ||
8
+ typeof value === "number" ||
9
+ typeof value === "string") {
10
+ return value;
11
+ }
12
+ if (typeof value === "function") {
13
+ throw new Error(`Cannot generate static ${options.description} registration code for function value at ${path}.`);
14
+ }
15
+ if (typeof value === "bigint" || typeof value === "symbol") {
16
+ throw new Error(`Cannot generate static ${options.description} registration code for ${typeof value} value at ${path}.`);
17
+ }
18
+ if (Array.isArray(value)) {
19
+ return value.map((entry, index) => normalizeStaticRegistrationValue(entry, `${path}[${index}]`, options));
20
+ }
21
+ if (isObjectRecord(value)) {
22
+ const normalized = {};
23
+ for (const [key, nestedValue] of Object.entries(value)) {
24
+ const nextValue = normalizeStaticRegistrationValue(nestedValue, `${path}.${key}`, options);
25
+ if (nextValue !== undefined) {
26
+ normalized[key] = nextValue;
27
+ }
28
+ }
29
+ return normalized;
30
+ }
31
+ throw new Error(`Cannot generate static ${options.description} registration code for unsupported value at ${path}.`);
32
+ }
@@ -1,12 +1,15 @@
1
1
  import type { BlockAlignment, BlockVerticalAlignment, JustifyContent, TextAlignment } from "../block-editor/alignment.js";
2
+ import type { BlockBorderSupportAttributes, BlockColorSupportAttributes, BlockDimensionsSupportAttributes, BlockSpacingSupportAttributes, BlockStyleAttributes, BlockTypographySupportAttributes } from "../block-editor/style-attributes.js";
2
3
  import type { FlexWrap, LayoutType, Orientation } from "../block-editor/layout.js";
3
4
  import type { SpacingAxis, SpacingDimension } from "../block-editor/spacing.js";
5
+ import { type WordPressBlockApiCompatibilityDiagnostic, type WordPressBlockApiCompatibilityFeature, type WordPressBlockApiCompatibilityManifest, type WordPressCompatibilitySettings, type WordPressVersion } from "./compatibility.js";
6
+ import { type DiagnosticLogger } from "./shared/diagnostics.js";
4
7
  /**
5
8
  * Derived from Gutenberg block support keys and commonly used block.json
6
9
  * support sections.
7
10
  */
8
- export type BlockSupportFeature = 'align' | 'alignWide' | 'anchor' | 'ariaLabel' | 'background' | 'border' | 'className' | 'color' | 'customClassName' | 'dimensions' | 'filter' | 'html' | 'inserter' | 'interactivity' | 'js' | 'layout' | 'lightbox' | 'lock' | 'locking' | 'multiple' | 'position' | 'renaming' | 'reusable' | 'shadow' | 'spacing' | 'typography';
9
- export declare const BLOCK_SUPPORT_FEATURES: readonly ["align", "alignWide", "anchor", "ariaLabel", "background", "border", "className", "color", "customClassName", "dimensions", "filter", "html", "inserter", "interactivity", "js", "layout", "lightbox", "lock", "locking", "multiple", "position", "renaming", "reusable", "shadow", "spacing", "typography"];
11
+ export type BlockSupportFeature = 'align' | 'alignWide' | 'allowedBlocks' | 'anchor' | 'ariaLabel' | 'autoRegister' | 'background' | 'border' | 'className' | 'color' | 'contentRole' | 'customClassName' | 'dimensions' | 'filter' | 'html' | 'inserter' | 'interactivity' | 'js' | 'layout' | 'lightbox' | 'listView' | 'lock' | 'locking' | 'multiple' | 'position' | 'renaming' | 'reusable' | 'shadow' | 'spacing' | 'splitting' | 'visibility' | 'typography';
12
+ export declare const BLOCK_SUPPORT_FEATURES: readonly ["align", "alignWide", "allowedBlocks", "anchor", "ariaLabel", "autoRegister", "background", "border", "className", "color", "contentRole", "customClassName", "dimensions", "filter", "html", "inserter", "interactivity", "js", "layout", "lightbox", "listView", "lock", "locking", "multiple", "position", "renaming", "reusable", "shadow", "spacing", "splitting", "typography", "visibility"];
10
13
  export type TypographySupportKey = 'fontFamily' | 'fontSize' | 'fontStyle' | 'fontWeight' | 'letterSpacing' | 'lineHeight' | 'dropCap' | 'textAlign' | 'textColumns' | 'textDecoration' | 'textTransform' | 'writingMode';
11
14
  export declare const TYPOGRAPHY_SUPPORT_KEYS: readonly ["fontFamily", "fontSize", "fontStyle", "fontWeight", "letterSpacing", "lineHeight", "dropCap", "textAlign", "textColumns", "textDecoration", "textTransform", "writingMode"];
12
15
  export type SpacingSupportKey = 'blockGap' | 'margin' | 'padding';
@@ -139,12 +142,15 @@ export interface BlockTypographySupport {
139
142
  export interface BlockSupports {
140
143
  readonly align?: boolean | readonly BlockAlignment[];
141
144
  readonly alignWide?: boolean;
145
+ readonly allowedBlocks?: boolean;
142
146
  readonly anchor?: boolean;
143
147
  readonly ariaLabel?: boolean;
148
+ readonly autoRegister?: boolean;
144
149
  readonly background?: boolean | BlockBackgroundSupport;
145
150
  readonly border?: boolean | BlockBorderSupport;
146
151
  readonly className?: boolean;
147
152
  readonly color?: boolean | BlockColorSupport;
153
+ readonly contentRole?: boolean;
148
154
  readonly customClassName?: boolean;
149
155
  readonly dimensions?: boolean | BlockDimensionsSupport;
150
156
  readonly filter?: boolean | BlockFilterSupport;
@@ -154,6 +160,7 @@ export interface BlockSupports {
154
160
  readonly js?: boolean;
155
161
  readonly layout?: boolean | BlockLayoutSupport;
156
162
  readonly lightbox?: boolean | BlockLightboxSupport;
163
+ readonly listView?: boolean;
157
164
  readonly lock?: boolean;
158
165
  readonly locking?: boolean;
159
166
  readonly multiple?: boolean;
@@ -162,6 +169,54 @@ export interface BlockSupports {
162
169
  readonly reusable?: boolean;
163
170
  readonly shadow?: boolean | BlockShadowSupport;
164
171
  readonly spacing?: boolean | BlockSpacingSupport;
172
+ readonly splitting?: boolean;
165
173
  readonly typography?: boolean | BlockTypographySupport;
174
+ readonly visibility?: boolean;
166
175
  }
176
+ export type BlockSupportsInput = BlockSupports & Readonly<Record<string, unknown>>;
177
+ export interface BlockAlignSupportAttributes {
178
+ readonly align?: BlockAlignment;
179
+ }
180
+ export interface BlockAllowedBlocksSupportAttributes {
181
+ readonly allowedBlocks?: readonly string[];
182
+ }
183
+ export interface BlockLayoutSupportAttributes {
184
+ readonly layout?: BlockLayoutDefault;
185
+ }
186
+ export interface BlockStyleAttributeSupportAttributes {
187
+ readonly style?: BlockStyleAttributes;
188
+ }
189
+ type SupportTruthy<TValue> = [TValue] extends [false | null | undefined] ? false : true;
190
+ type HasSupport<TSupports, TKey extends PropertyKey> = TKey extends keyof TSupports ? SupportTruthy<TSupports[TKey]> : false;
191
+ type HasNestedSupport<TSupports, TSection extends keyof BlockSupports, TKey extends PropertyKey> = TSection extends keyof TSupports ? TSupports[TSection] extends true ? true : TSupports[TSection] extends Readonly<Record<TKey, infer TValue>> ? SupportTruthy<TValue> : false : false;
192
+ type IfSupport<TCondition, TAttributes> = TCondition extends true ? TAttributes : {};
193
+ export interface DefineSupportsInlineOptions {
194
+ readonly allowUnknownFutureKeys?: boolean;
195
+ readonly logger?: DiagnosticLogger<WordPressBlockApiCompatibilityDiagnostic>;
196
+ readonly minVersion?: WordPressVersion;
197
+ readonly minWordPress?: WordPressVersion;
198
+ readonly onDiagnostic?: (diagnostic: WordPressBlockApiCompatibilityDiagnostic) => void;
199
+ readonly strict?: boolean;
200
+ }
201
+ export interface DefineSupportsOptions extends WordPressCompatibilitySettings {
202
+ readonly logger?: DiagnosticLogger<WordPressBlockApiCompatibilityDiagnostic>;
203
+ readonly minWordPress?: WordPressVersion;
204
+ readonly onDiagnostic?: (diagnostic: WordPressBlockApiCompatibilityDiagnostic) => void;
205
+ }
206
+ export type StripDefineSupportsOptions<TSupports> = Omit<TSupports, keyof DefineSupportsInlineOptions>;
207
+ export declare const DEFINED_BLOCK_SUPPORTS_METADATA: unique symbol;
208
+ export type DefinedBlockSupportsMetadataKey = typeof DEFINED_BLOCK_SUPPORTS_METADATA;
209
+ export interface DefinedBlockSupportsMetadata {
210
+ readonly diagnostics: readonly WordPressBlockApiCompatibilityDiagnostic[];
211
+ readonly manifest: WordPressBlockApiCompatibilityManifest;
212
+ }
213
+ export type DefinedBlockSupports<TSupports extends BlockSupportsInput = BlockSupportsInput> = Readonly<StripDefineSupportsOptions<TSupports>> & {
214
+ readonly [DEFINED_BLOCK_SUPPORTS_METADATA]?: DefinedBlockSupportsMetadata;
215
+ };
216
+ export type SupportAttributes<TSupports> = TSupports extends DefinedBlockSupports<infer TDefinedSupports> ? SupportAttributesFromBlockSupports<StripDefineSupportsOptions<TDefinedSupports>> : TSupports extends BlockSupportsInput ? SupportAttributesFromBlockSupports<StripDefineSupportsOptions<TSupports>> : {};
217
+ export type SupportAttributesFromBlockSupports<TSupports> = IfSupport<HasSupport<TSupports, "align">, BlockAlignSupportAttributes> & IfSupport<HasSupport<TSupports, "allowedBlocks">, BlockAllowedBlocksSupportAttributes> & IfSupport<HasSupport<TSupports, "layout">, BlockLayoutSupportAttributes> & IfSupport<HasSupport<TSupports, "color">, BlockColorSupportAttributes> & IfSupport<HasSupport<TSupports, "typography">, BlockTypographySupportAttributes> & IfSupport<HasSupport<TSupports, "spacing">, BlockSpacingSupportAttributes> & IfSupport<HasSupport<TSupports, "dimensions">, BlockDimensionsSupportAttributes> & IfSupport<HasSupport<TSupports, "border">, BlockBorderSupportAttributes> & IfSupport<HasSupport<TSupports, "background">, BlockStyleAttributeSupportAttributes> & IfSupport<HasNestedSupport<TSupports, "filter", "duotone">, BlockStyleAttributeSupportAttributes> & IfSupport<HasSupport<TSupports, "position">, BlockStyleAttributeSupportAttributes> & IfSupport<HasSupport<TSupports, "shadow">, BlockStyleAttributeSupportAttributes>;
218
+ export declare function collectBlockSupportsCompatibilityFeatures(supports: BlockSupportsInput): readonly WordPressBlockApiCompatibilityFeature[];
219
+ export declare function createBlockSupportsCompatibilityManifest(supports: BlockSupportsInput, settings?: DefineSupportsOptions): WordPressBlockApiCompatibilityManifest;
220
+ export declare function getDefinedSupportsCompatibilityManifest(supports: unknown): WordPressBlockApiCompatibilityManifest | undefined;
221
+ export declare function defineSupports<const TSupports extends BlockSupportsInput & DefineSupportsInlineOptions>(supports: TSupports, options?: DefineSupportsOptions): DefinedBlockSupports<TSupports>;
167
222
  export {};
@@ -1,12 +1,18 @@
1
+ import { createWordPressBlockApiCompatibilityManifest, } from "./compatibility.js";
2
+ import { handleDiagnostics, } from "./shared/diagnostics.js";
3
+ import { isNonArrayObject, isObjectRecord, } from "./shared/object-utils.js";
1
4
  export const BLOCK_SUPPORT_FEATURES = [
2
5
  'align',
3
6
  'alignWide',
7
+ 'allowedBlocks',
4
8
  'anchor',
5
9
  'ariaLabel',
10
+ 'autoRegister',
6
11
  'background',
7
12
  'border',
8
13
  'className',
9
14
  'color',
15
+ 'contentRole',
10
16
  'customClassName',
11
17
  'dimensions',
12
18
  'filter',
@@ -16,6 +22,7 @@ export const BLOCK_SUPPORT_FEATURES = [
16
22
  'js',
17
23
  'layout',
18
24
  'lightbox',
25
+ 'listView',
19
26
  'lock',
20
27
  'locking',
21
28
  'multiple',
@@ -24,7 +31,9 @@ export const BLOCK_SUPPORT_FEATURES = [
24
31
  'reusable',
25
32
  'shadow',
26
33
  'spacing',
34
+ 'splitting',
27
35
  'typography',
36
+ 'visibility',
28
37
  ];
29
38
  export const TYPOGRAPHY_SUPPORT_KEYS = [
30
39
  'fontFamily',
@@ -45,3 +54,166 @@ export const SPACING_SUPPORT_KEYS = [
45
54
  'margin',
46
55
  'padding',
47
56
  ];
57
+ export const DEFINED_BLOCK_SUPPORTS_METADATA = Symbol.for("@wp-typia/block-types/defined-supports");
58
+ const KNOWN_BLOCK_SUPPORT_FEATURES = new Set(BLOCK_SUPPORT_FEATURES);
59
+ const DEFINE_SUPPORTS_INLINE_OPTION_KEYS = new Set([
60
+ "allowUnknownFutureKeys",
61
+ "logger",
62
+ "minVersion",
63
+ "minWordPress",
64
+ "onDiagnostic",
65
+ "strict",
66
+ ]);
67
+ const COLOR_COMPATIBILITY_SUPPORT_KEYS = [
68
+ "button",
69
+ "enableContrastChecker",
70
+ "heading",
71
+ ];
72
+ const TYPOGRAPHY_COMPATIBILITY_SUPPORT_KEYS = [
73
+ "fontSize",
74
+ "letterSpacing",
75
+ "lineHeight",
76
+ "textAlign",
77
+ "textDecoration",
78
+ "textTransform",
79
+ ];
80
+ const TOP_LEVEL_COMPATIBILITY_SUPPORT_KEYS = [
81
+ "allowedBlocks",
82
+ "background",
83
+ "contentRole",
84
+ "dimensions",
85
+ "listView",
86
+ "position",
87
+ "renaming",
88
+ "shadow",
89
+ "visibility",
90
+ ];
91
+ function isEnabledSupportValue(value) {
92
+ return value !== false && value !== null && value !== undefined;
93
+ }
94
+ function isEnabledTopLevelSupportValue(value) {
95
+ if (!isObjectRecord(value)) {
96
+ return isNonArrayObject(value) ? false : isEnabledSupportValue(value);
97
+ }
98
+ return Object.entries(value).some(([key, nestedValue]) => !key.startsWith("__experimental") &&
99
+ isEnabledSupportValue(nestedValue));
100
+ }
101
+ function hasEnabledNestedSupport(section, key) {
102
+ return isObjectRecord(section) && isEnabledSupportValue(section[key]);
103
+ }
104
+ function addCompatibilityFeature(features, seen, feature) {
105
+ const id = `blockSupports.${feature}`;
106
+ if (seen.has(id)) {
107
+ return;
108
+ }
109
+ seen.add(id);
110
+ features.push({
111
+ area: "blockSupports",
112
+ feature,
113
+ });
114
+ }
115
+ export function collectBlockSupportsCompatibilityFeatures(supports) {
116
+ const features = [];
117
+ const seen = new Set();
118
+ for (const key of TOP_LEVEL_COMPATIBILITY_SUPPORT_KEYS) {
119
+ if (isEnabledTopLevelSupportValue(supports[key])) {
120
+ addCompatibilityFeature(features, seen, key);
121
+ }
122
+ }
123
+ const spacing = supports.spacing;
124
+ for (const key of SPACING_SUPPORT_KEYS) {
125
+ if (hasEnabledNestedSupport(spacing, key)) {
126
+ addCompatibilityFeature(features, seen, `spacing.${key}`);
127
+ }
128
+ }
129
+ const typography = supports.typography;
130
+ for (const key of TYPOGRAPHY_COMPATIBILITY_SUPPORT_KEYS) {
131
+ if (hasEnabledNestedSupport(typography, key)) {
132
+ addCompatibilityFeature(features, seen, `typography.${key}`);
133
+ }
134
+ }
135
+ const color = supports.color;
136
+ if (isObjectRecord(color)) {
137
+ for (const key of COLOR_COMPATIBILITY_SUPPORT_KEYS) {
138
+ if (isEnabledSupportValue(color[key])) {
139
+ addCompatibilityFeature(features, seen, `color.${key}`);
140
+ }
141
+ }
142
+ }
143
+ if (hasEnabledNestedSupport(supports.filter, "duotone")) {
144
+ addCompatibilityFeature(features, seen, "filter.duotone");
145
+ }
146
+ for (const key of Object.keys(supports)) {
147
+ if (!KNOWN_BLOCK_SUPPORT_FEATURES.has(key) &&
148
+ !DEFINE_SUPPORTS_INLINE_OPTION_KEYS.has(key) &&
149
+ isEnabledTopLevelSupportValue(supports[key])) {
150
+ addCompatibilityFeature(features, seen, key);
151
+ }
152
+ }
153
+ return features;
154
+ }
155
+ function splitDefineSupportsInput(supports) {
156
+ const normalizedSupports = {};
157
+ const inlineOptions = {};
158
+ for (const [key, value] of Object.entries(supports)) {
159
+ if (DEFINE_SUPPORTS_INLINE_OPTION_KEYS.has(key)) {
160
+ Object.assign(inlineOptions, { [key]: value });
161
+ continue;
162
+ }
163
+ normalizedSupports[key] = value;
164
+ }
165
+ return {
166
+ inlineOptions,
167
+ supports: normalizedSupports,
168
+ };
169
+ }
170
+ function resolveDefineSupportsSettings(inlineOptions, options) {
171
+ const settings = {};
172
+ const allowUnknownFutureKeys = options.allowUnknownFutureKeys ?? inlineOptions.allowUnknownFutureKeys;
173
+ const minVersion = options.minVersion ??
174
+ options.minWordPress ??
175
+ inlineOptions.minVersion ??
176
+ inlineOptions.minWordPress;
177
+ const strict = options.strict ?? inlineOptions.strict;
178
+ if (allowUnknownFutureKeys !== undefined) {
179
+ Object.assign(settings, { allowUnknownFutureKeys });
180
+ }
181
+ if (minVersion !== undefined) {
182
+ Object.assign(settings, { minVersion });
183
+ }
184
+ if (strict !== undefined) {
185
+ Object.assign(settings, { strict });
186
+ }
187
+ return settings;
188
+ }
189
+ export function createBlockSupportsCompatibilityManifest(supports, settings = {}) {
190
+ const compatibilitySettings = resolveDefineSupportsSettings({}, settings);
191
+ return createWordPressBlockApiCompatibilityManifest(collectBlockSupportsCompatibilityFeatures(supports), compatibilitySettings);
192
+ }
193
+ function handleDefineSupportsDiagnostics(diagnostics, onDiagnostic, logger) {
194
+ handleDiagnostics(diagnostics, onDiagnostic, {
195
+ failureHeading: "WordPress block supports compatibility check failed:",
196
+ logger,
197
+ });
198
+ }
199
+ export function getDefinedSupportsCompatibilityManifest(supports) {
200
+ return isObjectRecord(supports)
201
+ ? supports[DEFINED_BLOCK_SUPPORTS_METADATA]?.manifest
202
+ : undefined;
203
+ }
204
+ export function defineSupports(supports, options = {}) {
205
+ const { inlineOptions, supports: normalizedSupports } = splitDefineSupportsInput(supports);
206
+ const settings = resolveDefineSupportsSettings(inlineOptions, options);
207
+ const manifest = createBlockSupportsCompatibilityManifest(normalizedSupports, settings);
208
+ handleDefineSupportsDiagnostics(manifest.diagnostics, options.onDiagnostic ?? inlineOptions.onDiagnostic, options.logger ?? inlineOptions.logger);
209
+ Object.defineProperty(normalizedSupports, DEFINED_BLOCK_SUPPORTS_METADATA, {
210
+ configurable: false,
211
+ enumerable: false,
212
+ value: {
213
+ diagnostics: manifest.diagnostics,
214
+ manifest,
215
+ },
216
+ writable: false,
217
+ });
218
+ return normalizedSupports;
219
+ }
@@ -0,0 +1,87 @@
1
+ import type { BlockAttributes, BlockVariation, BlockVariationScope } from "./registration.js";
2
+ import { type WordPressBlockApiCompatibilityDiagnostic, type WordPressBlockApiCompatibilityFeature, type WordPressBlockApiCompatibilityManifest, type WordPressCompatibilitySettings, type WordPressVersion } from "./compatibility.js";
3
+ import { type DiagnosticLogger } from "./shared/diagnostics.js";
4
+ export type BlockVariationAttributeMap<TAttributes extends BlockAttributes = BlockAttributes> = Partial<TAttributes> & BlockAttributes;
5
+ export type BlockVariationInnerBlockTemplate = readonly [
6
+ name: string,
7
+ attributes?: Readonly<BlockAttributes>,
8
+ innerBlocks?: readonly BlockVariationInnerBlockTemplate[]
9
+ ];
10
+ export type BlockVariationInnerBlocks = readonly BlockVariationInnerBlockTemplate[];
11
+ export type BlockVariationIsActive<TAttributes extends BlockAttributes = BlockAttributes> = readonly Extract<keyof TAttributes, string>[] | ((blockAttributes: Readonly<BlockVariationAttributeMap<TAttributes>>, variationAttributes: Readonly<BlockVariationAttributeMap<TAttributes>>) => boolean);
12
+ export interface BlockVariationDefinition<TAttributes extends BlockAttributes = BlockAttributes> extends Omit<BlockVariation<BlockVariationAttributeMap<TAttributes>>, "attributes" | "example" | "innerBlocks" | "isActive" | "scope"> {
13
+ readonly attributes?: BlockVariationAttributeMap<TAttributes>;
14
+ readonly example?: BlockVariation<BlockVariationAttributeMap<TAttributes>>["example"] | {
15
+ readonly attributes: BlockVariationAttributeMap<TAttributes>;
16
+ readonly innerBlocks?: BlockVariationInnerBlocks;
17
+ };
18
+ readonly innerBlocks?: BlockVariationInnerBlocks;
19
+ readonly isActive?: BlockVariationIsActive<TAttributes>;
20
+ readonly scope?: readonly BlockVariationScope[];
21
+ }
22
+ export interface DefineVariationInlineOptions {
23
+ readonly allowMissingIsActive?: boolean;
24
+ readonly logger?: DiagnosticLogger<BlockVariationDiagnostic>;
25
+ readonly minVersion?: WordPressVersion;
26
+ readonly minWordPress?: WordPressVersion;
27
+ readonly onDiagnostic?: (diagnostic: BlockVariationDiagnostic) => void;
28
+ readonly requireIsActive?: boolean;
29
+ readonly strict?: boolean;
30
+ }
31
+ export interface DefineVariationOptions extends WordPressCompatibilitySettings {
32
+ readonly allowMissingIsActive?: boolean;
33
+ readonly logger?: DiagnosticLogger<BlockVariationDiagnostic>;
34
+ readonly minWordPress?: WordPressVersion;
35
+ readonly onDiagnostic?: (diagnostic: BlockVariationDiagnostic) => void;
36
+ readonly requireIsActive?: boolean;
37
+ }
38
+ export type StripDefineVariationOptions<TVariation> = Omit<TVariation, keyof DefineVariationInlineOptions>;
39
+ export declare const DEFINED_BLOCK_VARIATION_METADATA: unique symbol;
40
+ export declare const DEFINED_BLOCK_VARIATIONS_METADATA: unique symbol;
41
+ export type DefinedBlockVariationMetadataKey = typeof DEFINED_BLOCK_VARIATION_METADATA;
42
+ export type DefinedBlockVariationsMetadataKey = typeof DEFINED_BLOCK_VARIATIONS_METADATA;
43
+ export interface DefinedBlockVariationMetadata {
44
+ readonly blockName: string;
45
+ readonly diagnostics: readonly BlockVariationDiagnostic[];
46
+ readonly manifest: WordPressBlockApiCompatibilityManifest;
47
+ }
48
+ export interface DefinedBlockVariationsMetadata {
49
+ readonly diagnostics: readonly BlockVariationDiagnostic[];
50
+ readonly entries: readonly BlockVariationRegistrationEntry[];
51
+ }
52
+ export type DefinedBlockVariation<TBlockName extends string = string, TAttributes extends BlockAttributes = BlockAttributes, TVariation extends BlockVariationDefinition<TAttributes> = BlockVariationDefinition<TAttributes>> = Readonly<StripDefineVariationOptions<TVariation>> & {
53
+ readonly [DEFINED_BLOCK_VARIATION_METADATA]?: DefinedBlockVariationMetadata;
54
+ readonly __wpTypiaVariationAttributes?: TAttributes;
55
+ readonly __wpTypiaVariationTarget?: TBlockName;
56
+ };
57
+ export type DefinedBlockVariations<TVariations extends readonly DefinedBlockVariation[] = readonly DefinedBlockVariation[]> = Readonly<TVariations> & {
58
+ readonly [DEFINED_BLOCK_VARIATIONS_METADATA]?: DefinedBlockVariationsMetadata;
59
+ };
60
+ export type BlockVariationDiagnosticCode = "duplicate-active-marker" | "duplicate-variation-name" | "missing-is-active" | "missing-stable-marker" | "unknown-is-active-attribute";
61
+ export interface BlockVariationAuthoringDiagnostic {
62
+ readonly attribute?: string | undefined;
63
+ readonly blockName: string;
64
+ readonly code: BlockVariationDiagnosticCode;
65
+ readonly message: string;
66
+ readonly severity: "error" | "warning";
67
+ readonly variationName: string;
68
+ }
69
+ export type BlockVariationDiagnostic = BlockVariationAuthoringDiagnostic | WordPressBlockApiCompatibilityDiagnostic;
70
+ export interface BlockVariationRegistrationEntry {
71
+ readonly blockName: string;
72
+ readonly variation: Readonly<BlockVariationDefinition>;
73
+ }
74
+ export interface CreateBlockVariationRegistrationSourceOptions {
75
+ readonly functionName?: string;
76
+ readonly importSource?: string;
77
+ }
78
+ export declare function collectBlockVariationCompatibilityFeatures(): readonly WordPressBlockApiCompatibilityFeature[];
79
+ export declare function createBlockVariationCompatibilityManifest(settings?: DefineVariationOptions): WordPressBlockApiCompatibilityManifest;
80
+ export declare function getDefinedVariationMetadata(variation: unknown): DefinedBlockVariationMetadata | undefined;
81
+ export declare function getDefinedVariationBlockName(variation: unknown): string | undefined;
82
+ export declare function getDefinedVariationCompatibilityManifest(variation: unknown): WordPressBlockApiCompatibilityManifest | undefined;
83
+ export declare function getDefinedVariationsMetadata(variations: unknown): DefinedBlockVariationsMetadata | undefined;
84
+ export declare function defineVariation<TAttributes extends BlockAttributes = BlockAttributes, const TBlockName extends string = string, const TVariation extends BlockVariationDefinition<TAttributes> & DefineVariationInlineOptions = BlockVariationDefinition<TAttributes> & DefineVariationInlineOptions>(blockName: TBlockName, variation: TVariation, options?: DefineVariationOptions): DefinedBlockVariation<TBlockName, TAttributes, TVariation>;
85
+ export declare function createBlockVariationRegistrationPlan(variations: readonly DefinedBlockVariation[]): readonly BlockVariationRegistrationEntry[];
86
+ export declare function defineVariations<const TVariations extends readonly DefinedBlockVariation[]>(variations: TVariations, options?: DefineVariationOptions): DefinedBlockVariations<TVariations>;
87
+ export declare function createStaticBlockVariationRegistrationSource(variations: readonly DefinedBlockVariation[], options?: CreateBlockVariationRegistrationSourceOptions): string;