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,239 @@
1
+ /**
2
+ * Generators: Transform CollectionDefinition into framework-specific configurations.
3
+ *
4
+ * This module produces configuration objects that existing renderers consume:
5
+ * - toColumnDefs() → TanStack Table ColumnDef[] shape
6
+ * - toFormConfig() → Form field configuration for create/edit forms
7
+ * - toFilterConfig() → Filter field configuration for filter panels
8
+ *
9
+ * These are "headless" — they produce data, not React components.
10
+ * The actual rendering is done by a renderer package (e.g. shadcn/ui) or equivalent.
11
+ */
12
+ import { getEnumValues, getNumericBounds } from './inference.js';
13
+ /** Map Zod type to the appropriate TanStack Table sort function name. */
14
+ function inferSortFnName(zodType, affordance) {
15
+ switch (zodType) {
16
+ case 'string': return 'text';
17
+ case 'number':
18
+ case 'int':
19
+ case 'float':
20
+ case 'bigint': return 'basic';
21
+ case 'date': return 'datetime';
22
+ case 'boolean': return 'basic';
23
+ case 'enum': return 'text';
24
+ default: return 'basic';
25
+ }
26
+ }
27
+ /** Map filter type + Zod type to the appropriate TanStack Table filter function name. */
28
+ function inferFilterFnName(filterType, zodType) {
29
+ if (typeof filterType === 'boolean')
30
+ return 'includesString';
31
+ switch (filterType) {
32
+ case 'exact': return 'equalsString';
33
+ case 'search': return 'includesString';
34
+ case 'select': return 'arrIncludes';
35
+ case 'multiSelect': return 'arrIncludesSome';
36
+ case 'range': return 'inNumberRange';
37
+ case 'contains': return 'arrIncludesAll';
38
+ case 'boolean': return 'equals';
39
+ case 'fuzzy': return 'includesString';
40
+ default: return 'includesString';
41
+ }
42
+ }
43
+ /**
44
+ * Generate column definitions from a CollectionDefinition.
45
+ *
46
+ * @returns An array of ColumnConfig objects compatible with TanStack Table.
47
+ */
48
+ export function toColumnDefs(collection) {
49
+ const columns = [];
50
+ const shape = collection.schema.shape;
51
+ // Selection column (if selectable)
52
+ if (collection.affordances.selectable) {
53
+ columns.push({
54
+ id: 'select',
55
+ header: '',
56
+ enableSorting: false,
57
+ enableColumnFilter: false,
58
+ enableGlobalFilter: false,
59
+ enableGrouping: false,
60
+ enableHiding: false,
61
+ enableResizing: false,
62
+ size: 40,
63
+ meta: {
64
+ zodType: 'display',
65
+ filterType: false,
66
+ editable: false,
67
+ inlineEditable: false,
68
+ },
69
+ });
70
+ }
71
+ // Data columns from visible fields
72
+ const visibleFields = collection.getVisibleFields();
73
+ for (const key of visibleFields) {
74
+ const fa = collection.fieldAffordances[key];
75
+ const fieldSchema = shape[key];
76
+ if (!fieldSchema)
77
+ continue;
78
+ const zodType = fa.zodType;
79
+ columns.push({
80
+ id: key,
81
+ header: fa.title,
82
+ accessorKey: key,
83
+ enableSorting: fa.sortable !== false && fa.sortable !== 'none',
84
+ enableColumnFilter: fa.filterable !== false,
85
+ enableGlobalFilter: fa.searchable ?? false,
86
+ enableGrouping: fa.groupable ?? false,
87
+ enableHiding: !fa.hidden,
88
+ enableResizing: fa.resizable ?? true,
89
+ size: fa.columnWidth,
90
+ minSize: fa.minWidth,
91
+ maxSize: fa.maxWidth,
92
+ sortingFn: inferSortFnName(zodType, fa),
93
+ sortDescFirst: fa.sortable === 'desc',
94
+ filterFn: fa.filterable ? inferFilterFnName(fa.filterable, zodType) : undefined,
95
+ meta: {
96
+ zodType,
97
+ filterType: fa.filterable ?? false,
98
+ editable: fa.editable ?? false,
99
+ inlineEditable: fa.inlineEditable ?? false,
100
+ displayFormat: fa.displayFormat,
101
+ badge: fa.badge,
102
+ copyable: fa.copyable,
103
+ truncate: fa.truncate,
104
+ tooltip: fa.tooltip,
105
+ enumValues: fieldSchema ? getEnumValues(fieldSchema) ?? undefined : undefined,
106
+ numericBounds: fieldSchema ? getNumericBounds(fieldSchema) : undefined,
107
+ pinned: fa.pinned,
108
+ },
109
+ });
110
+ }
111
+ // Actions column (if there are item-level operations)
112
+ const itemOps = collection.getOperations('item');
113
+ if (itemOps.length > 0) {
114
+ columns.push({
115
+ id: 'actions',
116
+ header: '',
117
+ enableSorting: false,
118
+ enableColumnFilter: false,
119
+ enableGlobalFilter: false,
120
+ enableGrouping: false,
121
+ enableHiding: false,
122
+ enableResizing: false,
123
+ size: 60 + (itemOps.length - 1) * 32,
124
+ meta: {
125
+ zodType: 'display',
126
+ filterType: false,
127
+ editable: false,
128
+ inlineEditable: false,
129
+ },
130
+ });
131
+ }
132
+ return columns;
133
+ }
134
+ /** Infer the form widget type from Zod type + affordances. */
135
+ function inferFormWidgetType(zodType, fa) {
136
+ // Explicit override takes precedence
137
+ if (fa.editWidget)
138
+ return fa.editWidget;
139
+ switch (zodType) {
140
+ case 'string': return 'text';
141
+ case 'number':
142
+ case 'int':
143
+ case 'float': return 'number';
144
+ case 'boolean': return 'checkbox';
145
+ case 'enum': return 'select';
146
+ case 'date': return 'date';
147
+ case 'array': return 'tags';
148
+ case 'object': return 'json';
149
+ default: return 'text';
150
+ }
151
+ }
152
+ /**
153
+ * Generate form field configurations for create or edit forms.
154
+ */
155
+ export function toFormConfig(collection, mode = 'create') {
156
+ const fields = [];
157
+ const shape = collection.schema.shape;
158
+ let orderCounter = 0;
159
+ for (const [key, fieldSchema] of Object.entries(shape)) {
160
+ const fa = collection.fieldAffordances[key];
161
+ // Skip fields that are not relevant for this mode
162
+ if (fa.readable === false && mode === 'edit')
163
+ continue;
164
+ if (fa.editable === false && mode === 'create' && !fa.requiredOnCreate)
165
+ continue;
166
+ if (fa.editable === false && mode === 'edit')
167
+ continue;
168
+ if (fa.hidden)
169
+ continue;
170
+ // Skip immutable fields on edit
171
+ if (mode === 'edit' && fa.immutableAfterCreate)
172
+ continue;
173
+ const zodType = fa.zodType;
174
+ const isRequired = mode === 'create'
175
+ ? (fa.requiredOnCreate ?? false)
176
+ : (fa.requiredOnUpdate ?? false);
177
+ // Get enum options if applicable
178
+ let options;
179
+ const enumValues = getEnumValues(fieldSchema);
180
+ if (enumValues) {
181
+ options = enumValues.map(v => ({
182
+ label: v.charAt(0).toUpperCase() + v.slice(1),
183
+ value: v,
184
+ }));
185
+ }
186
+ fields.push({
187
+ name: key,
188
+ label: fa.title,
189
+ type: inferFormWidgetType(zodType, fa),
190
+ required: isRequired,
191
+ disabled: fa.editable === false,
192
+ hidden: fa.hidden ?? false,
193
+ placeholder: fa.editPlaceholder,
194
+ helpText: fa.editHelp ?? fa.description,
195
+ options,
196
+ order: fa.order ?? orderCounter++,
197
+ zodType,
198
+ });
199
+ }
200
+ return fields.sort((a, b) => a.order - b.order);
201
+ }
202
+ /**
203
+ * Generate filter field configurations for the filter panel.
204
+ */
205
+ export function toFilterConfig(collection) {
206
+ const filters = [];
207
+ const shape = collection.schema.shape;
208
+ const filterableFields = collection.getFilterableFields();
209
+ for (const { key, affordance } of filterableFields) {
210
+ const fieldSchema = shape[key];
211
+ if (!fieldSchema)
212
+ continue;
213
+ const filterType = typeof affordance.filterable === 'string'
214
+ ? affordance.filterable
215
+ : 'search';
216
+ let options;
217
+ const enumValues = getEnumValues(fieldSchema);
218
+ if (enumValues && (filterType === 'select' || filterType === 'multiSelect')) {
219
+ options = enumValues.map(v => ({
220
+ label: v.charAt(0).toUpperCase() + v.slice(1),
221
+ value: v,
222
+ }));
223
+ }
224
+ let bounds;
225
+ if (filterType === 'range') {
226
+ bounds = getNumericBounds(fieldSchema);
227
+ }
228
+ filters.push({
229
+ name: key,
230
+ label: affordance.title ?? key,
231
+ filterType,
232
+ options,
233
+ bounds,
234
+ zodType: collection.fieldAffordances[key].zodType,
235
+ });
236
+ }
237
+ return filters;
238
+ }
239
+ //# sourceMappingURL=generators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generators.js","sourceRoot":"","sources":["../src/generators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * zod-collection-ui — Schema-driven collection affordances
3
+ *
4
+ * Declare once, render anywhere. Define a Zod schema with affordance metadata
5
+ * and get auto-generated table configurations, form configs, and action definitions.
6
+ */
7
+ export { defineCollection } from './collection.js';
8
+ export type { CollectionDefinition } from './collection.js';
9
+ export { inferFieldAffordances, getZodBaseType, unwrapZodSchema, hasZodCheck, getEnumValues, getZodMeta, getNumericBounds, humanizeFieldName, } from './inference.js';
10
+ export { toColumnDefs, toFormConfig, toFilterConfig, } from './generators.js';
11
+ export type { ColumnConfig, FormFieldConfig, FilterFieldConfig } from './generators.js';
12
+ export { createCollectionStore } from './store.js';
13
+ export type { CollectionState, CollectionActions, CollectionStore, SortingState, ColumnFilter, PaginationState, } from './store.js';
14
+ export { createInMemoryProvider } from './data-provider.js';
15
+ export type { DataProvider, GetListParams, GetListResult, InMemoryProviderOptions } from './data-provider.js';
16
+ export { toPrompt } from './prompt.js';
17
+ export type { FieldAffordance, SortDirection, FilterType, AggregationFn, CollectionAffordances, CollectionConfig, PaginationConfig, SearchConfig, MultiSortConfig, GroupByConfig, FilterPreset, ViewMode, OperationDefinition, OperationScope, OperationConfirmation, } from './types.js';
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * zod-collection-ui — Schema-driven collection affordances
3
+ *
4
+ * Declare once, render anywhere. Define a Zod schema with affordance metadata
5
+ * and get auto-generated table configurations, form configs, and action definitions.
6
+ */
7
+ export { defineCollection } from './collection.js';
8
+ export { inferFieldAffordances, getZodBaseType, unwrapZodSchema, hasZodCheck, getEnumValues, getZodMeta, getNumericBounds, humanizeFieldName, } from './inference.js';
9
+ export { toColumnDefs, toFormConfig, toFilterConfig, } from './generators.js';
10
+ export { createCollectionStore } from './store.js';
11
+ export { createInMemoryProvider } from './data-provider.js';
12
+ export { toPrompt } from './prompt.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAUnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,39 @@
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
+ import { z } from 'zod';
12
+ import type { FieldAffordance } from './types.js';
13
+ /** Get the underlying type name from a Zod schema, unwrapping optionals/nullables/defaults. */
14
+ export declare function getZodBaseType(schema: z.ZodType): string;
15
+ /** Get the inner schema, unwrapping optionals/nullables/defaults. */
16
+ export declare function unwrapZodSchema(schema: z.ZodType): z.ZodType;
17
+ /** Check if a Zod schema has a specific check/validation. */
18
+ export declare function hasZodCheck(schema: z.ZodType, kind: string): boolean;
19
+ /** Get enum values from a Zod enum schema. */
20
+ export declare function getEnumValues(schema: z.ZodType): string[] | null;
21
+ /** Read Zod v4 metadata from the global registry. */
22
+ export declare function getZodMeta(schema: z.ZodType): Record<string, unknown> | undefined;
23
+ /** Get the numeric min/max from Zod checks. */
24
+ export declare function getNumericBounds(schema: z.ZodType): {
25
+ min?: number;
26
+ max?: number;
27
+ };
28
+ /**
29
+ * Given a field name and its Zod schema, infer sensible default affordances.
30
+ *
31
+ * Inference layers (later layers override earlier):
32
+ * 1. Type-based defaults (string → searchable, number → range filterable, etc.)
33
+ * 2. Validation-based refinements (email → email widget, uuid → not editable)
34
+ * 3. Name-based heuristics (id → hidden, createdAt → not editable, password → not readable)
35
+ * 4. Zod .meta() annotations (explicit overrides from the developer)
36
+ */
37
+ export declare function inferFieldAffordances(key: string, schema: z.ZodType): FieldAffordance;
38
+ /** Convert a camelCase or snake_case field name to a human-readable label. */
39
+ export declare function humanizeFieldName(key: string): string;