@boltstore/utils 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/auth-types.d.ts +138 -0
- package/dist/auth-types.d.ts.map +1 -0
- package/dist/auth-types.js +4 -0
- package/dist/auth-types.js.map +1 -0
- package/dist/constants.d.ts +123 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +144 -0
- package/dist/constants.js.map +1 -0
- package/dist/filter/compiler.d.ts +14 -0
- package/dist/filter/compiler.d.ts.map +1 -0
- package/dist/filter/compiler.js +93 -0
- package/dist/filter/compiler.js.map +1 -0
- package/dist/filter/parser.d.ts +15 -0
- package/dist/filter/parser.d.ts.map +1 -0
- package/dist/filter/parser.js +134 -0
- package/dist/filter/parser.js.map +1 -0
- package/dist/filter/query.d.ts +13 -0
- package/dist/filter/query.d.ts.map +1 -0
- package/dist/filter/query.js +20 -0
- package/dist/filter/query.js.map +1 -0
- package/dist/filter/tokenizer.d.ts +17 -0
- package/dist/filter/tokenizer.d.ts.map +1 -0
- package/dist/filter/tokenizer.js +133 -0
- package/dist/filter/tokenizer.js.map +1 -0
- package/dist/filter/types.d.ts +24 -0
- package/dist/filter/types.d.ts.map +1 -0
- package/dist/filter/types.js +3 -0
- package/dist/filter/types.js.map +1 -0
- package/dist/filter.d.ts +7 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +12 -0
- package/dist/filter.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/realtime-types.d.ts +90 -0
- package/dist/realtime-types.d.ts.map +1 -0
- package/dist/realtime-types.js +4 -0
- package/dist/realtime-types.js.map +1 -0
- package/dist/schema.d.ts +612 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +209 -0
- package/dist/schema.js.map +1 -0
- package/dist/storage-types.d.ts +117 -0
- package/dist/storage-types.d.ts.map +1 -0
- package/dist/storage-types.js +4 -0
- package/dist/storage-types.js.map +1 -0
- package/dist/sync-types.d.ts +136 -0
- package/dist/sync-types.d.ts.map +1 -0
- package/dist/sync-types.js +4 -0
- package/dist/sync-types.js.map +1 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +30 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +259 -0
- package/dist/validation.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2DAA2D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { FieldSchema, FieldType } from "./types";
|
|
2
|
+
export interface ValidationError {
|
|
3
|
+
field: string;
|
|
4
|
+
code: string;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ValidationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
errors: ValidationError[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Validate a single field value against its schema.
|
|
13
|
+
*/
|
|
14
|
+
export declare function validateField(value: unknown, field: FieldSchema): ValidationError | null;
|
|
15
|
+
/**
|
|
16
|
+
* Validate a record's data against a collection's field schemas.
|
|
17
|
+
* Only validates fields that are present in the data object.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateRecord(data: Record<string, unknown>, fields: FieldSchema[], options?: {
|
|
20
|
+
partial?: boolean;
|
|
21
|
+
}): ValidationResult;
|
|
22
|
+
/**
|
|
23
|
+
* Check if a value matches the expected type without full validation.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isValidType(value: unknown, type: FieldType): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Apply default values from field schemas to a data object.
|
|
28
|
+
*/
|
|
29
|
+
export declare function applyDefaults(data: Record<string, unknown>, fields: FieldSchema[]): Record<string, unknown>;
|
|
30
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGtD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAyMD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,WAAW,GACjB,eAAe,GAAG,IAAI,CAMxB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9B,gBAAgB,CAgClB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAqBpE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,WAAW,EAAE,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// ── Field Validation ──
|
|
2
|
+
// Pure functions, zero dependencies. Used by both server and client.
|
|
3
|
+
import { ErrorCodes } from "./constants";
|
|
4
|
+
// ── Individual Validators ──
|
|
5
|
+
const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
6
|
+
const URL_REGEX = /^https?:\/\/.+/i;
|
|
7
|
+
function validateRequired(value, field) {
|
|
8
|
+
if (field.required && (value === undefined || value === null || value === "")) {
|
|
9
|
+
return {
|
|
10
|
+
field: field.name,
|
|
11
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
12
|
+
message: `Field "${field.name}" is required`,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
function validateType(value, field) {
|
|
18
|
+
if (value === undefined || value === null)
|
|
19
|
+
return null;
|
|
20
|
+
const type = field.type;
|
|
21
|
+
switch (type) {
|
|
22
|
+
case "text":
|
|
23
|
+
case "email":
|
|
24
|
+
case "url":
|
|
25
|
+
case "select":
|
|
26
|
+
if (typeof value !== "string") {
|
|
27
|
+
return {
|
|
28
|
+
field: field.name,
|
|
29
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
30
|
+
message: `Field "${field.name}" must be a string, got ${typeof value}`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
case "number":
|
|
35
|
+
if (typeof value !== "number" || Number.isNaN(value)) {
|
|
36
|
+
return {
|
|
37
|
+
field: field.name,
|
|
38
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
39
|
+
message: `Field "${field.name}" must be a number, got ${typeof value}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
case "bool":
|
|
44
|
+
if (typeof value !== "boolean") {
|
|
45
|
+
return {
|
|
46
|
+
field: field.name,
|
|
47
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
48
|
+
message: `Field "${field.name}" must be a boolean, got ${typeof value}`,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case "date":
|
|
53
|
+
if (typeof value !== "string" || Number.isNaN(Date.parse(value))) {
|
|
54
|
+
return {
|
|
55
|
+
field: field.name,
|
|
56
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
57
|
+
message: `Field "${field.name}" must be a valid ISO 8601 date string`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
case "json":
|
|
62
|
+
// JSON fields accept objects, arrays, and primitives
|
|
63
|
+
if (typeof value === "function" || typeof value === "symbol") {
|
|
64
|
+
return {
|
|
65
|
+
field: field.name,
|
|
66
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
67
|
+
message: `Field "${field.name}" must be valid JSON`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
break;
|
|
71
|
+
case "file":
|
|
72
|
+
if (typeof value !== "string") {
|
|
73
|
+
return {
|
|
74
|
+
field: field.name,
|
|
75
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
76
|
+
message: `Field "${field.name}" must be a file ID string`,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
break;
|
|
80
|
+
case "relation":
|
|
81
|
+
if (typeof value !== "string") {
|
|
82
|
+
return {
|
|
83
|
+
field: field.name,
|
|
84
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
85
|
+
message: `Field "${field.name}" must be a relation ID string`,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
function validateConstraints(value, field) {
|
|
93
|
+
if (value === undefined || value === null)
|
|
94
|
+
return null;
|
|
95
|
+
const type = field.type;
|
|
96
|
+
// String constraints
|
|
97
|
+
if (type === "text" || type === "email" || type === "url" || type === "select") {
|
|
98
|
+
const str = value;
|
|
99
|
+
if (field.min !== undefined && str.length < field.min) {
|
|
100
|
+
return {
|
|
101
|
+
field: field.name,
|
|
102
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
103
|
+
message: `Field "${field.name}" must be at least ${field.min} characters`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (field.maxLength !== undefined && str.length > field.maxLength) {
|
|
107
|
+
return {
|
|
108
|
+
field: field.name,
|
|
109
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
110
|
+
message: `Field "${field.name}" must be at most ${field.maxLength} characters`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (field.pattern) {
|
|
114
|
+
try {
|
|
115
|
+
const regex = new RegExp(field.pattern);
|
|
116
|
+
if (!regex.test(str)) {
|
|
117
|
+
return {
|
|
118
|
+
field: field.name,
|
|
119
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
120
|
+
message: `Field "${field.name}" does not match the required pattern`,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
return {
|
|
126
|
+
field: field.name,
|
|
127
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
128
|
+
message: `Field "${field.name}" has an invalid pattern`,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Email-specific
|
|
134
|
+
if (type === "email" && typeof value === "string" && !EMAIL_REGEX.test(value)) {
|
|
135
|
+
return {
|
|
136
|
+
field: field.name,
|
|
137
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
138
|
+
message: `Field "${field.name}" must be a valid email address`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// URL-specific
|
|
142
|
+
if (type === "url" && typeof value === "string" && !URL_REGEX.test(value)) {
|
|
143
|
+
return {
|
|
144
|
+
field: field.name,
|
|
145
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
146
|
+
message: `Field "${field.name}" must be a valid URL`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
// Select-specific
|
|
150
|
+
if (type === "select" && field.values && typeof value === "string") {
|
|
151
|
+
if (!field.values.includes(value)) {
|
|
152
|
+
return {
|
|
153
|
+
field: field.name,
|
|
154
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
155
|
+
message: `Field "${field.name}" must be one of: ${field.values.join(", ")}`,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Number constraints
|
|
160
|
+
if (type === "number" && typeof value === "number") {
|
|
161
|
+
if (field.min !== undefined && value < field.min) {
|
|
162
|
+
return {
|
|
163
|
+
field: field.name,
|
|
164
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
165
|
+
message: `Field "${field.name}" must be at least ${field.min}`,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
if (field.max !== undefined && value > field.max) {
|
|
169
|
+
return {
|
|
170
|
+
field: field.name,
|
|
171
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
172
|
+
message: `Field "${field.name}" must be at most ${field.max}`,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
// ── Main Validation API ──
|
|
179
|
+
/**
|
|
180
|
+
* Validate a single field value against its schema.
|
|
181
|
+
*/
|
|
182
|
+
export function validateField(value, field) {
|
|
183
|
+
return (validateRequired(value, field) ??
|
|
184
|
+
validateType(value, field) ??
|
|
185
|
+
validateConstraints(value, field));
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Validate a record's data against a collection's field schemas.
|
|
189
|
+
* Only validates fields that are present in the data object.
|
|
190
|
+
*/
|
|
191
|
+
export function validateRecord(data, fields, options) {
|
|
192
|
+
const errors = [];
|
|
193
|
+
const fieldMap = new Map(fields.map((f) => [f.name, f]));
|
|
194
|
+
// Check all provided fields
|
|
195
|
+
for (const [key, value] of Object.entries(data)) {
|
|
196
|
+
const field = fieldMap.get(key);
|
|
197
|
+
if (!field) {
|
|
198
|
+
// Unknown fields are allowed — they get stored in the JSON blob
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const error = validateField(value, field);
|
|
202
|
+
if (error)
|
|
203
|
+
errors.push(error);
|
|
204
|
+
}
|
|
205
|
+
// For non-partial (create) operations, check required fields
|
|
206
|
+
if (!options?.partial) {
|
|
207
|
+
for (const field of fields) {
|
|
208
|
+
if (field.required && !(field.name in data)) {
|
|
209
|
+
errors.push({
|
|
210
|
+
field: field.name,
|
|
211
|
+
code: ErrorCodes.VALIDATION_ERROR,
|
|
212
|
+
message: `Field "${field.name}" is required`,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
valid: errors.length === 0,
|
|
219
|
+
errors,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Check if a value matches the expected type without full validation.
|
|
224
|
+
*/
|
|
225
|
+
export function isValidType(value, type) {
|
|
226
|
+
switch (type) {
|
|
227
|
+
case "text":
|
|
228
|
+
case "email":
|
|
229
|
+
case "url":
|
|
230
|
+
case "select":
|
|
231
|
+
return typeof value === "string";
|
|
232
|
+
case "number":
|
|
233
|
+
return typeof value === "number" && !Number.isNaN(value);
|
|
234
|
+
case "bool":
|
|
235
|
+
return typeof value === "boolean";
|
|
236
|
+
case "date":
|
|
237
|
+
return typeof value === "string" && !Number.isNaN(Date.parse(value));
|
|
238
|
+
case "json":
|
|
239
|
+
return typeof value !== "function" && typeof value !== "symbol";
|
|
240
|
+
case "file":
|
|
241
|
+
case "relation":
|
|
242
|
+
return typeof value === "string";
|
|
243
|
+
default:
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Apply default values from field schemas to a data object.
|
|
249
|
+
*/
|
|
250
|
+
export function applyDefaults(data, fields) {
|
|
251
|
+
const result = { ...data };
|
|
252
|
+
for (const field of fields) {
|
|
253
|
+
if (field.default !== undefined && !(field.name in result)) {
|
|
254
|
+
result[field.name] = field.default;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@boltstore/utils",
|
|
3
|
+
"version": "0.5.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"description": "Shared TypeScript types, validation, and utilities for Boltstore",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./types": {
|
|
16
|
+
"types": "./dist/types.d.ts",
|
|
17
|
+
"import": "./dist/types.js"
|
|
18
|
+
},
|
|
19
|
+
"./validation": {
|
|
20
|
+
"types": "./dist/validation.d.ts",
|
|
21
|
+
"import": "./dist/validation.js"
|
|
22
|
+
},
|
|
23
|
+
"./filter": {
|
|
24
|
+
"types": "./dist/filter.d.ts",
|
|
25
|
+
"import": "./dist/filter.js"
|
|
26
|
+
},
|
|
27
|
+
"./sync-types": {
|
|
28
|
+
"types": "./dist/sync-types.d.ts",
|
|
29
|
+
"import": "./dist/sync-types.js"
|
|
30
|
+
},
|
|
31
|
+
"./realtime-types": {
|
|
32
|
+
"types": "./dist/realtime-types.d.ts",
|
|
33
|
+
"import": "./dist/realtime-types.js"
|
|
34
|
+
},
|
|
35
|
+
"./auth-types": {
|
|
36
|
+
"types": "./dist/auth-types.d.ts",
|
|
37
|
+
"import": "./dist/auth-types.js"
|
|
38
|
+
},
|
|
39
|
+
"./storage-types": {
|
|
40
|
+
"types": "./dist/storage-types.d.ts",
|
|
41
|
+
"import": "./dist/storage-types.js"
|
|
42
|
+
},
|
|
43
|
+
"./constants": {
|
|
44
|
+
"types": "./dist/constants.d.ts",
|
|
45
|
+
"import": "./dist/constants.js"
|
|
46
|
+
},
|
|
47
|
+
"./schema": {
|
|
48
|
+
"types": "./dist/schema.d.ts",
|
|
49
|
+
"import": "./dist/schema.js"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"test": "bun test",
|
|
54
|
+
"check": "tsc --noEmit",
|
|
55
|
+
"build": "tsc",
|
|
56
|
+
"prepublishOnly": "bun run build"
|
|
57
|
+
},
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@types/bun": "latest",
|
|
60
|
+
"typescript": "^5.7.0"
|
|
61
|
+
},
|
|
62
|
+
"files": [
|
|
63
|
+
"dist/",
|
|
64
|
+
"README.md"
|
|
65
|
+
],
|
|
66
|
+
"license": "MIT",
|
|
67
|
+
"repository": {
|
|
68
|
+
"type": "git",
|
|
69
|
+
"url": "https://github.com/boltstore/utils"
|
|
70
|
+
},
|
|
71
|
+
"publishConfig": {
|
|
72
|
+
"access": "public"
|
|
73
|
+
}
|
|
74
|
+
}
|