@stndrds/schema 0.1.0-alpha.14

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 (128) hide show
  1. package/dist/chunk-3ABIOLKO.mjs +4624 -0
  2. package/dist/chunk-3IRX2BDY.mjs +3970 -0
  3. package/dist/chunk-4OTLPWSP.mjs +4448 -0
  4. package/dist/chunk-54ODQBUN.mjs +3867 -0
  5. package/dist/chunk-6HIA3FR2.mjs +4230 -0
  6. package/dist/chunk-6P3XHNLD.mjs +4171 -0
  7. package/dist/chunk-7LJECNAS.mjs +4167 -0
  8. package/dist/chunk-A2WNLUKV.mjs +4475 -0
  9. package/dist/chunk-AA3234RM.mjs +4475 -0
  10. package/dist/chunk-ADNXDLLD.mjs +3136 -0
  11. package/dist/chunk-B4DCDQUI.mjs +4695 -0
  12. package/dist/chunk-B4PSXY6I.mjs +4527 -0
  13. package/dist/chunk-BJHJBZCM.mjs +4228 -0
  14. package/dist/chunk-C3ZWTO6G.mjs +4474 -0
  15. package/dist/chunk-CLOGNKDD.mjs +4040 -0
  16. package/dist/chunk-EW4V63PA.mjs +3053 -0
  17. package/dist/chunk-FR2LCO6R.mjs +2485 -0
  18. package/dist/chunk-GJSF2RKL.mjs +2786 -0
  19. package/dist/chunk-GO5NPP2X.mjs +4726 -0
  20. package/dist/chunk-H3ZYJUDS.mjs +3050 -0
  21. package/dist/chunk-IDDLSFSK.mjs +4230 -0
  22. package/dist/chunk-JRADUJQ7.mjs +4726 -0
  23. package/dist/chunk-NEDR6N7R.mjs +3118 -0
  24. package/dist/chunk-NESPRMDF.mjs +2482 -0
  25. package/dist/chunk-NWFGRJBW.mjs +4612 -0
  26. package/dist/chunk-NXJ57GSN.mjs +2918 -0
  27. package/dist/chunk-O4C5FCTS.mjs +3961 -0
  28. package/dist/chunk-O4PRB27Q.mjs +2513 -0
  29. package/dist/chunk-OJDFNUCR.mjs +4463 -0
  30. package/dist/chunk-OSEKVBHC.mjs +4627 -0
  31. package/dist/chunk-QX4U6U6K.mjs +2484 -0
  32. package/dist/chunk-RMDQ6LKV.mjs +3046 -0
  33. package/dist/chunk-SBXKDATH.mjs +2673 -0
  34. package/dist/chunk-SKMP3AP3.mjs +2918 -0
  35. package/dist/chunk-STMS7WZD.mjs +2623 -0
  36. package/dist/chunk-T3T6PTFG.mjs +3057 -0
  37. package/dist/chunk-TPW72RAH.mjs +4624 -0
  38. package/dist/chunk-TUQEGNGV.mjs +2534 -0
  39. package/dist/chunk-TVKFS3YN.mjs +2449 -0
  40. package/dist/chunk-TZTH3BHG.mjs +3110 -0
  41. package/dist/chunk-W6MU3XPG.mjs +4612 -0
  42. package/dist/chunk-WL7Z3YFR.mjs +4603 -0
  43. package/dist/chunk-XNVVYHH3.mjs +4602 -0
  44. package/dist/chunk-XTA3WY64.mjs +2918 -0
  45. package/dist/chunk-YV7DEZFZ.mjs +2528 -0
  46. package/dist/chunk-ZLJPJND6.mjs +4474 -0
  47. package/dist/chunk-ZNZXTCEX.mjs +4234 -0
  48. package/dist/index.d.mts +1222 -0
  49. package/dist/index.d.ts +1222 -0
  50. package/dist/index.js +5320 -0
  51. package/dist/index.mjs +635 -0
  52. package/dist/runtime-2iKarXtl.d.mts +1924 -0
  53. package/dist/runtime-2iKarXtl.d.ts +1924 -0
  54. package/dist/runtime-4l2ddHZ7.d.mts +2242 -0
  55. package/dist/runtime-4l2ddHZ7.d.ts +2243 -0
  56. package/dist/runtime-8hKS6zAv.d.mts +2226 -0
  57. package/dist/runtime-8hKS6zAv.d.ts +2226 -0
  58. package/dist/runtime-B6yjtoR3.d.mts +4142 -0
  59. package/dist/runtime-B6yjtoR3.d.ts +4142 -0
  60. package/dist/runtime-BGCShrZB.d.mts +2001 -0
  61. package/dist/runtime-BGCShrZB.d.ts +2001 -0
  62. package/dist/runtime-BRW4NGAk.d.mts +1668 -0
  63. package/dist/runtime-BRW4NGAk.d.ts +1668 -0
  64. package/dist/runtime-BnfBr314.d.mts +1683 -0
  65. package/dist/runtime-BnfBr314.d.ts +1683 -0
  66. package/dist/runtime-BrqhiJUF.d.mts +4151 -0
  67. package/dist/runtime-BrqhiJUF.d.ts +4151 -0
  68. package/dist/runtime-Bvj8c-BE.d.mts +4277 -0
  69. package/dist/runtime-Bvj8c-BE.d.ts +4277 -0
  70. package/dist/runtime-C03qT4qU.d.mts +4267 -0
  71. package/dist/runtime-C03qT4qU.d.ts +4267 -0
  72. package/dist/runtime-CaCZ7mSf.d.mts +2974 -0
  73. package/dist/runtime-CaCZ7mSf.d.ts +2974 -0
  74. package/dist/runtime-CaIzNX0Z.d.mts +4091 -0
  75. package/dist/runtime-CaIzNX0Z.d.ts +4091 -0
  76. package/dist/runtime-ChPTgmLP.d.mts +4320 -0
  77. package/dist/runtime-ChPTgmLP.d.ts +4320 -0
  78. package/dist/runtime-CnImZ1Vv.d.mts +4267 -0
  79. package/dist/runtime-CnImZ1Vv.d.ts +4267 -0
  80. package/dist/runtime-Cp-B26Nj.d.mts +2890 -0
  81. package/dist/runtime-Cp-B26Nj.d.ts +2890 -0
  82. package/dist/runtime-Cq8jfk3c.d.mts +4277 -0
  83. package/dist/runtime-Cq8jfk3c.d.ts +4277 -0
  84. package/dist/runtime-CqDFXhhP.d.mts +1685 -0
  85. package/dist/runtime-CqDFXhhP.d.ts +1685 -0
  86. package/dist/runtime-CqtpZLdL.d.mts +4280 -0
  87. package/dist/runtime-CqtpZLdL.d.ts +4280 -0
  88. package/dist/runtime-D-4DblaZ.d.mts +4147 -0
  89. package/dist/runtime-D-4DblaZ.d.ts +4147 -0
  90. package/dist/runtime-D59sSqNl.d.mts +4146 -0
  91. package/dist/runtime-D59sSqNl.d.ts +4146 -0
  92. package/dist/runtime-DEfPk3wT.d.mts +1840 -0
  93. package/dist/runtime-DEfPk3wT.d.ts +1840 -0
  94. package/dist/runtime-DGV-7vES.d.mts +1685 -0
  95. package/dist/runtime-DGV-7vES.d.ts +1685 -0
  96. package/dist/runtime-DNacghqc.d.mts +3971 -0
  97. package/dist/runtime-DNacghqc.d.ts +3971 -0
  98. package/dist/runtime-DPLsUHYK.d.mts +3977 -0
  99. package/dist/runtime-DPLsUHYK.d.ts +3977 -0
  100. package/dist/runtime-DTxCw60F.d.mts +2973 -0
  101. package/dist/runtime-DTxCw60F.d.ts +2973 -0
  102. package/dist/runtime-DUXJ-zNS.d.mts +2788 -0
  103. package/dist/runtime-DUXJ-zNS.d.ts +2788 -0
  104. package/dist/runtime-DbljInhV.d.mts +2237 -0
  105. package/dist/runtime-DbljInhV.d.ts +2237 -0
  106. package/dist/runtime-DcH3y6Yu.d.mts +4272 -0
  107. package/dist/runtime-DcH3y6Yu.d.ts +4272 -0
  108. package/dist/runtime-DdBFz85g.d.mts +4229 -0
  109. package/dist/runtime-DdBFz85g.d.ts +4229 -0
  110. package/dist/runtime-DjMWhjkm.d.mts +4321 -0
  111. package/dist/runtime-DjMWhjkm.d.ts +4321 -0
  112. package/dist/runtime-Djz3fOBE.d.mts +2078 -0
  113. package/dist/runtime-Djz3fOBE.d.ts +2078 -0
  114. package/dist/runtime-Dli8g3Aq.d.mts +2082 -0
  115. package/dist/runtime-Dli8g3Aq.d.ts +2082 -0
  116. package/dist/runtime-a8J378im.d.mts +4123 -0
  117. package/dist/runtime-a8J378im.d.ts +4123 -0
  118. package/dist/runtime-dp3rb3Lf.d.mts +2968 -0
  119. package/dist/runtime-dp3rb3Lf.d.ts +2968 -0
  120. package/dist/runtime-iWXlSN_H.d.mts +1683 -0
  121. package/dist/runtime-iWXlSN_H.d.ts +1683 -0
  122. package/dist/runtime-yMql0npY.d.mts +4321 -0
  123. package/dist/runtime-yMql0npY.d.ts +4321 -0
  124. package/dist/runtime.d.mts +3 -0
  125. package/dist/runtime.d.ts +3 -0
  126. package/dist/runtime.js +3626 -0
  127. package/dist/runtime.mjs +48 -0
  128. package/package.json +58 -0
