@stndrds/schema 1.0.0-alpha.264 → 1.0.0-alpha.266

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 (81) hide show
  1. package/dist/all--B2_3ksI.d.ts +465 -0
  2. package/dist/all-D5zeUllO.d.mts +465 -0
  3. package/dist/{attributes-DUuaECJI.d.ts → attributes-_b3Db8vT.d.ts} +1 -1
  4. package/dist/{attributes-DCgZhISp.d.mts → attributes-lBLiOIY3.d.mts} +1 -1
  5. package/dist/chunk-6ZDH3EJA.js +1261 -0
  6. package/dist/chunk-F6ATLCIR.mjs +1214 -0
  7. package/dist/{chunk-TS3PJOMZ.js → chunk-FDIAOFHS.js} +22 -235
  8. package/dist/{chunk-UXCJ3NI4.mjs → chunk-KDHDC7E6.mjs} +150 -9
  9. package/dist/{chunk-U36ZIBEM.mjs → chunk-O73ROMWQ.mjs} +15 -6
  10. package/dist/{chunk-54WDPQ6R.mjs → chunk-POULKEJM.mjs} +22 -224
  11. package/dist/{chunk-EBGRZUIH.js → chunk-Q4SZAMJT.js} +5 -0
  12. package/dist/chunk-QMLO7V5E.mjs +216 -0
  13. package/dist/{chunk-L4U5QEQL.js → chunk-QN2N3IJZ.js} +158 -8
  14. package/dist/{chunk-JUKLL5RJ.mjs → chunk-R5LAJCBU.mjs} +5 -2
  15. package/dist/chunk-V6Q7HCA7.js +229 -0
  16. package/dist/{chunk-QAF3HNKQ.js → chunk-ZPFOKBIN.js} +16 -5
  17. package/dist/exceptions.d.mts +471 -0
  18. package/dist/exceptions.d.ts +471 -0
  19. package/dist/exceptions.js +158 -0
  20. package/dist/exceptions.mjs +1 -0
  21. package/dist/helpers-C1VVEAOO.d.mts +76 -0
  22. package/dist/helpers-vQ6kp8ET.d.ts +76 -0
  23. package/dist/index-Bq1KrQkR.d.ts +2413 -0
  24. package/dist/index-DtxtOBYT.d.mts +2413 -0
  25. package/dist/index.d.mts +1580 -2652
  26. package/dist/index.d.ts +1580 -2652
  27. package/dist/index.js +1297 -1045
  28. package/dist/index.mjs +913 -907
  29. package/dist/migrations-BXd2ZGfM.d.mts +39 -0
  30. package/dist/migrations-DcuJZ8qO.d.ts +39 -0
  31. package/dist/{helpers-B4qBjTd0.d.ts → objects-A1ED9af-.d.ts} +33 -113
  32. package/dist/{helpers-B_NlMAm2.d.mts → objects-BCaBw2ef.d.mts} +33 -113
  33. package/dist/{types-15lGDPlN.d.mts → types-DNz3ITS-.d.mts} +1 -1
  34. package/dist/{types-CqZZxm_V.d.ts → types-DqLi1tx1.d.ts} +1 -1
  35. package/dist/validation/all.d.mts +7 -4
  36. package/dist/validation/all.d.ts +7 -4
  37. package/dist/validation/all.js +88 -15
  38. package/dist/validation/all.mjs +9 -8
  39. package/dist/validation/complex/currency.d.mts +2 -2
  40. package/dist/validation/complex/currency.d.ts +2 -2
  41. package/dist/validation/complex/location.d.mts +2 -2
  42. package/dist/validation/complex/location.d.ts +2 -2
  43. package/dist/validation/complex/phone.d.mts +2 -2
  44. package/dist/validation/complex/phone.d.ts +2 -2
  45. package/dist/validation/complex/phone.js +2 -2
  46. package/dist/validation/complex/phone.mjs +1 -1
  47. package/dist/validation/complex/relation.d.mts +2 -2
  48. package/dist/validation/complex/relation.d.ts +2 -2
  49. package/dist/validation/complex/richtext.d.mts +2 -2
  50. package/dist/validation/complex/richtext.d.ts +2 -2
  51. package/dist/validation/complex/select.d.mts +2 -2
  52. package/dist/validation/complex/select.d.ts +2 -2
  53. package/dist/validation/complex/user.d.mts +2 -2
  54. package/dist/validation/complex/user.d.ts +2 -2
  55. package/dist/validation/computed/formula.d.mts +2 -2
  56. package/dist/validation/computed/formula.d.ts +2 -2
  57. package/dist/validation/computed/rollup.d.mts +2 -2
  58. package/dist/validation/computed/rollup.d.ts +2 -2
  59. package/dist/validation/config/index.d.mts +5 -18
  60. package/dist/validation/config/index.d.ts +5 -18
  61. package/dist/validation/config/index.js +34 -4
  62. package/dist/validation/config/index.mjs +7 -1
  63. package/dist/validation/core/index.d.mts +3 -3
  64. package/dist/validation/core/index.d.ts +3 -3
  65. package/dist/validation/object/index.d.mts +5 -4
  66. package/dist/validation/object/index.d.ts +5 -4
  67. package/dist/validation/object/index.js +19 -18
  68. package/dist/validation/object/index.mjs +7 -6
  69. package/dist/validation/primitives/checkbox.d.mts +2 -2
  70. package/dist/validation/primitives/checkbox.d.ts +2 -2
  71. package/dist/validation/primitives/date.d.mts +2 -2
  72. package/dist/validation/primitives/date.d.ts +2 -2
  73. package/dist/validation/primitives/number.d.mts +2 -2
  74. package/dist/validation/primitives/number.d.ts +2 -2
  75. package/dist/validation/primitives/text.d.mts +2 -2
  76. package/dist/validation/primitives/text.d.ts +2 -2
  77. package/dist/validation/primitives/text.js +2 -2
  78. package/dist/validation/primitives/text.mjs +1 -1
  79. package/package.json +7 -2
  80. package/dist/chunk-PGERPYDR.js +0 -2
  81. package/dist/chunk-SP3PNHYF.mjs +0 -1
