@wp-typia/project-tools 0.23.0 → 0.23.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.
Files changed (109) hide show
  1. package/dist/runtime/ai-feature-artifacts.js +4 -1
  2. package/dist/runtime/block-generator-service-spec.js +2 -1
  3. package/dist/runtime/cli-add-block-json.js +5 -1
  4. package/dist/runtime/cli-add-help.js +4 -3
  5. package/dist/runtime/cli-add-types.d.ts +18 -6
  6. package/dist/runtime/cli-add-validation.d.ts +7 -0
  7. package/dist/runtime/cli-add-validation.js +9 -0
  8. package/dist/runtime/cli-add-workspace-ability-scaffold.js +4 -1
  9. package/dist/runtime/cli-add-workspace-admin-view-scaffold.js +5 -1
  10. package/dist/runtime/cli-add-workspace-admin-view-templates-core-data.d.ts +34 -0
  11. package/dist/runtime/cli-add-workspace-admin-view-templates-core-data.js +483 -0
  12. package/dist/runtime/cli-add-workspace-admin-view-templates-default.d.ts +30 -0
  13. package/dist/runtime/cli-add-workspace-admin-view-templates-default.js +310 -0
  14. package/dist/runtime/cli-add-workspace-admin-view-templates-rest.d.ts +25 -0
  15. package/dist/runtime/cli-add-workspace-admin-view-templates-rest.js +124 -0
  16. package/dist/runtime/cli-add-workspace-admin-view-templates-settings.d.ts +34 -0
  17. package/dist/runtime/cli-add-workspace-admin-view-templates-settings.js +370 -0
  18. package/dist/runtime/cli-add-workspace-admin-view-templates-shared.d.ts +49 -0
  19. package/dist/runtime/cli-add-workspace-admin-view-templates-shared.js +259 -0
  20. package/dist/runtime/cli-add-workspace-admin-view-templates.d.ts +18 -27
  21. package/dist/runtime/cli-add-workspace-admin-view-templates.js +30 -1326
  22. package/dist/runtime/cli-add-workspace-ai-anchors.js +4 -1
  23. package/dist/runtime/cli-add-workspace-ai-source-emitters.js +17 -1
  24. package/dist/runtime/cli-add-workspace-integration-env.d.ts +3 -1
  25. package/dist/runtime/cli-add-workspace-integration-env.js +42 -5
  26. package/dist/runtime/cli-add-workspace-rest-anchors.d.ts +8 -0
  27. package/dist/runtime/cli-add-workspace-rest-anchors.js +41 -0
  28. package/dist/runtime/cli-add-workspace-rest-generated.d.ts +9 -0
  29. package/dist/runtime/cli-add-workspace-rest-generated.js +158 -0
  30. package/dist/runtime/cli-add-workspace-rest-manual.d.ts +8 -0
  31. package/dist/runtime/cli-add-workspace-rest-manual.js +279 -0
  32. package/dist/runtime/cli-add-workspace-rest-php-templates.d.ts +24 -0
  33. package/dist/runtime/cli-add-workspace-rest-php-templates.js +678 -0
  34. package/dist/runtime/cli-add-workspace-rest-source-emitters.d.ts +8 -0
  35. package/dist/runtime/cli-add-workspace-rest-source-emitters.js +25 -4
  36. package/dist/runtime/cli-add-workspace-rest-types.d.ts +108 -0
  37. package/dist/runtime/cli-add-workspace-rest-types.js +1 -0
  38. package/dist/runtime/cli-add-workspace-rest.d.ts +3 -20
  39. package/dist/runtime/cli-add-workspace-rest.js +33 -788
  40. package/dist/runtime/cli-core.d.ts +1 -1
  41. package/dist/runtime/cli-core.js +1 -1
  42. package/dist/runtime/cli-diagnostics.d.ts +3 -1
  43. package/dist/runtime/cli-diagnostics.js +17 -5
  44. package/dist/runtime/cli-doctor-workspace-bindings.js +4 -1
  45. package/dist/runtime/cli-doctor-workspace-block-addons.d.ts +12 -0
  46. package/dist/runtime/cli-doctor-workspace-block-addons.js +134 -0
  47. package/dist/runtime/cli-doctor-workspace-block-iframe.d.ts +9 -0
  48. package/dist/runtime/cli-doctor-workspace-block-iframe.js +228 -0
  49. package/dist/runtime/cli-doctor-workspace-block-metadata.d.ts +11 -0
  50. package/dist/runtime/cli-doctor-workspace-block-metadata.js +111 -0
  51. package/dist/runtime/cli-doctor-workspace-blocks.js +6 -424
  52. package/dist/runtime/cli-doctor-workspace-features-abilities.d.ts +11 -0
  53. package/dist/runtime/cli-doctor-workspace-features-abilities.js +112 -0
  54. package/dist/runtime/cli-doctor-workspace-features-admin-views.d.ts +11 -0
  55. package/dist/runtime/cli-doctor-workspace-features-admin-views.js +128 -0
  56. package/dist/runtime/cli-doctor-workspace-features-ai.d.ts +11 -0
  57. package/dist/runtime/cli-doctor-workspace-features-ai.js +57 -0
  58. package/dist/runtime/cli-doctor-workspace-features-editor-plugins.d.ts +11 -0
  59. package/dist/runtime/cli-doctor-workspace-features-editor-plugins.js +80 -0
  60. package/dist/runtime/cli-doctor-workspace-features-post-meta.d.ts +11 -0
  61. package/dist/runtime/cli-doctor-workspace-features-post-meta.js +77 -0
  62. package/dist/runtime/cli-doctor-workspace-features-rest.d.ts +11 -0
  63. package/dist/runtime/cli-doctor-workspace-features-rest.js +120 -0
  64. package/dist/runtime/cli-doctor-workspace-features.js +14 -487
  65. package/dist/runtime/cli-doctor.d.ts +52 -3
  66. package/dist/runtime/cli-doctor.js +79 -8
  67. package/dist/runtime/cli-help.js +6 -3
  68. package/dist/runtime/cli-init-package-json.js +4 -2
  69. package/dist/runtime/cli-prompt.d.ts +16 -2
  70. package/dist/runtime/cli-prompt.js +29 -12
  71. package/dist/runtime/cli-scaffold.d.ts +2 -1
  72. package/dist/runtime/cli-scaffold.js +19 -10
  73. package/dist/runtime/external-template-guards.js +4 -6
  74. package/dist/runtime/index.d.ts +2 -2
  75. package/dist/runtime/index.js +1 -1
  76. package/dist/runtime/json-utils.d.ts +62 -4
  77. package/dist/runtime/json-utils.js +78 -4
  78. package/dist/runtime/local-dev-presets.js +4 -1
  79. package/dist/runtime/migration-ui-capability.js +4 -1
  80. package/dist/runtime/migration-utils.js +4 -1
  81. package/dist/runtime/package-managers.js +6 -1
  82. package/dist/runtime/package-versions.js +6 -1
  83. package/dist/runtime/scaffold-bootstrap.js +7 -2
  84. package/dist/runtime/scaffold-package-manager-files.js +5 -1
  85. package/dist/runtime/scaffold-repository-reference.js +4 -2
  86. package/dist/runtime/scaffold-template-variables.js +2 -1
  87. package/dist/runtime/scaffold.d.ts +18 -1
  88. package/dist/runtime/scaffold.js +55 -2
  89. package/dist/runtime/temp-roots.js +4 -1
  90. package/dist/runtime/template-layers.js +4 -1
  91. package/dist/runtime/template-registry.js +9 -3
  92. package/dist/runtime/template-source-contracts.d.ts +2 -0
  93. package/dist/runtime/template-source-normalization.js +2 -1
  94. package/dist/runtime/template-source-remote.js +18 -5
  95. package/dist/runtime/template-source-seeds.js +10 -3
  96. package/dist/runtime/workspace-inventory-mutations.js +2 -1
  97. package/dist/runtime/workspace-inventory-parser-entries.d.ts +17 -0
  98. package/dist/runtime/workspace-inventory-parser-entries.js +157 -0
  99. package/dist/runtime/workspace-inventory-parser-validation.d.ts +104 -0
  100. package/dist/runtime/workspace-inventory-parser-validation.js +34 -0
  101. package/dist/runtime/workspace-inventory-parser.d.ts +3 -45
  102. package/dist/runtime/workspace-inventory-parser.js +3 -581
  103. package/dist/runtime/workspace-inventory-section-descriptors.d.ts +19 -0
  104. package/dist/runtime/workspace-inventory-section-descriptors.js +435 -0
  105. package/dist/runtime/workspace-inventory-templates.d.ts +1 -1
  106. package/dist/runtime/workspace-inventory-templates.js +1 -0
  107. package/dist/runtime/workspace-inventory-types.d.ts +1 -0
  108. package/dist/runtime/workspace-project.js +4 -6
  109. package/package.json +2 -2
