@wp-typia/project-tools 0.21.0 → 0.22.0

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.
@@ -814,15 +814,16 @@ function checkWorkspaceAdminViewConfig(adminView, inventory) {
814
814
  return createDoctorCheck(`Admin view config ${adminView.slug}`, "pass", "Admin view uses a replaceable local fetcher");
815
815
  }
816
816
  const source = adminView.source.trim();
817
- const sourceMatch = /^rest-resource:([a-z][a-z0-9-]*)$/u.exec(source);
818
- const restResourceSlug = sourceMatch?.[1];
817
+ const restSourceMatch = /^rest-resource:([a-z][a-z0-9-]*)$/u.exec(source);
818
+ const coreDataSourceMatch = /^core-data:(postType|taxonomy)\/([a-z0-9][a-z0-9_-]*)$/u.exec(source);
819
+ const restResourceSlug = restSourceMatch?.[1];
819
820
  const restResource = restResourceSlug
820
821
  ? inventory.restResources.find((entry) => entry.slug === restResourceSlug)
821
822
  : undefined;
822
- const isValid = Boolean(restResource?.methods.includes("list"));
823
+ const isValid = Boolean(restResource?.methods.includes("list")) || Boolean(coreDataSourceMatch);
823
824
  return createDoctorCheck(`Admin view config ${adminView.slug}`, isValid ? "pass" : "fail", isValid
824
825
  ? `Admin view source ${source} is list-capable`
825
- : "Admin view source must use rest-resource:<slug> and reference a list-capable REST resource");
826
+ : "Admin view source must use rest-resource:<slug> with a list-capable REST resource or core-data:<postType|taxonomy>/<name>");
826
827
  }
