zod-collection-ui 0.0.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,395 @@
1
+ /**
2
+ * Inference Engine: Zod Type → Default Affordances
3
+ *
4
+ * Given a Zod schema field (with no .meta() annotations), infers sensible
5
+ * default affordances based on:
6
+ * 1. The Zod type (string, number, boolean, enum, date, array, object)
7
+ * 2. Zod validations/checks (email, url, uuid, min, max, etc.)
8
+ * 3. Field name heuristics (id, createdAt, password, etc.)
9
+ * 4. Zod v4 metadata (if present via .meta())
10
+ */
11
+ // ============================================================================
12
+ // Schema Introspection Helpers
13
+ // ============================================================================
14
+ /** Get the underlying type name from a Zod schema, unwrapping optionals/nullables/defaults. */
15
+ export function getZodBaseType(schema) {
16
+ const def = schema._zod?.def;
17
+ if (!def)
18
+ return 'unknown';
19
+ // Unwrap wrapper types
20
+ if (def.type === 'optional' || def.type === 'nullable' || def.type === 'default') {
21
+ return getZodBaseType(def.innerType);
22
+ }
23
+ return def.type ?? 'unknown';
24
+ }
25
+ /** Get the inner schema, unwrapping optionals/nullables/defaults. */
26
+ export function unwrapZodSchema(schema) {
27
+ const def = schema._zod?.def;
28
+ if (!def)
29
+ return schema;
30
+ if (def.type === 'optional' || def.type === 'nullable' || def.type === 'default') {
31
+ return unwrapZodSchema(def.innerType);
32
+ }
33
+ return schema;
34
+ }
35
+ /** Check if a Zod schema has a specific check/validation. */
36
+ export function hasZodCheck(schema, kind) {
37
+ const unwrapped = unwrapZodSchema(schema);
38
+ const def = unwrapped._zod?.def;
39
+ if (!def)
40
+ return false;
41
+ // Zod v4: checks are on the def
42
+ if (def.checks) {
43
+ return def.checks.some((c) => c.kind === kind);
44
+ }
45
+ // Zod v4: format checks might be on the type itself
46
+ if (def.format === kind)
47
+ return true;
48
+ if (def.type === kind)
49
+ return true;
50
+ return false;
51
+ }
52
+ /** Get enum values from a Zod enum schema. */
53
+ export function getEnumValues(schema) {
54
+ const unwrapped = unwrapZodSchema(schema);
55
+ const def = unwrapped._zod?.def;
56
+ if (!def)
57
+ return null;
58
+ if (def.type === 'enum') {
59
+ // Zod v4 uses `entries` (object { a: 'a', b: 'b' }) not `values` (array)
60
+ if (def.entries) {
61
+ return Object.values(def.entries);
62
+ }
63
+ return def.values ?? null;
64
+ }
65
+ return null;
66
+ }
67
+ /** Read Zod v4 metadata from the global registry. */
68
+ export function getZodMeta(schema) {
69
+ try {
70
+ // Zod v4: .meta() without args returns the metadata
71
+ const meta = schema.meta?.();
72
+ return meta ?? undefined;
73
+ }
74
+ catch {
75
+ return undefined;
76
+ }
77
+ }
78
+ /** Get the numeric min/max from Zod checks. */
79
+ export function getNumericBounds(schema) {
80
+ const unwrapped = unwrapZodSchema(schema);
81
+ const result = {};
82
+ // Zod v4: min/max are instance properties on the schema
83
+ const asAny = unwrapped;
84
+ if (typeof asAny.minValue === 'number' && asAny.minValue !== -Number.MAX_SAFE_INTEGER) {
85
+ result.min = asAny.minValue;
86
+ }
87
+ if (typeof asAny.maxValue === 'number' && asAny.maxValue !== Number.MAX_SAFE_INTEGER) {
88
+ result.max = asAny.maxValue;
89
+ }
90
+ // Fallback: check the checks array (Zod v3 style)
91
+ const def = unwrapped._zod?.def;
92
+ if (def?.checks) {
93
+ for (const check of def.checks) {
94
+ if (check.kind === 'min' && result.min === undefined)
95
+ result.min = check.value;
96
+ if (check.kind === 'max' && result.max === undefined)
97
+ result.max = check.value;
98
+ }
99
+ }
100
+ return result;
101
+ }
102
+ // ============================================================================
103
+ // Type-Based Inference
104
+ // ============================================================================
105
+ const STRING_FIELD_DEFAULTS = {
106
+ sortable: 'both',
107
+ filterable: 'search',
108
+ searchable: true,
109
+ groupable: false,
110
+ editable: true,
111
+ visible: true,
112
+ };
113
+ const NUMBER_FIELD_DEFAULTS = {
114
+ sortable: 'both',
115
+ filterable: 'range',
116
+ searchable: false,
117
+ groupable: false,
118
+ editable: true,
119
+ visible: true,
120
+ aggregatable: ['sum', 'avg', 'min', 'max'],
121
+ };
122
+ const BOOLEAN_FIELD_DEFAULTS = {
123
+ sortable: 'both',
124
+ filterable: 'boolean',
125
+ searchable: false,
126
+ groupable: true,
127
+ editable: true,
128
+ visible: true,
129
+ };
130
+ const ENUM_FIELD_DEFAULTS = {
131
+ sortable: 'both',
132
+ filterable: 'select',
133
+ searchable: false,
134
+ groupable: true,
135
+ editable: true,
136
+ visible: true,
137
+ };
138
+ const DATE_FIELD_DEFAULTS = {
139
+ sortable: 'both',
140
+ filterable: 'range',
141
+ searchable: false,
142
+ groupable: false,
143
+ editable: true,
144
+ visible: true,
145
+ };
146
+ const ARRAY_FIELD_DEFAULTS = {
147
+ sortable: false,
148
+ filterable: 'contains',
149
+ searchable: false,
150
+ groupable: false,
151
+ editable: true,
152
+ visible: true,
153
+ };
154
+ const OBJECT_FIELD_DEFAULTS = {
155
+ sortable: false,
156
+ filterable: false,
157
+ searchable: false,
158
+ groupable: false,
159
+ editable: true,
160
+ visible: true,
161
+ detailOnly: true,
162
+ };
163
+ const UNKNOWN_FIELD_DEFAULTS = {
164
+ sortable: false,
165
+ filterable: false,
166
+ searchable: false,
167
+ groupable: false,
168
+ editable: false,
169
+ visible: true,
170
+ };
171
+ /** Map Zod base type to default affordances. */
172
+ function getTypeDefaults(zodType) {
173
+ switch (zodType) {
174
+ case 'string':
175
+ return { ...STRING_FIELD_DEFAULTS };
176
+ case 'number':
177
+ case 'int':
178
+ case 'float':
179
+ case 'bigint':
180
+ return { ...NUMBER_FIELD_DEFAULTS };
181
+ case 'boolean':
182
+ return { ...BOOLEAN_FIELD_DEFAULTS };
183
+ case 'enum':
184
+ case 'nativeEnum':
185
+ return { ...ENUM_FIELD_DEFAULTS };
186
+ case 'date':
187
+ return { ...DATE_FIELD_DEFAULTS };
188
+ case 'array':
189
+ case 'set':
190
+ case 'tuple':
191
+ return { ...ARRAY_FIELD_DEFAULTS };
192
+ case 'object':
193
+ case 'record':
194
+ case 'map':
195
+ return { ...OBJECT_FIELD_DEFAULTS };
196
+ default:
197
+ return { ...UNKNOWN_FIELD_DEFAULTS };
198
+ }
199
+ }
200
+ // ============================================================================
201
+ // Validation-Based Refinements
202
+ // ============================================================================
203
+ /** Refine defaults based on Zod validations/checks. */
204
+ function refineByValidations(schema, defaults) {
205
+ const unwrapped = unwrapZodSchema(schema);
206
+ const def = unwrapped._zod?.def;
207
+ if (!def)
208
+ return defaults;
209
+ const refined = { ...defaults };
210
+ // String format checks
211
+ if (def.type === 'string') {
212
+ // Check for format-specific strings
213
+ if (def.checks) {
214
+ for (const check of def.checks) {
215
+ if (check.kind === 'email') {
216
+ refined.editWidget = 'email';
217
+ refined.filterable = 'search';
218
+ }
219
+ if (check.kind === 'url' || check.kind === 'uri') {
220
+ refined.editWidget = 'url';
221
+ refined.searchable = false;
222
+ refined.filterable = 'exact';
223
+ }
224
+ if (check.kind === 'uuid' || check.kind === 'ulid' || check.kind === 'cuid') {
225
+ refined.editable = false;
226
+ refined.filterable = 'exact';
227
+ refined.searchable = false;
228
+ }
229
+ if (check.kind === 'regex') {
230
+ // Has a pattern validation
231
+ }
232
+ }
233
+ }
234
+ // Check for format property (Zod v4 uses this for email, url, etc.)
235
+ if (def.format === 'email') {
236
+ refined.editWidget = 'email';
237
+ }
238
+ if (def.format === 'uri' || def.format === 'url') {
239
+ refined.editWidget = 'url';
240
+ refined.searchable = false;
241
+ }
242
+ if (def.format === 'uuid') {
243
+ refined.editable = false;
244
+ refined.filterable = 'exact';
245
+ refined.searchable = false;
246
+ }
247
+ }
248
+ // Boolean with default → might be a toggle
249
+ if (def.type === 'boolean' && 'defaultValue' in def) {
250
+ refined.editWidget = 'switch';
251
+ }
252
+ return refined;
253
+ }
254
+ // ============================================================================
255
+ // Name-Based Heuristics
256
+ // ============================================================================
257
+ const ID_PATTERNS = /^(id|_id|uuid|uid|key|pk)$/i;
258
+ const ID_SUFFIX_PATTERNS = /(_id|Id|ID|_key|Key)$/;
259
+ const CREATED_PATTERNS = /^(created_?at|creation_?date|date_?created|ctime)$/i;
260
+ const UPDATED_PATTERNS = /^(updated_?at|modified_?at|last_?modified|mtime|changed_?at)$/i;
261
+ const DELETED_PATTERNS = /^(deleted_?at|removed_?at)$/i;
262
+ const SECRET_PATTERNS = /^(password|secret|token|api_?key|access_?key|private_?key|hash|salt)$/i;
263
+ const EMAIL_PATTERNS = /^(email|e_?mail)$/i;
264
+ const NAME_PATTERNS = /^(name|title|label|display_?name|full_?name|username)$/i;
265
+ const DESCRIPTION_PATTERNS = /^(description|summary|body|content|text|bio|about|notes)$/i;
266
+ const IMAGE_PATTERNS = /^(image|photo|avatar|thumbnail|picture|icon|logo)(_?url)?$/i;
267
+ const STATUS_PATTERNS = /^(status|state|phase|stage)$/i;
268
+ /** Refine defaults based on field name heuristics. */
269
+ function refineByFieldName(key, defaults) {
270
+ const refined = { ...defaults };
271
+ if (ID_PATTERNS.test(key) || ID_SUFFIX_PATTERNS.test(key)) {
272
+ refined.editable = false;
273
+ refined.visible = key === 'id' ? false : refined.visible;
274
+ refined.filterable = 'exact';
275
+ refined.searchable = false;
276
+ }
277
+ if (CREATED_PATTERNS.test(key)) {
278
+ refined.editable = false;
279
+ refined.sortable = 'both';
280
+ refined.filterable = 'range';
281
+ }
282
+ if (UPDATED_PATTERNS.test(key)) {
283
+ refined.editable = false;
284
+ refined.visible = false;
285
+ refined.sortable = 'both';
286
+ }
287
+ if (DELETED_PATTERNS.test(key)) {
288
+ refined.editable = false;
289
+ refined.visible = false;
290
+ }
291
+ if (SECRET_PATTERNS.test(key)) {
292
+ refined.readable = false;
293
+ refined.searchable = false;
294
+ refined.sortable = false;
295
+ refined.filterable = false;
296
+ refined.visible = false;
297
+ }
298
+ if (EMAIL_PATTERNS.test(key)) {
299
+ refined.editWidget = refined.editWidget ?? 'email';
300
+ refined.filterable = 'search';
301
+ refined.searchable = true;
302
+ }
303
+ if (NAME_PATTERNS.test(key)) {
304
+ refined.searchable = true;
305
+ refined.summaryField = true;
306
+ refined.sortable = 'both';
307
+ }
308
+ if (DESCRIPTION_PATTERNS.test(key)) {
309
+ refined.editWidget = refined.editWidget ?? 'textarea';
310
+ refined.truncate = refined.truncate ?? 100;
311
+ refined.tooltip = true;
312
+ refined.sortable = false;
313
+ }
314
+ if (IMAGE_PATTERNS.test(key)) {
315
+ refined.sortable = false;
316
+ refined.filterable = false;
317
+ refined.searchable = false;
318
+ }
319
+ if (STATUS_PATTERNS.test(key)) {
320
+ refined.groupable = true;
321
+ refined.filterable = 'select';
322
+ }
323
+ return refined;
324
+ }
325
+ // ============================================================================
326
+ // Public API: inferFieldAffordances
327
+ // ============================================================================
328
+ /**
329
+ * Given a field name and its Zod schema, infer sensible default affordances.
330
+ *
331
+ * Inference layers (later layers override earlier):
332
+ * 1. Type-based defaults (string → searchable, number → range filterable, etc.)
333
+ * 2. Validation-based refinements (email → email widget, uuid → not editable)
334
+ * 3. Name-based heuristics (id → hidden, createdAt → not editable, password → not readable)
335
+ * 4. Zod .meta() annotations (explicit overrides from the developer)
336
+ */
337
+ export function inferFieldAffordances(key, schema) {
338
+ const baseType = getZodBaseType(schema);
339
+ // Layer 1: Type-based defaults
340
+ let affordances = getTypeDefaults(baseType);
341
+ // Layer 2: Validation-based refinements
342
+ affordances = refineByValidations(schema, affordances);
343
+ // Layer 3: Name-based heuristics
344
+ affordances = refineByFieldName(key, affordances);
345
+ // Layer 4: Zod .meta() annotations (if any)
346
+ const meta = getZodMeta(schema);
347
+ if (meta) {
348
+ affordances = { ...affordances, ...extractAffordancesFromMeta(meta) };
349
+ }
350
+ // Always set the title if not explicitly provided
351
+ if (!affordances.title) {
352
+ affordances.title = humanizeFieldName(key);
353
+ }
354
+ return affordances;
355
+ }
356
+ /** Extract affordance-relevant fields from Zod metadata. */
357
+ function extractAffordancesFromMeta(meta) {
358
+ const result = {};
359
+ // Direct affordance fields
360
+ const affordanceKeys = [
361
+ 'sortable', 'filterable', 'searchable', 'groupable', 'aggregatable',
362
+ 'readable', 'editable', 'inlineEditable', 'requiredOnCreate', 'requiredOnUpdate',
363
+ 'immutableAfterCreate', 'visible', 'hidden', 'detailOnly', 'summaryField',
364
+ 'columnWidth', 'minWidth', 'maxWidth', 'resizable', 'pinned', 'order',
365
+ 'title', 'description', 'displayFormat', 'badge', 'copyable', 'truncate',
366
+ 'tooltip', 'editWidget', 'editPlaceholder', 'editHelp',
367
+ ];
368
+ for (const key of affordanceKeys) {
369
+ if (key in meta) {
370
+ result[key] = meta[key];
371
+ }
372
+ }
373
+ // Support nested affordance object from .meta({ affordances: { ... } })
374
+ if (meta.affordances && typeof meta.affordances === 'object') {
375
+ Object.assign(result, meta.affordances);
376
+ }
377
+ // Map standard Zod meta fields
378
+ if (meta.title && !result.title)
379
+ result.title = meta.title;
380
+ if (meta.description && !result.description)
381
+ result.description = meta.description;
382
+ return result;
383
+ }
384
+ /** Convert a camelCase or snake_case field name to a human-readable label. */
385
+ export function humanizeFieldName(key) {
386
+ return key
387
+ // Insert space before uppercase letters (camelCase)
388
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
389
+ // Replace underscores and hyphens with spaces
390
+ .replace(/[_-]+/g, ' ')
391
+ // Capitalize first letter of each word
392
+ .replace(/\b\w/g, (c) => c.toUpperCase())
393
+ .trim();
394
+ }
395
+ //# sourceMappingURL=inference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inference.js","sourceRoot":"","sources":["../src/inference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * AI Prompt Generator: Produce machine-readable descriptions of collections.
3
+ *
4
+ * Follows the json-render `generateCatalogPrompt()` pattern:
5
+ * given a collection definition, produce a structured text that an LLM can
6
+ * consume to understand what UI components to generate, what operations
7
+ * are available, and what constraints exist.
8
+ *
9
+ * Use cases:
10
+ * - Feed to an LLM to generate UI specifications
11
+ * - Feed to an agent to understand available CRUD operations
12
+ * - Generate API documentation from schema
13
+ */
14
+ import type { CollectionDefinition } from './collection.js';
15
+ /**
16
+ * Generate an AI-consumable prompt describing a collection's affordances.
17
+ *
18
+ * The prompt is structured for LLM consumption: it clearly separates
19
+ * data shape, field capabilities, collection operations, and custom actions.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const prompt = toPrompt(projectCollection);
24
+ * // Feed to an LLM:
25
+ * // "Given the following collection definition, generate a React component..."
26
+ * // + prompt
27
+ * ```
28
+ */
29
+ export declare function toPrompt(collection: CollectionDefinition<any>): string;