@stndrds/schema 1.0.0-alpha.100 → 1.0.0-alpha.102
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/{attributes-CH89Z_J-.d.mts → attributes-D7yQuTJK.d.mts} +1 -11
- package/dist/{attributes-dw-jLtYS.d.ts → attributes-DcbQC-4b.d.ts} +1 -11
- package/dist/chunk-3JINFUN3.js +81 -0
- package/dist/{chunk-BZTLI773.mjs → chunk-4KRLCWJM.mjs} +1 -1
- package/dist/{chunk-ERG77ADK.mjs → chunk-4TC27SMF.mjs} +1 -1
- package/dist/{chunk-OO2LJ6GP.js → chunk-56QI6UTK.js} +4 -4
- package/dist/{chunk-PGHTIMRD.mjs → chunk-5JVVPJJW.mjs} +28 -19
- package/dist/{chunk-P4NGPF5L.mjs → chunk-5XL3JP73.mjs} +3 -19
- package/dist/{chunk-ZJNX6UXB.mjs → chunk-7HFZ7MVR.mjs} +1 -1
- package/dist/{chunk-6IFD5732.js → chunk-ACQ3TUFK.js} +2 -2
- package/dist/{chunk-FKPYFM6G.mjs → chunk-AYCSVKI2.mjs} +1 -1
- package/dist/{chunk-ALV6GETG.mjs → chunk-BLXQGQLK.mjs} +1 -1
- package/dist/{chunk-STKN6A5M.js → chunk-D7WFIGXW.js} +2 -2
- package/dist/{chunk-E6XO2STS.js → chunk-FRCDMQER.js} +0 -14
- package/dist/{chunk-QPDXDX7A.js → chunk-GCRHSPZN.js} +2 -2
- package/dist/{chunk-TV4G2KMD.mjs → chunk-IRTRJH37.mjs} +1 -1
- package/dist/{chunk-3RFFA4EV.mjs → chunk-ITTQ4FGR.mjs} +1 -1
- package/dist/{chunk-FKETRWAF.js → chunk-J5HRK3WD.js} +2 -2
- package/dist/{chunk-6MXQAQBB.mjs → chunk-KNYZH2WD.mjs} +1 -1
- package/dist/chunk-KWVCGQ7N.mjs +78 -0
- package/dist/chunk-MAKSIK3P.js +10 -0
- package/dist/{chunk-H3VBSMVW.js → chunk-N7T66JVY.js} +2 -21
- package/dist/{chunk-UPEQEX2D.js → chunk-OAQWRMTP.js} +2 -2
- package/dist/{chunk-VC4E3OSZ.mjs → chunk-OLJLCVNY.mjs} +1 -1
- package/dist/{chunk-ANP6HGMJ.js → chunk-P2BE2A2G.js} +4 -4
- package/dist/{chunk-HJNLL34O.js → chunk-QWZHR2OO.js} +2 -2
- package/dist/{chunk-XAORXFAX.mjs → chunk-QY6QFRRV.mjs} +1 -12
- package/dist/{chunk-CE25ADK5.js → chunk-QYNPB37W.js} +51 -42
- package/dist/{chunk-XPFWKISJ.mjs → chunk-R4CJHCC4.mjs} +1 -1
- package/dist/{chunk-5CBTJS7J.js → chunk-RJ4LOX7P.js} +2 -2
- package/dist/{chunk-C7KW4NAD.js → chunk-ROAZLZA2.js} +2 -2
- package/dist/{chunk-4IVCBFJA.mjs → chunk-RUYUFXNW.mjs} +1 -1
- package/dist/{chunk-PZT3CIHD.mjs → chunk-SS2NR6DH.mjs} +2 -18
- package/dist/{chunk-5SQEKHPW.js → chunk-T225DB55.js} +7 -52
- package/dist/{chunk-ATA4XHB4.js → chunk-TKN73433.js} +2 -2
- package/dist/{chunk-2LUHLHLE.mjs → chunk-TMYBEXBT.mjs} +1 -1
- package/dist/{chunk-JEDANRCG.mjs → chunk-UQVW4KPP.mjs} +7 -51
- package/dist/{chunk-IMEPIVTR.js → chunk-V6DE3MXC.js} +1 -38
- package/dist/{chunk-KC2FFNL4.js → chunk-VXOTYFEW.js} +2 -2
- package/dist/{chunk-RDGBQM3N.mjs → chunk-WV4V64D5.mjs} +1 -1
- package/dist/helpers-DD6JzYfI.d.mts +860 -0
- package/dist/helpers-kMS5R7KX.d.ts +860 -0
- package/dist/index.d.mts +717 -2804
- package/dist/index.d.ts +717 -2804
- package/dist/index.js +2055 -3922
- package/dist/index.mjs +2467 -3985
- package/dist/{types-Ms3HtAmo.d.mts → types-BAPgWlpX.d.mts} +1 -1
- package/dist/{types-D-0QbsA9.d.ts → types-mZPUEZl0.d.ts} +1 -1
- package/dist/utils.d.mts +1 -55
- package/dist/utils.d.ts +1 -55
- package/dist/utils.js +6 -18
- package/dist/utils.mjs +1 -1
- package/dist/validation/all.d.mts +5 -20
- package/dist/validation/all.d.ts +5 -20
- package/dist/validation/all.js +29 -238
- package/dist/validation/all.mjs +19 -20
- package/dist/validation/complex/currency.d.mts +2 -2
- package/dist/validation/complex/currency.d.ts +2 -2
- package/dist/validation/complex/currency.js +3 -4
- package/dist/validation/complex/currency.mjs +2 -3
- package/dist/validation/complex/file.d.mts +2 -2
- package/dist/validation/complex/file.d.ts +2 -2
- package/dist/validation/complex/file.js +3 -4
- package/dist/validation/complex/file.mjs +2 -3
- package/dist/validation/complex/location.d.mts +2 -2
- package/dist/validation/complex/location.d.ts +2 -2
- package/dist/validation/complex/location.js +3 -4
- package/dist/validation/complex/location.mjs +2 -3
- package/dist/validation/complex/phone.d.mts +2 -2
- package/dist/validation/complex/phone.d.ts +2 -2
- package/dist/validation/complex/phone.js +3 -4
- package/dist/validation/complex/phone.mjs +2 -3
- package/dist/validation/complex/relation.d.mts +2 -2
- package/dist/validation/complex/relation.d.ts +2 -2
- package/dist/validation/complex/relation.js +5 -6
- package/dist/validation/complex/relation.mjs +2 -3
- package/dist/validation/complex/richtext.d.mts +2 -2
- package/dist/validation/complex/richtext.d.ts +2 -2
- package/dist/validation/complex/richtext.js +3 -4
- package/dist/validation/complex/richtext.mjs +2 -3
- package/dist/validation/complex/select.d.mts +2 -2
- package/dist/validation/complex/select.d.ts +2 -2
- package/dist/validation/complex/select.js +5 -6
- package/dist/validation/complex/select.mjs +2 -3
- package/dist/validation/complex/user.d.mts +2 -2
- package/dist/validation/complex/user.d.ts +2 -2
- package/dist/validation/complex/user.js +3 -4
- package/dist/validation/complex/user.mjs +2 -3
- package/dist/validation/computed/formula.d.mts +2 -2
- package/dist/validation/computed/formula.d.ts +2 -2
- package/dist/validation/computed/formula.js +3 -4
- package/dist/validation/computed/formula.mjs +2 -3
- package/dist/validation/computed/rollup.d.mts +2 -2
- package/dist/validation/computed/rollup.d.ts +2 -2
- package/dist/validation/computed/rollup.js +3 -4
- package/dist/validation/computed/rollup.mjs +2 -3
- package/dist/validation/config/index.d.mts +2 -403
- package/dist/validation/config/index.d.ts +2 -403
- package/dist/validation/config/index.js +4 -89
- package/dist/validation/config/index.mjs +1 -2
- package/dist/validation/core/index.d.mts +4 -53
- package/dist/validation/core/index.d.ts +4 -53
- package/dist/validation/core/index.js +3 -12
- package/dist/validation/core/index.mjs +1 -2
- package/dist/validation/object/index.d.mts +29 -4
- package/dist/validation/object/index.d.ts +29 -4
- package/dist/validation/object/index.js +29 -30
- package/dist/validation/object/index.mjs +17 -18
- package/dist/validation/primitives/checkbox.d.mts +2 -2
- package/dist/validation/primitives/checkbox.d.ts +2 -2
- package/dist/validation/primitives/checkbox.js +3 -4
- package/dist/validation/primitives/checkbox.mjs +2 -3
- package/dist/validation/primitives/date.d.mts +2 -2
- package/dist/validation/primitives/date.d.ts +2 -2
- package/dist/validation/primitives/date.js +3 -4
- package/dist/validation/primitives/date.mjs +2 -3
- package/dist/validation/primitives/number.d.mts +2 -2
- package/dist/validation/primitives/number.d.ts +2 -2
- package/dist/validation/primitives/number.js +3 -4
- package/dist/validation/primitives/number.mjs +2 -3
- package/dist/validation/primitives/rating.d.mts +2 -2
- package/dist/validation/primitives/rating.d.ts +2 -2
- package/dist/validation/primitives/rating.js +3 -4
- package/dist/validation/primitives/rating.mjs +2 -3
- package/dist/validation/primitives/text.d.mts +2 -2
- package/dist/validation/primitives/text.d.ts +2 -2
- package/dist/validation/primitives/text.js +4 -5
- package/dist/validation/primitives/text.mjs +2 -3
- package/package.json +2 -3
- package/dist/chunk-4DMDOSFN.js +0 -10
- package/dist/chunk-7FSIBNRH.mjs +0 -25
- package/dist/chunk-BEN6TE7Y.js +0 -11
- package/dist/chunk-RDXQ4CYT.mjs +0 -9
- package/dist/chunk-ZWMMEQI7.js +0 -28
- package/dist/index-CftmKoRP.d.mts +0 -2053
- package/dist/index-Dh_XiNFt.d.ts +0 -2053
- package/dist/validation/validators.d.mts +0 -23
- package/dist/validation/validators.d.ts +0 -23
- package/dist/validation/validators.js +0 -265
- package/dist/validation/validators.mjs +0 -20
- /package/dist/{chunk-R6JFUC32.js → chunk-PGERPYDR.js} +0 -0
- /package/dist/{chunk-EKG35CSO.mjs → chunk-SP3PNHYF.mjs} +0 -0
|
@@ -159,11 +159,6 @@ interface FeatureFlagsConfig {
|
|
|
159
159
|
* are NOT supported to avoid duplicating backend behavior.
|
|
160
160
|
*/
|
|
161
161
|
type PropertyType = "text" | "textarea" | "number" | "checkbox" | "date" | "phone" | "currency" | "status" | "select" | "multiselect" | "rating" | "location";
|
|
162
|
-
/**
|
|
163
|
-
* Forbidden property types that would require complex backend duplication
|
|
164
|
-
*/
|
|
165
|
-
declare const FORBIDDEN_PROPERTY_TYPES: readonly ["formula", "rollup", "relation", "file", "user", "document", "richtext"];
|
|
166
|
-
type ForbiddenPropertyType = (typeof FORBIDDEN_PROPERTY_TYPES)[number];
|
|
167
162
|
/**
|
|
168
163
|
* Union of attribute types allowed as qualified relation properties.
|
|
169
164
|
*
|
|
@@ -660,11 +655,6 @@ interface DocumentAttribute extends BaseAttribute<string | string[]> {
|
|
|
660
655
|
attributes?: Attribute[];
|
|
661
656
|
}
|
|
662
657
|
type Attribute = TextAttribute | TextAreaAttribute | RichtextAttribute | NumberAttribute | CheckboxAttribute | DateAttribute | PhoneAttribute | CurrencyAttribute | StatusAttribute | LocationAttribute | SelectAttribute | MultiselectAttribute | FileAttribute | UserAttribute | RelationAttribute | RatingAttribute | FormulaAttribute | RollupAttribute | DocumentAttribute;
|
|
663
|
-
/**
|
|
664
|
-
* Attribute types that are not sortable by default.
|
|
665
|
-
* These types have complex/binary values without a meaningful natural order.
|
|
666
|
-
*/
|
|
667
|
-
declare const NON_SORTABLE_TYPES: ReadonlySet<AttributeType>;
|
|
668
658
|
/**
|
|
669
659
|
* Check if an attribute supports sorting based on its type.
|
|
670
660
|
*/
|
|
@@ -672,4 +662,4 @@ declare function isAttributeSortable(attr: {
|
|
|
672
662
|
type: AttributeType;
|
|
673
663
|
}): boolean;
|
|
674
664
|
|
|
675
|
-
export {
|
|
665
|
+
export { hasOptions as $, type Attribute as A, type BilateralConfig as B, type CurrencyAttribute as C, type DateAttribute as D, type AttributeGroup as E, type FileAttribute as F, type BaseAttribute as G, type DateFormat as H, type DateValue as I, type FeatureFlagsConfig as J, type FlagOverride as K, type LocationAttribute as L, type MultiRelationAttribute as M, type NumberAttribute as N, type Option as O, type PhoneAttribute as P, type NumberUnit as Q, type RelationAttribute as R, type SingleRelationAttribute as S, type TextAreaAttribute as T, type UserAttribute as U, type OptionPropertyAttribute as V, type PropertyAttribute as W, type PropertySchema as X, type PropertyType as Y, RELATION_TARGET_ANY as Z, type StatusGroup as _, type RichtextAttribute as a, inferInverseCardinality as a0, isAttributeSortable as a1, isBilateralRelation as a2, isUniversalRelation as a3, type MultiselectAttribute as b, type SelectAttribute as c, type StatusAttribute as d, type FormulaAttribute as e, type RollupAttribute as f, type CheckboxAttribute as g, type RatingAttribute as h, type TextAttribute as i, type AttributeType as j, type LocationGranularity as k, type Location as l, type Phone as m, type Currency as n, type DocumentAttribute as o, type FeatureGate as p, type FormulaReturnType as q, type RelationTarget as r, type RichtextFeature as s, type RollupFunction as t, type FlagValueType as u, type FeatureFlagDefinition as v, type FlagLevel as w, type FeatureFlagsRepository as x, type StaticFlagDefault as y, type ResolvedFlag as z };
|
|
@@ -159,11 +159,6 @@ interface FeatureFlagsConfig {
|
|
|
159
159
|
* are NOT supported to avoid duplicating backend behavior.
|
|
160
160
|
*/
|
|
161
161
|
type PropertyType = "text" | "textarea" | "number" | "checkbox" | "date" | "phone" | "currency" | "status" | "select" | "multiselect" | "rating" | "location";
|
|
162
|
-
/**
|
|
163
|
-
* Forbidden property types that would require complex backend duplication
|
|
164
|
-
*/
|
|
165
|
-
declare const FORBIDDEN_PROPERTY_TYPES: readonly ["formula", "rollup", "relation", "file", "user", "document", "richtext"];
|
|
166
|
-
type ForbiddenPropertyType = (typeof FORBIDDEN_PROPERTY_TYPES)[number];
|
|
167
162
|
/**
|
|
168
163
|
* Union of attribute types allowed as qualified relation properties.
|
|
169
164
|
*
|
|
@@ -660,11 +655,6 @@ interface DocumentAttribute extends BaseAttribute<string | string[]> {
|
|
|
660
655
|
attributes?: Attribute[];
|
|
661
656
|
}
|
|
662
657
|
type Attribute = TextAttribute | TextAreaAttribute | RichtextAttribute | NumberAttribute | CheckboxAttribute | DateAttribute | PhoneAttribute | CurrencyAttribute | StatusAttribute | LocationAttribute | SelectAttribute | MultiselectAttribute | FileAttribute | UserAttribute | RelationAttribute | RatingAttribute | FormulaAttribute | RollupAttribute | DocumentAttribute;
|
|
663
|
-
/**
|
|
664
|
-
* Attribute types that are not sortable by default.
|
|
665
|
-
* These types have complex/binary values without a meaningful natural order.
|
|
666
|
-
*/
|
|
667
|
-
declare const NON_SORTABLE_TYPES: ReadonlySet<AttributeType>;
|
|
668
658
|
/**
|
|
669
659
|
* Check if an attribute supports sorting based on its type.
|
|
670
660
|
*/
|
|
@@ -672,4 +662,4 @@ declare function isAttributeSortable(attr: {
|
|
|
672
662
|
type: AttributeType;
|
|
673
663
|
}): boolean;
|
|
674
664
|
|
|
675
|
-
export {
|
|
665
|
+
export { hasOptions as $, type Attribute as A, type BilateralConfig as B, type CurrencyAttribute as C, type DateAttribute as D, type AttributeGroup as E, type FileAttribute as F, type BaseAttribute as G, type DateFormat as H, type DateValue as I, type FeatureFlagsConfig as J, type FlagOverride as K, type LocationAttribute as L, type MultiRelationAttribute as M, type NumberAttribute as N, type Option as O, type PhoneAttribute as P, type NumberUnit as Q, type RelationAttribute as R, type SingleRelationAttribute as S, type TextAreaAttribute as T, type UserAttribute as U, type OptionPropertyAttribute as V, type PropertyAttribute as W, type PropertySchema as X, type PropertyType as Y, RELATION_TARGET_ANY as Z, type StatusGroup as _, type RichtextAttribute as a, inferInverseCardinality as a0, isAttributeSortable as a1, isBilateralRelation as a2, isUniversalRelation as a3, type MultiselectAttribute as b, type SelectAttribute as c, type StatusAttribute as d, type FormulaAttribute as e, type RollupAttribute as f, type CheckboxAttribute as g, type RatingAttribute as h, type TextAttribute as i, type AttributeType as j, type LocationGranularity as k, type Location as l, type Phone as m, type Currency as n, type DocumentAttribute as o, type FeatureGate as p, type FormulaReturnType as q, type RelationTarget as r, type RichtextFeature as s, type RollupFunction as t, type FlagValueType as u, type FeatureFlagDefinition as v, type FlagLevel as w, type FeatureFlagsRepository as x, type StaticFlagDefault as y, type ResolvedFlag as z };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
|
+
var zod = require('zod');
|
|
5
|
+
|
|
6
|
+
// src/lib/lru-cache.ts
|
|
7
|
+
var LRUCache = class {
|
|
8
|
+
constructor(capacity) {
|
|
9
|
+
if (capacity <= 0) {
|
|
10
|
+
throw new Error("LRU cache capacity must be greater than 0");
|
|
11
|
+
}
|
|
12
|
+
this.capacity = capacity;
|
|
13
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
14
|
+
}
|
|
15
|
+
get(key) {
|
|
16
|
+
const value = this.cache.get(key);
|
|
17
|
+
if (value !== void 0) {
|
|
18
|
+
this.cache.delete(key);
|
|
19
|
+
this.cache.set(key, value);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
set(key, value) {
|
|
24
|
+
if (this.cache.has(key)) {
|
|
25
|
+
this.cache.delete(key);
|
|
26
|
+
} else if (this.cache.size >= this.capacity) {
|
|
27
|
+
const firstKey = this.cache.keys().next().value;
|
|
28
|
+
if (firstKey !== void 0) {
|
|
29
|
+
this.cache.delete(firstKey);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.cache.set(key, value);
|
|
33
|
+
}
|
|
34
|
+
has(key) {
|
|
35
|
+
return this.cache.has(key);
|
|
36
|
+
}
|
|
37
|
+
clear() {
|
|
38
|
+
this.cache.clear();
|
|
39
|
+
}
|
|
40
|
+
get size() {
|
|
41
|
+
return this.cache.size;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
// src/validation/core/regex-cache.ts
|
|
46
|
+
function createRegexCache(capacity = 100) {
|
|
47
|
+
return new LRUCache(capacity);
|
|
48
|
+
}
|
|
49
|
+
function getCachedRegex(cache, pattern) {
|
|
50
|
+
let cached = cache.get(pattern);
|
|
51
|
+
if (!cached) {
|
|
52
|
+
cached = new RegExp(pattern);
|
|
53
|
+
cache.set(pattern, cached);
|
|
54
|
+
}
|
|
55
|
+
return cached;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// src/validation/primitives/text.ts
|
|
59
|
+
var textRegexCache = createRegexCache();
|
|
60
|
+
function createTextValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
61
|
+
let schema = zod.z.string();
|
|
62
|
+
if (attr.minLength !== void 0) {
|
|
63
|
+
schema = schema.min(attr.minLength, messages.minLength(attr, attr.minLength));
|
|
64
|
+
}
|
|
65
|
+
if (attr.maxLength !== void 0) {
|
|
66
|
+
schema = schema.max(attr.maxLength, messages.maxLength(attr, attr.maxLength));
|
|
67
|
+
}
|
|
68
|
+
if (attr.pattern) {
|
|
69
|
+
schema = schema.regex(
|
|
70
|
+
getCachedRegex(textRegexCache, attr.pattern),
|
|
71
|
+
messages.invalidPattern(attr)
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
return schema;
|
|
75
|
+
}
|
|
76
|
+
function createTextAreaValidator(_attr, _messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
77
|
+
return zod.z.string();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
exports.createTextAreaValidator = createTextAreaValidator;
|
|
81
|
+
exports.createTextValidator = createTextValidator;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createSelectValidator(attr, messages =
|
|
6
|
+
function createSelectValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
const validValues = attr.options.map((opt) => opt.value);
|
|
8
8
|
const validLabels = attr.options.map((opt) => opt.label);
|
|
9
9
|
return zod.z.enum(validValues, {
|
|
10
10
|
message: messages.invalidOption(attr, validLabels)
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
|
-
function createMultiselectValidator(attr, messages =
|
|
13
|
+
function createMultiselectValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
14
14
|
const validValues = attr.options.map((opt) => opt.value);
|
|
15
15
|
const validLabels = attr.options.map((opt) => opt.label);
|
|
16
16
|
return zod.z.array(
|
|
@@ -19,7 +19,7 @@ function createMultiselectValidator(attr, messages = chunk5SQEKHPW_js.DEFAULT_VA
|
|
|
19
19
|
})
|
|
20
20
|
);
|
|
21
21
|
}
|
|
22
|
-
function createStatusValidator(attr, messages =
|
|
22
|
+
function createStatusValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
23
23
|
const validValues = attr.options.map((opt) => opt.value);
|
|
24
24
|
const validLabels = attr.options.map((opt) => opt.label);
|
|
25
25
|
return zod.z.enum(validValues, {
|
|
@@ -1,20 +1,19 @@
|
|
|
1
|
-
import { createCheckboxValidator } from './chunk-
|
|
2
|
-
import { createDateValidator } from './chunk-
|
|
3
|
-
import { createNumberValidator } from './chunk-
|
|
4
|
-
import { createRatingValidator } from './chunk-
|
|
5
|
-
import { createTextAreaValidator, createTextValidator } from './chunk-
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { DEFAULT_VALIDATION_MESSAGES } from './chunk-
|
|
17
|
-
import { formatZodErrors } from './chunk-RDXQ4CYT.mjs';
|
|
1
|
+
import { createCheckboxValidator } from './chunk-TMYBEXBT.mjs';
|
|
2
|
+
import { createDateValidator } from './chunk-4KRLCWJM.mjs';
|
|
3
|
+
import { createNumberValidator } from './chunk-KNYZH2WD.mjs';
|
|
4
|
+
import { createRatingValidator } from './chunk-RUYUFXNW.mjs';
|
|
5
|
+
import { createTextAreaValidator, createTextValidator } from './chunk-KWVCGQ7N.mjs';
|
|
6
|
+
import { createRichtextValidator } from './chunk-BLXQGQLK.mjs';
|
|
7
|
+
import { createMultiselectValidator, createSelectValidator, createStatusValidator } from './chunk-7HFZ7MVR.mjs';
|
|
8
|
+
import { createUserValidator } from './chunk-ITTQ4FGR.mjs';
|
|
9
|
+
import { createFormulaValidator } from './chunk-IRTRJH37.mjs';
|
|
10
|
+
import { createRollupValidator } from './chunk-OLJLCVNY.mjs';
|
|
11
|
+
import { createCurrencyValidator } from './chunk-AYCSVKI2.mjs';
|
|
12
|
+
import { createFileValidator } from './chunk-4TC27SMF.mjs';
|
|
13
|
+
import { createLocationValidator } from './chunk-WV4V64D5.mjs';
|
|
14
|
+
import { createPhoneValidator } from './chunk-5XL3JP73.mjs';
|
|
15
|
+
import { createRelationValidator } from './chunk-R4CJHCC4.mjs';
|
|
16
|
+
import { DEFAULT_VALIDATION_MESSAGES, formatZodErrors } from './chunk-UQVW4KPP.mjs';
|
|
18
17
|
import { z } from 'zod';
|
|
19
18
|
|
|
20
19
|
function isEmptyValue(value) {
|
|
@@ -82,21 +81,31 @@ function createFormAttributeValidator(attr, messages = DEFAULT_VALIDATION_MESSAG
|
|
|
82
81
|
}
|
|
83
82
|
return validator;
|
|
84
83
|
}
|
|
84
|
+
var objectValidatorCache = /* @__PURE__ */ new WeakMap();
|
|
85
|
+
var draftValidatorCache = /* @__PURE__ */ new WeakMap();
|
|
85
86
|
function createObjectValidator(objectDef) {
|
|
87
|
+
const cached = objectValidatorCache.get(objectDef);
|
|
88
|
+
if (cached) return cached;
|
|
86
89
|
const shape = {};
|
|
87
90
|
for (const attr of objectDef.attributes) {
|
|
88
91
|
const validator = createAttributeValidator(attr);
|
|
89
92
|
shape[attr.name] = attr.required ? validator : withEmptyToNull(validator);
|
|
90
93
|
}
|
|
91
|
-
|
|
94
|
+
const schema = z.object(shape).passthrough();
|
|
95
|
+
objectValidatorCache.set(objectDef, schema);
|
|
96
|
+
return schema;
|
|
92
97
|
}
|
|
93
98
|
function createDraftValidator(objectDef) {
|
|
99
|
+
const cached = draftValidatorCache.get(objectDef);
|
|
100
|
+
if (cached) return cached;
|
|
94
101
|
const shape = {};
|
|
95
102
|
for (const attr of objectDef.attributes) {
|
|
96
103
|
const validator = createAttributeValidator(attr);
|
|
97
104
|
shape[attr.name] = withEmptyToNull(validator);
|
|
98
105
|
}
|
|
99
|
-
|
|
106
|
+
const schema = z.object(shape).passthrough();
|
|
107
|
+
draftValidatorCache.set(objectDef, schema);
|
|
108
|
+
return schema;
|
|
100
109
|
}
|
|
101
110
|
|
|
102
111
|
// src/validation/object/helpers.ts
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DEFAULT_VALIDATION_MESSAGES } from './chunk-
|
|
2
|
-
import { getCountryByIso3,
|
|
1
|
+
import { DEFAULT_VALIDATION_MESSAGES } from './chunk-UQVW4KPP.mjs';
|
|
2
|
+
import { getCountryByIso3, isValidIso3, stripTrunkPrefix } from '@stndrds/constants';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { parsePhoneNumberFromString } from 'libphonenumber-js';
|
|
5
5
|
|
|
@@ -61,22 +61,6 @@ function formatPhoneForDisplay(phone) {
|
|
|
61
61
|
}
|
|
62
62
|
return `${dial} ${phone.phoneNumber}`.trim();
|
|
63
63
|
}
|
|
64
|
-
function parseRawPhoneInput(rawInput, countryIso3) {
|
|
65
|
-
if (!rawInput || rawInput.trim() === "") {
|
|
66
|
-
return { success: false, error: "Phone number is empty" };
|
|
67
|
-
}
|
|
68
|
-
const normalized = normalizePhoneNumber(rawInput, countryIso3);
|
|
69
|
-
if (!normalized) {
|
|
70
|
-
return { success: false, error: "Could not extract digits from input" };
|
|
71
|
-
}
|
|
72
|
-
if (!validatePhoneNumber(normalized, countryIso3)) {
|
|
73
|
-
return { success: false, error: "Invalid phone number for country" };
|
|
74
|
-
}
|
|
75
|
-
return {
|
|
76
|
-
success: true,
|
|
77
|
-
phone: { countryCode: countryIso3, phoneNumber: normalized }
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
64
|
|
|
81
65
|
// src/validation/complex/phone.ts
|
|
82
66
|
function createPhoneValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
|
|
@@ -96,4 +80,4 @@ function createPhoneValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
|
|
|
96
80
|
});
|
|
97
81
|
}
|
|
98
82
|
|
|
99
|
-
export { createPhoneValidator, formatPhoneForDisplay
|
|
83
|
+
export { createPhoneValidator, formatPhoneForDisplay };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createRollupValidator(_attr, _messages =
|
|
6
|
+
function createRollupValidator(_attr, _messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
return zod.z.unknown();
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createRatingValidator(attr, messages =
|
|
6
|
+
function createRatingValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
let schema = zod.z.number().min(0);
|
|
8
8
|
if (attr.max !== void 0) {
|
|
9
9
|
schema = schema.max(attr.max, messages.maxValue(attr, attr.max));
|
|
@@ -17,17 +17,6 @@ function generateId() {
|
|
|
17
17
|
return v.toString(16);
|
|
18
18
|
});
|
|
19
19
|
}
|
|
20
|
-
function generatePrefixedId(prefix) {
|
|
21
|
-
return `${prefix}_${generateId()}`;
|
|
22
|
-
}
|
|
23
|
-
function slugify(input) {
|
|
24
|
-
return input.normalize("NFD").replace(/\p{M}/gu, "").toLowerCase().replace(/[^a-z0-9\s_-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-");
|
|
25
|
-
}
|
|
26
|
-
function generateTemplateName(label) {
|
|
27
|
-
const slug = slugify(label) || "template";
|
|
28
|
-
const suffix = generateId().slice(0, 8);
|
|
29
|
-
return `${slug}-${suffix}`;
|
|
30
|
-
}
|
|
31
20
|
function indexBy(items, keyFn) {
|
|
32
21
|
return new Map(items.map((item) => [keyFn(item), item]));
|
|
33
22
|
}
|
|
@@ -55,7 +44,4 @@ exports.asTenantId = asTenantId;
|
|
|
55
44
|
exports.asUserId = asUserId;
|
|
56
45
|
exports.deepEqual = deepEqual;
|
|
57
46
|
exports.generateId = generateId;
|
|
58
|
-
exports.generatePrefixedId = generatePrefixedId;
|
|
59
|
-
exports.generateTemplateName = generateTemplateName;
|
|
60
47
|
exports.indexBy = indexBy;
|
|
61
|
-
exports.slugify = slugify;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createCurrencyValidator(attr, messages =
|
|
6
|
+
function createCurrencyValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
return zod.z.object(
|
|
8
8
|
{
|
|
9
9
|
code: zod.z.string().length(3),
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createDateValidator(attr, messages =
|
|
6
|
+
function createDateValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
return zod.z.coerce.date({ message: messages.invalidDate(attr) });
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { DEFAULT_VALIDATION_MESSAGES } from './chunk-UQVW4KPP.mjs';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
// src/lib/lru-cache.ts
|
|
5
|
+
var LRUCache = class {
|
|
6
|
+
constructor(capacity) {
|
|
7
|
+
if (capacity <= 0) {
|
|
8
|
+
throw new Error("LRU cache capacity must be greater than 0");
|
|
9
|
+
}
|
|
10
|
+
this.capacity = capacity;
|
|
11
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
12
|
+
}
|
|
13
|
+
get(key) {
|
|
14
|
+
const value = this.cache.get(key);
|
|
15
|
+
if (value !== void 0) {
|
|
16
|
+
this.cache.delete(key);
|
|
17
|
+
this.cache.set(key, value);
|
|
18
|
+
}
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
set(key, value) {
|
|
22
|
+
if (this.cache.has(key)) {
|
|
23
|
+
this.cache.delete(key);
|
|
24
|
+
} else if (this.cache.size >= this.capacity) {
|
|
25
|
+
const firstKey = this.cache.keys().next().value;
|
|
26
|
+
if (firstKey !== void 0) {
|
|
27
|
+
this.cache.delete(firstKey);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
this.cache.set(key, value);
|
|
31
|
+
}
|
|
32
|
+
has(key) {
|
|
33
|
+
return this.cache.has(key);
|
|
34
|
+
}
|
|
35
|
+
clear() {
|
|
36
|
+
this.cache.clear();
|
|
37
|
+
}
|
|
38
|
+
get size() {
|
|
39
|
+
return this.cache.size;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// src/validation/core/regex-cache.ts
|
|
44
|
+
function createRegexCache(capacity = 100) {
|
|
45
|
+
return new LRUCache(capacity);
|
|
46
|
+
}
|
|
47
|
+
function getCachedRegex(cache, pattern) {
|
|
48
|
+
let cached = cache.get(pattern);
|
|
49
|
+
if (!cached) {
|
|
50
|
+
cached = new RegExp(pattern);
|
|
51
|
+
cache.set(pattern, cached);
|
|
52
|
+
}
|
|
53
|
+
return cached;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/validation/primitives/text.ts
|
|
57
|
+
var textRegexCache = createRegexCache();
|
|
58
|
+
function createTextValidator(attr, messages = DEFAULT_VALIDATION_MESSAGES) {
|
|
59
|
+
let schema = z.string();
|
|
60
|
+
if (attr.minLength !== void 0) {
|
|
61
|
+
schema = schema.min(attr.minLength, messages.minLength(attr, attr.minLength));
|
|
62
|
+
}
|
|
63
|
+
if (attr.maxLength !== void 0) {
|
|
64
|
+
schema = schema.max(attr.maxLength, messages.maxLength(attr, attr.maxLength));
|
|
65
|
+
}
|
|
66
|
+
if (attr.pattern) {
|
|
67
|
+
schema = schema.regex(
|
|
68
|
+
getCachedRegex(textRegexCache, attr.pattern),
|
|
69
|
+
messages.invalidPattern(attr)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
return schema;
|
|
73
|
+
}
|
|
74
|
+
function createTextAreaValidator(_attr, _messages = DEFAULT_VALIDATION_MESSAGES) {
|
|
75
|
+
return z.string();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { createTextAreaValidator, createTextValidator };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
|
+
var zod = require('zod');
|
|
5
|
+
|
|
6
|
+
function createCheckboxValidator(_attr, _messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
|
+
return zod.z.boolean();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
exports.createCheckboxValidator = createCheckboxValidator;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var constants = require('@stndrds/constants');
|
|
5
5
|
var zod = require('zod');
|
|
6
6
|
var libphonenumberJs = require('libphonenumber-js');
|
|
@@ -63,25 +63,9 @@ function formatPhoneForDisplay(phone) {
|
|
|
63
63
|
}
|
|
64
64
|
return `${dial} ${phone.phoneNumber}`.trim();
|
|
65
65
|
}
|
|
66
|
-
function parseRawPhoneInput(rawInput, countryIso3) {
|
|
67
|
-
if (!rawInput || rawInput.trim() === "") {
|
|
68
|
-
return { success: false, error: "Phone number is empty" };
|
|
69
|
-
}
|
|
70
|
-
const normalized = normalizePhoneNumber(rawInput, countryIso3);
|
|
71
|
-
if (!normalized) {
|
|
72
|
-
return { success: false, error: "Could not extract digits from input" };
|
|
73
|
-
}
|
|
74
|
-
if (!validatePhoneNumber(normalized, countryIso3)) {
|
|
75
|
-
return { success: false, error: "Invalid phone number for country" };
|
|
76
|
-
}
|
|
77
|
-
return {
|
|
78
|
-
success: true,
|
|
79
|
-
phone: { countryCode: countryIso3, phoneNumber: normalized }
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
66
|
|
|
83
67
|
// src/validation/complex/phone.ts
|
|
84
|
-
function createPhoneValidator(attr, messages =
|
|
68
|
+
function createPhoneValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
85
69
|
return zod.z.object(
|
|
86
70
|
{
|
|
87
71
|
countryCode: zod.z.string().length(3),
|
|
@@ -100,6 +84,3 @@ function createPhoneValidator(attr, messages = chunk5SQEKHPW_js.DEFAULT_VALIDATI
|
|
|
100
84
|
|
|
101
85
|
exports.createPhoneValidator = createPhoneValidator;
|
|
102
86
|
exports.formatPhoneForDisplay = formatPhoneForDisplay;
|
|
103
|
-
exports.normalizePhoneNumber = normalizePhoneNumber;
|
|
104
|
-
exports.parseRawPhoneInput = parseRawPhoneInput;
|
|
105
|
-
exports.validatePhoneNumber = validatePhoneNumber;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createFormulaValidator(_attr, _messages =
|
|
6
|
+
function createFormulaValidator(_attr, _messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
return zod.z.unknown();
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
6
|
function extractRelationId(item) {
|
|
@@ -9,7 +9,7 @@ function extractRelationId(item) {
|
|
|
9
9
|
}
|
|
10
10
|
return item;
|
|
11
11
|
}
|
|
12
|
-
function createSingleRelationValidator(attr, messages =
|
|
12
|
+
function createSingleRelationValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
13
13
|
const uuidSchema = zod.z.uuid({
|
|
14
14
|
message: messages.invalidId(attr)
|
|
15
15
|
});
|
|
@@ -23,7 +23,7 @@ function createSingleRelationValidator(attr, messages = chunk5SQEKHPW_js.DEFAULT
|
|
|
23
23
|
// Allow additional properties (bilateral relations may have extra metadata)
|
|
24
24
|
]);
|
|
25
25
|
}
|
|
26
|
-
function createMultiRelationValidator(attr, messages =
|
|
26
|
+
function createMultiRelationValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
27
27
|
const uuidSchema = zod.z.uuid({
|
|
28
28
|
message: messages.invalidId(attr)
|
|
29
29
|
});
|
|
@@ -52,7 +52,7 @@ function createMultiRelationValidator(attr, messages = chunk5SQEKHPW_js.DEFAULT_
|
|
|
52
52
|
{ message: messages.invalidId(attr) }
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
|
-
function createRelationValidator(attr, messages =
|
|
55
|
+
function createRelationValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
56
56
|
if (attr.cardinality === "many") {
|
|
57
57
|
return createMultiRelationValidator(attr, messages);
|
|
58
58
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkT225DB55_js = require('./chunk-T225DB55.js');
|
|
4
4
|
var zod = require('zod');
|
|
5
5
|
|
|
6
|
-
function createRichtextValidator(attr, messages =
|
|
6
|
+
function createRichtextValidator(attr, messages = chunkT225DB55_js.DEFAULT_VALIDATION_MESSAGES) {
|
|
7
7
|
return zod.z.string({
|
|
8
8
|
message: messages.invalidRichtext(attr)
|
|
9
9
|
});
|
|
@@ -15,17 +15,6 @@ function generateId() {
|
|
|
15
15
|
return v.toString(16);
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
|
-
function generatePrefixedId(prefix) {
|
|
19
|
-
return `${prefix}_${generateId()}`;
|
|
20
|
-
}
|
|
21
|
-
function slugify(input) {
|
|
22
|
-
return input.normalize("NFD").replace(/\p{M}/gu, "").toLowerCase().replace(/[^a-z0-9\s_-]/g, "").trim().replace(/\s+/g, "-").replace(/-+/g, "-");
|
|
23
|
-
}
|
|
24
|
-
function generateTemplateName(label) {
|
|
25
|
-
const slug = slugify(label) || "template";
|
|
26
|
-
const suffix = generateId().slice(0, 8);
|
|
27
|
-
return `${slug}-${suffix}`;
|
|
28
|
-
}
|
|
29
18
|
function indexBy(items, keyFn) {
|
|
30
19
|
return new Map(items.map((item) => [keyFn(item), item]));
|
|
31
20
|
}
|
|
@@ -49,4 +38,4 @@ function deepEqual(a, b) {
|
|
|
49
38
|
return false;
|
|
50
39
|
}
|
|
51
40
|
|
|
52
|
-
export { asTenantId, asUserId, deepEqual, generateId,
|
|
41
|
+
export { asTenantId, asUserId, deepEqual, generateId, indexBy };
|