@revealui/contracts 1.0.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.
Files changed (191) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +160 -0
  3. package/dist/a2a/index.d.ts +383 -0
  4. package/dist/a2a/index.d.ts.map +1 -0
  5. package/dist/a2a/index.js +276 -0
  6. package/dist/a2a/index.js.map +1 -0
  7. package/dist/actions/action-validator.d.ts +48 -0
  8. package/dist/actions/action-validator.d.ts.map +1 -0
  9. package/dist/actions/action-validator.js +288 -0
  10. package/dist/actions/action-validator.js.map +1 -0
  11. package/dist/actions/index.d.ts +7 -0
  12. package/dist/actions/index.d.ts.map +1 -0
  13. package/dist/actions/index.js +7 -0
  14. package/dist/actions/index.js.map +1 -0
  15. package/dist/agents/index.d.ts +628 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +511 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/types.d.ts +22 -0
  20. package/dist/agents/types.d.ts.map +1 -0
  21. package/dist/agents/types.js +2 -0
  22. package/dist/agents/types.js.map +1 -0
  23. package/dist/api/auth.d.ts +60 -0
  24. package/dist/api/auth.d.ts.map +1 -0
  25. package/dist/api/auth.js +84 -0
  26. package/dist/api/auth.js.map +1 -0
  27. package/dist/api/chat.d.ts +45 -0
  28. package/dist/api/chat.d.ts.map +1 -0
  29. package/dist/api/chat.js +55 -0
  30. package/dist/api/chat.js.map +1 -0
  31. package/dist/api/gdpr.d.ts +39 -0
  32. package/dist/api/gdpr.d.ts.map +1 -0
  33. package/dist/api/gdpr.js +53 -0
  34. package/dist/api/gdpr.js.map +1 -0
  35. package/dist/cms/collection.d.ts +108 -0
  36. package/dist/cms/collection.d.ts.map +1 -0
  37. package/dist/cms/collection.js +144 -0
  38. package/dist/cms/collection.js.map +1 -0
  39. package/dist/cms/compat.d.ts +128 -0
  40. package/dist/cms/compat.d.ts.map +1 -0
  41. package/dist/cms/compat.js +141 -0
  42. package/dist/cms/compat.js.map +1 -0
  43. package/dist/cms/config-contract.d.ts +278 -0
  44. package/dist/cms/config-contract.d.ts.map +1 -0
  45. package/dist/cms/config-contract.js +220 -0
  46. package/dist/cms/config-contract.js.map +1 -0
  47. package/dist/cms/config.d.ts +351 -0
  48. package/dist/cms/config.d.ts.map +1 -0
  49. package/dist/cms/config.js +50 -0
  50. package/dist/cms/config.js.map +1 -0
  51. package/dist/cms/errors.d.ts +122 -0
  52. package/dist/cms/errors.d.ts.map +1 -0
  53. package/dist/cms/errors.js +163 -0
  54. package/dist/cms/errors.js.map +1 -0
  55. package/dist/cms/extensibility.d.ts +211 -0
  56. package/dist/cms/extensibility.d.ts.map +1 -0
  57. package/dist/cms/extensibility.js +313 -0
  58. package/dist/cms/extensibility.js.map +1 -0
  59. package/dist/cms/field.d.ts +69 -0
  60. package/dist/cms/field.d.ts.map +1 -0
  61. package/dist/cms/field.js +94 -0
  62. package/dist/cms/field.js.map +1 -0
  63. package/dist/cms/functions.d.ts +466 -0
  64. package/dist/cms/functions.d.ts.map +1 -0
  65. package/dist/cms/functions.js +19 -0
  66. package/dist/cms/functions.js.map +1 -0
  67. package/dist/cms/global.d.ts +45 -0
  68. package/dist/cms/global.d.ts.map +1 -0
  69. package/dist/cms/global.js +62 -0
  70. package/dist/cms/global.js.map +1 -0
  71. package/dist/cms/index.d.ts +23 -0
  72. package/dist/cms/index.d.ts.map +1 -0
  73. package/dist/cms/index.js +42 -0
  74. package/dist/cms/index.js.map +1 -0
  75. package/dist/cms/structure.d.ts +1601 -0
  76. package/dist/cms/structure.d.ts.map +1 -0
  77. package/dist/cms/structure.js +757 -0
  78. package/dist/cms/structure.js.map +1 -0
  79. package/dist/content/index.d.ts +1542 -0
  80. package/dist/content/index.d.ts.map +1 -0
  81. package/dist/content/index.js +522 -0
  82. package/dist/content/index.js.map +1 -0
  83. package/dist/database/bridge.d.ts +177 -0
  84. package/dist/database/bridge.d.ts.map +1 -0
  85. package/dist/database/bridge.js +139 -0
  86. package/dist/database/bridge.js.map +1 -0
  87. package/dist/database/index.d.ts +8 -0
  88. package/dist/database/index.d.ts.map +1 -0
  89. package/dist/database/index.js +9 -0
  90. package/dist/database/index.js.map +1 -0
  91. package/dist/database/type-bridge.d.ts +178 -0
  92. package/dist/database/type-bridge.d.ts.map +1 -0
  93. package/dist/database/type-bridge.js +154 -0
  94. package/dist/database/type-bridge.js.map +1 -0
  95. package/dist/entities/agent-context.d.ts +280 -0
  96. package/dist/entities/agent-context.d.ts.map +1 -0
  97. package/dist/entities/agent-context.js +390 -0
  98. package/dist/entities/agent-context.js.map +1 -0
  99. package/dist/entities/agent-memory.d.ts +661 -0
  100. package/dist/entities/agent-memory.d.ts.map +1 -0
  101. package/dist/entities/agent-memory.js +544 -0
  102. package/dist/entities/agent-memory.js.map +1 -0
  103. package/dist/entities/board.d.ts +95 -0
  104. package/dist/entities/board.d.ts.map +1 -0
  105. package/dist/entities/board.js +99 -0
  106. package/dist/entities/board.js.map +1 -0
  107. package/dist/entities/code-provenance.d.ts +270 -0
  108. package/dist/entities/code-provenance.d.ts.map +1 -0
  109. package/dist/entities/code-provenance.js +339 -0
  110. package/dist/entities/code-provenance.js.map +1 -0
  111. package/dist/entities/index.d.ts +22 -0
  112. package/dist/entities/index.d.ts.map +1 -0
  113. package/dist/entities/index.js +22 -0
  114. package/dist/entities/index.js.map +1 -0
  115. package/dist/entities/media.d.ts +485 -0
  116. package/dist/entities/media.d.ts.map +1 -0
  117. package/dist/entities/media.js +606 -0
  118. package/dist/entities/media.js.map +1 -0
  119. package/dist/entities/page-revision.d.ts +390 -0
  120. package/dist/entities/page-revision.d.ts.map +1 -0
  121. package/dist/entities/page-revision.js +406 -0
  122. package/dist/entities/page-revision.js.map +1 -0
  123. package/dist/entities/page.d.ts +2349 -0
  124. package/dist/entities/page.d.ts.map +1 -0
  125. package/dist/entities/page.js +377 -0
  126. package/dist/entities/page.js.map +1 -0
  127. package/dist/entities/post.d.ts +619 -0
  128. package/dist/entities/post.d.ts.map +1 -0
  129. package/dist/entities/post.js +555 -0
  130. package/dist/entities/post.js.map +1 -0
  131. package/dist/entities/price.d.ts +772 -0
  132. package/dist/entities/price.d.ts.map +1 -0
  133. package/dist/entities/price.js +308 -0
  134. package/dist/entities/price.js.map +1 -0
  135. package/dist/entities/product.d.ts +753 -0
  136. package/dist/entities/product.d.ts.map +1 -0
  137. package/dist/entities/product.js +307 -0
  138. package/dist/entities/product.js.map +1 -0
  139. package/dist/entities/session.d.ts +222 -0
  140. package/dist/entities/session.d.ts.map +1 -0
  141. package/dist/entities/session.js +253 -0
  142. package/dist/entities/session.js.map +1 -0
  143. package/dist/entities/site.d.ts +387 -0
  144. package/dist/entities/site.d.ts.map +1 -0
  145. package/dist/entities/site.js +348 -0
  146. package/dist/entities/site.js.map +1 -0
  147. package/dist/entities/ticket-comment.d.ts +49 -0
  148. package/dist/entities/ticket-comment.d.ts.map +1 -0
  149. package/dist/entities/ticket-comment.js +58 -0
  150. package/dist/entities/ticket-comment.js.map +1 -0
  151. package/dist/entities/ticket-label.d.ts +64 -0
  152. package/dist/entities/ticket-label.d.ts.map +1 -0
  153. package/dist/entities/ticket-label.js +77 -0
  154. package/dist/entities/ticket-label.js.map +1 -0
  155. package/dist/entities/ticket.d.ts +204 -0
  156. package/dist/entities/ticket.d.ts.map +1 -0
  157. package/dist/entities/ticket.js +205 -0
  158. package/dist/entities/ticket.js.map +1 -0
  159. package/dist/entities/user.d.ts +336 -0
  160. package/dist/entities/user.d.ts.map +1 -0
  161. package/dist/entities/user.js +255 -0
  162. package/dist/entities/user.js.map +1 -0
  163. package/dist/foundation/contract.d.ts +221 -0
  164. package/dist/foundation/contract.d.ts.map +1 -0
  165. package/dist/foundation/contract.js +133 -0
  166. package/dist/foundation/contract.js.map +1 -0
  167. package/dist/foundation/index.d.ts +7 -0
  168. package/dist/foundation/index.d.ts.map +1 -0
  169. package/dist/foundation/index.js +7 -0
  170. package/dist/foundation/index.js.map +1 -0
  171. package/dist/generated/contracts.d.ts +1514 -0
  172. package/dist/generated/contracts.d.ts.map +1 -0
  173. package/dist/generated/contracts.js +959 -0
  174. package/dist/generated/contracts.js.map +1 -0
  175. package/dist/generated/database.d.ts +48 -0
  176. package/dist/generated/database.d.ts.map +1 -0
  177. package/dist/generated/database.js +17 -0
  178. package/dist/generated/database.js.map +1 -0
  179. package/dist/generated/zod-schemas.d.ts +14793 -0
  180. package/dist/generated/zod-schemas.d.ts.map +1 -0
  181. package/dist/generated/zod-schemas.js +547 -0
  182. package/dist/generated/zod-schemas.js.map +1 -0
  183. package/dist/index.d.ts +50 -0
  184. package/dist/index.d.ts.map +1 -0
  185. package/dist/index.js +81 -0
  186. package/dist/index.js.map +1 -0
  187. package/dist/representation/index.d.ts +304 -0
  188. package/dist/representation/index.d.ts.map +1 -0
  189. package/dist/representation/index.js +280 -0
  190. package/dist/representation/index.js.map +1 -0
  191. package/package.json +117 -0