@@ -1,105 +1,3 @@
1
- import { createDateValidator } from './chunk-Q44QKLN4.mjs';
2
- import { createNumberValidator } from './chunk-UANQJ2GH.mjs';
3
- import { createTextValidator } from './chunk-U36ZIBEM.mjs';
4
- import { createMultiselectValidator, createSelectValidator, createStatusValidator } from './chunk-ZDQ5AP26.mjs';
5
- import { createUserValidator } from './chunk-LV3FEUKU.mjs';
6
- import { createFormulaValidator } from './chunk-UXAHLSWC.mjs';
7
- import { createRollupValidator } from './chunk-NS63SPNN.mjs';
8
- import { createCheckboxValidator } from './chunk-OSSGN43B.mjs';
9
- import { createCurrencyValidator } from './chunk-AYVHMVKQ.mjs';
10
- import { createLocationValidator } from './chunk-YUFTHPOE.mjs';
11
- import { createPhoneValidator } from './chunk-JUKLL5RJ.mjs';
12
- import { createRelationValidator } from './chunk-GO6LQADH.mjs';
13
- import { createRichtextValidator } from './chunk-QVLQPW3O.mjs';
14
- import { DEFAULT_VALIDATION_MESSAGES, formatZodErrors } from './chunk-HRQEZUAA.mjs';
15
- import { z } from 'zod';
16
-
17
- function isEmptyValue(value) {
18
- if (value === null || value === void 0) return true;
19
- if (typeof value === "string" && value.trim() === "") return true;
20
- if (value instanceof Date) return false;
21
- if (typeof value === "object" && !Array.isArray(value)) {
22
- return Object.values(value).every(
23
- (v) => v === null || v === void 0 || typeof v === "string" && v.trim() === ""
24
- );
25
- }
26
- return false;
27
- }
28
- function withEmptyToNull(validator) {
29
- return z.preprocess((val) => isEmptyValue(val) ? null : val, validator.nullish());
30
- }
31
-
32
- // src/validation/object/attribute-factory.ts
33
- function createAttributeValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
34
- switch (attr.type) {
35
- case "text":
36
- return createTextValidator(attr, messages);
37
- case "richtext":
38
- return createRichtextValidator(attr, messages);
39
- case "number":
40
- return createNumberValidator(attr, messages);
41
- case "checkbox":
42
- return createCheckboxValidator(attr, messages);
43
- case "date":
44
- return createDateValidator(attr, messages);
45
- case "phone":
46
- return createPhoneValidator(attr, messages);
47
- case "currency":
48
- return createCurrencyValidator(attr, messages);
49
- case "status":
50
- return createStatusValidator(attr, messages);
51
- case "location":
52
- return createLocationValidator(attr, messages);
53
- case "select":
54
- return createSelectValidator(attr, messages);
55
- case "multiselect":
56
- return createMultiselectValidator(attr, messages);
57
- case "user":
58
- return createUserValidator(attr, messages);
59
- case "relation":
60
- return createRelationValidator(attr, messages);
61
- case "formula":
62
- return createFormulaValidator(attr, messages);
63
- case "rollup":
64
- return createRollupValidator(attr, messages);
65
- default:
66
- return z.unknown();
67
- }
68
- }
69
- function createFormAttributeValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
70
- const validator = createAttributeValidator(attr, messages);
71
- if (!attr.required) {
72
- return withEmptyToNull(validator);
73
- }
74
- return validator;
75
- }
76
- var objectValidatorCache = /* @__PURE__ */ new WeakMap();
77
- var draftValidatorCache = /* @__PURE__ */ new WeakMap();
78
- function createObjectValidator(objectDef) {
79
- const cached = objectValidatorCache.get(objectDef);
80
- if (cached) return cached;
81
- const shape = {};
82
- for (const attr of objectDef.attributes) {
83
- const validator = createAttributeValidator(attr);
84
- shape[attr.name] = attr.required ? validator : withEmptyToNull(validator);
85
- }
86
- const schema = z.object(shape).passthrough();
87
- objectValidatorCache.set(objectDef, schema);
88
- return schema;
89
- }
90
- function createDraftValidator(objectDef) {
91
- const cached = draftValidatorCache.get(objectDef);
92
- if (cached) return cached;
93
- const shape = {};
94
- for (const attr of objectDef.attributes) {
95
- const validator = createAttributeValidator(attr);
96
- shape[attr.name] = withEmptyToNull(validator);
97
- }
98
- const schema = z.object(shape).passthrough();
99
- draftValidatorCache.set(objectDef, schema);
100
- return schema;
101
- }
102
-
103
1
  // src/exceptions.ts
