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.
package/dist/prompt.js ADDED
@@ -0,0 +1,247 @@
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
+ /**
15
+ * Generate an AI-consumable prompt describing a collection's affordances.
16
+ *
17
+ * The prompt is structured for LLM consumption: it clearly separates
18
+ * data shape, field capabilities, collection operations, and custom actions.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const prompt = toPrompt(projectCollection);
23
+ * // Feed to an LLM:
24
+ * // "Given the following collection definition, generate a React component..."
25
+ * // + prompt
26
+ * ```
27
+ */
28
+ export function toPrompt(collection) {
29
+ const sections = [];
30
+ // Header
31
+ sections.push('# Collection Definition');
32
+ sections.push('');
33
+ // Identity
34
+ sections.push(`- **ID field**: \`${collection.idField}\``);
35
+ sections.push(`- **Label field**: \`${collection.labelField}\``);
36
+ sections.push(`- **Total fields**: ${Object.keys(collection.fieldAffordances).length}`);
37
+ sections.push('');
38
+ // Data Shape
39
+ sections.push('## Data Shape');
40
+ sections.push('');
41
+ sections.push('| Field | Type | Sortable | Filterable | Searchable | Editable | Notes |');
42
+ sections.push('|-------|------|----------|------------|------------|----------|-------|');
43
+ for (const [key, fa] of Object.entries(collection.fieldAffordances)) {
44
+ const notes = buildFieldNotes(key, fa, collection);
45
+ sections.push(`| \`${key}\` | ${fa.zodType} | ${formatBool(fa.sortable)} | ${formatFilter(fa.filterable)} | ${formatBool(fa.searchable)} | ${formatBool(fa.editable)} | ${notes} |`);
46
+ }
47
+ sections.push('');
48
+ // Collection Capabilities
49
+ sections.push('## Collection Capabilities');
50
+ sections.push('');
51
+ const aff = collection.affordances;
52
+ const capabilities = [];
53
+ if (aff.create)
54
+ capabilities.push('Create new items');
55
+ if (aff.read !== false)
56
+ capabilities.push('Read/view items');
57
+ if (aff.update !== false)
58
+ capabilities.push('Update existing items');
59
+ if (aff.delete)
60
+ capabilities.push('Delete items');
61
+ if (aff.bulkDelete)
62
+ capabilities.push('Bulk delete selected items');
63
+ if (aff.bulkEdit)
64
+ capabilities.push('Bulk edit selected items');
65
+ if (aff.search)
66
+ capabilities.push('Full-text search across searchable fields');
67
+ if (aff.pagination)
68
+ capabilities.push(`Pagination (${describePagination(aff.pagination)})`);
69
+ if (aff.multiSort)
70
+ capabilities.push('Multi-column sorting');
71
+ if (aff.filterPanel)
72
+ capabilities.push('Filter panel');
73
+ if (aff.groupBy)
74
+ capabilities.push('Group by field');
75
+ if (aff.export)
76
+ capabilities.push(`Export (${Array.isArray(aff.export) ? aff.export.join(', ') : 'all formats'})`);
77
+ if (aff.selectable)
78
+ capabilities.push(`Row selection (${aff.selectable === true ? 'multi' : aff.selectable})`);
79
+ if (aff.columnVisibility)
80
+ capabilities.push('Toggle column visibility');
81
+ if (aff.columnOrder)
82
+ capabilities.push('Reorder columns');
83
+ if (aff.refresh)
84
+ capabilities.push('Manual refresh');
85
+ for (const cap of capabilities) {
86
+ sections.push(`- ${cap}`);
87
+ }
88
+ sections.push('');
89
+ // Default sort
90
+ if (aff.defaultSort) {
91
+ const ds = aff.defaultSort;
92
+ sections.push(`**Default sort**: \`${ds.field}\` ${ds.direction}`);
93
+ sections.push('');
94
+ }
95
+ // Search fields
96
+ const searchable = collection.getSearchableFields();
97
+ if (searchable.length > 0) {
98
+ sections.push(`**Searchable fields**: ${searchable.map(f => `\`${f}\``).join(', ')}`);
99
+ sections.push('');
100
+ }
101
+ // Filterable fields detail
102
+ const filterable = collection.getFilterableFields();
103
+ if (filterable.length > 0) {
104
+ sections.push('## Filter Configuration');
105
+ sections.push('');
106
+ for (const { key, affordance } of filterable) {
107
+ const filterType = typeof affordance.filterable === 'string' ? affordance.filterable : 'text';
108
+ let detail = `- \`${key}\` (${filterType})`;
109
+ if (filterType === 'select' || filterType === 'multiSelect') {
110
+ // We'd need enum values — check zodType
111
+ const fa = collection.fieldAffordances[key];
112
+ if (fa.zodType === 'enum') {
113
+ detail += ` — enum field`;
114
+ }
115
+ }
116
+ if (filterType === 'range') {
117
+ detail += ` — numeric/date range`;
118
+ }
119
+ sections.push(detail);
120
+ }
121
+ sections.push('');
122
+ }
123
+ // Custom operations
124
+ if (collection.operations.length > 0) {
125
+ sections.push('## Custom Operations');
126
+ sections.push('');
127
+ sections.push('| Name | Label | Scope | Confirm | Variant |');
128
+ sections.push('|------|-------|-------|---------|---------|');
129
+ for (const op of collection.operations) {
130
+ sections.push(`| \`${op.name}\` | ${op.label} | ${op.scope} | ${op.confirm ? 'yes' : 'no'} | ${op.variant ?? 'default'} |`);
131
+ }
132
+ sections.push('');
133
+ }
134
+ // Views
135
+ if (aff.views && aff.views.length > 1) {
136
+ sections.push(`**Available views**: ${aff.views.join(', ')}`);
137
+ sections.push(`**Default view**: ${aff.defaultView ?? 'table'}`);
138
+ sections.push('');
139
+ }
140
+ // UI Generation hints
141
+ sections.push('## UI Generation Hints');
142
+ sections.push('');
143
+ sections.push('When generating a UI for this collection:');
144
+ const hints = [];
145
+ const visibleFields = collection.getVisibleFields();
146
+ hints.push(`Show these fields in the table: ${visibleFields.map(f => `\`${f}\``).join(', ')}`);
147
+ const groupable = collection.getGroupableFields();
148
+ if (groupable.length > 0) {
149
+ hints.push(`Fields suitable for grouping: ${groupable.map(f => `\`${f.key}\``).join(', ')}`);
150
+ }
151
+ // Fields with badges
152
+ const badgeFields = Object.entries(collection.fieldAffordances)
153
+ .filter(([_, fa]) => fa.badge)
154
+ .map(([key]) => key);
155
+ if (badgeFields.length > 0) {
156
+ hints.push(`Render as badges: ${badgeFields.map(f => `\`${f}\``).join(', ')}`);
157
+ }
158
+ // Inline editable fields
159
+ const inlineEditable = Object.entries(collection.fieldAffordances)
160
+ .filter(([_, fa]) => fa.inlineEditable)
161
+ .map(([key]) => key);
162
+ if (inlineEditable.length > 0) {
163
+ hints.push(`Inline-editable in table view: ${inlineEditable.map(f => `\`${f}\``).join(', ')}`);
164
+ }
165
+ // Summary fields
166
+ const summaryFields = Object.entries(collection.fieldAffordances)
167
+ .filter(([_, fa]) => fa.summaryField)
168
+ .map(([key]) => key);
169
+ if (summaryFields.length > 0) {
170
+ hints.push(`Summary/title fields: ${summaryFields.map(f => `\`${f}\``).join(', ')}`);
171
+ }
172
+ // Detail-only fields
173
+ const detailOnly = Object.entries(collection.fieldAffordances)
174
+ .filter(([_, fa]) => fa.detailOnly)
175
+ .map(([key]) => key);
176
+ if (detailOnly.length > 0) {
177
+ hints.push(`Show only in detail view: ${detailOnly.map(f => `\`${f}\``).join(', ')}`);
178
+ }
179
+ for (const hint of hints) {
180
+ sections.push(`- ${hint}`);
181
+ }
182
+ return sections.join('\n');
183
+ }
184
+ // ============================================================================
185
+ // Helpers
186
+ // ============================================================================
187
+ function formatBool(value) {
188
+ if (value === true || value === 'both' || value === 'asc' || value === 'desc')
189
+ return 'yes';
190
+ if (value === false || value === 'none')
191
+ return 'no';
192
+ return String(value ?? 'no');
193
+ }
194
+ function formatFilter(value) {
195
+ if (value === false)
196
+ return 'no';
197
+ if (value === true)
198
+ return 'yes';
199
+ if (typeof value === 'string')
200
+ return value;
201
+ return 'no';
202
+ }
203
+ function buildFieldNotes(key, fa, collection) {
204
+ const notes = [];
205
+ if (key === collection.idField)
206
+ notes.push('ID');
207
+ if (key === collection.labelField)
208
+ notes.push('Label');
209
+ if (fa.summaryField)
210
+ notes.push('Summary');
211
+ if (fa.hidden)
212
+ notes.push('Hidden');
213
+ if (fa.visible === false)
214
+ notes.push('Not visible');
215
+ if (fa.detailOnly)
216
+ notes.push('Detail only');
217
+ if (fa.groupable)
218
+ notes.push('Groupable');
219
+ if (fa.inlineEditable)
220
+ notes.push('Inline edit');
221
+ if (fa.badge)
222
+ notes.push('Badge');
223
+ if (fa.copyable)
224
+ notes.push('Copyable');
225
+ if (fa.truncate)
226
+ notes.push(`Truncate@${fa.truncate}`);
227
+ if (fa.editWidget && fa.editWidget !== 'text')
228
+ notes.push(`Widget: ${fa.editWidget}`);
229
+ return notes.join(', ');
230
+ }
231
+ function describePagination(pagination) {
232
+ if (typeof pagination === 'boolean')
233
+ return 'enabled';
234
+ if (typeof pagination === 'object' && pagination !== null) {
235
+ const p = pagination;
236
+ const parts = [];
237
+ if (p.defaultPageSize)
238
+ parts.push(`${p.defaultPageSize}/page`);
239
+ if (p.style)
240
+ parts.push(p.style);
241
+ if (p.serverSide)
242
+ parts.push('server-side');
243
+ return parts.join(', ') || 'enabled';
244
+ }
245
+ return 'enabled';
246
+ }
247
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Collection Store: Framework-agnostic state factory.
3
+ *
4
+ * Creates a state object + action functions for managing collection UI state.
5
+ * This is headless — it doesn't depend on React, Zustand, or any framework.
6
+ * You can:
7
+ * - Use it directly as a plain object
8
+ * - Feed its shape into Zustand's `create()`
9
+ * - Feed its shape into a React `useReducer`
10
+ * - Feed its shape into any state management library
11
+ *
12
+ * Design: follows the "thin glue" philosophy — produces data, not components.
13
+ */
14
+ import type { CollectionDefinition } from './collection.js';
15
+ export interface SortingState {
16
+ id: string;
17
+ desc: boolean;
18
+ }
19
+ export interface ColumnFilter {
20
+ id: string;
21
+ value: unknown;
22
+ }
23
+ export interface PaginationState {
24
+ pageIndex: number;
25
+ pageSize: number;
26
+ }
27
+ /**
28
+ * The full state shape for a collection UI.
29
+ * Compatible with TanStack Table's state model.
30
+ */
31
+ export interface CollectionState<T> {
32
+ items: T[];
33
+ totalCount: number;
34
+ loading: boolean;
35
+ error: string | null;
36
+ sorting: SortingState[];
37
+ columnFilters: ColumnFilter[];
38
+ globalFilter: string;
39
+ pagination: PaginationState;
40
+ rowSelection: Record<string, boolean>;
41
+ columnVisibility: Record<string, boolean>;
42
+ columnOrder: string[];
43
+ grouping: string[];
44
+ }
45
+ /**
46
+ * Actions that modify collection state.
47
+ * Each action takes the current state and returns a new state (pure functions).
48
+ */
49
+ export interface CollectionActions<T> {
50
+ setItems(state: CollectionState<T>, items: T[], total?: number): CollectionState<T>;
51
+ setSorting(state: CollectionState<T>, sorting: SortingState[]): CollectionState<T>;
52
+ setColumnFilters(state: CollectionState<T>, filters: ColumnFilter[]): CollectionState<T>;
53
+ setGlobalFilter(state: CollectionState<T>, filter: string): CollectionState<T>;
54
+ setPagination(state: CollectionState<T>, pagination: PaginationState): CollectionState<T>;
55
+ setRowSelection(state: CollectionState<T>, selection: Record<string, boolean>): CollectionState<T>;
56
+ setColumnVisibility(state: CollectionState<T>, visibility: Record<string, boolean>): CollectionState<T>;
57
+ setColumnOrder(state: CollectionState<T>, order: string[]): CollectionState<T>;
58
+ setGrouping(state: CollectionState<T>, grouping: string[]): CollectionState<T>;
59
+ setLoading(state: CollectionState<T>, loading: boolean): CollectionState<T>;
60
+ setError(state: CollectionState<T>, error: string | null): CollectionState<T>;
61
+ clearSelection(state: CollectionState<T>): CollectionState<T>;
62
+ selectAll(state: CollectionState<T>): CollectionState<T>;
63
+ reset(state: CollectionState<T>): CollectionState<T>;
64
+ }
65
+ /**
66
+ * A collection store: initial state + pure action functions + derived selectors.
67
+ */
68
+ export interface CollectionStore<T> {
69
+ /** The initial state, derived from the collection definition. */
70
+ initialState: CollectionState<T>;
71
+ /** Pure functions that produce new state from old state + args. */
72
+ actions: CollectionActions<T>;
73
+ /** Derived data selectors (computed from state). */
74
+ selectors: {
75
+ getSelectedItems(state: CollectionState<T>): T[];
76
+ getSelectedCount(state: CollectionState<T>): number;
77
+ getPageCount(state: CollectionState<T>): number;
78
+ isAllSelected(state: CollectionState<T>): boolean;
79
+ hasSelection(state: CollectionState<T>): boolean;
80
+ getVisibleItems(state: CollectionState<T>): T[];
81
+ };
82
+ }
83
+ /**
84
+ * Create a collection store from a CollectionDefinition.
85
+ *
86
+ * Returns initial state, pure action functions, and derived selectors.
87
+ * Framework-agnostic: use with Zustand, Redux, useReducer, or plain objects.
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * const store = createCollectionStore(projectCollection);
92
+ *
93
+ * // Use directly:
94
+ * let state = store.initialState;
95
+ * state = store.actions.setItems(state, projects, 100);
96
+ * const selected = store.selectors.getSelectedItems(state);
97
+ *
98
+ * // Or feed into Zustand:
99
+ * const useStore = create(() => ({
100
+ * ...store.initialState,
101
+ * setItems: (items, total) => set(s => store.actions.setItems(s, items, total)),
102
+ * }));
103
+ * ```
104
+ */
105
+ export declare function createCollectionStore<T>(collection: CollectionDefinition<any>): CollectionStore<T>;
package/dist/store.js ADDED
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Collection Store: Framework-agnostic state factory.
3
+ *
4
+ * Creates a state object + action functions for managing collection UI state.
5
+ * This is headless — it doesn't depend on React, Zustand, or any framework.
6
+ * You can:
7
+ * - Use it directly as a plain object
8
+ * - Feed its shape into Zustand's `create()`
9
+ * - Feed its shape into a React `useReducer`
10
+ * - Feed its shape into any state management library
11
+ *
12
+ * Design: follows the "thin glue" philosophy — produces data, not components.
13
+ */
14
+ // ============================================================================
15
+ // createCollectionStore
16
+ // ============================================================================
17
+ /**
18
+ * Create a collection store from a CollectionDefinition.
19
+ *
20
+ * Returns initial state, pure action functions, and derived selectors.
21
+ * Framework-agnostic: use with Zustand, Redux, useReducer, or plain objects.
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * const store = createCollectionStore(projectCollection);
26
+ *
27
+ * // Use directly:
28
+ * let state = store.initialState;
29
+ * state = store.actions.setItems(state, projects, 100);
30
+ * const selected = store.selectors.getSelectedItems(state);
31
+ *
32
+ * // Or feed into Zustand:
33
+ * const useStore = create(() => ({
34
+ * ...store.initialState,
35
+ * setItems: (items, total) => set(s => store.actions.setItems(s, items, total)),
36
+ * }));
37
+ * ```
38
+ */
39
+ export function createCollectionStore(collection) {
40
+ // Build initial state from collection affordances
41
+ const paginationConfig = collection.affordances.pagination;
42
+ const defaultPageSize = paginationConfig && typeof paginationConfig === 'object'
43
+ ? paginationConfig.defaultPageSize ?? 25
44
+ : 25;
45
+ const defaultSort = collection.affordances.defaultSort;
46
+ const initialState = {
47
+ items: [],
48
+ totalCount: 0,
49
+ loading: false,
50
+ error: null,
51
+ sorting: defaultSort
52
+ ? [{ id: defaultSort.field, desc: defaultSort.direction === 'desc' }]
53
+ : [],
54
+ columnFilters: [],
55
+ globalFilter: '',
56
+ pagination: {
57
+ pageIndex: 0,
58
+ pageSize: defaultPageSize,
59
+ },
60
+ rowSelection: {},
61
+ columnVisibility: buildInitialVisibility(collection),
62
+ columnOrder: buildInitialOrder(collection),
63
+ grouping: [],
64
+ };
65
+ // Pure action functions (state, args) → newState
66
+ const actions = {
67
+ setItems(state, items, total) {
68
+ return { ...state, items, totalCount: total ?? items.length };
69
+ },
70
+ setSorting(state, sorting) {
71
+ return { ...state, sorting };
72
+ },
73
+ setColumnFilters(state, filters) {
74
+ return { ...state, columnFilters: filters, pagination: { ...state.pagination, pageIndex: 0 } };
75
+ },
76
+ setGlobalFilter(state, filter) {
77
+ return { ...state, globalFilter: filter, pagination: { ...state.pagination, pageIndex: 0 } };
78
+ },
79
+ setPagination(state, pagination) {
80
+ return { ...state, pagination };
81
+ },
82
+ setRowSelection(state, selection) {
83
+ return { ...state, rowSelection: selection };
84
+ },
85
+ setColumnVisibility(state, visibility) {
86
+ return { ...state, columnVisibility: visibility };
87
+ },
88
+ setColumnOrder(state, order) {
89
+ return { ...state, columnOrder: order };
90
+ },
91
+ setGrouping(state, grouping) {
92
+ return { ...state, grouping };
93
+ },
94
+ setLoading(state, loading) {
95
+ return { ...state, loading };
96
+ },
97
+ setError(state, error) {
98
+ return { ...state, error };
99
+ },
100
+ clearSelection(state) {
101
+ return { ...state, rowSelection: {} };
102
+ },
103
+ selectAll(state) {
104
+ const selection = {};
105
+ for (let i = 0; i < state.items.length; i++) {
106
+ selection[String(i)] = true;
107
+ }
108
+ return { ...state, rowSelection: selection };
109
+ },
110
+ reset(state) {
111
+ return {
112
+ ...state,
113
+ sorting: initialState.sorting,
114
+ columnFilters: [],
115
+ globalFilter: '',
116
+ pagination: { pageIndex: 0, pageSize: state.pagination.pageSize },
117
+ rowSelection: {},
118
+ grouping: [],
119
+ };
120
+ },
121
+ };
122
+ // Derived selectors
123
+ const selectors = {
124
+ getSelectedItems(state) {
125
+ return Object.entries(state.rowSelection)
126
+ .filter(([_, selected]) => selected)
127
+ .map(([idx]) => state.items[parseInt(idx)])
128
+ .filter(Boolean);
129
+ },
130
+ getSelectedCount(state) {
131
+ return Object.values(state.rowSelection).filter(Boolean).length;
132
+ },
133
+ getPageCount(state) {
134
+ if (state.pagination.pageSize === 0)
135
+ return 0;
136
+ return Math.ceil(state.totalCount / state.pagination.pageSize);
137
+ },
138
+ isAllSelected(state) {
139
+ if (state.items.length === 0)
140
+ return false;
141
+ return Object.values(state.rowSelection).filter(Boolean).length === state.items.length;
142
+ },
143
+ hasSelection(state) {
144
+ return Object.values(state.rowSelection).some(Boolean);
145
+ },
146
+ getVisibleItems(state) {
147
+ // For client-side pagination, slice the items array
148
+ const { pageIndex, pageSize } = state.pagination;
149
+ return state.items.slice(pageIndex * pageSize, (pageIndex + 1) * pageSize);
150
+ },
151
+ };
152
+ return { initialState, actions, selectors };
153
+ }
154
+ // ============================================================================
155
+ // Helpers
156
+ // ============================================================================
157
+ function buildInitialVisibility(collection) {
158
+ const visibility = {};
159
+ for (const [key, fa] of Object.entries(collection.fieldAffordances)) {
160
+ if (fa.visible === false || fa.hidden) {
161
+ visibility[key] = false;
162
+ }
163
+ }
164
+ return visibility;
165
+ }
166
+ function buildInitialOrder(collection) {
167
+ return Object.entries(collection.fieldAffordances)
168
+ .sort(([, a], [, b]) => (a.order ?? 999) - (b.order ?? 999))
169
+ .map(([key]) => key);
170
+ }
171
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}