@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.
- package/dist/all--B2_3ksI.d.ts +465 -0
- package/dist/all-D5zeUllO.d.mts +465 -0
- package/dist/{attributes-DUuaECJI.d.ts → attributes-_b3Db8vT.d.ts} +1 -1
- package/dist/{attributes-DCgZhISp.d.mts → attributes-lBLiOIY3.d.mts} +1 -1
- package/dist/chunk-6ZDH3EJA.js +1261 -0
- package/dist/chunk-F6ATLCIR.mjs +1214 -0
- package/dist/{chunk-TS3PJOMZ.js → chunk-FDIAOFHS.js} +22 -235
- package/dist/{chunk-UXCJ3NI4.mjs → chunk-KDHDC7E6.mjs} +150 -9
- package/dist/{chunk-U36ZIBEM.mjs → chunk-O73ROMWQ.mjs} +15 -6
- package/dist/{chunk-54WDPQ6R.mjs → chunk-POULKEJM.mjs} +22 -224
- package/dist/{chunk-EBGRZUIH.js → chunk-Q4SZAMJT.js} +5 -0
- package/dist/chunk-QMLO7V5E.mjs +216 -0
- package/dist/{chunk-L4U5QEQL.js → chunk-QN2N3IJZ.js} +158 -8
- package/dist/{chunk-JUKLL5RJ.mjs → chunk-R5LAJCBU.mjs} +5 -2
- package/dist/chunk-V6Q7HCA7.js +229 -0
- package/dist/{chunk-QAF3HNKQ.js → chunk-ZPFOKBIN.js} +16 -5
- package/dist/exceptions.d.mts +471 -0
- package/dist/exceptions.d.ts +471 -0
- package/dist/exceptions.js +158 -0
- package/dist/exceptions.mjs +1 -0
- package/dist/helpers-C1VVEAOO.d.mts +76 -0
- package/dist/helpers-vQ6kp8ET.d.ts +76 -0
- package/dist/index-Bq1KrQkR.d.ts +2413 -0
- package/dist/index-DtxtOBYT.d.mts +2413 -0
- package/dist/index.d.mts +1580 -2652
- package/dist/index.d.ts +1580 -2652
- package/dist/index.js +1297 -1045
- package/dist/index.mjs +913 -907
- package/dist/migrations-BXd2ZGfM.d.mts +39 -0
- package/dist/migrations-DcuJZ8qO.d.ts +39 -0
- package/dist/{helpers-B4qBjTd0.d.ts → objects-A1ED9af-.d.ts} +33 -113
- package/dist/{helpers-B_NlMAm2.d.mts → objects-BCaBw2ef.d.mts} +33 -113
- package/dist/{types-15lGDPlN.d.mts → types-DNz3ITS-.d.mts} +1 -1
- package/dist/{types-CqZZxm_V.d.ts → types-DqLi1tx1.d.ts} +1 -1
- package/dist/validation/all.d.mts +7 -4
- package/dist/validation/all.d.ts +7 -4
- package/dist/validation/all.js +88 -15
- package/dist/validation/all.mjs +9 -8
- package/dist/validation/complex/currency.d.mts +2 -2
- package/dist/validation/complex/currency.d.ts +2 -2
- package/dist/validation/complex/location.d.mts +2 -2
- package/dist/validation/complex/location.d.ts +2 -2
- package/dist/validation/complex/phone.d.mts +2 -2
- package/dist/validation/complex/phone.d.ts +2 -2
- package/dist/validation/complex/phone.js +2 -2
- package/dist/validation/complex/phone.mjs +1 -1
- package/dist/validation/complex/relation.d.mts +2 -2
- package/dist/validation/complex/relation.d.ts +2 -2
- package/dist/validation/complex/richtext.d.mts +2 -2
- package/dist/validation/complex/richtext.d.ts +2 -2
- package/dist/validation/complex/select.d.mts +2 -2
- package/dist/validation/complex/select.d.ts +2 -2
- package/dist/validation/complex/user.d.mts +2 -2
- package/dist/validation/complex/user.d.ts +2 -2
- package/dist/validation/computed/formula.d.mts +2 -2
- package/dist/validation/computed/formula.d.ts +2 -2
- package/dist/validation/computed/rollup.d.mts +2 -2
- package/dist/validation/computed/rollup.d.ts +2 -2
- package/dist/validation/config/index.d.mts +5 -18
- package/dist/validation/config/index.d.ts +5 -18
- package/dist/validation/config/index.js +34 -4
- package/dist/validation/config/index.mjs +7 -1
- package/dist/validation/core/index.d.mts +3 -3
- package/dist/validation/core/index.d.ts +3 -3
- package/dist/validation/object/index.d.mts +5 -4
- package/dist/validation/object/index.d.ts +5 -4
- package/dist/validation/object/index.js +19 -18
- package/dist/validation/object/index.mjs +7 -6
- package/dist/validation/primitives/checkbox.d.mts +2 -2
- package/dist/validation/primitives/checkbox.d.ts +2 -2
- package/dist/validation/primitives/date.d.mts +2 -2
- package/dist/validation/primitives/date.d.ts +2 -2
- package/dist/validation/primitives/number.d.mts +2 -2
- package/dist/validation/primitives/number.d.ts +2 -2
- package/dist/validation/primitives/text.d.mts +2 -2
- package/dist/validation/primitives/text.d.ts +2 -2
- package/dist/validation/primitives/text.js +2 -2
- package/dist/validation/primitives/text.mjs +1 -1
- package/package.json +7 -2
- package/dist/chunk-PGERPYDR.js +0 -2
- 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
|
-
|
|
374
|
-
|
|
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
|
|
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
|
-
|
|
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 };
|