@wp-typia/block-types 0.3.1 → 0.3.2

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,50 @@
1
+ const DEFINE_VARIATION_INLINE_OPTION_KEYS = new Set([
2
+ "allowMissingIsActive",
3
+ "logger",
4
+ "minVersion",
5
+ "minWordPress",
6
+ "onDiagnostic",
7
+ "requireIsActive",
8
+ "strict",
9
+ ]);
10
+ export function splitDefineVariationInput(variation) {
11
+ const inlineOptions = {};
12
+ const normalizedVariation = {};
13
+ for (const [key, value] of Object.entries(variation)) {
14
+ if (DEFINE_VARIATION_INLINE_OPTION_KEYS.has(key)) {
15
+ Object.assign(inlineOptions, { [key]: value });
16
+ continue;
17
+ }
18
+ normalizedVariation[key] = value;
19
+ }
20
+ return {
21
+ inlineOptions,
22
+ variation: normalizedVariation,
23
+ };
24
+ }
25
+ export function resolveDefineVariationSettings(inlineOptions, options) {
26
+ const compatibility = {};
27
+ const allowUnknownFutureKeys = options.allowUnknownFutureKeys;
28
+ const minVersion = options.minVersion ??
29
+ options.minWordPress ??
30
+ inlineOptions.minVersion ??
31
+ inlineOptions.minWordPress;
32
+ const strict = options.strict ?? inlineOptions.strict ?? true;
33
+ if (allowUnknownFutureKeys !== undefined) {
34
+ Object.assign(compatibility, { allowUnknownFutureKeys });
35
+ }
36
+ if (minVersion !== undefined) {
37
+ Object.assign(compatibility, { minVersion });
38
+ }
39
+ Object.assign(compatibility, { strict });
40
+ return {
41
+ compatibility,
42
+ diagnostics: {
43
+ allowMissingIsActive: options.allowMissingIsActive ?? inlineOptions.allowMissingIsActive ?? false,
44
+ requireIsActive: options.requireIsActive ?? inlineOptions.requireIsActive ?? true,
45
+ strict,
46
+ },
47
+ logger: options.logger ?? inlineOptions.logger,
48
+ onDiagnostic: options.onDiagnostic ?? inlineOptions.onDiagnostic,
49
+ };
50
+ }
@@ -1,6 +1,8 @@
1
1
  import type { BlockAttributes, BlockVariation, BlockVariationScope } from "./registration.js";
2
- import { type WordPressBlockApiCompatibilityDiagnostic, type WordPressBlockApiCompatibilityFeature, type WordPressBlockApiCompatibilityManifest, type WordPressCompatibilitySettings, type WordPressVersion } from "./compatibility.js";
2
+ import { type WordPressBlockApiCompatibilityDiagnostic, type WordPressBlockApiCompatibilityManifest, type WordPressCompatibilitySettings, type WordPressVersion } from "./compatibility.js";
3
3
  import { type DiagnosticLogger } from "./shared/diagnostics.js";
4
+ import { collectBlockVariationCompatibilityFeatures, createBlockVariationCompatibilityManifest } from "./variations-manifest.js";
5
+ export { collectBlockVariationCompatibilityFeatures, createBlockVariationCompatibilityManifest, };
4
6
  export type BlockVariationAttributeMap<TAttributes extends BlockAttributes = BlockAttributes> = Partial<TAttributes> & BlockAttributes;