@@ -0,0 +1,310 @@
1
+ import { quoteTsString } from './cli-add-shared.js';
2
+ import { toCamelCase, toPascalCase, toTitleCase } from './string-case.js';
3
+ /**
4
+ * Builds starter item and dataset types for the default admin-view variant.
5
+ *
6
+ * @param adminViewSlug - Admin-view slug used to derive generated type names.
7
+ * @returns Generated TypeScript source for default admin-view types.
8
+ */
9
+ export function buildDefaultAdminViewTypesSource(adminViewSlug) {
10
+ const pascalName = toPascalCase(adminViewSlug);
11
+ const itemTypeName = `${pascalName}AdminViewItem`;
12
+ const dataSetTypeName = `${pascalName}AdminViewDataSet`;
13
+ return `export type ${pascalName}AdminViewStatus = 'draft' | 'published';
14
+
15
+ export interface ${itemTypeName} {
16
+ \tid: number;
17
+ \towner: string;
18
+ \tstatus: ${pascalName}AdminViewStatus;
19
+ \ttitle: string;
20
+ \tupdatedAt: string;
21
+ }
22
+
23
+ export interface ${dataSetTypeName} {
24
+ \titems: ${itemTypeName}[];
25
+ \tpaginationInfo: {
26
+ \t\ttotalItems: number;
27
+ \t\ttotalPages: number;
28
+ \t};
29
+ }
30
+ `;
31
+ }
32
+ /**
33
+ * Builds a DataViews config module for the default admin-view variant.
34
+ *
35
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
36
+ * @param textDomain - WordPress i18n text domain for generated labels.
37
+ * @returns Generated TypeScript source for the default DataViews config.
38
+ */
39
+ export function buildDefaultAdminViewConfigSource(adminViewSlug, textDomain) {
40
+ const pascalName = toPascalCase(adminViewSlug);
41
+ const camelName = toCamelCase(adminViewSlug);
42
+ const itemTypeName = `${pascalName}AdminViewItem`;
43
+ const dataViewsName = `${camelName}AdminDataViews`;
44
+ return `import { defineDataViews } from '@wp-typia/dataviews';
45
+ import { __ } from '@wordpress/i18n';
46
+
47
+ import type { ${itemTypeName} } from './types';
48
+
49
+ export const ${dataViewsName} = defineDataViews<${itemTypeName}>({
50
+ \tidField: 'id',
51
+ \tsearch: true,
52
+ \tsearchLabel: __( 'Search records', ${quoteTsString(textDomain)} ),
53
+ \ttitleField: 'title',
54
+ \tdefaultView: {
55
+ \t\tfields: ['title', 'status', 'updatedAt'],
56
+ \t\tpage: 1,
57
+ \t\tperPage: 10,
58
+ \t\tsort: {
59
+ \t\t\tdirection: 'desc',
60
+ \t\t\tfield: 'updatedAt',
61
+ \t\t},
62
+ \t\ttitleField: 'title',
63
+ \t\ttype: 'table',
64
+ \t},
65
+ \tfields: {
66
+ \t\tid: {
67
+ \t\t\tenableHiding: false,
68
+ \t\t\tlabel: __( 'ID', ${quoteTsString(textDomain)} ),
69
+ \t\t\treadOnly: true,
70
+ \t\t\tschema: { type: 'integer' },
71
+ \t\t},
72
+ \t\towner: {
73
+ \t\t\tlabel: __( 'Owner', ${quoteTsString(textDomain)} ),
74
+ \t\t\tschema: { type: 'string' },
75
+ \t\t},
76
+ \t\tstatus: {
77
+ \t\t\tfilterBy: { operators: ['isAny', 'isNone'] },
78
+ \t\t\tlabel: __( 'Status', ${quoteTsString(textDomain)} ),
79
+ \t\t\tschema: {
80
+ \t\t\t\tenum: ['draft', 'published'],
81
+ \t\t\t\tenumLabels: {
82
+ \t\t\t\t\tdraft: __( 'Draft', ${quoteTsString(textDomain)} ),
83
+ \t\t\t\t\tpublished: __( 'Published', ${quoteTsString(textDomain)} ),
84
+ \t\t\t\t},
85
+ \t\t\t\ttype: 'string',
86
+ \t\t\t},
87
+ \t\t},
88
+ \t\ttitle: {
89
+ \t\t\tenableGlobalSearch: true,
90
+ \t\t\tenableSorting: true,
91
+ \t\t\tlabel: __( 'Title', ${quoteTsString(textDomain)} ),
92
+ \t\t\tschema: { type: 'string' },
93
+ \t\t},
94
+ \t\tupdatedAt: {
95
+ \t\t\tenableSorting: true,
96
+ \t\t\tlabel: __( 'Updated', ${quoteTsString(textDomain)} ),
97
+ \t\t\tschema: { format: 'date-time', type: 'string' },
98
+ \t\t\ttype: 'datetime',
99
+ \t\t},
100
+ \t},
101
+ });
102
+ `;
103
+ }
104
+ /**
105
+ * Builds an in-memory starter data module for the default admin-view variant.
106
+ *
107
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
108
+ * @returns Generated TypeScript source for starter data loading.
109
+ */
110
+ export function buildDefaultAdminViewDataSource(adminViewSlug) {
111
+ const pascalName = toPascalCase(adminViewSlug);
112
+ const camelName = toCamelCase(adminViewSlug);
113
+ const title = toTitleCase(adminViewSlug);
114
+ const itemTypeName = `${pascalName}AdminViewItem`;
115
+ const dataSetTypeName = `${pascalName}AdminViewDataSet`;
116
+ const queryTypeName = `${pascalName}AdminViewQuery`;
117
+ const dataViewsName = `${camelName}AdminDataViews`;
118
+ const fetchName = `fetch${pascalName}AdminViewData`;
119
+ return `import type { DataViewsView } from '@wp-typia/dataviews';
120
+
121
+ import { ${dataViewsName} } from './config';
122
+ import type { ${dataSetTypeName}, ${itemTypeName} } from './types';
123
+
124
+ export interface ${queryTypeName} {
125
+ \tpage?: number;
126
+ \tperPage?: number;
127
+ \tsearch?: string;
128
+ }
129
+
130
+ const STARTER_ITEMS: ${itemTypeName}[] = [
131
+ \t{
132
+ \t\tid: 1,
133
+ \t\towner: 'Editorial',
134
+ \t\tstatus: 'published',
135
+ \t\ttitle: ${quoteTsString(`${title} launch checklist`)},
136
+ \t\tupdatedAt: '2026-04-01T10:30:00Z',
137
+ \t},
138
+ \t{
139
+ \t\tid: 2,
140
+ \t\towner: 'Design',
141
+ \t\tstatus: 'draft',
142
+ \t\ttitle: ${quoteTsString(`${title} content refresh`)},
143
+ \t\tupdatedAt: '2026-04-03T14:15:00Z',
144
+ \t},
145
+ \t{
146
+ \t\tid: 3,
147
+ \t\towner: 'Operations',
148
+ \t\tstatus: 'published',
149
+ \t\ttitle: ${quoteTsString(`${title} support handoff`)},
150
+ \t\tupdatedAt: '2026-04-08T08:45:00Z',
151
+ \t},
152
+ ];
153
+
154
+ function matchesSearch(item: ${itemTypeName}, search: string | undefined): boolean {
155
+ \tif (!search) {
156
+ \t\treturn true;
157
+ \t}
158
+
159
+ \tconst needle = search.toLowerCase();
160
+ \treturn [item.title, item.owner, item.status].some((value) =>
161
+ \t\tvalue.toLowerCase().includes(needle),
162
+ \t);
163
+ }
164
+
165
+ export async function ${fetchName}(
166
+ \tview: DataViewsView<${itemTypeName}>,
167
+ ): Promise<${dataSetTypeName}> {
168
+ \tconst query = ${dataViewsName}.toQueryArgs<${queryTypeName}>(view, {
169
+ \t\tperPageParam: 'perPage',
170
+ \t});
171
+ \tconst requestedPage = query.page ?? 1;
172
+ \tconst page = requestedPage > 0 ? requestedPage : 1;
173
+ \tconst requestedPerPage = query.perPage ?? view.perPage ?? 10;
174
+ \tconst perPage = requestedPerPage > 0 ? requestedPerPage : 10;
175
+ \tconst filteredItems = STARTER_ITEMS.filter((item) =>
176
+ \t\tmatchesSearch(item, query.search),
177
+ \t);
178
+ \tconst offset = (page - 1) * perPage;
179
+ \tconst items = filteredItems.slice(offset, offset + perPage);
180
+
181
+ \treturn {
182
+ \t\titems,
183
+ \t\tpaginationInfo: {
184
+ \t\t\ttotalItems: filteredItems.length,
185
+ \t\t\ttotalPages: Math.max(1, Math.ceil(filteredItems.length / perPage)),
186
+ \t\t},
187
+ \t};
188
+ }
189
+ `;
190
+ }
191
+ /**
192
+ * Builds the React screen module for the default admin-view variant.
193
+ *
194
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
195
+ * @param textDomain - WordPress i18n text domain for generated labels.
196
+ * @returns Generated TSX source for the default admin-view screen.
197
+ */
198
+ export function buildAdminViewScreenSource(adminViewSlug, textDomain) {
199
+ const pascalName = toPascalCase(adminViewSlug);
200
+ const camelName = toCamelCase(adminViewSlug);
201
+ const itemTypeName = `${pascalName}AdminViewItem`;
202
+ const dataSetTypeName = `${pascalName}AdminViewDataSet`;
203
+ const componentName = `${pascalName}AdminViewScreen`;
204
+ const dataViewsName = `${camelName}AdminDataViews`;
205
+ const fetchName = `fetch${pascalName}AdminViewData`;
206
+ const title = toTitleCase(adminViewSlug);
207
+ return `import type { DataViewsConfig, DataViewsView } from '@wp-typia/dataviews';
208
+ import { Button, Notice, Spinner } from '@wordpress/components';
209
+ import { useEffect, useState } from '@wordpress/element';
210
+ import { __ } from '@wordpress/i18n';
211
+ import { DataViews } from '@wordpress/dataviews/wp';
212
+
213
+ import { ${dataViewsName} } from './config';
214
+ import { ${fetchName} } from './data';
215
+ import type { ${dataSetTypeName}, ${itemTypeName} } from './types';
216
+
217
+ const TypedDataViews = DataViews as unknown as <TItem extends object>(
218
+ \tprops: DataViewsConfig<TItem>,
219
+ ) => ReturnType<typeof DataViews>;
220
+
221
+ const EMPTY_DATA_SET: ${dataSetTypeName} = {
222
+ \titems: [],
223
+ \tpaginationInfo: {
224
+ \t\ttotalItems: 0,
225
+ \t\ttotalPages: 1,
226
+ \t},
227
+ };
228
+
229
+ export function ${componentName}() {
230
+ \tconst [view, setView] = useState<DataViewsView<${itemTypeName}>>(
231
+ \t\t${dataViewsName}.defaultView,
232
+ \t);
233
+ \tconst [dataSet, setDataSet] = useState<${dataSetTypeName}>(EMPTY_DATA_SET);
234
+ \tconst [error, setError] = useState<string | null>(null);
235
+ \tconst [isLoading, setIsLoading] = useState(true);
236
+ \tconst [reloadToken, setReloadToken] = useState(0);
237
+
238
+ \tuseEffect(() => {
239
+ \t\tlet isCurrentRequest = true;
240
+ \t\tsetIsLoading(true);
241
+ \t\tsetError(null);
242
+
243
+ \t\tvoid ${fetchName}(view)
244
+ \t\t\t.then((nextDataSet) => {
245
+ \t\t\t\tif (isCurrentRequest) {
246
+ \t\t\t\t\tsetDataSet(nextDataSet);
247
+ \t\t\t\t}
248
+ \t\t\t})
249
+ \t\t\t.catch((nextError: unknown) => {
250
+ \t\t\t\tif (isCurrentRequest) {
251
+ \t\t\t\t\tsetError(
252
+ \t\t\t\t\t\tnextError instanceof Error
253
+ \t\t\t\t\t\t\t? nextError.message
254
+ \t\t\t\t\t\t\t: __( 'Unable to load records.', ${quoteTsString(textDomain)} ),
255
+ \t\t\t\t\t);
256
+ \t\t\t\t}
257
+ \t\t\t})
258
+ \t\t\t.finally(() => {
259
+ \t\t\t\tif (isCurrentRequest) {
260
+ \t\t\t\t\tsetIsLoading(false);
261
+ \t\t\t\t}
262
+ \t\t\t});
263
+
264
+ \t\treturn () => {
265
+ \t\t\tisCurrentRequest = false;
266
+ \t\t};
267
+ \t}, [reloadToken, view]);
268
+
269
+ \tconst config = ${dataViewsName}.createConfig({
270
+ \t\tdata: dataSet.items,
271
+ \t\tisLoading,
272
+ \t\tonChangeView: setView,
273
+ \t\tpaginationInfo: dataSet.paginationInfo,
274
+ \t\tview,
275
+ \t});
276
+
277
+ \treturn (
278
+ \t\t<div className="wp-typia-admin-view-screen">
279
+ \t\t\t<header className="wp-typia-admin-view-screen__header">
280
+ \t\t\t\t<div>
281
+ \t\t\t\t\t<p className="wp-typia-admin-view-screen__eyebrow">
282
+ \t\t\t\t\t\t{ __( 'DataViews admin screen', ${quoteTsString(textDomain)} ) }
283
+ \t\t\t\t\t</p>
284
+ \t\t\t\t\t<h1>{ __( ${quoteTsString(title)}, ${quoteTsString(textDomain)} ) }</h1>
285
+ \t\t\t\t\t<p>
286
+ \t\t\t\t\t\t{ __( 'Replace the fetcher in data.ts with your project data source when this screen graduates from scaffold to product UI.', ${quoteTsString(textDomain)} ) }
287
+ \t\t\t\t\t</p>
288
+ \t\t\t\t</div>
289
+ \t\t\t\t<div className="wp-typia-admin-view-screen__actions">
290
+ \t\t\t\t\t{ isLoading ? <Spinner /> : null }
291
+ \t\t\t\t\t<Button
292
+ \t\t\t\t\t\tisBusy={ isLoading }
293
+ \t\t\t\t\t\tonClick={ () => setReloadToken((token) => token + 1) }
294
+ \t\t\t\t\t\tvariant="secondary"
295
+ \t\t\t\t\t>
296
+ \t\t\t\t\t\t{ __( 'Reload', ${quoteTsString(textDomain)} ) }
297
+ \t\t\t\t\t</Button>
298
+ \t\t\t\t</div>
299
+ \t\t\t</header>
300
+ \t\t\t{ error ? (
301
+ \t\t\t\t<Notice isDismissible={ false } status="error">
302
+ \t\t\t\t\t{ error }
303
+ \t\t\t\t</Notice>
304
+ \t\t\t) : null }
305
+ \t\t\t<TypedDataViews<${itemTypeName}> { ...config } />
306
+ \t\t</div>
307
+ \t);
308
+ }
309
+ `;
310
+ }
@@ -0,0 +1,25 @@
1
+ import { type AdminViewRestResource } from './cli-add-workspace-admin-view-types.js';
2
+ /**
3
+ * Builds TypeScript item and dataset types for a REST-backed admin view.
4
+ *
5
+ * @param adminViewSlug - Admin-view slug used to derive generated type names.
6
+ * @param restResource - REST resource metadata used for imported record types.
7
+ * @returns Generated TypeScript source for REST admin-view types.
8
+ */
9
+ export declare function buildRestAdminViewTypesSource(adminViewSlug: string, restResource: AdminViewRestResource): string;
10
+ /**
11
+ * Builds a DataViews config module for a REST-backed admin view.
12
+ *
13
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
14
+ * @param textDomain - WordPress i18n text domain for generated labels.
15
+ * @returns Generated TypeScript source for the REST DataViews config.
16
+ */
17
+ export declare function buildRestAdminViewConfigSource(adminViewSlug: string, textDomain: string): string;
18
+ /**
19
+ * Builds a REST list data module with pagination mapping for an admin view.
20
+ *
21
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
22
+ * @param restResource - REST resource metadata used for generated imports.
23
+ * @returns Generated TypeScript source for REST data loading.
24
+ */
25
+ export declare function buildRestAdminViewDataSource(adminViewSlug: string, restResource: AdminViewRestResource): string;
@@ -0,0 +1,124 @@
1
+ import { quoteTsString } from './cli-add-shared.js';
2
+ import { getAdminViewRelativeModuleSpecifier } from './cli-add-workspace-admin-view-templates-shared.js';
3
+ import { toCamelCase, toPascalCase } from './string-case.js';
4
+ /**
5
+ * Builds TypeScript item and dataset types for a REST-backed admin view.
6
+ *
7
+ * @param adminViewSlug - Admin-view slug used to derive generated type names.
8
+ * @param restResource - REST resource metadata used for imported record types.
9
+ * @returns Generated TypeScript source for REST admin-view types.
10
+ */
11
+ export function buildRestAdminViewTypesSource(adminViewSlug, restResource) {
12
+ const pascalName = toPascalCase(adminViewSlug);
13
+ const restPascalName = toPascalCase(restResource.slug);
14
+ const itemTypeName = `${pascalName}AdminViewItem`;
15
+ const dataSetTypeName = `${pascalName}AdminViewDataSet`;
16
+ const restTypesModule = getAdminViewRelativeModuleSpecifier(adminViewSlug, restResource.typesFile);
17
+ return `import type { ${restPascalName}Record } from ${quoteTsString(restTypesModule)};
18
+
19
+ export type ${itemTypeName} = ${restPascalName}Record;
20
+
21
+ export interface ${dataSetTypeName} {
22
+ \titems: ${itemTypeName}[];
23
+ \tpaginationInfo: {
24
+ \t\ttotalItems: number;
25
+ \t\ttotalPages: number;
26
+ \t};
27
+ }
28
+ `;
29
+ }
30
+ /**
31
+ * Builds a DataViews config module for a REST-backed admin view.
32
+ *
33
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
34
+ * @param textDomain - WordPress i18n text domain for generated labels.
35
+ * @returns Generated TypeScript source for the REST DataViews config.
36
+ */
37
+ export function buildRestAdminViewConfigSource(adminViewSlug, textDomain) {
38
+ const pascalName = toPascalCase(adminViewSlug);
39
+ const camelName = toCamelCase(adminViewSlug);
40
+ const itemTypeName = `${pascalName}AdminViewItem`;
41
+ const dataViewsName = `${camelName}AdminDataViews`;
42
+ return `import { defineDataViews } from '@wp-typia/dataviews';
43
+ import { __ } from '@wordpress/i18n';
44
+
45
+ import type { ${itemTypeName} } from './types';
46
+
47
+ export const ${dataViewsName} = defineDataViews<${itemTypeName}>({
48
+ \tidField: 'id',
49
+ \tsearch: false,
50
+ \tsearchLabel: __( 'Search records', ${quoteTsString(textDomain)} ),
51
+ \tdefaultView: {
52
+ \t\tfields: ['id'],
53
+ \t\tpage: 1,
54
+ \t\tperPage: 10,
55
+ \t\ttype: 'table',
56
+ \t},
57
+ \tfields: {
58
+ \t\tid: {
59
+ \t\t\tenableHiding: false,
60
+ \t\t\tlabel: __( 'ID', ${quoteTsString(textDomain)} ),
61
+ \t\t\treadOnly: true,
62
+ \t\t\tschema: { type: 'integer' },
63
+ \t\t},
64
+ \t\t// REST-backed screens start with the guaranteed ID column. Add project-owned fields here once they are declared on the REST record type.
65
+ \t},
66
+ });
67
+ `;
68
+ }
69
+ /**
70
+ * Builds a REST list data module with pagination mapping for an admin view.
71
+ *
72
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
73
+ * @param restResource - REST resource metadata used for generated imports.
74
+ * @returns Generated TypeScript source for REST data loading.
75
+ */
76
+ export function buildRestAdminViewDataSource(adminViewSlug, restResource) {
77
+ const pascalName = toPascalCase(adminViewSlug);
78
+ const restPascalName = toPascalCase(restResource.slug);
79
+ const camelName = toCamelCase(adminViewSlug);
80
+ const itemTypeName = `${pascalName}AdminViewItem`;
81
+ const dataSetTypeName = `${pascalName}AdminViewDataSet`;
82
+ const dataViewsName = `${camelName}AdminDataViews`;
83
+ const fetchName = `fetch${pascalName}AdminViewData`;
84
+ const restApiModule = getAdminViewRelativeModuleSpecifier(adminViewSlug, restResource.apiFile);
85
+ const restTypesModule = getAdminViewRelativeModuleSpecifier(adminViewSlug, restResource.typesFile);
86
+ return `import type { DataViewsView } from '@wp-typia/dataviews';
87
+
88
+ import { listResource } from ${quoteTsString(restApiModule)};
89
+ import type { ${restPascalName}ListQuery } from ${quoteTsString(restTypesModule)};
90
+ import { ${dataViewsName} } from './config';
91
+ import type { ${dataSetTypeName}, ${itemTypeName} } from './types';
92
+
93
+ function resolveTotalPages(total: number, perPage: number | undefined): number {
94
+ \tconst resolvedPerPage = perPage && perPage > 0 ? perPage : 1;
95
+ \treturn Math.max(1, Math.ceil(total / resolvedPerPage));
96
+ }
97
+
98
+ export async function ${fetchName}(
99
+ \tview: DataViewsView<${itemTypeName}>,
100
+ ): Promise<${dataSetTypeName}> {
101
+ \tconst query = ${dataViewsName}.toQueryArgs<${restPascalName}ListQuery>(view, {
102
+ \t\tperPageParam: 'perPage',
103
+ \t\tsearchParam: false,
104
+ \t});
105
+ \tconst result = await listResource({
106
+ \t\tpage: query.page,
107
+ \t\tperPage: query.perPage,
108
+ \t});
109
+ \tif (!result.isValid || !result.data) {
110
+ \t\tthrow new Error('Unable to load REST resource records.');
111
+ \t}
112
+
113
+ \tconst response = result.data;
114
+
115
+ \treturn {
116
+ \t\titems: response.items,
117
+ \t\tpaginationInfo: {
118
+ \t\t\ttotalItems: response.total,
119
+ \t\t\ttotalPages: resolveTotalPages(response.total, response.perPage ?? query.perPage),
120
+ \t\t},
121
+ \t};
122
+ }
123
+ `;
124
+ }
@@ -0,0 +1,34 @@
1
+ import { type AdminViewManualSettingsRestResource } from './cli-add-workspace-admin-view-types.js';
2
+ /**
3
+ * Builds TypeScript request, response, and form-state types for REST settings.
4
+ *
5
+ * @param adminViewSlug - Admin-view slug used to derive generated type names.
6
+ * @param restResource - Manual REST settings resource metadata for imports.
7
+ * @returns Generated TypeScript source for REST settings types.
8
+ */
9
+ export declare function buildRestSettingsAdminViewTypesSource(adminViewSlug: string, restResource: AdminViewManualSettingsRestResource): string;
10
+ /**
11
+ * Builds display metadata for a manual REST settings form admin screen.
12
+ *
13
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
14
+ * @param textDomain - WordPress i18n text domain for generated labels.
15
+ * @param restResource - Manual REST settings metadata, including secret fields.
16
+ * @returns Generated TypeScript source for settings form configuration.
17
+ */
18
+ export declare function buildRestSettingsAdminViewConfigSource(adminViewSlug: string, textDomain: string, restResource: AdminViewManualSettingsRestResource): string;
19
+ /**
20
+ * Builds load and save helpers for a manual REST settings form.
21
+ *
22
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
23
+ * @param restResource - Manual REST settings metadata for API imports and secret handling.
24
+ * @returns Generated TypeScript source for settings data helpers.
25
+ */
26
+ export declare function buildRestSettingsAdminViewDataSource(adminViewSlug: string, restResource: AdminViewManualSettingsRestResource): string;
27
+ /**
28
+ * Builds the React form screen for a manual REST settings admin view.
29
+ *
30
+ * @param adminViewSlug - Admin-view slug used to derive generated identifiers.
31
+ * @param textDomain - WordPress i18n text domain for generated labels.
32
+ * @returns Generated TSX source for the REST settings screen.
33
+ */
34
+ export declare function buildRestSettingsAdminViewScreenSource(adminViewSlug: string, textDomain: string): string;