package/dist/index.mjs ADDED
@@ -0,0 +1,635 @@
1
+ import {
2
+ CustomTabConfig,
3
+ DEFAULT_LABEL_FALLBACK,
4
+ FileService,
5
+ GeocodingService,
6
+ GlobalSearchService,
7
+ GroupBuilder,
8
+ NoopGeocodingAdapter,
9
+ NoopHookRegistry,
10
+ ObjectBuilder,
11
+ ObjectSchemaService,
12
+ RecordService,
13
+ RelationService,
14
+ TabBuilder,
15
+ TableTabConfig,
16
+ UserProfileService,
17
+ ViewBuilder,
18
+ ViewService,
19
+ attributeConfigSchemas,
20
+ checkbox,
21
+ checkboxConfigSchema,
22
+ computeRecordStatus,
23
+ createAttributeValidator,
24
+ createCheckboxValidator,
25
+ createCurrencyValidator,
26
+ createDateValidator,
27
+ createDraftValidator,
28
+ createFileValidator,
29
+ createLocationValidator,
30
+ createMockAdapter,
31
+ createMultiRelationValidator,
32
+ createMultiselectValidator,
33
+ createNumberValidator,
34
+ createObjectValidator,
35
+ createPhoneValidator,
36
+ createRatingValidator,
37
+ createRelationValidator,
38
+ createSelectValidator,
39
+ createSingleRelationValidator,
40
+ createStatusValidator,
41
+ createTextValidator,
42
+ createTimestampValidator,
43
+ createUserValidator,
44
+ currency,
45
+ currencyConfigSchema,
46
+ date,
47
+ dateConfigSchema,
48
+ extractAttributeNames,
49
+ file,
50
+ fileConfigSchema,
51
+ generateId,
52
+ generatePrefixedId,
53
+ getAttributeConfigSchema,
54
+ getMissingRequiredAttributes,
55
+ getSyncPreview,
56
+ getViewSyncPreview,
57
+ group,
58
+ isLabelExpression,
59
+ isRecordComplete,
60
+ location,
61
+ locationConfigSchema,
62
+ multiselect,
63
+ multiselectConfigSchema,
64
+ number,
65
+ numberConfigSchema,
66
+ object,
67
+ parseAttributeConfig,
68
+ phone,
69
+ phoneConfigSchema,
70
+ rating,
71
+ ratingConfigSchema,
72
+ registry,
73
+ relation,
74
+ relationConfigSchema,
75
+ renderLabelExpression,
76
+ safeParseAttributeConfig,
77
+ select,
78
+ selectConfigSchema,
79
+ status,
80
+ statusConfigSchema,
81
+ syncAll,
82
+ syncNativeObjects,
83
+ syncNativeViews,
84
+ text,
85
+ textConfigSchema,
86
+ textarea,
87
+ textareaConfigSchema,
88
+ timestamp,
89
+ timestampConfigSchema,
90
+ user,
91
+ userConfigSchema,
92
+ validateAttribute,
93
+ validateAttributeConfig,
94
+ validateDraft,
95
+ validateDraftOrThrow,
96
+ validateObject,
97
+ validateObjectOrThrow,
98
+ verifyNativeObjectsSync,
99
+ verifyNativeViewsSync,
100
+ view
101
+ } from "./chunk-GO5NPP2X.mjs";
102
+
103
+ // src/types/filters.ts
104
+ function isAdvancedFilterState(state) {
105
+ return "groups" in state;
106
+ }
107
+ function toAdvancedFilterState(state) {
108
+ if (state.rules.length === 0) {
109
+ return {
110
+ combinator: state.combinator,
111
+ groups: []
112
+ };
113
+ }
114
+ return {
115
+ combinator: "and",
116
+ groups: [
117
+ {
118
+ id: crypto.randomUUID(),
119
+ combinator: state.combinator,
120
+ rules: state.rules
121
+ }
122
+ ]
123
+ };
124
+ }
125
+ function toSimpleFilterState(state) {
126
+ const allRules = state.groups.flatMap((group2) => group2.rules);
127
+ return {
128
+ combinator: state.combinator,
129
+ rules: allRules
130
+ };
131
+ }
132
+ var OPERATORS_BY_TYPE = {
133
+ text: [
134
+ "is",
135
+ "is_not",
136
+ "contains",
137
+ "not_contains",
138
+ "starts_with",
139
+ "ends_with",
140
+ "is_empty",
141
+ "is_not_empty"
142
+ ],
143
+ textarea: [
144
+ "is",
145
+ "is_not",
146
+ "contains",
147
+ "not_contains",
148
+ "starts_with",
149
+ "ends_with",
150
+ "is_empty",
151
+ "is_not_empty"
152
+ ],
153
+ number: ["eq", "neq", "lt", "gt", "lte", "gte", "is_empty", "is_not_empty"],
154
+ checkbox: ["is_checked", "is_not_checked"],
155
+ date: [
156
+ "is",
157
+ "is_not",
158
+ "before",
159
+ "after",
160
+ "on_or_before",
161
+ "on_or_after",
162
+ "is_within",
163
+ "is_empty",
164
+ "is_not_empty"
165
+ ],
166
+ timestamp: [
167
+ "is",
168
+ "is_not",
169
+ "before",
170
+ "after",
171
+ "on_or_before",
172
+ "on_or_after",
173
+ "is_within",
174
+ "is_empty",
175
+ "is_not_empty"
176
+ ],
177
+ phone: ["is", "is_not", "contains", "not_contains", "is_empty", "is_not_empty"],
178
+ currency: ["eq", "neq", "lt", "gt", "lte", "gte", "is_empty", "is_not_empty"],
179
+ status: ["is", "is_not", "any_of", "none_of", "is_empty", "is_not_empty"],
180
+ select: ["is", "is_not", "any_of", "none_of", "is_empty", "is_not_empty"],
181
+ multiselect: ["contains", "not_contains", "is_empty", "is_not_empty"],
182
+ location: ["contains", "is_empty", "is_not_empty"],
183
+ file: ["is_empty", "is_not_empty"],
184
+ user: ["contains", "not_contains", "is_empty", "is_not_empty"],
185
+ relation: ["any_of", "none_of", "contains", "not_contains", "is_empty", "is_not_empty"],
186
+ rating: ["eq", "neq", "lt", "gt", "lte", "gte", "is_empty", "is_not_empty"]
187
+ };
188
+ var NO_VALUE_OPERATORS = [
189
+ "is_empty",
190
+ "is_not_empty",
191
+ "is_checked",
192
+ "is_not_checked"
193
+ ];
194
+ function isNoValueOperator(operator) {
195
+ return NO_VALUE_OPERATORS.includes(operator);
196
+ }
197
+
198
+ // src/types/views.ts
199
+ function isFormTab(tab) {
200
+ return tab.type === "form";
201
+ }
202
+ function isTableTab(tab) {
203
+ return tab.type === "table";
204
+ }
205
+ function isCustomTab(tab) {
206
+ return tab.type === "custom";
207
+ }
208
+
209
+ // src/exceptions.ts
210
+ var SchemaErrorCode = {
211
+ // Generic
212
+ UNKNOWN: "SCHEMA_UNKNOWN_ERROR",
213
+ // Not Found
214
+ OBJECT_NOT_FOUND: "SCHEMA_OBJECT_NOT_FOUND",
215
+ ATTRIBUTE_NOT_FOUND: "SCHEMA_ATTRIBUTE_NOT_FOUND",
216
+ RECORD_NOT_FOUND: "SCHEMA_RECORD_NOT_FOUND",
217
+ USER_PROFILE_NOT_FOUND: "SCHEMA_USER_PROFILE_NOT_FOUND",
218
+ FILE_NOT_FOUND: "SCHEMA_FILE_NOT_FOUND",
219
+ // Validation
220
+ VALIDATION_FAILED: "SCHEMA_VALIDATION_FAILED",
221
+ INVALID_ATTRIBUTE_NAME: "SCHEMA_INVALID_ATTRIBUTE_NAME",
222
+ INVALID_OBJECT_NAME: "SCHEMA_INVALID_OBJECT_NAME",
223
+ // Protected Resources
224
+ PROTECTED_OBJECT: "SCHEMA_PROTECTED_OBJECT",
225
+ PROTECTED_ATTRIBUTE: "SCHEMA_PROTECTED_ATTRIBUTE",
226
+ // Sync
227
+ SYNC_FAILED: "SCHEMA_SYNC_FAILED",
228
+ NOT_SYSTEM_OBJECT: "SCHEMA_NOT_SYSTEM_OBJECT",
229
+ // Duplicates
230
+ DUPLICATE_OBJECT: "SCHEMA_DUPLICATE_OBJECT",
231
+ DUPLICATE_ATTRIBUTE: "SCHEMA_DUPLICATE_ATTRIBUTE"
232
+ };
233
+ var SchemaError = class extends Error {
234
+ constructor(message, code = SchemaErrorCode.UNKNOWN, details) {
235
+ super(message);
236
+ this.name = "SchemaError";
237
+ this.code = code;
238
+ this.details = details;
239
+ Object.setPrototypeOf(this, new.target.prototype);
240
+ }
241
+ toJSON() {
242
+ return {
243
+ name: this.name,
244
+ code: this.code,
245
+ message: this.message,
246
+ details: this.details
247
+ };
248
+ }
249
+ };
250
+ var NotFoundError = class extends SchemaError {
251
+ constructor(resourceType, resourceId, code = SchemaErrorCode.RECORD_NOT_FOUND) {
252
+ super(`${resourceType} with id "${resourceId}" not found`, code, {
253
+ resourceType,
254
+ resourceId
255
+ });
256
+ this.name = "NotFoundError";
257
+ this.resourceType = resourceType;
258
+ this.resourceId = resourceId;
259
+ }
260
+ };
261
+ var ObjectNotFoundError = class extends NotFoundError {
262
+ constructor(objectId) {
263
+ super("Object", objectId, SchemaErrorCode.OBJECT_NOT_FOUND);
264
+ this.name = "ObjectNotFoundError";
265
+ }
266
+ };
267
+ var AttributeNotFoundError = class extends NotFoundError {
268
+ constructor(attributeId) {
269
+ super("Attribute", attributeId, SchemaErrorCode.ATTRIBUTE_NOT_FOUND);
270
+ this.name = "AttributeNotFoundError";
271
+ }
272
+ };
273
+ var RecordNotFoundError = class extends NotFoundError {
274
+ constructor(recordId) {
275
+ super("Record", recordId, SchemaErrorCode.RECORD_NOT_FOUND);
276
+ this.name = "RecordNotFoundError";
277
+ }
278
+ };
279
+ var UserProfileNotFoundError = class extends NotFoundError {
280
+ constructor(identifier) {
281
+ super("UserProfile", identifier, SchemaErrorCode.USER_PROFILE_NOT_FOUND);
282
+ this.name = "UserProfileNotFoundError";
283
+ }
284
+ };
285
+ var FileNotFoundError = class extends NotFoundError {
286
+ constructor(fileId) {
287
+ super("File", fileId, SchemaErrorCode.FILE_NOT_FOUND);
288
+ this.name = "FileNotFoundError";
289
+ }
290
+ };
291
+ var ValidationError = class _ValidationError extends SchemaError {
292
+ constructor(message, errors) {
293
+ super(message, SchemaErrorCode.VALIDATION_FAILED, { errors });
294
+ this.name = "ValidationError";
295
+ this.errors = errors;
296
+ }
297
+ /**
298
+ * Create a validation error from Zod-style errors
299
+ */
300
+ static fromZodErrors(errors) {
301
+ const details = errors.map((err) => ({
302
+ path: err.path.map(String),
303
+ message: err.message
304
+ }));
305
+ const message = `Validation failed: ${details.map((d) => `${d.path.join(".")}: ${d.message}`).join(", ")}`;
306
+ return new _ValidationError(message, details);
307
+ }
308
+ };
309
+ var ProtectedResourceError = class extends SchemaError {
310
+ constructor(resourceType, resourceName, operation) {
311
+ const code = resourceType === "object" ? SchemaErrorCode.PROTECTED_OBJECT : SchemaErrorCode.PROTECTED_ATTRIBUTE;
312
+ super(`Cannot ${operation} system ${resourceType} "${resourceName}"`, code, {
313
+ resourceType,
314
+ resourceName,
315
+ operation
316
+ });
317
+ this.name = "ProtectedResourceError";
318
+ this.resourceType = resourceType;
319
+ this.resourceName = resourceName;
320
+ this.operation = operation;
321
+ }
322
+ };
323
+ var SyncError = class extends SchemaError {
324
+ constructor(objectName, message, cause) {
325
+ super(`Failed to sync object "${objectName}": ${message}`, SchemaErrorCode.SYNC_FAILED, {
326
+ objectName,
327
+ cause: cause?.message
328
+ });
329
+ this.name = "SyncError";
330
+ this.objectName = objectName;
331
+ this.cause = cause;
332
+ }
333
+ };
334
+ var NotSystemObjectError = class extends SchemaError {
335
+ constructor(objectName) {
336
+ super(
337
+ `Object "${objectName}" is not marked as system. Native objects must have system=true.`,
338
+ SchemaErrorCode.NOT_SYSTEM_OBJECT,
339
+ { objectName }
340
+ );
341
+ this.name = "NotSystemObjectError";
342
+ this.objectName = objectName;
343
+ }
344
+ };
345
+ var DuplicateError = class extends SchemaError {
346
+ constructor(resourceType, resourceName) {
347
+ const code = resourceType === "object" ? SchemaErrorCode.DUPLICATE_OBJECT : SchemaErrorCode.DUPLICATE_ATTRIBUTE;
348
+ super(
349
+ `${resourceType === "object" ? "Object" : "Attribute"} "${resourceName}" already exists`,
350
+ code,
351
+ { resourceType, resourceName }
352
+ );
353
+ this.name = "DuplicateError";
354
+ this.resourceType = resourceType;
355
+ this.resourceName = resourceName;
356
+ }
357
+ };
358
+ function isSchemaError(error) {
359
+ return error instanceof SchemaError;
360
+ }
361
+ function isNotFoundError(error) {
362
+ return error instanceof NotFoundError;
363
+ }
364
+ function isValidationError(error) {
365
+ return error instanceof ValidationError;
366
+ }
367
+ function isProtectedResourceError(error) {
368
+ return error instanceof ProtectedResourceError;
369
+ }
370
+
371
+ // src/views/registry.ts
372
+ var ViewRegistry = class {
373
+ constructor() {
374
+ this.views = /* @__PURE__ */ new Map();
375
+ this.byObject = /* @__PURE__ */ new Map();
376
+ }
377
+ /**
378
+ * Register a native view
379
+ * @param viewOrViews - Single view or array of views
380
+ * @throws Error if view is not marked as system
381
+ * @throws Error if view with same name already exists for the object
382
+ */
383
+ register(viewOrViews) {
384
+ const views = Array.isArray(viewOrViews) ? viewOrViews : [viewOrViews];
385
+ for (const view2 of views) {
386
+ this.registerSingle(view2);
387
+ }
388
+ return this;
389
+ }
390
+ registerSingle(view2) {
391
+ if (!view2.system) {
392
+ throw new Error(
393
+ `[ViewRegistry] View "${view2.name}" for object "${view2.object}" is missing system flag.
394
+ Only system views can be registered. Add .system() to your view builder.`
395
+ );
396
+ }
397
+ const key = this.makeKey(view2.object, view2.name);
398
+ if (this.views.has(key)) {
399
+ throw new Error(
400
+ `[ViewRegistry] Duplicate view name "${view2.name}" for object "${view2.object}"`
401
+ );
402
+ }
403
+ this.views.set(key, view2);
404
+ const objectViews = this.byObject.get(view2.object) ?? [];
405
+ objectViews.push(view2);
406
+ this.byObject.set(view2.object, objectViews);
407
+ }
408
+ /**
409
+ * Get all views for an object
410
+ */
411
+ getByObjectName(objectName) {
412
+ return this.byObject.get(objectName) ?? [];
413
+ }
414
+ /**
415
+ * Get a specific view by object and view name
416
+ */
417
+ get(objectName, viewName) {
418
+ return this.views.get(this.makeKey(objectName, viewName));
419
+ }
420
+ /**
421
+ * Get a view or throw if not found
422
+ */
423
+ getOrThrow(objectName, viewName) {
424
+ const view2 = this.get(objectName, viewName);
425
+ if (!view2) {
426
+ const available = this.getByObjectName(objectName);
427
+ const availableNames = available.map((v) => v.name).join(", ") || "(none)";
428
+ throw new Error(
429
+ `[ViewRegistry] View "${viewName}" not found for object "${objectName}".
430
+ Available views: ${availableNames}`
431
+ );
432
+ }
433
+ return view2;
434
+ }
435
+ /**
436
+ * Get all registered views
437
+ */
438
+ getAll() {
439
+ return Array.from(this.views.values());
440
+ }
441
+ /**
442
+ * Check if a view exists
443
+ */
444
+ has(objectName, viewName) {
445
+ return this.views.has(this.makeKey(objectName, viewName));
446
+ }
447
+ /**
448
+ * Check if any views exist for an object
449
+ */
450
+ hasObject(objectName) {
451
+ return this.byObject.has(objectName);
452
+ }
453
+ /**
454
+ * Get number of registered views
455
+ */
456
+ get size() {
457
+ return this.views.size;
458
+ }
459
+ /**
460
+ * List all object names that have views
461
+ */
462
+ listObjectNames() {
463
+ return Array.from(this.byObject.keys());
464
+ }
465
+ /**
466
+ * Get default view for an object (if any)
467
+ */
468
+ getDefault(objectName) {
469
+ const views = this.getByObjectName(objectName);
470
+ return views.find((v) => v.default) ?? views[0];
471
+ }
472
+ /**
473
+ * Clear all registered views (for testing)
474
+ */
475
+ clear() {
476
+ this.views.clear();
477
+ this.byObject.clear();
478
+ }
479
+ /**
480
+ * Generate summary string for debugging
481
+ */
482
+ summary() {
483
+ const lines = [];
484
+ lines.push(`[ViewRegistry] ${this.size} native view(s) registered:`);
485
+ for (const objectName of this.listObjectNames()) {
486
+ const views = this.getByObjectName(objectName);
487
+ const viewNames = views.map((v) => {
488
+ const flags = [];
489
+ if (v.default) flags.push("default");
490
+ const flagStr = flags.length > 0 ? ` (${flags.join(", ")})` : "";
491
+ return `${v.name}${flagStr}`;
492
+ });
493
+ lines.push(` ${objectName}: ${viewNames.join(", ")}`);
494
+ }
495
+ return lines.join("\n");
496
+ }
497
+ /**
498
+ * Log summary to console
499
+ */
500
+ debug() {
501
+ console.info(this.summary());
502
+ }
503
+ makeKey(objectName, viewName) {
504
+ return `${objectName}:${viewName}`;
505
+ }
506
+ };
507
+ var viewRegistry = new ViewRegistry();
508
+ export {
509
+ AttributeNotFoundError,
510
+ CustomTabConfig,
511
+ DEFAULT_LABEL_FALLBACK,
512
+ DuplicateError,
513
+ FileNotFoundError,
514
+ FileService,
515
+ GeocodingService,
516
+ GlobalSearchService,
517
+ GroupBuilder,
518
+ NO_VALUE_OPERATORS,
519
+ NoopGeocodingAdapter,
520
+ NoopHookRegistry,
521
+ NotFoundError,
522
+ NotSystemObjectError,
523
+ OPERATORS_BY_TYPE,
524
+ ObjectBuilder,
525
+ ObjectNotFoundError,
526
+ ObjectSchemaService,
527
+ ProtectedResourceError,
528
+ RecordNotFoundError,
529
+ RecordService,
530
+ RelationService,
531
+ SchemaError,
532
+ SchemaErrorCode,
533
+ SyncError,
534
+ TabBuilder,
535
+ TableTabConfig,
536
+ UserProfileNotFoundError,
537
+ UserProfileService,
538
+ ValidationError,
539
+ ViewBuilder,
540
+ ViewService,
541
+ attributeConfigSchemas,
542
+ checkbox,
543
+ checkboxConfigSchema,
544
+ computeRecordStatus,
545
+ createAttributeValidator,
546
+ createCheckboxValidator,
547
+ createCurrencyValidator,
548
+ createDateValidator,
549
+ createDraftValidator,
550
+ createFileValidator,
551
+ createLocationValidator,
552
+ createMockAdapter,
553
+ createMultiRelationValidator,
554
+ createMultiselectValidator,
555
+ createNumberValidator,
556
+ createObjectValidator,
557
+ createPhoneValidator,
558
+ createRatingValidator,
559
+ createRelationValidator,
560
+ createSelectValidator,
561
+ createSingleRelationValidator,
562
+ createStatusValidator,
563
+ createTextValidator,
564
+ createTimestampValidator,
565
+ createUserValidator,
566
+ currency,
567
+ currencyConfigSchema,
568
+ date,
569
+ dateConfigSchema,
570
+ extractAttributeNames,
571
+ file,
572
+ fileConfigSchema,
573
+ generateId,
574
+ generatePrefixedId,
575
+ getAttributeConfigSchema,
576
+ getMissingRequiredAttributes,
577
+ getSyncPreview,
578
+ getViewSyncPreview,
579
+ group,
580
+ isAdvancedFilterState,
581
+ isCustomTab,
582
+ isFormTab,
583
+ isLabelExpression,
584
+ isNoValueOperator,
585
+ isNotFoundError,
586
+ isProtectedResourceError,
587
+ isRecordComplete,
588
+ isSchemaError,
589
+ isTableTab,
590
+ isValidationError,
591
+ location,
592
+ locationConfigSchema,
593
+ multiselect,
594
+ multiselectConfigSchema,
595
+ number,
596
+ numberConfigSchema,
597
+ object,
598
+ parseAttributeConfig,
599
+ phone,
600
+ phoneConfigSchema,
601
+ rating,
602
+ ratingConfigSchema,
603
+ registry,
604
+ relation,
605
+ relationConfigSchema,
606
+ renderLabelExpression,
607
+ safeParseAttributeConfig,
608
+ select,
609
+ selectConfigSchema,
610
+ status,
611
+ statusConfigSchema,
612
+ syncAll,
613
+ syncNativeObjects,
614
+ syncNativeViews,
615
+ text,
616
+ textConfigSchema,
617
+ textarea,
618
+ textareaConfigSchema,
619
+ timestamp,
620
+ timestampConfigSchema,
621
+ toAdvancedFilterState,
622
+ toSimpleFilterState,
623
+ user,
624
+ userConfigSchema,
625
+ validateAttribute,
626
+ validateAttributeConfig,
627
+ validateDraft,
628
+ validateDraftOrThrow,
629
+ validateObject,
630
+ validateObjectOrThrow,
631
+ verifyNativeObjectsSync,
632
+ verifyNativeViewsSync,
633
+ view,
634
+ viewRegistry
635
+ };