827
828
  function checkWorkspaceAdminViewBootstrap(projectDir, packageName, phpPrefix) {
828
829
  const packageBaseName = packageName.split("/").pop() ?? packageName;
@@ -18,7 +18,7 @@ export function formatHelpText() {
18
18
  wp-typia create <project-dir> [--template compound] [--external-layer-source <./path|github:owner/repo/path[#ref]|npm-package>] [--external-layer-id <layer-id>] [--inner-blocks-preset <freeform|ordered|horizontal|locked-structure>] [--alternate-render-targets <email,mjml,plain-text>] [--data-storage <post-meta|custom-table>] [--persistence-policy <authenticated|public>] [--namespace <value>] [--text-domain <value>] [--php-prefix <value>] [--with-migration-ui] [--with-wp-env] [--with-test-preset] [--yes] [--dry-run] [--no-install] [--package-manager <id>]
19
19
  wp-typia <project-dir> [create flags...]
20
20
  wp-typia init [project-dir] [--apply] [--package-manager <id>]
21
- wp-typia add admin-view <name> [--source <rest-resource:slug>]
21
+ wp-typia add admin-view <name> [--source <rest-resource:slug|core-data:kind/name>]
22
22
  wp-typia add block <name> [--template <basic|interactivity|persistence|compound>] [--external-layer-source <./path|github:owner/repo/path[#ref]|npm-package>] [--external-layer-id <layer-id>] [--inner-blocks-preset <freeform|ordered|horizontal|locked-structure>] [--alternate-render-targets <email,mjml,plain-text>] [--data-storage <post-meta|custom-table>] [--persistence-policy <authenticated|public>]
23
23
  wp-typia add variation <name> --block <block-slug>
24
24
  wp-typia add style <name> --block <block-slug>
@@ -49,7 +49,10 @@ Notes:
49
49
  \`wp-typia init\` previews the minimum retrofit sync surface by default; rerun with \`--apply\` to write package.json updates and generated helper scripts.
50
50
  Use \`--template workspace\` as shorthand for \`@wp-typia/create-workspace-template\`, the official empty workspace scaffold behind \`wp-typia add ...\`.
51
51
  Interactive add flows let you choose a template when \`--template\` is omitted; non-interactive runs default to \`basic\`.
52
- \`add admin-view\` scaffolds an opt-in DataViews-powered WordPress admin screen under \`src/admin-views/\`; pass \`--source rest-resource:<slug>\` to reuse a list-capable REST resource.
52
+ \`add admin-view\` scaffolds an opt-in DataViews-powered WordPress admin screen under \`src/admin-views/\`.
53
+ Pass \`--source rest-resource:<slug>\` to reuse a list-capable REST resource.
54
+ Pass \`--source core-data:postType/post\` or \`--source core-data:taxonomy/category\` to bind a WordPress-owned entity collection.
55
+ Public installs currently gate this workflow until \`@wp-typia/dataviews\` is published to npm.
53
56
  \`query-loop\` is create-only. Use \`wp-typia create <project-dir> --template query-loop\`; \`wp-typia add block\` accepts only basic, interactivity, persistence, and compound families.
54
57
  \`add variation\` uses an existing workspace block from \`scripts/block-config.ts\`.
55
58
  \`add style\` registers a Block Styles option for an existing generated block.
@@ -1,4 +1,5 @@
1
- import { type SelectableExternalTemplateLayer } from "./template-layers.js";
1
+ import { resolveTemplateSeed } from "./template-source.js";
2
+ import { listSelectableExternalTemplateLayers, type SelectableExternalTemplateLayer } from "./template-layers.js";
2
3
  export interface ExternalLayerSelectionOption extends SelectableExternalTemplateLayer {
3
4
  }
4
5
  export interface ResolvedExternalLayerSelection {
@@ -6,9 +7,14 @@ export interface ResolvedExternalLayerSelection {
6
7
  externalLayerId?: string;
7
8
  externalLayerSource?: string;
8
9
  }
9
- export declare function resolveOptionalInteractiveExternalLayerId({ callerCwd, externalLayerId, externalLayerSource, selectExternalLayerId, }: {
10
+ type ResolveExternalTemplateSeed = typeof resolveTemplateSeed;
11
+ type ListExternalTemplateLayers = typeof listSelectableExternalTemplateLayers;
12
+ export declare function resolveOptionalInteractiveExternalLayerId({ callerCwd, externalLayerId, externalLayerSource, listExternalTemplateLayers, resolveExternalTemplateSeed, selectExternalLayerId, }: {
10
13
  callerCwd: string;
11
14
  externalLayerId?: string;
12
15
  externalLayerSource?: string;
16
+ listExternalTemplateLayers?: ListExternalTemplateLayers;
17
+ resolveExternalTemplateSeed?: ResolveExternalTemplateSeed;
13
18
  selectExternalLayerId?: (options: ExternalLayerSelectionOption[]) => Promise<string>;
14
19
  }): Promise<ResolvedExternalLayerSelection>;
20
+ export {};
@@ -1,15 +1,15 @@
1
1
  import { parseTemplateLocator, resolveTemplateSeed, } from "./template-source.js";
2
2
  import { listSelectableExternalTemplateLayers, } from "./template-layers.js";
3
- export async function resolveOptionalInteractiveExternalLayerId({ callerCwd, externalLayerId, externalLayerSource, selectExternalLayerId, }) {
3
+ export async function resolveOptionalInteractiveExternalLayerId({ callerCwd, externalLayerId, externalLayerSource, listExternalTemplateLayers = listSelectableExternalTemplateLayers, resolveExternalTemplateSeed = resolveTemplateSeed, selectExternalLayerId, }) {
4
4
  if (!externalLayerSource || externalLayerId || !selectExternalLayerId) {
5
5
  return {
6
6
  externalLayerId,
7
7
  externalLayerSource,
8
8
  };
9
9
  }
10
- const layerSeed = await resolveTemplateSeed(parseTemplateLocator(externalLayerSource), callerCwd);
10
+ const layerSeed = await resolveExternalTemplateSeed(parseTemplateLocator(externalLayerSource), callerCwd);
11
11
  try {
12
- const selectableLayers = await listSelectableExternalTemplateLayers(layerSeed.rootDir);
12
+ const selectableLayers = await listExternalTemplateLayers(layerSeed.rootDir);
13
13
  if (selectableLayers.length <= 1) {
14
14
  await layerSeed.cleanup?.();
15
15
  return {
@@ -25,7 +25,6 @@ export async function resolveOptionalInteractiveExternalLayerId({ callerCwd, ext
25
25
  externalLayerSource: layerSeed.rootDir,
26
26
  };
27
27
  }
28
- await layerSeed.cleanup?.();
29
28
  throw new Error(`Unknown external layer "${selectedLayerId}". Expected one of: ${selectableLayers.map((layer) => layer.id).join(", ")}`);
30
29
  }
31
30
  catch (error) {
@@ -11,6 +11,19 @@ export interface PackageVersions {
11
11
  wpTypiaPackageExactVersion: string;
12
12
  wpTypiaPackageVersion: string;
13
13
  }
14
+ /**
15
+ * Explicit fallback ranges for managed WordPress-facing workspace dependencies.
16
+ *
17
+ * These remain centralized here even when individual scaffold flows resolve a
18
+ * fresher local or installed manifest version first, so add-command defaults do
19
+ * not drift across runtime modules.
20
+ */
21
+ export declare const DEFAULT_WORDPRESS_ABILITIES_VERSION = "^0.10.0";
22
+ export declare const DEFAULT_WORDPRESS_CORE_ABILITIES_VERSION = "^0.9.0";
23
+ export declare const DEFAULT_WORDPRESS_CORE_DATA_VERSION = "^7.44.0";
24
+ export declare const DEFAULT_WORDPRESS_DATA_VERSION = "^9.28.0";
25
+ export declare const DEFAULT_WORDPRESS_DATAVIEWS_VERSION = "^14.1.0";
26
+ export declare const DEFAULT_WP_TYPIA_DATAVIEWS_VERSION = "^0.1.0";
14
27
  /**
15
28
  * Clears the in-memory cache used by `getPackageVersions()`.
16
29
  *
@@ -7,6 +7,19 @@ const DEFAULT_VERSION_RANGE = "^0.0.0";
7
7
  const DEFAULT_EXACT_VERSION = "0.0.0";
8
8
  const DEFAULT_TSX_PACKAGE_VERSION = "^4.20.5";
9
9
  const DEFAULT_TYPIA_UNPLUGIN_PACKAGE_VERSION = "^12.0.1";
10
+ /**
11
+ * Explicit fallback ranges for managed WordPress-facing workspace dependencies.
12
+ *
13
+ * These remain centralized here even when individual scaffold flows resolve a
14
+ * fresher local or installed manifest version first, so add-command defaults do
15
+ * not drift across runtime modules.
16
+ */
17
+ export const DEFAULT_WORDPRESS_ABILITIES_VERSION = "^0.10.0";
18
+ export const DEFAULT_WORDPRESS_CORE_ABILITIES_VERSION = "^0.9.0";
19
+ export const DEFAULT_WORDPRESS_CORE_DATA_VERSION = "^7.44.0";
20
+ export const DEFAULT_WORDPRESS_DATA_VERSION = "^9.28.0";
21
+ export const DEFAULT_WORDPRESS_DATAVIEWS_VERSION = "^14.1.0";
22
+ export const DEFAULT_WP_TYPIA_DATAVIEWS_VERSION = "^0.1.0";
10
23
  let cachedPackageVersions = null;
11
24
  function getErrorCode(error) {
12
25
  return typeof error === "object" && error !== null && "code" in error
@@ -4,7 +4,7 @@
4
4
  * The policy keeps plugin headers, runtime gates, and workspace inventory
5
5
  * metadata aligned when optional or required AI-capable features are added.
6
6
  */
7
- import { type AiFeatureCapabilitySelection, type AiFeatureCompatibilityFloor, type ResolvedAiFeatureCapabilityPlan } from "./ai-feature-capability.js";
7
+ import { type AiFeatureCapabilitySelection, type AiFeatureCompatibilityFloor, type ResolvedAiFeatureCapabilityPlan } from './ai-feature-capability.js';
8
8
  /**
9
9
  * WordPress plugin header version floors emitted by scaffold templates.
10
10
  */
@@ -25,7 +25,7 @@ export interface ScaffoldCompatibilityPolicy {
25
25
  */
26
26
  export interface ScaffoldCompatibilityConfig {
27
27
  hardMinimums: AiFeatureCompatibilityFloor;
28
- mode: "baseline" | "optional" | "required";
28
+ mode: 'baseline' | 'optional' | 'required';
29
29
  optionalFeatures: string[];
30
30
  requiredFeatures: string[];
31
31
  runtimeGates: string[];
@@ -4,14 +4,15 @@
4
4
  * The policy keeps plugin headers, runtime gates, and workspace inventory
5
5
  * metadata aligned when optional or required AI-capable features are added.
6
6
  */
7
- import { AI_FEATURE_DEFINITIONS, resolveAiFeatureCapabilityPlan, } from "./ai-feature-capability.js";
7
+ import { AI_FEATURE_DEFINITIONS, resolveAiFeatureCapabilityPlan, } from './ai-feature-capability.js';
8
+ import { pickHigherVersionFloor } from './version-floor.js';
8
9
  /**
9
10
  * Baseline headers used by scaffold output before optional features are added.
10
11
  */
11
12
  export const DEFAULT_SCAFFOLD_COMPATIBILITY = {
12
- requiresAtLeast: "6.7",
13
- requiresPhp: "8.0",
14
- testedUpTo: "6.9",
13
+ requiresAtLeast: '6.7',
14
+ requiresPhp: '8.0',
15
+ testedUpTo: '6.9',
15
16
  };
16
17
  /**
17
18
  * Optional WordPress AI Client surface used by server-only AI feature scaffold.
@@ -19,7 +20,7 @@ export const DEFAULT_SCAFFOLD_COMPATIBILITY = {
19
20
  export const OPTIONAL_WORDPRESS_AI_CLIENT_COMPATIBILITY = [
20
21
  {
21
22
  featureId: AI_FEATURE_DEFINITIONS.wordpressAiClient.id,
22
- mode: "optional",
23
+ mode: 'optional',
23
24
  },
24
25
  ];
25
26
  /**
@@ -28,42 +29,15 @@ export const OPTIONAL_WORDPRESS_AI_CLIENT_COMPATIBILITY = [
28
29
  export const REQUIRED_WORKSPACE_ABILITY_COMPATIBILITY = [
29
30
  {
30
31
  featureId: AI_FEATURE_DEFINITIONS.wordpressServerAbilities.id,
31
- mode: "required",
32
+ mode: 'required',
32
33
  },
33
34
  {
34
35
  featureId: AI_FEATURE_DEFINITIONS.wordpressCoreAbilities.id,
35
- mode: "required",
36
+ mode: 'required',
36
37
  },
37
38
  ];
38
- function parseVersionFloorParts(value) {
39
- return value.split(".").map((part, index) => {
40
- if (!/^\d+$/u.test(part)) {
41
- throw new Error(`parseVersionFloorParts received an invalid version floor "${value}" at segment ${index + 1}.`);
42
- }
43
- return Number.parseInt(part, 10);
44
- });
45
- }
46
- function compareVersionFloors(left, right) {
47
- const leftParts = parseVersionFloorParts(left);
48
- const rightParts = parseVersionFloorParts(right);
49
- const length = Math.max(leftParts.length, rightParts.length);
50
- for (let index = 0; index < length; index += 1) {
51
- const leftValue = leftParts[index] ?? 0;
52
- const rightValue = rightParts[index] ?? 0;
53
- if (leftValue > rightValue) {
54
- return 1;
55
- }
56
- if (leftValue < rightValue) {
57
- return -1;
58
- }
59
- }
60
- return 0;
61
- }
62
- function pickHigherVersionFloor(current, candidate) {
63
- if (!candidate) {
64
- return current;
65
- }
66
- return compareVersionFloors(current, candidate) >= 0 ? current : candidate;
39
+ function pickHigherScaffoldVersionFloor(current, candidate) {
40
+ return pickHigherVersionFloor(current, candidate) ?? current;
67
41
  }
68
42
  function pickHigherHeaderVersionFloor(policyValue, currentValue) {
69
43
  const normalizedCurrentValue = currentValue.trim();
@@ -71,7 +45,7 @@ function pickHigherHeaderVersionFloor(policyValue, currentValue) {
71
45
  return policyValue;
72
46
  }
73
47
  try {
74
- return pickHigherVersionFloor(policyValue, normalizedCurrentValue);
48
+ return pickHigherScaffoldVersionFloor(policyValue, normalizedCurrentValue);
75
49
  }
76
50
  catch {
77
51
  return policyValue;
@@ -82,21 +56,21 @@ function formatRuntimeGate(feature) {
82
56
  }
83
57
  function getPolicyMode(capabilityPlan) {
84
58
  if (capabilityPlan.requiredFeatures.length > 0) {
85
- return "required";
59
+ return 'required';
86
60
  }
87
61
  if (capabilityPlan.optionalFeatures.length > 0) {
88
- return "optional";
62
+ return 'optional';
89
63
  }
90
- return "baseline";
64
+ return 'baseline';
91
65
  }
92
66
  /**
93
67
  * Resolve plugin header floors and capability gates for scaffold selections.
94
68
  */
95
69
  export function resolveScaffoldCompatibilityPolicy(selections, { baseline = DEFAULT_SCAFFOLD_COMPATIBILITY, } = {}) {
96
70
  const capabilityPlan = resolveAiFeatureCapabilityPlan(selections);
97
- const requiresAtLeast = pickHigherVersionFloor(baseline.requiresAtLeast, capabilityPlan.hardMinimums.wordpress);
98
- const requiresPhp = pickHigherVersionFloor(baseline.requiresPhp, capabilityPlan.hardMinimums.php);
99
- const testedUpTo = pickHigherVersionFloor(baseline.testedUpTo, requiresAtLeast);
71
+ const requiresAtLeast = pickHigherScaffoldVersionFloor(baseline.requiresAtLeast, capabilityPlan.hardMinimums.wordpress);
72
+ const requiresPhp = pickHigherScaffoldVersionFloor(baseline.requiresPhp, capabilityPlan.hardMinimums.php);
73
+ const testedUpTo = pickHigherScaffoldVersionFloor(baseline.testedUpTo, requiresAtLeast);
100
74
  return {
101
75
  capabilityPlan,
102
76
  pluginHeader: {
@@ -125,16 +99,16 @@ export function createScaffoldCompatibilityConfig(policy) {
125
99
  /**
126
100
  * Render compatibility metadata as formatted TypeScript object literal JSON.
127
101
  */
128
- export function renderScaffoldCompatibilityConfig(policy, indent = "\t\t") {
102
+ export function renderScaffoldCompatibilityConfig(policy, indent = '\t\t') {
129
103
  const config = createScaffoldCompatibilityConfig(policy);
130
- return JSON.stringify(config, null, "\t")
131
- .split("\n")
104
+ return JSON.stringify(config, null, '\t')
105
+ .split('\n')
132
106
  .map((line, index) => (index === 0 ? line : `${indent}${line}`))
133
- .join("\n");
107
+ .join('\n');
134
108
  }
135
109
  function replacePluginHeaderVersionFloor(source, pattern, policyValue) {
136
110
  return source.replace(pattern, (_match, prefix, currentValue, lineEnding) => {
137
- const versionPrefix = prefix.endsWith(":") ? `${prefix} ` : prefix;
111
+ const versionPrefix = prefix.endsWith(':') ? `${prefix} ` : prefix;
138
112
  return `${versionPrefix}${pickHigherHeaderVersionFloor(policyValue, currentValue)}${lineEnding}`;
139
113
  });
140
114
  }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Parse a dotted version floor into numeric parts for stable comparisons.
3
+ *
4
+ * @param value Human-authored version floor such as `7.0` or `8.1.2`.
5
+ * @returns Numeric version segments suitable for ordered comparison.
6
+ * @throws When any segment contains non-digit characters.
7
+ */
8
+ export declare function parseVersionFloorParts(value: string): number[];
9
+ /**
10
+ * Compare two dotted version floors.
11
+ *
12
+ * Missing trailing segments are treated as zero so `7.0` equals `7.0.0`.
13
+ *
14
+ * @param left Left-hand version floor.
15
+ * @param right Right-hand version floor.
16
+ * @returns `1` when left is higher, `-1` when right is higher, or `0` when equal.
17
+ */
18
+ export declare function compareVersionFloors(left: string, right: string): number;
19
+ /**
20
+ * Pick the higher version floor while tolerating undefined values.
21
+ *
22
+ * @param current Current resolved floor, when present.
23
+ * @param candidate Candidate floor to compare against the current floor.
24
+ * @returns The higher defined floor, or undefined when neither value exists.
25
+ */
26
+ export declare function pickHigherVersionFloor(current: string | undefined, candidate: string | undefined): string | undefined;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Parse a dotted version floor into numeric parts for stable comparisons.
3
+ *
4
+ * @param value Human-authored version floor such as `7.0` or `8.1.2`.
5
+ * @returns Numeric version segments suitable for ordered comparison.
6
+ * @throws When any segment contains non-digit characters.
7
+ */
8
+ export function parseVersionFloorParts(value) {
9
+ return value.split('.').map((part, index) => {
10
+ if (!/^\d+$/u.test(part)) {
11
+ throw new Error(`parseVersionFloorParts received an invalid version floor "${value}" at segment ${index + 1}.`);
12
+ }
13
+ return Number.parseInt(part, 10);
14
+ });
15
+ }
16
+ /**
17
+ * Compare two dotted version floors.
18
+ *
19
+ * Missing trailing segments are treated as zero so `7.0` equals `7.0.0`.
20
+ *
21
+ * @param left Left-hand version floor.
22
+ * @param right Right-hand version floor.
23
+ * @returns `1` when left is higher, `-1` when right is higher, or `0` when equal.
24
+ */
25
+ export function compareVersionFloors(left, right) {
26
+ const leftParts = parseVersionFloorParts(left);
27
+ const rightParts = parseVersionFloorParts(right);
28
+ const length = Math.max(leftParts.length, rightParts.length);
29
+ for (let index = 0; index < length; index += 1) {
30
+ const leftValue = leftParts[index] ?? 0;
31
+ const rightValue = rightParts[index] ?? 0;
32
+ if (leftValue > rightValue) {
33
+ return 1;
34
+ }
35
+ if (leftValue < rightValue) {
36
+ return -1;
37
+ }
38
+ }
39
+ return 0;
40
+ }
41
+ /**
42
+ * Pick the higher version floor while tolerating undefined values.
43
+ *
44
+ * @param current Current resolved floor, when present.
45
+ * @param candidate Candidate floor to compare against the current floor.
46
+ * @returns The higher defined floor, or undefined when neither value exists.
47
+ */
48
+ export function pickHigherVersionFloor(current, candidate) {
49
+ if (!candidate) {
50
+ return current;
51
+ }
52
+ if (!current) {
53
+ return candidate;
54
+ }
55
+ return compareVersionFloors(current, candidate) >= 0 ? current : candidate;
56
+ }
@@ -96,7 +96,8 @@ export interface WorkspaceAiFeatureInventoryEntry {
96
96
  * @property file Relative path to the generated admin view shared entry file.
97
97
  * @property phpFile Relative path to the generated WordPress admin page glue.
98
98
  * @property slug Normalized admin view slug.
99
- * @property source Optional source locator such as `rest-resource:products`.
99
+ * @property source Optional source locator such as `rest-resource:products` or
100
+ * `core-data:postType/post`.
100
101
  */
101
102
  export interface WorkspaceAdminViewInventoryEntry {
102
103
  file: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wp-typia/project-tools",
3
- "version": "0.21.0",
3
+ "version": "0.22.0",
4
4
  "description": "Project orchestration and programmatic tooling for wp-typia",
5
5
  "packageManager": "bun@1.3.11",
6
6
  "type": "module",
@@ -105,6 +105,7 @@
105
105
  "prepack": "bun run build && node ./scripts/publish-manifest.mjs prepare",
106
106
  "postpack": "node ./scripts/publish-manifest.mjs restore",
107
107
  "test": "bun run build && bun test tests/*.test.ts",
108
+ "test:quick": "bun run build && bun test tests/workspace-add.test.ts tests/workspace-doctor.test.ts tests/scaffold-compound.test.ts",
108
109
  "test:scaffold-core": "bun run build && bun test tests/block-generator-service.test.ts tests/built-in-block-artifacts.test.ts tests/scaffold-basic.test.ts tests/scaffold-persistence.test.ts tests/template-source.test.ts tests/init-command.test.ts tests/package-versions.test.ts tests/cli-entry.test.ts tests/cli-prompt.test.ts tests/import-policy.test.ts tests/wordpress-ai-spec.test.ts tests/typia-llm.test.ts",
109
110
  "test:workspace": "bun run build && bun test tests/workspace-add.test.ts tests/workspace-doctor.test.ts",
110
111
  "test:compound": "bun run build && bun test tests/scaffold-compound.test.ts",
@@ -146,7 +147,7 @@
146
147
  "dependencies": {
147
148
  "@wp-typia/api-client": "^0.4.5",
148
149
  "@wp-typia/block-runtime": "^0.5.0",
149
- "@wp-typia/rest": "^0.3.11",
150
+ "@wp-typia/rest": "^0.3.12",
150
151
  "@wp-typia/block-types": "^0.2.4",
151
152
  "mustache": "^4.2.0",
152
153
  "npm-package-arg": "^13.0.0",