104
2
  var SchemaErrorCode = {
105
3
  // Generic
@@ -110,6 +8,7 @@ var SchemaErrorCode = {
110
8
  RECORD_NOT_FOUND: "SCHEMA_RECORD_NOT_FOUND",
111
9
  ROLE_NOT_FOUND: "SCHEMA_ROLE_NOT_FOUND",
112
10
  MEMORY_NOT_FOUND: "SCHEMA_MEMORY_NOT_FOUND",
11
+ SCHEMA_PLAN_NOT_FOUND: "SCHEMA_PLAN_NOT_FOUND",
113
12
  // Validation
114
13
  VALIDATION_FAILED: "SCHEMA_VALIDATION_FAILED",
115
14
  INVALID_ATTRIBUTE_NAME: "SCHEMA_INVALID_ATTRIBUTE_NAME",
@@ -222,7 +121,17 @@ var SchemaErrorCode = {
222
121
  EMAIL_IMAGE_PROXY_UPSTREAM_FAILED: "EMAIL_IMAGE_PROXY_UPSTREAM_FAILED",
223
122
  // Email provider sync — transport failures from Gmail / Microsoft Graph
224
123
  EMAIL_PROVIDER_API_FAILED: "EMAIL_PROVIDER_API_FAILED",
225
- EMAIL_BATCH_ITEM_FAILED: "EMAIL_BATCH_ITEM_FAILED"
124
+ EMAIL_BATCH_ITEM_FAILED: "EMAIL_BATCH_ITEM_FAILED",
125
+ // Reflexes — agent-authored deterministic automations
126
+ REFLEX_INVALID_TRANSITION: "REFLEX_INVALID_TRANSITION",
127
+ REFLEX_INVALID_TOKEN: "REFLEX_INVALID_TOKEN",
128
+ REFLEX_CAPABILITY_DENIED: "REFLEX_CAPABILITY_DENIED",
129
+ REFLEX_GATEWAY_UNAVAILABLE: "REFLEX_GATEWAY_UNAVAILABLE",
130
+ REFLEX_BUNDLE_FAILED: "REFLEX_BUNDLE_FAILED",
131
+ REFLEX_EGRESS_DENIED: "REFLEX_EGRESS_DENIED",
132
+ REFLEX_PROTOCOL_VIOLATION: "REFLEX_PROTOCOL_VIOLATION",
133
+ REFLEX_RUN_FAILED: "REFLEX_RUN_FAILED",
134
+ REFLEX_RUN_TIMEOUT: "REFLEX_RUN_TIMEOUT"
226
135
  };
227
136
  var SchemaError = class extends Error {
228
137
  constructor(message, code = SchemaErrorCode.UNKNOWN, details) {
@@ -270,6 +179,12 @@ var RecordNotFoundError = class extends NotFoundError {
270
179
  this.name = "RecordNotFoundError";
271
180
  }
272
181
  };
182
+ var SchemaPlanNotFoundError = class extends NotFoundError {
183
+ constructor(planId) {
184
+ super("Schema plan", planId, SchemaErrorCode.SCHEMA_PLAN_NOT_FOUND);
185
+ this.name = "SchemaPlanNotFoundError";
186
+ }
187
+ };
273
188
  var ValidationError = class _ValidationError extends SchemaError {
274
189
  constructor(message, errors) {
275
190
  super(message, SchemaErrorCode.VALIDATION_FAILED, { errors });
@@ -370,19 +285,14 @@ var OrphanSystemAttributeError = class extends SchemaError {
370
285
  var DestructiveSyncNotAllowedError = class extends SchemaError {
371
286
  constructor(operations) {
372
287
  const summary = operations.map((op) => {
373
- if (op.type === "remove_attribute") {
374
- return `- remove_attribute "${op.objectName ?? "?"}.${op.name}"`;
375
- }
376
- if (op.type === "remove_object") {
377
- return "- remove_object";
378
- }
379
- return `- ${op.type}`;
288
+ const named = op;
289
+ return named.name ? `- ${op.type} "${named.name}"` : `- ${op.type}`;
380
290
  }).join("\n");
381
291
  super(
382
292
  `Destructive schema operations detected (data will be lost):
383
293
  ${summary}
384
294
 
385
- To allow Standards to apply these automatically, set the environment variable:
295
+ These are applied only under an explicit opt-in; without it boot demotes the object to runtime and keeps its rows. To let Standards apply them automatically, set the environment variable:
386
296
  STANDARDS_ALLOW_DESTRUCTIVE_SYNC=1
387
297
 
388
298
  Otherwise, revert your code changes or back up the data first.`,
@@ -598,116 +508,4 @@ function isObjectReferencedError(error) {
598
508
  return error instanceof ObjectReferencedError;
599
509
  }
600
510
 
601
- // src/validation/object/helpers.ts
602
- function validateAttribute(attr, value) {
603
- const validator = createAttributeValidator(attr);
604
- if (!attr.required && (value === void 0 || value === null)) {
605
- return { success: true, data: { [attr.name]: value } };
606
- }
607
- const result = validator.safeParse(value);
608
- if (result.success) {
609
- return {
610
- success: true,
611
- data: { [attr.name]: result.data }
612
- };
613
- }
614
- return {
615
- success: false,
616
- errors: formatZodErrors(result.error).map((err) => ({
617
- path: [attr.name, ...err.path],
618
- message: err.message
619
- }))
620
- };
621
- }
622
- function validateObject(objectDef, data) {
623
- const validator = createObjectValidator(objectDef);
624
- const result = validator.safeParse(data);
625
- if (result.success) {
626
- return {
627
- success: true,
628
- data: result.data
629
- };
630
- }
631
- return {
632
- success: false,
633
- errors: formatZodErrors(result.error)
634
- };
635
- }
636
- function validateObjectOrThrow(objectDef, data) {
637
- const result = validateObject(objectDef, data);
638
- if (!result.success) {
639
- const errors = result.errors ?? [];
640
- const detail = errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n") || "Unknown validation error";
641
- throw new ValidationError(
642
- `Validation failed for ${objectDef.label}:
643
- ${detail}`,
644
- errors.map((err) => ({ path: err.path, message: err.message }))
645
- );
646
- }
647
- return result.data;
648
- }
649
- function validateDraft(objectDef, data) {
650
- const validator = createDraftValidator(objectDef);
651
- const result = validator.safeParse(data);
652
- if (result.success) {
653
- return {
654
- success: true,
655
- data: result.data
656
- };
657
- }
658
- return {
659
- success: false,
660
- errors: formatZodErrors(result.error)
661
- };
662
- }
663
- function validateDraftOrThrow(objectDef, data) {
664
- const result = validateDraft(objectDef, data);
665
- if (!result.success) {
666
- const errors = result.errors ?? [];
667
- const detail = errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n") || "Unknown validation error";
668
- throw new ValidationError(
669
- `Draft validation failed for ${objectDef.label}:
670
- ${detail}`,
671
- errors.map((err) => ({ path: err.path, message: err.message }))
672
- );
673
- }
674
- return result.data;
675
- }
676
- function rejectUnknownAttributesOrThrow(objectDef, data) {
677
- const knownNames = new Set(objectDef.attributes.map((a) => a.name));
678
- const unknownKeys = Object.keys(data).filter((key) => !knownNames.has(key));
679
- if (unknownKeys.length > 0) {
680
- throw new ValidationError(
681
- `Unknown attribute${unknownKeys.length > 1 ? "s" : ""} for ${objectDef.label}: ${unknownKeys.join(", ")}`,
682
- unknownKeys.map((key) => ({ path: [key], message: "Unknown attribute" }))
683
- );
684
- }
685
- }
686
- function isValuePresent(value) {
687
- if (value === void 0 || value === null) {
688
- return false;
689
- }
690
- if (typeof value === "string" && value.trim() === "") {
691
- return false;
692
- }
693
- return true;
694
- }
695
- function getMissingRequiredAttributes(objectDef, data) {
696
- const missing = [];
697
- for (const attr of objectDef.attributes) {
698
- if (attr.required && !isValuePresent(data[attr.name])) {
699
- missing.push(attr);
700
- }
701
- }
702
- return missing;
703
- }
704
- function isRecordComplete(objectDef, data) {
705
- const missing = getMissingRequiredAttributes(objectDef, data);
706
- if (missing.length > 0) {
707
- return false;
708
- }
709
- const validation = validateObject(objectDef, data);
710
- return validation.success;
711
- }
712
-
713
- export { AccessDeniedError, AttributeInUseError, AttributeNotFoundError, ChangeTypeNotSupportedError, ConcurrentModificationError, DestructiveSyncNotAllowedError, DuplicateError, ForbiddenError, MemoryNotFoundError, MigrationTimeoutError, NotFoundError, NotImplementedError, ObjectNotFoundError, ObjectReferencedError, OrphanSystemAttributeError, ProtectedResourceError, ProtectedRoleError, RecordNotFoundError, RecordReferencedError, RepositoryError, RoleNotFoundError, SchemaError, SchemaErrorCode, SearchBackendError, StorageError, SyncCascadeError, SyncConflictError, SyncError, SystemEntityImmutableError, ValidationError, createAttributeValidator, createDraftValidator, createFormAttributeValidator, createObjectValidator, getMissingRequiredAttributes, isAttributeInUseError, isNotFoundError, isObjectReferencedError, isProtectedResourceError, isRecordComplete, isRecordReferencedError, isSchemaError, isValidationError, rejectUnknownAttributesOrThrow, validateAttribute, validateDraft, validateDraftOrThrow, validateObject, validateObjectOrThrow };
511
+ export { AccessDeniedError, AttributeInUseError, AttributeNotFoundError, ChangeTypeNotSupportedError, ConcurrentModificationError, DestructiveSyncNotAllowedError, DuplicateError, ForbiddenError, MemoryNotFoundError, MigrationTimeoutError, NotFoundError, NotImplementedError, ObjectNotFoundError, ObjectReferencedError, OrphanSystemAttributeError, ProtectedResourceError, ProtectedRoleError, RecordNotFoundError, RecordReferencedError, RepositoryError, RoleNotFoundError, SchemaError, SchemaErrorCode, SchemaPlanNotFoundError, SearchBackendError, StorageError, SyncCascadeError, SyncConflictError, SyncError, SystemEntityImmutableError, ValidationError, isAttributeInUseError, isNotFoundError, isObjectReferencedError, isProtectedResourceError, isRecordReferencedError, isSchemaError, isValidationError };
@@ -8,6 +8,9 @@ var libphonenumberJs = require('libphonenumber-js');
8
8
  function digitsOnly(input) {
9
9
  return input.replace(/\D/g, "");
10
10
  }
11
+ function normalizeCountrylessPhoneNumber(phoneNumber) {
12
+ return digitsOnly(phoneNumber);
13
+ }
11
14
  function getIso2(iso3) {
12
15
  const country = constants.getCountryByIso3(iso3);
13
16
  return country?.iso2;
@@ -65,3 +68,5 @@ function createPhoneValidator(attr, messages = chunkYKWSHBT5_js.DEFAULT_VALIDATI
65
68
 
66
69
  exports.createPhoneValidator = createPhoneValidator;
67
70
  exports.formatPhoneForDisplay = formatPhoneForDisplay;
71
+ exports.normalizeCountrylessPhoneNumber = normalizeCountrylessPhoneNumber;
72
+ exports.normalizePhoneNumber = normalizePhoneNumber;
@@ -0,0 +1,216 @@
1
+ import { createRichtextValidator } from './chunk-QVLQPW3O.mjs';
2
+ import { createMultiselectValidator, createSelectValidator, createStatusValidator } from './chunk-ZDQ5AP26.mjs';
3
+ import { createUserValidator } from './chunk-LV3FEUKU.mjs';
4
+ import { createFormulaValidator } from './chunk-UXAHLSWC.mjs';
5
+ import { createRollupValidator } from './chunk-NS63SPNN.mjs';
6
+ import { createCheckboxValidator } from './chunk-OSSGN43B.mjs';
7
+ import { createDateValidator } from './chunk-Q44QKLN4.mjs';
8
+ import { createNumberValidator } from './chunk-UANQJ2GH.mjs';
9
+ import { createTextValidator } from './chunk-O73ROMWQ.mjs';
10
+ import { ValidationError } from './chunk-POULKEJM.mjs';
11
+ import { createCurrencyValidator } from './chunk-AYVHMVKQ.mjs';
12
+ import { createLocationValidator } from './chunk-YUFTHPOE.mjs';
13
+ import { createPhoneValidator } from './chunk-R5LAJCBU.mjs';
14
+ import { createRelationValidator } from './chunk-GO6LQADH.mjs';
15
+ import { DEFAULT_VALIDATION_MESSAGES, formatZodErrors } from './chunk-HRQEZUAA.mjs';
16
+ import { z } from 'zod';
17
+
18
+ function isEmptyValue(value) {
19
+ if (value === null || value === void 0) return true;
20
+ if (typeof value === "string" && value.trim() === "") return true;
21
+ if (value instanceof Date) return false;
22
+ if (typeof value === "object" && !Array.isArray(value)) {
23
+ return Object.values(value).every(
24
+ (v) => v === null || v === void 0 || typeof v === "string" && v.trim() === ""
25
+ );
26
+ }
27
+ return false;
28
+ }
29
+ function withEmptyToNull(validator) {
30
+ return z.preprocess((val) => isEmptyValue(val) ? null : val, validator.nullish());
31
+ }
32
+
33
+ // src/validation/object/attribute-factory.ts
34
+ function createAttributeValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
35
+ switch (attr.type) {
36
+ case "text":
37
+ return createTextValidator(attr, messages);
38
+ case "richtext":
39
+ return createRichtextValidator(attr, messages);
40
+ case "number":
41
+ return createNumberValidator(attr, messages);
42
+ case "checkbox":
43
+ return createCheckboxValidator(attr, messages);
44
+ case "date":
45
+ return createDateValidator(attr, messages);
46
+ case "phone":
47
+ return createPhoneValidator(attr, messages);
48
+ case "currency":
49
+ return createCurrencyValidator(attr, messages);
50
+ case "status":
51
+ return createStatusValidator(attr, messages);
52
+ case "location":
53
+ return createLocationValidator(attr, messages);
54
+ case "select":
55
+ return createSelectValidator(attr, messages);
56
+ case "multiselect":
57
+ return createMultiselectValidator(attr, messages);
58
+ case "user":
59
+ return createUserValidator(attr, messages);
60
+ case "relation":
61
+ return createRelationValidator(attr, messages);
62
+ case "formula":
63
+ return createFormulaValidator(attr, messages);
64
+ case "rollup":
65
+ return createRollupValidator(attr, messages);
66
+ default:
67
+ return z.unknown();
68
+ }
69
+ }
70
+ function createFormAttributeValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
71
+ const validator = createAttributeValidator(attr, messages);
72
+ if (!attr.required) {
73
+ return withEmptyToNull(validator);
74
+ }
75
+ return validator;
76
+ }
77
+ var objectValidatorCache = /* @__PURE__ */ new WeakMap();
78
+ var draftValidatorCache = /* @__PURE__ */ new WeakMap();
79
+ function createObjectValidator(objectDef) {
80
+ const cached = objectValidatorCache.get(objectDef);
81
+ if (cached) return cached;
82
+ const shape = {};
83
+ for (const attr of objectDef.attributes) {
84
+ const validator = createAttributeValidator(attr);
85
+ shape[attr.name] = attr.required ? validator : withEmptyToNull(validator);
86
+ }
87
+ const schema = z.object(shape).passthrough();
88
+ objectValidatorCache.set(objectDef, schema);
89
+ return schema;
90
+ }
91
+ function createDraftValidator(objectDef) {
92
+ const cached = draftValidatorCache.get(objectDef);
93
+ if (cached) return cached;
94
+ const shape = {};
95
+ for (const attr of objectDef.attributes) {
96
+ const validator = createAttributeValidator(attr);
97
+ shape[attr.name] = withEmptyToNull(validator);
98
+ }
99
+ const schema = z.object(shape).passthrough();
100
+ draftValidatorCache.set(objectDef, schema);
101
+ return schema;
102
+ }
103
+
104
+ // src/validation/object/helpers.ts
105
+ function validateAttribute(attr, value) {
106
+ const validator = createAttributeValidator(attr);
107
+ if (!attr.required && (value === void 0 || value === null)) {
108
+ return { success: true, data: { [attr.name]: value } };
109
+ }
110
+ const result = validator.safeParse(value);
111
+ if (result.success) {
112
+ return {
113
+ success: true,
114
+ data: { [attr.name]: result.data }
115
+ };
116
+ }
117
+ return {
118
+ success: false,
119
+ errors: formatZodErrors(result.error).map((err) => ({
120
+ path: [attr.name, ...err.path],
121
+ message: err.message
122
+ }))
123
+ };
124
+ }
125
+ function validateObject(objectDef, data) {
126
+ const validator = createObjectValidator(objectDef);
127
+ const result = validator.safeParse(data);
128
+ if (result.success) {
129
+ return {
130
+ success: true,
131
+ data: result.data
132
+ };
133
+ }
134
+ return {
135
+ success: false,
136
+ errors: formatZodErrors(result.error)
137
+ };
138
+ }
139
+ function validateObjectOrThrow(objectDef, data) {
140
+ const result = validateObject(objectDef, data);
141
+ if (!result.success) {
142
+ const errors = result.errors ?? [];
143
+ const detail = errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n") || "Unknown validation error";
144
+ throw new ValidationError(
145
+ `Validation failed for ${objectDef.label}:
146
+ ${detail}`,
147
+ errors.map((err) => ({ path: err.path, message: err.message }))
148
+ );
149
+ }
150
+ return result.data;
151
+ }
152
+ function validateDraft(objectDef, data) {
153
+ const validator = createDraftValidator(objectDef);
154
+ const result = validator.safeParse(data);
155
+ if (result.success) {
156
+ return {
157
+ success: true,
158
+ data: result.data
159
+ };
160
+ }
161
+ return {
162
+ success: false,
163
+ errors: formatZodErrors(result.error)
164
+ };
165
+ }
166
+ function validateDraftOrThrow(objectDef, data) {
167
+ const result = validateDraft(objectDef, data);
168
+ if (!result.success) {
169
+ const errors = result.errors ?? [];
170
+ const detail = errors.map((err) => `${err.path.join(".")}: ${err.message}`).join("\n") || "Unknown validation error";
171
+ throw new ValidationError(
172
+ `Draft validation failed for ${objectDef.label}:
173
+ ${detail}`,
174
+ errors.map((err) => ({ path: err.path, message: err.message }))
175
+ );
176
+ }
177
+ return result.data;
178
+ }
179
+ function rejectUnknownAttributesOrThrow(objectDef, data) {
180
+ const knownNames = new Set(objectDef.attributes.map((a) => a.name));
181
+ const unknownKeys = Object.keys(data).filter((key) => !knownNames.has(key));
182
+ if (unknownKeys.length > 0) {
183
+ throw new ValidationError(
184
+ `Unknown attribute${unknownKeys.length > 1 ? "s" : ""} for ${objectDef.label}: ${unknownKeys.join(", ")}`,
185
+ unknownKeys.map((key) => ({ path: [key], message: "Unknown attribute" }))
186
+ );
187
+ }
188
+ }
189
+ function isValuePresent(value) {
190
+ if (value === void 0 || value === null) {
191
+ return false;
192
+ }
193
+ if (typeof value === "string" && value.trim() === "") {
194
+ return false;
195
+ }
196
+ return true;
197
+ }
198
+ function getMissingRequiredAttributes(objectDef, data) {
199
+ const missing = [];
200
+ for (const attr of objectDef.attributes) {
201
+ if (attr.required && !isValuePresent(data[attr.name])) {
202
+ missing.push(attr);
203
+ }
204
+ }
205
+ return missing;
206
+ }
207
+ function isRecordComplete(objectDef, data) {
208
+ const missing = getMissingRequiredAttributes(objectDef, data);
209
+ if (missing.length > 0) {
210
+ return false;
211
+ }
212
+ const validation = validateObject(objectDef, data);
213
+ return validation.success;
214
+ }
215
+
216
+ export { createAttributeValidator, createDraftValidator, createFormAttributeValidator, createObjectValidator, getMissingRequiredAttributes, isRecordComplete, rejectUnknownAttributesOrThrow, validateAttribute, validateDraft, validateDraftOrThrow, validateObject, validateObjectOrThrow };