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