@@ -0,0 +1,313 @@
1
+ /**
2
+ * Extensibility Contracts
3
+ *
4
+ * Contracts for extending the CMS type system with:
5
+ * - Custom field types (from plugins)
6
+ * - Plugin field extensions
7
+ * - Custom validation rules
8
+ *
9
+ * @module @revealui/contracts/core/contracts/extensibility
10
+ */
11
+ import { z } from 'zod/v4';
12
+ // Global registry instance
13
+ const customFieldTypeRegistry = {};
14
+ /**
15
+ * Register a custom field type
16
+ *
17
+ * Call this from plugins to add new field types.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // In your plugin
22
+ * registerCustomFieldType('color-picker', {
23
+ * description: 'A color picker field',
24
+ * defaultValue: '#000000',
25
+ * validate: (value) => {
26
+ * if (typeof value !== 'string') return 'Color must be a string';
27
+ * if (!/^#[0-9a-f]{6}$/i.test(value)) return 'Invalid hex color';
28
+ * return true;
29
+ * },
30
+ * });
31
+ * ```
32
+ */
33
+ export function registerCustomFieldType(typeName, config) {
34
+ // Silently overwrite existing types - last registration wins
35
+ customFieldTypeRegistry[typeName] = config;
36
+ }
37
+ /**
38
+ * Get a registered custom field type
39
+ */
40
+ export function getCustomFieldType(typeName) {
41
+ return customFieldTypeRegistry[typeName];
42
+ }
43
+ /**
44
+ * Get all registered custom field types
45
+ */
46
+ export function getCustomFieldTypes() {
47
+ return { ...customFieldTypeRegistry };
48
+ }
49
+ /**
50
+ * Unregister a custom field type (mainly for testing)
51
+ */
52
+ export function unregisterCustomFieldType(typeName) {
53
+ Reflect.deleteProperty(customFieldTypeRegistry, typeName);
54
+ }
55
+ /**
56
+ * Clear all custom field types (mainly for testing)
57
+ */
58
+ export function clearCustomFieldTypes() {
59
+ for (const key of Object.keys(customFieldTypeRegistry)) {
60
+ Reflect.deleteProperty(customFieldTypeRegistry, key);
61
+ }
62
+ }
63
+ /**
64
+ * Built-in field types in RevealUI CMS
65
+ */
66
+ export const BUILTIN_FIELD_TYPES = [
67
+ 'text',
68
+ 'textarea',
69
+ 'number',
70
+ 'email',
71
+ 'password',
72
+ 'code',
73
+ 'date',
74
+ 'checkbox',
75
+ 'select',
76
+ 'radio',
77
+ 'relationship',
78
+ 'upload',
79
+ 'array',
80
+ 'blocks',
81
+ 'group',
82
+ 'row',
83
+ 'collapsible',
84
+ 'tabs',
85
+ 'richText',
86
+ 'json',
87
+ 'point',
88
+ 'ui',
89
+ ];
90
+ /**
91
+ * Check if a field type is valid (built-in or custom)
92
+ */
93
+ export function isValidFieldType(type) {
94
+ return BUILTIN_FIELD_TYPES.includes(type) || type in customFieldTypeRegistry;
95
+ }
96
+ /**
97
+ * Get all valid field types (built-in + custom)
98
+ */
99
+ export function getValidFieldTypes() {
100
+ return [...BUILTIN_FIELD_TYPES, ...Object.keys(customFieldTypeRegistry)];
101
+ }
102
+ /**
103
+ * Extended field type schema that includes custom types
104
+ *
105
+ * Use this schema when validating field configs that may include
106
+ * custom field types from plugins.
107
+ */
108
+ export const ExtendedFieldTypeSchema = z.string().refine((type) => isValidFieldType(type), {
109
+ message: `Invalid field type. Valid types: ${getValidFieldTypes().join(', ')}`,
110
+ });
111
+ // Registry of plugin extensions
112
+ const pluginExtensions = [];
113
+ /**
114
+ * Register a plugin field extension
115
+ *
116
+ * @example
117
+ * ```typescript
118
+ * registerPluginExtension({
119
+ * pluginName: 'seo-plugin',
120
+ * globalFields: [
121
+ * { name: 'metaTitle', type: 'text', admin: { position: 'sidebar' } },
122
+ * { name: 'metaDescription', type: 'textarea' },
123
+ * ],
124
+ * collectionFields: {
125
+ * posts: [
126
+ * { name: 'canonicalUrl', type: 'text' },
127
+ * ],
128
+ * },
129
+ * });
130
+ * ```
131
+ */
132
+ export function registerPluginExtension(extension) {
133
+ // Register any custom field types from this plugin
134
+ if (extension.customFieldTypes) {
135
+ for (const { name, config } of extension.customFieldTypes) {
136
+ registerCustomFieldType(name, config);
137
+ }
138
+ }
139
+ pluginExtensions.push(extension);
140
+ // Sort by priority
141
+ pluginExtensions.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
142
+ }
143
+ /**
144
+ * Get all registered plugin extensions
145
+ */
146
+ export function getPluginExtensions() {
147
+ return [...pluginExtensions];
148
+ }
149
+ /**
150
+ * Clear all plugin extensions (mainly for testing)
151
+ */
152
+ export function clearPluginExtensions() {
153
+ pluginExtensions.length = 0;
154
+ }
155
+ /**
156
+ * Apply plugin field extensions to a collection config
157
+ *
158
+ * This is called during config finalization to add plugin-provided fields.
159
+ *
160
+ * @param config - The base collection config
161
+ * @returns The config with plugin fields added
162
+ */
163
+ export function applyPluginExtensions(config) {
164
+ let result = { ...config, fields: [...config.fields] };
165
+ const { slug } = config;
166
+ for (const extension of pluginExtensions) {
167
+ // Add global fields
168
+ if (extension.globalFields) {
169
+ result = {
170
+ ...result,
171
+ fields: [...result.fields, ...extension.globalFields],
172
+ };
173
+ }
174
+ // Add collection-specific fields
175
+ if (extension.collectionFields && slug in extension.collectionFields) {
176
+ const collectionSpecificFields = extension.collectionFields[slug];
177
+ if (collectionSpecificFields) {
178
+ result = {
179
+ ...result,
180
+ fields: [...result.fields, ...collectionSpecificFields],
181
+ };
182
+ }
183
+ }
184
+ // Apply beforeFinalize hook
185
+ if (extension.beforeFinalize) {
186
+ result = extension.beforeFinalize(result);
187
+ }
188
+ }
189
+ return result;
190
+ }
191
+ // Global validation rules registry
192
+ const validationRules = {};
193
+ /**
194
+ * Register a custom validation rule
195
+ *
196
+ * @example
197
+ * ```typescript
198
+ * registerValidationRule({
199
+ * name: 'slug-format',
200
+ * validate: (value) => {
201
+ * if (typeof value !== 'string') return 'Must be a string';
202
+ * if (!/^[a-z0-9-]+$/.test(value)) {
203
+ * return 'Slug must contain only lowercase letters, numbers, and hyphens';
204
+ * }
205
+ * return true;
206
+ * },
207
+ * description: 'Validates URL-safe slug format',
208
+ * });
209
+ * ```
210
+ */
211
+ export function registerValidationRule(rule) {
212
+ validationRules[rule.name] = rule;
213
+ }
214
+ /**
215
+ * Get a validation rule by name
216
+ */
217
+ export function getValidationRule(name) {
218
+ return validationRules[name];
219
+ }
220
+ /**
221
+ * Get all registered validation rules
222
+ */
223
+ export function getValidationRules() {
224
+ return { ...validationRules };
225
+ }
226
+ /**
227
+ * Run a validation rule against a value
228
+ */
229
+ export function runValidationRule(ruleName, value, options) {
230
+ const rule = validationRules[ruleName];
231
+ if (!rule) {
232
+ return `Unknown validation rule: ${ruleName}`;
233
+ }
234
+ return rule.validate(value, options);
235
+ }
236
+ // ============================================
237
+ // TYPE EXTENSION UTILITIES
238
+ // ============================================
239
+ /**
240
+ * Merge field arrays, handling conflicts by name
241
+ *
242
+ * Later fields override earlier fields with the same name.
243
+ */
244
+ export function mergeFields(base, additions) {
245
+ const fieldMap = new Map();
246
+ // Add base fields
247
+ for (const field of base) {
248
+ const { name } = field;
249
+ if (name) {
250
+ fieldMap.set(name, field);
251
+ }
252
+ }
253
+ // Override/add additional fields
254
+ for (const field of additions) {
255
+ const { name } = field;
256
+ if (name) {
257
+ fieldMap.set(name, field);
258
+ }
259
+ }
260
+ // Rebuild array, preserving order of base with additions at end
261
+ const result = [];
262
+ const addedNames = new Set();
263
+ for (const field of base) {
264
+ const { name } = field;
265
+ if (name) {
266
+ const mappedField = fieldMap.get(name);
267
+ if (mappedField) {
268
+ result.push(mappedField);
269
+ addedNames.add(name);
270
+ continue;
271
+ }
272
+ }
273
+ result.push(field);
274
+ }
275
+ // Add any new fields not in base
276
+ for (const field of additions) {
277
+ const { name } = field;
278
+ if (name && !addedNames.has(name)) {
279
+ result.push(field);
280
+ }
281
+ }
282
+ return result;
283
+ }
284
+ /**
285
+ * Deep merge two collection configs
286
+ */
287
+ export function mergeCollectionConfigs(base, overrides) {
288
+ const baseAccess = base.access ?? {};
289
+ const baseHooks = base.hooks ?? {};
290
+ const baseAdmin = base.admin ?? {};
291
+ const result = {
292
+ ...base,
293
+ ...overrides,
294
+ fields: overrides.fields ? mergeFields(base.fields, overrides.fields) : base.fields,
295
+ };
296
+ if (overrides.access) {
297
+ result.access = { ...baseAccess, ...overrides.access };
298
+ }
299
+ if (overrides.hooks) {
300
+ result.hooks = {
301
+ ...baseHooks,
302
+ ...overrides.hooks,
303
+ // Merge hook arrays
304
+ beforeChange: [...(baseHooks.beforeChange ?? []), ...(overrides.hooks.beforeChange ?? [])],
305
+ afterChange: [...(baseHooks.afterChange ?? []), ...(overrides.hooks.afterChange ?? [])],
306
+ };
307
+ }
308
+ if (overrides.admin) {
309
+ result.admin = { ...baseAdmin, ...overrides.admin };
310
+ }
311
+ return result;
312
+ }
313
+ //# sourceMappingURL=extensibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensibility.js","sourceRoot":"","sources":["../../src/cms/extensibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Field Contract
3
+ *
4
+ * Unified contract for Field configurations that combines:
5
+ * - TypeScript types (compile-time)
6
+ * - Zod schemas (runtime validation)
7
+ * - Validation functions
8
+ * - Type guards
9
+ *
10
+ * This is the single source of truth for Field definitions.
11
+ *
12
+ * @module @revealui/contracts/core/contracts/field
13
+ */
14
+ import { type Contract, type ContractType } from '../foundation/contract.js';
15
+ import type { Field } from './config.js';
16
+ import { type FieldStructure } from './structure.js';
17
+ /**
18
+ * Field Contract
19
+ *
20
+ * This contract validates Field configurations at runtime
21
+ * and provides TypeScript types at compile time.
22
+ */
23
+ export declare const FieldContract: Contract<FieldStructure>;
24
+ /**
25
+ * Type for Field configuration
26
+ * Extracted from the FieldContract
27
+ */
28
+ export type FieldContractType = ContractType<typeof FieldContract>;
29
+ /**
30
+ * Validate a field configuration
31
+ */
32
+ export declare function validateField(data: unknown): ReturnType<typeof FieldContract.validate>;
33
+ /**
34
+ * Type guard for field configurations
35
+ */
36
+ export declare function isFieldConfig(data: unknown): data is FieldContractType;
37
+ /**
38
+ * Parse field configuration (throws on validation failure)
39
+ */
40
+ export declare function parseField(data: unknown): FieldContractType;
41
+ /**
42
+ * Type guard for text fields
43
+ */
44
+ export declare function isTextField(field: Field): boolean;
45
+ /**
46
+ * Type guard for number fields
47
+ */
48
+ export declare function isNumberField(field: Field): boolean;
49
+ /**
50
+ * Type guard for relationship fields
51
+ */
52
+ export declare function isRelationshipField(field: Field): boolean;
53
+ /**
54
+ * Type guard for array fields
55
+ */
56
+ export declare function isArrayField(field: Field): boolean;
57
+ /**
58
+ * Type guard for group fields
59
+ */
60
+ export declare function isGroupField(field: Field): boolean;
61
+ /**
62
+ * Type guard for layout fields (row, tabs, collapsible)
63
+ */
64
+ export declare function isLayoutField(field: Field): boolean;
65
+ /**
66
+ * Check if a field has nested fields
67
+ */
68
+ export declare function hasNestedFields(field: Field): boolean;
69
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/cms/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,YAAY,EAAkB,MAAM,2BAA2B,CAAA;AAC5F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,cAAc,EAAwB,MAAM,gBAAgB,CAAA;AAE1E;;;;;GAKG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,cAAc,CAOjD,CAAA;AAEF;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAA;AAElE;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,QAAQ,CAAC,CAEtF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,iBAAiB,CAEtE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAE3D;AAMD;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEjD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAKrD"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Field Contract
3
+ *
4
+ * Unified contract for Field configurations that combines:
5
+ * - TypeScript types (compile-time)
6
+ * - Zod schemas (runtime validation)
7
+ * - Validation functions
8
+ * - Type guards
9
+ *
10
+ * This is the single source of truth for Field definitions.
11
+ *
12
+ * @module @revealui/contracts/core/contracts/field
13
+ */
14
+ import { createContract } from '../foundation/contract.js';
15
+ import { FieldStructureSchema } from './structure.js';
16
+ /**
17
+ * Field Contract
18
+ *
19
+ * This contract validates Field configurations at runtime
20
+ * and provides TypeScript types at compile time.
21
+ */
22
+ export const FieldContract = createContract({
23
+ name: 'Field',
24
+ version: '1.0.0',
25
+ schema: FieldStructureSchema,
26
+ description: 'Field configuration contract',
27
+ docsUrl: 'https://revealui.dev/docs/api-reference/fields',
28
+ tags: ['field', 'config', 'cms'],
29
+ });
30
+ /**
31
+ * Validate a field configuration
32
+ */
33
+ export function validateField(data) {
34
+ return FieldContract.validate(data);
35
+ }
36
+ /**
37
+ * Type guard for field configurations
38
+ */
39
+ export function isFieldConfig(data) {
40
+ return FieldContract.isType(data);
41
+ }
42
+ /**
43
+ * Parse field configuration (throws on validation failure)
44
+ */
45
+ export function parseField(data) {
46
+ return FieldContract.parse(data);
47
+ }
48
+ // =============================================================================
49
+ // Type Guards
50
+ // =============================================================================
51
+ /**
52
+ * Type guard for text fields
53
+ */
54
+ export function isTextField(field) {
55
+ return field.type === 'text';
56
+ }
57
+ /**
58
+ * Type guard for number fields
59
+ */
60
+ export function isNumberField(field) {
61
+ return field.type === 'number';
62
+ }
63
+ /**
64
+ * Type guard for relationship fields
65
+ */
66
+ export function isRelationshipField(field) {
67
+ return field.type === 'relationship';
68
+ }
69
+ /**
70
+ * Type guard for array fields
71
+ */
72
+ export function isArrayField(field) {
73
+ return field.type === 'array';
74
+ }
75
+ /**
76
+ * Type guard for group fields
77
+ */
78
+ export function isGroupField(field) {
79
+ return field.type === 'group';
80
+ }
81
+ /**
82
+ * Type guard for layout fields (row, tabs, collapsible)
83
+ */
84
+ export function isLayoutField(field) {
85
+ return ['row', 'tabs', 'collapsible'].includes(field.type);
86
+ }
87
+ /**
88
+ * Check if a field has nested fields
89
+ */
90
+ export function hasNestedFields(field) {
91
+ return (['array', 'group', 'row', 'collapsible'].includes(field.type) ||
92
+ (field.type === 'tabs' && !!field.tabs));
93
+ }
94
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../../src/cms/field.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAoC,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE5F,OAAO,EAAuB,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAE1E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,aAAa,GAA6B,cAAc,CAAC;IACpE,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,oBAAoB;IAC5B,WAAW,EAAE,8BAA8B;IAC3C,OAAO,EAAE,gDAAgD;IACzD,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC;CACjC,CAAC,CAAA;AAQF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAClC,CAAC;AAED,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK,CAAC,IAAI,KAAK,MAAM,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAA;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAY;IAC9C,OAAO,KAAK,CAAC,IAAI,KAAK,cAAc,CAAA;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,KAAY;IAC1C,OAAO,CACL,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAC7D,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CACxC,CAAA;AACH,CAAC"}