5
7
  export type BlockVariationInnerBlockTemplate = readonly [
6
8
  name: string,
@@ -75,8 +77,6 @@ export interface CreateBlockVariationRegistrationSourceOptions {
75
77
  readonly functionName?: string;
76
78
  readonly importSource?: string;
77
79
  }
78
- export declare function collectBlockVariationCompatibilityFeatures(): readonly WordPressBlockApiCompatibilityFeature[];
79
- export declare function createBlockVariationCompatibilityManifest(settings?: DefineVariationOptions): WordPressBlockApiCompatibilityManifest;
80
80
  export declare function getDefinedVariationMetadata(variation: unknown): DefinedBlockVariationMetadata | undefined;
81
81
  export declare function getDefinedVariationBlockName(variation: unknown): string | undefined;
82
82
  export declare function getDefinedVariationCompatibilityManifest(variation: unknown): WordPressBlockApiCompatibilityManifest | undefined;
@@ -1,134 +1,11 @@
1
- import { createWordPressBlockApiCompatibilityManifest, } from "./compatibility.js";
2
- import { getDiagnosticSeverity, handleDiagnostics, } from "./shared/diagnostics.js";
3
1
  import { isObjectRecord } from "./shared/object-utils.js";
4
2
  import { normalizeStaticRegistrationValue } from "./shared/static-registration.js";
3
+ import { createCollectionDiagnostics, createVariationDiagnostics, handleVariationDiagnostics, } from "./variations-diagnostics.js";
4
+ import { collectBlockVariationCompatibilityFeatures, createBlockVariationCompatibilityManifest, createBlockVariationCompatibilityManifestFromSettings, } from "./variations-manifest.js";
5
+ import { resolveDefineVariationSettings, splitDefineVariationInput, } from "./variations-settings.js";
6
+ export { collectBlockVariationCompatibilityFeatures, createBlockVariationCompatibilityManifest, };
5
7
  export const DEFINED_BLOCK_VARIATION_METADATA = Symbol.for("@wp-typia/block-types/defined-variation");
6
8
  export const DEFINED_BLOCK_VARIATIONS_METADATA = Symbol.for("@wp-typia/block-types/defined-variations");
7
- const DEFINE_VARIATION_INLINE_OPTION_KEYS = new Set([
8
- "allowMissingIsActive",
9
- "logger",
10
- "minVersion",
11
- "minWordPress",
12
- "onDiagnostic",
13
- "requireIsActive",
14
- "strict",
15
- ]);
16
- const STABLE_VARIATION_MARKER_ATTRIBUTES = [
17
- "className",
18
- "namespace",
19
- "wpTypiaVariation",
20
- ];
21
- function splitDefineVariationInput(variation) {
22
- const inlineOptions = {};
23
- const normalizedVariation = {};
24
- for (const [key, value] of Object.entries(variation)) {
25
- if (DEFINE_VARIATION_INLINE_OPTION_KEYS.has(key)) {
26
- Object.assign(inlineOptions, { [key]: value });
27
- continue;
28
- }
29
- normalizedVariation[key] = value;
30
- }
31
- return {
32
- inlineOptions,
33
- variation: normalizedVariation,
34
- };
35
- }
36
- function resolveDefineVariationSettings(inlineOptions, options) {
37
- const compatibility = {};
38
- const allowUnknownFutureKeys = options.allowUnknownFutureKeys;
39
- const minVersion = options.minVersion ??
40
- options.minWordPress ??
41
- inlineOptions.minVersion ??
42
- inlineOptions.minWordPress;
43
- const strict = options.strict ?? inlineOptions.strict ?? true;
44
- if (allowUnknownFutureKeys !== undefined) {
45
- Object.assign(compatibility, { allowUnknownFutureKeys });
46
- }
47
- if (minVersion !== undefined) {
48
- Object.assign(compatibility, { minVersion });
49
- }
50
- Object.assign(compatibility, { strict });
51
- return {
52
- compatibility,
53
- diagnostics: {
54
- allowMissingIsActive: options.allowMissingIsActive ?? inlineOptions.allowMissingIsActive ?? false,
55
- requireIsActive: options.requireIsActive ?? inlineOptions.requireIsActive ?? true,
56
- strict,
57
- },
58
- logger: options.logger ?? inlineOptions.logger,
59
- onDiagnostic: options.onDiagnostic ?? inlineOptions.onDiagnostic,
60
- };
61
- }
62
- export function collectBlockVariationCompatibilityFeatures() {
63
- return [
64
- {
65
- area: "blockVariations",
66
- feature: "editorRegistration",
67
- },
68
- ];
69
- }
70
- export function createBlockVariationCompatibilityManifest(settings = {}) {
71
- const resolved = resolveDefineVariationSettings({}, settings);
72
- return createWordPressBlockApiCompatibilityManifest(collectBlockVariationCompatibilityFeatures(), resolved.compatibility);
73
- }
74
- function hasStableMarkerAttribute(attributes) {
75
- if (!isObjectRecord(attributes)) {
76
- return false;
77
- }
78
- return STABLE_VARIATION_MARKER_ATTRIBUTES.some((key) => key in attributes);
79
- }
80
- function createVariationDiagnostics(blockName, variation, options) {
81
- const diagnostics = [];
82
- const variationName = variation.name;
83
- const attributes = variation.attributes;
84
- const isActive = variation.isActive;
85
- if (options.requireIsActive &&
86
- !options.allowMissingIsActive &&
87
- !variation.isDefault &&
88
- isActive === undefined) {
89
- diagnostics.push({
90
- blockName,
91
- code: "missing-is-active",
92
- message: `Block variation "${variationName}" for "${blockName}" does not declare isActive; add an active discriminator or set allowMissingIsActive.`,
93
- severity: "warning",
94
- variationName,
95
- });
96
- }
97
- if (options.requireIsActive &&
98
- !options.allowMissingIsActive &&
99
- !variation.isDefault &&
100
- isActive === undefined &&
101
- !hasStableMarkerAttribute(attributes)) {
102
- diagnostics.push({
103
- blockName,
104
- code: "missing-stable-marker",
105
- message: `Block variation "${variationName}" for "${blockName}" has no stable marker attribute such as className, namespace, or wpTypiaVariation.`,
106
- severity: "warning",
107
- variationName,
108
- });
109
- }
110
- if (Array.isArray(isActive)) {
111
- for (const attribute of isActive) {
112
- if (!isObjectRecord(attributes) || !(attribute in attributes)) {
113
- diagnostics.push({
114
- attribute,
115
- blockName,
116
- code: "unknown-is-active-attribute",
117
- message: `Block variation "${variationName}" for "${blockName}" uses isActive attribute "${attribute}" that is not present in its attributes.`,
118
- severity: "warning",
119
- variationName,
120
- });
121
- }
122
- }
123
- }
124
- return diagnostics;
125
- }
126
- function handleVariationDiagnostics(diagnostics, onDiagnostic, logger) {
127
- handleDiagnostics(diagnostics, onDiagnostic, {
128
- failureHeading: "WordPress block variation check failed:",
129
- logger,
130
- });
131
- }
132
9
  export function getDefinedVariationMetadata(variation) {
133
10
  return isObjectRecord(variation)
134
11
  ? variation[DEFINED_BLOCK_VARIATION_METADATA]
@@ -148,7 +25,7 @@ export function getDefinedVariationsMetadata(variations) {
148
25
  export function defineVariation(blockName, variation, options = {}) {
149
26
  const { inlineOptions, variation: normalizedVariation } = splitDefineVariationInput(variation);
150
27
  const resolved = resolveDefineVariationSettings(inlineOptions, options);
151
- const manifest = createWordPressBlockApiCompatibilityManifest(collectBlockVariationCompatibilityFeatures(), resolved.compatibility);
28
+ const manifest = createBlockVariationCompatibilityManifestFromSettings(resolved.compatibility);
152
29
  const diagnostics = [
153
30
  ...manifest.diagnostics,
154
31
  ...createVariationDiagnostics(blockName, normalizedVariation, resolved.diagnostics),
@@ -166,42 +43,6 @@ export function defineVariation(blockName, variation, options = {}) {
166
43
  });
167
44
  return normalizedVariation;
168
45
  }
169
- function createCollectionDiagnostics(entries, strict) {
170
- const diagnostics = [];
171
- const seenNames = new Map();
172
- const seenActiveMarkers = new Map();
173
- for (const entry of entries) {
174
- const nameKey = `${entry.blockName}:${entry.variation.name}`;
175
- const activeMarker = Array.isArray(entry.variation.isActive)
176
- ? entry.variation.isActive.join("|")
177
- : undefined;
178
- if (seenNames.has(nameKey)) {
179
- diagnostics.push({
180
- blockName: entry.blockName,
181
- code: "duplicate-variation-name",
182
- message: `Duplicate block variation name "${entry.variation.name}" for "${entry.blockName}".`,
183
- severity: getDiagnosticSeverity(strict),
184
- variationName: entry.variation.name,
185
- });
186
- }
187
- seenNames.set(nameKey, entry);
188
- if (activeMarker && activeMarker.length > 0) {
189
- const markerKey = `${entry.blockName}:${activeMarker}`;
190
- const existing = seenActiveMarkers.get(markerKey);
191
- if (existing) {
192
- diagnostics.push({
193
- blockName: entry.blockName,
194
- code: "duplicate-active-marker",
195
- message: `Block variations "${existing.variation.name}" and "${entry.variation.name}" for "${entry.blockName}" share the same isActive discriminator "${activeMarker}".`,
196
- severity: "warning",
197
- variationName: entry.variation.name,
198
- });
199
- }
200
- seenActiveMarkers.set(markerKey, entry);
201
- }
202
- }
203
- return diagnostics;
204
- }
205
46
  export function createBlockVariationRegistrationPlan(variations) {
206
47
  return variations.map((variation) => {
207
48
  const metadata = getDefinedVariationMetadata(variation);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wp-typia/block-types",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "description": "Shared WordPress block semantic types derived from Gutenberg and unofficial declarations",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",