@regle/core 0.6.1 → 0.7.1-beta.1
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/regle-core.cjs +180 -94
- package/dist/regle-core.d.cts +8 -5
- package/dist/regle-core.d.ts +8 -5
- package/dist/regle-core.min.cjs +2 -2
- package/dist/regle-core.min.mjs +2 -2
- package/dist/regle-core.mjs +180 -94
- package/package.json +2 -1
package/dist/regle-core.cjs
CHANGED
|
@@ -4,7 +4,7 @@ var vue = require('vue');
|
|
|
4
4
|
|
|
5
5
|
// ../shared/utils/isEmpty.ts
|
|
6
6
|
function isEmpty(value) {
|
|
7
|
-
if (value ===
|
|
7
|
+
if (value === undefined || value === null) {
|
|
8
8
|
return true;
|
|
9
9
|
}
|
|
10
10
|
if (value instanceof Date) {
|
|
@@ -310,7 +310,7 @@ function useStorage() {
|
|
|
310
310
|
}
|
|
311
311
|
function checkRuleDeclEntry($path, newRules) {
|
|
312
312
|
const storedRulesDefs = ruleDeclStorage.value.get($path);
|
|
313
|
-
if (!storedRulesDefs) return
|
|
313
|
+
if (!storedRulesDefs) return undefined;
|
|
314
314
|
const storedRules = storedRulesDefs;
|
|
315
315
|
const isValidCache = areRulesChanged(newRules, storedRules);
|
|
316
316
|
if (!isValidCache) return { valid: false };
|
|
@@ -405,7 +405,7 @@ function debounce(func, wait, immediate) {
|
|
|
405
405
|
const debouncedFn = (...args) => new Promise((resolve) => {
|
|
406
406
|
clearTimeout(timeout);
|
|
407
407
|
timeout = setTimeout(() => {
|
|
408
|
-
timeout =
|
|
408
|
+
timeout = undefined;
|
|
409
409
|
{
|
|
410
410
|
Promise.resolve(func.apply(this, [...args])).then(resolve);
|
|
411
411
|
}
|
|
@@ -413,7 +413,7 @@ function debounce(func, wait, immediate) {
|
|
|
413
413
|
});
|
|
414
414
|
debouncedFn.cancel = () => {
|
|
415
415
|
clearTimeout(timeout);
|
|
416
|
-
timeout =
|
|
416
|
+
timeout = undefined;
|
|
417
417
|
};
|
|
418
418
|
return debouncedFn;
|
|
419
419
|
}
|
|
@@ -475,10 +475,10 @@ function extractRulesErrors({
|
|
|
475
475
|
field,
|
|
476
476
|
silent = false
|
|
477
477
|
}) {
|
|
478
|
-
return Object.entries(field.$rules ?? {}).map(([
|
|
478
|
+
return Object.entries(field.$rules ?? {}).map(([_, rule]) => {
|
|
479
479
|
if (silent) {
|
|
480
480
|
return rule.$message;
|
|
481
|
-
} else if (!rule.$valid && field.$
|
|
481
|
+
} else if (!rule.$valid && field.$error && !rule.$validating) {
|
|
482
482
|
return rule.$message;
|
|
483
483
|
}
|
|
484
484
|
return null;
|
|
@@ -488,10 +488,10 @@ function extractRulesErrors({
|
|
|
488
488
|
} else {
|
|
489
489
|
return acc?.concat(value);
|
|
490
490
|
}
|
|
491
|
-
}, []).concat(field.$
|
|
491
|
+
}, []).concat(field.$error ? field.$externalErrors ?? [] : []).concat(field.$error ? field.$schemaErrors ?? [] : []);
|
|
492
492
|
}
|
|
493
493
|
function extractRulesTooltips({ field }) {
|
|
494
|
-
return Object.entries(field.$rules ?? {}).map(([
|
|
494
|
+
return Object.entries(field.$rules ?? {}).map(([_, rule]) => rule.$tooltip).filter((tooltip) => !!tooltip).reduce((acc, value) => {
|
|
495
495
|
if (typeof value === "string") {
|
|
496
496
|
return acc?.concat([value]);
|
|
497
497
|
} else {
|
|
@@ -546,7 +546,7 @@ function createReactiveRuleStatus({
|
|
|
546
546
|
});
|
|
547
547
|
function computeRuleProcessor(key) {
|
|
548
548
|
let result = "";
|
|
549
|
-
const customProcessor = customMessages ? customMessages[ruleKey]?.[key] :
|
|
549
|
+
const customProcessor = customMessages ? customMessages[ruleKey]?.[key] : undefined;
|
|
550
550
|
if (customProcessor) {
|
|
551
551
|
if (typeof customProcessor === "function") {
|
|
552
552
|
result = customProcessor($defaultMetadata.value);
|
|
@@ -720,6 +720,8 @@ function createReactiveFieldStatus({
|
|
|
720
720
|
storage,
|
|
721
721
|
options,
|
|
722
722
|
externalErrors,
|
|
723
|
+
schemaErrors,
|
|
724
|
+
schemaMode,
|
|
723
725
|
onUnwatch,
|
|
724
726
|
$isArray,
|
|
725
727
|
initialState,
|
|
@@ -812,7 +814,7 @@ function createReactiveFieldStatus({
|
|
|
812
814
|
}
|
|
813
815
|
scopeState = scope.run(() => {
|
|
814
816
|
const $dirty = vue.ref(false);
|
|
815
|
-
const
|
|
817
|
+
const triggerPunishment2 = vue.ref(false);
|
|
816
818
|
const $anyDirty = vue.computed(() => $dirty.value);
|
|
817
819
|
const $debounce2 = vue.computed(() => {
|
|
818
820
|
return $localOptions.value.$debounce;
|
|
@@ -868,16 +870,25 @@ function createReactiveFieldStatus({
|
|
|
868
870
|
return $invalid.value && !$pending.value && $dirty.value;
|
|
869
871
|
});
|
|
870
872
|
const $errors = vue.computed(() => {
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
873
|
+
return extractRulesErrors({
|
|
874
|
+
field: {
|
|
875
|
+
$error: $error.value,
|
|
876
|
+
$externalErrors: externalErrors?.value,
|
|
877
|
+
$schemaErrors: schemaErrors?.value,
|
|
878
|
+
$rules: $rules.value
|
|
879
|
+
}
|
|
880
|
+
});
|
|
881
|
+
});
|
|
882
|
+
const $silentErrors = vue.computed(() => {
|
|
883
|
+
return extractRulesErrors({
|
|
884
|
+
field: {
|
|
885
|
+
$error: true,
|
|
886
|
+
$externalErrors: externalErrors?.value,
|
|
887
|
+
$schemaErrors: schemaErrors?.value,
|
|
888
|
+
$rules: $rules.value
|
|
889
|
+
},
|
|
890
|
+
silent: true
|
|
891
|
+
});
|
|
881
892
|
});
|
|
882
893
|
const $edited = vue.computed(() => {
|
|
883
894
|
if ($dirty.value) {
|
|
@@ -902,16 +913,6 @@ function createReactiveFieldStatus({
|
|
|
902
913
|
}
|
|
903
914
|
});
|
|
904
915
|
});
|
|
905
|
-
const $silentErrors = vue.computed(() => {
|
|
906
|
-
return extractRulesErrors({
|
|
907
|
-
field: {
|
|
908
|
-
$dirty: $dirty.value,
|
|
909
|
-
$externalErrors: externalErrors?.value,
|
|
910
|
-
$rules: $rules.value
|
|
911
|
-
},
|
|
912
|
-
silent: true
|
|
913
|
-
});
|
|
914
|
-
});
|
|
915
916
|
const $ready = vue.computed(() => {
|
|
916
917
|
if (!$autoDirty2.value) {
|
|
917
918
|
return !($invalid.value || $pending.value);
|
|
@@ -919,7 +920,7 @@ function createReactiveFieldStatus({
|
|
|
919
920
|
return $anyDirty.value && !($invalid.value || $pending.value);
|
|
920
921
|
});
|
|
921
922
|
const $pending = vue.computed(() => {
|
|
922
|
-
if (
|
|
923
|
+
if (triggerPunishment2.value || !$rewardEarly2.value) {
|
|
923
924
|
return Object.entries($rules.value).some(([key, ruleResult]) => {
|
|
924
925
|
return ruleResult.$pending;
|
|
925
926
|
});
|
|
@@ -927,11 +928,11 @@ function createReactiveFieldStatus({
|
|
|
927
928
|
return false;
|
|
928
929
|
});
|
|
929
930
|
const $invalid = vue.computed(() => {
|
|
930
|
-
if (externalErrors?.value?.length) {
|
|
931
|
+
if (externalErrors?.value?.length || schemaErrors?.value?.length) {
|
|
931
932
|
return true;
|
|
932
|
-
} else if (
|
|
933
|
+
} else if ($inactive.value) {
|
|
933
934
|
return false;
|
|
934
|
-
} else if (!$rewardEarly2.value || $rewardEarly2.value &&
|
|
935
|
+
} else if (!$rewardEarly2.value || $rewardEarly2.value && triggerPunishment2.value) {
|
|
935
936
|
return Object.entries($rules.value).some(([_, ruleResult]) => {
|
|
936
937
|
return !ruleResult.$valid;
|
|
937
938
|
});
|
|
@@ -940,7 +941,7 @@ function createReactiveFieldStatus({
|
|
|
940
941
|
});
|
|
941
942
|
const $name = vue.computed(() => fieldName);
|
|
942
943
|
const $inactive = vue.computed(() => {
|
|
943
|
-
if (isEmpty($rules.value)) {
|
|
944
|
+
if (isEmpty($rules.value) && !schemaMode) {
|
|
944
945
|
return true;
|
|
945
946
|
}
|
|
946
947
|
return false;
|
|
@@ -951,9 +952,13 @@ function createReactiveFieldStatus({
|
|
|
951
952
|
} else if ($inactive.value) {
|
|
952
953
|
return false;
|
|
953
954
|
} else if ($dirty.value && !isEmpty(state.value) && !$validating2.value) {
|
|
954
|
-
|
|
955
|
-
return
|
|
956
|
-
}
|
|
955
|
+
if (schemaMode) {
|
|
956
|
+
return !schemaErrors?.value?.length;
|
|
957
|
+
} else {
|
|
958
|
+
return Object.values($rules.value).every((ruleResult) => {
|
|
959
|
+
return ruleResult.$valid && ruleResult.$active;
|
|
960
|
+
});
|
|
961
|
+
}
|
|
957
962
|
}
|
|
958
963
|
return false;
|
|
959
964
|
});
|
|
@@ -1001,7 +1006,7 @@ function createReactiveFieldStatus({
|
|
|
1001
1006
|
const $shortcuts2 = {};
|
|
1002
1007
|
vue.watch($invalid, (value) => {
|
|
1003
1008
|
if (!value) {
|
|
1004
|
-
|
|
1009
|
+
triggerPunishment2.value = false;
|
|
1005
1010
|
}
|
|
1006
1011
|
});
|
|
1007
1012
|
return {
|
|
@@ -1026,7 +1031,7 @@ function createReactiveFieldStatus({
|
|
|
1026
1031
|
$validating: $validating2,
|
|
1027
1032
|
$tooltips,
|
|
1028
1033
|
$dirty,
|
|
1029
|
-
triggerPunishment,
|
|
1034
|
+
triggerPunishment: triggerPunishment2,
|
|
1030
1035
|
processShortcuts,
|
|
1031
1036
|
$silentValue,
|
|
1032
1037
|
$inactive
|
|
@@ -1109,7 +1114,9 @@ function createReactiveFieldStatus({
|
|
|
1109
1114
|
} else if (scopeState.$autoDirty.value && scopeState.$dirty.value && !scopeState.$pending.value) {
|
|
1110
1115
|
return { result: !scopeState.$error.value, data };
|
|
1111
1116
|
}
|
|
1112
|
-
if (
|
|
1117
|
+
if (schemaMode) {
|
|
1118
|
+
return { result: !schemaErrors?.value?.length, data };
|
|
1119
|
+
} else if (isEmpty($rules.value)) {
|
|
1113
1120
|
return { result: true, data };
|
|
1114
1121
|
}
|
|
1115
1122
|
const results = await Promise.allSettled(
|
|
@@ -1160,6 +1167,7 @@ function createReactiveFieldStatus({
|
|
|
1160
1167
|
$haveAnyAsyncRule,
|
|
1161
1168
|
$debounce,
|
|
1162
1169
|
$lazy,
|
|
1170
|
+
triggerPunishment,
|
|
1163
1171
|
...restScope
|
|
1164
1172
|
} = scopeState;
|
|
1165
1173
|
return vue.reactive({
|
|
@@ -1188,9 +1196,11 @@ function createCollectionElement({
|
|
|
1188
1196
|
customMessages,
|
|
1189
1197
|
rules,
|
|
1190
1198
|
externalErrors,
|
|
1199
|
+
schemaErrors,
|
|
1191
1200
|
initialState,
|
|
1192
1201
|
shortcuts,
|
|
1193
|
-
fieldName
|
|
1202
|
+
fieldName,
|
|
1203
|
+
schemaMode
|
|
1194
1204
|
}) {
|
|
1195
1205
|
const $fieldId = rules.$key ? rules.$key : randomId();
|
|
1196
1206
|
let $path = `${path}.${String($fieldId)}`;
|
|
@@ -1208,6 +1218,8 @@ function createCollectionElement({
|
|
|
1208
1218
|
$path = `${path}.${stateValue.value.$id}`;
|
|
1209
1219
|
}
|
|
1210
1220
|
}
|
|
1221
|
+
const $externalErrors = vue.toRef(externalErrors?.value ?? [], index);
|
|
1222
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.[index]);
|
|
1211
1223
|
const $status = createReactiveChildrenStatus({
|
|
1212
1224
|
state: stateValue,
|
|
1213
1225
|
rulesDef: vue.toRef(() => rules),
|
|
@@ -1215,10 +1227,12 @@ function createCollectionElement({
|
|
|
1215
1227
|
path: $path,
|
|
1216
1228
|
storage,
|
|
1217
1229
|
options,
|
|
1218
|
-
externalErrors:
|
|
1230
|
+
externalErrors: $externalErrors,
|
|
1231
|
+
schemaErrors: $schemaErrors,
|
|
1219
1232
|
initialState,
|
|
1220
1233
|
shortcuts,
|
|
1221
|
-
fieldName
|
|
1234
|
+
fieldName,
|
|
1235
|
+
schemaMode
|
|
1222
1236
|
});
|
|
1223
1237
|
if ($status) {
|
|
1224
1238
|
const valueId = stateValue.value?.$id;
|
|
@@ -1237,6 +1251,8 @@ function createReactiveCollectionStatus({
|
|
|
1237
1251
|
storage,
|
|
1238
1252
|
options,
|
|
1239
1253
|
externalErrors,
|
|
1254
|
+
schemaErrors,
|
|
1255
|
+
schemaMode,
|
|
1240
1256
|
initialState,
|
|
1241
1257
|
shortcuts,
|
|
1242
1258
|
fieldName
|
|
@@ -1247,7 +1263,7 @@ function createReactiveCollectionStatus({
|
|
|
1247
1263
|
let immediateScopeState;
|
|
1248
1264
|
let collectionScopes = [];
|
|
1249
1265
|
if (!Array.isArray(state.value) && !rulesDef.value.$each) {
|
|
1250
|
-
return
|
|
1266
|
+
return undefined;
|
|
1251
1267
|
}
|
|
1252
1268
|
const $id = vue.ref();
|
|
1253
1269
|
const $value = vue.ref(state.value);
|
|
@@ -1300,6 +1316,8 @@ function createReactiveCollectionStatus({
|
|
|
1300
1316
|
collectionScopes.push(scope2);
|
|
1301
1317
|
}
|
|
1302
1318
|
const initialStateRef = vue.toRef(initialState.value ?? [], index);
|
|
1319
|
+
const $externalErrors = vue.toRef(externalErrors?.value ?? {}, `$each`);
|
|
1320
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.$each);
|
|
1303
1321
|
const element = createCollectionElement({
|
|
1304
1322
|
$id: $id.value,
|
|
1305
1323
|
path,
|
|
@@ -1309,10 +1327,12 @@ function createReactiveCollectionStatus({
|
|
|
1309
1327
|
index,
|
|
1310
1328
|
options,
|
|
1311
1329
|
storage,
|
|
1312
|
-
externalErrors:
|
|
1330
|
+
externalErrors: $externalErrors,
|
|
1331
|
+
schemaErrors: $schemaErrors,
|
|
1313
1332
|
initialState: initialStateRef,
|
|
1314
1333
|
shortcuts,
|
|
1315
|
-
fieldName
|
|
1334
|
+
fieldName,
|
|
1335
|
+
schemaMode
|
|
1316
1336
|
});
|
|
1317
1337
|
if (element) {
|
|
1318
1338
|
return element;
|
|
@@ -1330,10 +1350,12 @@ function createReactiveCollectionStatus({
|
|
|
1330
1350
|
storage,
|
|
1331
1351
|
options,
|
|
1332
1352
|
externalErrors: vue.toRef(externalErrors?.value ?? {}, `$self`),
|
|
1353
|
+
schemaErrors: vue.computed(() => schemaErrors?.value?.$self),
|
|
1333
1354
|
$isArray: true,
|
|
1334
1355
|
initialState,
|
|
1335
1356
|
shortcuts,
|
|
1336
|
-
fieldName
|
|
1357
|
+
fieldName,
|
|
1358
|
+
schemaMode
|
|
1337
1359
|
});
|
|
1338
1360
|
}
|
|
1339
1361
|
function updateStatus() {
|
|
@@ -1353,26 +1375,28 @@ function createReactiveCollectionStatus({
|
|
|
1353
1375
|
if (scope2) {
|
|
1354
1376
|
collectionScopes.push(scope2);
|
|
1355
1377
|
}
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1378
|
+
const $externalErrors = vue.toRef(externalErrors?.value ?? {}, `$each`);
|
|
1379
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.$each ?? []);
|
|
1380
|
+
const element = createCollectionElement({
|
|
1381
|
+
$id: $id.value,
|
|
1382
|
+
path,
|
|
1383
|
+
customMessages,
|
|
1384
|
+
rules: unwrapped ?? {},
|
|
1385
|
+
stateValue: currentValue,
|
|
1386
|
+
index,
|
|
1387
|
+
options,
|
|
1388
|
+
storage,
|
|
1389
|
+
externalErrors: $externalErrors,
|
|
1390
|
+
schemaErrors: $schemaErrors,
|
|
1391
|
+
initialState: vue.toRef(initialState.value ?? [], index),
|
|
1392
|
+
shortcuts,
|
|
1393
|
+
fieldName,
|
|
1394
|
+
schemaMode
|
|
1395
|
+
});
|
|
1396
|
+
if (element) {
|
|
1397
|
+
return element;
|
|
1375
1398
|
}
|
|
1399
|
+
return null;
|
|
1376
1400
|
}
|
|
1377
1401
|
}).filter((each) => !!each);
|
|
1378
1402
|
previousStatus.filter(($each) => !state.value?.find((f) => $each.$id === f.$id)).forEach((_, index) => {
|
|
@@ -1628,6 +1652,8 @@ function createReactiveNestedStatus({
|
|
|
1628
1652
|
path = "",
|
|
1629
1653
|
rootRules,
|
|
1630
1654
|
externalErrors,
|
|
1655
|
+
schemaErrors,
|
|
1656
|
+
rootSchemaErrors,
|
|
1631
1657
|
validationGroups,
|
|
1632
1658
|
initialState,
|
|
1633
1659
|
fieldName,
|
|
@@ -1637,6 +1663,7 @@ function createReactiveNestedStatus({
|
|
|
1637
1663
|
let scopeState;
|
|
1638
1664
|
let nestedScopes = [];
|
|
1639
1665
|
let $unwatchRules = null;
|
|
1666
|
+
let $unwatchSchemaErrors = null;
|
|
1640
1667
|
let $unwatchExternalErrors = null;
|
|
1641
1668
|
let $unwatchState = null;
|
|
1642
1669
|
async function createReactiveFieldsStatus(watchSources = true) {
|
|
@@ -1647,6 +1674,7 @@ function createReactiveNestedStatus({
|
|
|
1647
1674
|
const stateRef = vue.toRef(state.value ?? {}, statePropKey);
|
|
1648
1675
|
const statePropRulesRef = vue.toRef(() => statePropRules);
|
|
1649
1676
|
const $externalErrors = vue.toRef(externalErrors?.value ?? {}, statePropKey);
|
|
1677
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.[statePropKey]);
|
|
1650
1678
|
const initialStateRef = vue.toRef(initialState?.value ?? {}, statePropKey);
|
|
1651
1679
|
return [
|
|
1652
1680
|
statePropKey,
|
|
@@ -1655,6 +1683,7 @@ function createReactiveNestedStatus({
|
|
|
1655
1683
|
rulesDef: statePropRulesRef,
|
|
1656
1684
|
path: path ? `${path}.${statePropKey}` : statePropKey,
|
|
1657
1685
|
externalErrors: $externalErrors,
|
|
1686
|
+
schemaErrors: $schemaErrors,
|
|
1658
1687
|
initialState: initialStateRef,
|
|
1659
1688
|
fieldName: statePropKey,
|
|
1660
1689
|
...commonArgs
|
|
@@ -1667,6 +1696,8 @@ function createReactiveNestedStatus({
|
|
|
1667
1696
|
const externalRulesStatus = Object.fromEntries(
|
|
1668
1697
|
Object.entries(vue.unref(externalErrors) ?? {}).filter(([key, errors]) => !(key in rulesDef.value) && !!errors).map(([key]) => {
|
|
1669
1698
|
const stateRef = vue.toRef(state.value ?? {}, key);
|
|
1699
|
+
const $externalErrors = vue.toRef(externalErrors?.value ?? {}, key);
|
|
1700
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.[key]);
|
|
1670
1701
|
const initialStateRef = vue.toRef(initialState?.value ?? {}, key);
|
|
1671
1702
|
return [
|
|
1672
1703
|
key,
|
|
@@ -1674,7 +1705,29 @@ function createReactiveNestedStatus({
|
|
|
1674
1705
|
state: stateRef,
|
|
1675
1706
|
rulesDef: vue.computed(() => ({})),
|
|
1676
1707
|
path: path ? `${path}.${key}` : key,
|
|
1677
|
-
externalErrors:
|
|
1708
|
+
externalErrors: $externalErrors,
|
|
1709
|
+
schemaErrors: $schemaErrors,
|
|
1710
|
+
initialState: initialStateRef,
|
|
1711
|
+
fieldName: key,
|
|
1712
|
+
...commonArgs
|
|
1713
|
+
})
|
|
1714
|
+
];
|
|
1715
|
+
})
|
|
1716
|
+
);
|
|
1717
|
+
const schemasRulesStatus = Object.fromEntries(
|
|
1718
|
+
Object.entries(vue.unref(schemaErrors) ?? {}).map(([key]) => {
|
|
1719
|
+
const stateRef = vue.toRef(state.value ?? {}, key);
|
|
1720
|
+
const $externalErrors = vue.toRef(externalErrors?.value ?? {}, key);
|
|
1721
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.[key]);
|
|
1722
|
+
const initialStateRef = vue.toRef(initialState?.value ?? {}, key);
|
|
1723
|
+
return [
|
|
1724
|
+
key,
|
|
1725
|
+
createReactiveChildrenStatus({
|
|
1726
|
+
state: stateRef,
|
|
1727
|
+
rulesDef: vue.computed(() => ({})),
|
|
1728
|
+
path: path ? `${path}.${key}` : key,
|
|
1729
|
+
externalErrors: $externalErrors,
|
|
1730
|
+
schemaErrors: $schemaErrors,
|
|
1678
1731
|
initialState: initialStateRef,
|
|
1679
1732
|
fieldName: key,
|
|
1680
1733
|
...commonArgs
|
|
@@ -1683,8 +1736,12 @@ function createReactiveNestedStatus({
|
|
|
1683
1736
|
})
|
|
1684
1737
|
);
|
|
1685
1738
|
const statesWithNoRules = Object.fromEntries(
|
|
1686
|
-
Object.entries(state.value ?? {}).filter(
|
|
1739
|
+
Object.entries(state.value ?? {}).filter(
|
|
1740
|
+
([key]) => !(key in rulesDef.value) && !(key in (externalRulesStatus ?? {})) && !(key in (schemasRulesStatus ?? {}))
|
|
1741
|
+
).map(([key]) => {
|
|
1687
1742
|
const stateRef = vue.toRef(state.value ?? {}, key);
|
|
1743
|
+
const $externalErrors = vue.toRef(externalErrors?.value ?? {}, key);
|
|
1744
|
+
const $schemaErrors = vue.computed(() => schemaErrors?.value?.[key]);
|
|
1688
1745
|
const initialStateRef = vue.toRef(initialState?.value ?? {}, key);
|
|
1689
1746
|
return [
|
|
1690
1747
|
key,
|
|
@@ -1692,7 +1749,8 @@ function createReactiveNestedStatus({
|
|
|
1692
1749
|
state: stateRef,
|
|
1693
1750
|
rulesDef: vue.computed(() => ({})),
|
|
1694
1751
|
path: path ? `${path}.${key}` : key,
|
|
1695
|
-
externalErrors:
|
|
1752
|
+
externalErrors: $externalErrors,
|
|
1753
|
+
schemaErrors: $schemaErrors,
|
|
1696
1754
|
initialState: initialStateRef,
|
|
1697
1755
|
fieldName: key,
|
|
1698
1756
|
...commonArgs
|
|
@@ -1703,6 +1761,7 @@ function createReactiveNestedStatus({
|
|
|
1703
1761
|
$fields.value = {
|
|
1704
1762
|
...scopedRulesStatus,
|
|
1705
1763
|
...externalRulesStatus,
|
|
1764
|
+
...schemasRulesStatus,
|
|
1706
1765
|
...statesWithNoRules
|
|
1707
1766
|
};
|
|
1708
1767
|
if (watchSources) {
|
|
@@ -1725,7 +1784,7 @@ function createReactiveNestedStatus({
|
|
|
1725
1784
|
});
|
|
1726
1785
|
}
|
|
1727
1786
|
function define$WatchExternalErrors() {
|
|
1728
|
-
if (externalErrors
|
|
1787
|
+
if (externalErrors) {
|
|
1729
1788
|
$unwatchExternalErrors = vue.watch(
|
|
1730
1789
|
externalErrors,
|
|
1731
1790
|
() => {
|
|
@@ -1760,6 +1819,17 @@ function createReactiveNestedStatus({
|
|
|
1760
1819
|
);
|
|
1761
1820
|
define$WatchExternalErrors();
|
|
1762
1821
|
}
|
|
1822
|
+
if (rootSchemaErrors) {
|
|
1823
|
+
$unwatchSchemaErrors?.();
|
|
1824
|
+
$unwatchSchemaErrors = vue.watch(
|
|
1825
|
+
rootSchemaErrors,
|
|
1826
|
+
() => {
|
|
1827
|
+
$unwatch();
|
|
1828
|
+
createReactiveFieldsStatus();
|
|
1829
|
+
},
|
|
1830
|
+
{ deep: true, flush: "post" }
|
|
1831
|
+
);
|
|
1832
|
+
}
|
|
1763
1833
|
define$watchState();
|
|
1764
1834
|
scope = vue.effectScope();
|
|
1765
1835
|
scopeState = scope.run(() => {
|
|
@@ -1821,8 +1891,9 @@ function createReactiveNestedStatus({
|
|
|
1821
1891
|
}
|
|
1822
1892
|
return $anyDirty.value && !($invalid.value || $pending.value);
|
|
1823
1893
|
});
|
|
1894
|
+
const $localPending2 = vue.ref(false);
|
|
1824
1895
|
const $pending = vue.computed(() => {
|
|
1825
|
-
return Object.entries($fields.value).some(([key, statusOrField]) => {
|
|
1896
|
+
return $localPending2.value || Object.entries($fields.value).some(([key, statusOrField]) => {
|
|
1826
1897
|
return statusOrField?.$pending;
|
|
1827
1898
|
});
|
|
1828
1899
|
});
|
|
@@ -1934,7 +2005,8 @@ function createReactiveNestedStatus({
|
|
|
1934
2005
|
$groups,
|
|
1935
2006
|
$silentValue,
|
|
1936
2007
|
$edited,
|
|
1937
|
-
$anyEdited
|
|
2008
|
+
$anyEdited,
|
|
2009
|
+
$localPending: $localPending2
|
|
1938
2010
|
};
|
|
1939
2011
|
});
|
|
1940
2012
|
}
|
|
@@ -1984,25 +2056,37 @@ function createReactiveNestedStatus({
|
|
|
1984
2056
|
}
|
|
1985
2057
|
async function $validate() {
|
|
1986
2058
|
try {
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
);
|
|
1993
|
-
const validationResults = results.every((value) => {
|
|
1994
|
-
if (value.status === "fulfilled") {
|
|
1995
|
-
return value.value.result === true;
|
|
2059
|
+
if (commonArgs.schemaMode) {
|
|
2060
|
+
if (commonArgs.onValidate) {
|
|
2061
|
+
$touch(false);
|
|
2062
|
+
scopeState.$localPending.value = true;
|
|
2063
|
+
return commonArgs.onValidate();
|
|
1996
2064
|
} else {
|
|
1997
|
-
return false;
|
|
2065
|
+
return { result: false, data: state.value };
|
|
1998
2066
|
}
|
|
1999
|
-
}
|
|
2000
|
-
|
|
2067
|
+
} else {
|
|
2068
|
+
const data = state.value;
|
|
2069
|
+
const results = await Promise.allSettled(
|
|
2070
|
+
Object.values($fields.value).map((statusOrField) => {
|
|
2071
|
+
return statusOrField.$validate();
|
|
2072
|
+
})
|
|
2073
|
+
);
|
|
2074
|
+
const validationResults = results.every((value) => {
|
|
2075
|
+
if (value.status === "fulfilled") {
|
|
2076
|
+
return value.value.result === true;
|
|
2077
|
+
} else {
|
|
2078
|
+
return false;
|
|
2079
|
+
}
|
|
2080
|
+
});
|
|
2081
|
+
return { result: validationResults, data };
|
|
2082
|
+
}
|
|
2001
2083
|
} catch (e) {
|
|
2002
2084
|
return { result: false, data: state.value };
|
|
2085
|
+
} finally {
|
|
2086
|
+
scopeState.$localPending.value = false;
|
|
2003
2087
|
}
|
|
2004
2088
|
}
|
|
2005
|
-
const { $shortcuts, ...restScopeState } = scopeState;
|
|
2089
|
+
const { $shortcuts, $localPending, ...restScopeState } = scopeState;
|
|
2006
2090
|
return vue.reactive({
|
|
2007
2091
|
...restScopeState,
|
|
2008
2092
|
...$shortcuts,
|
|
@@ -2020,20 +2104,17 @@ function createReactiveNestedStatus({
|
|
|
2020
2104
|
}
|
|
2021
2105
|
function createReactiveChildrenStatus({
|
|
2022
2106
|
rulesDef,
|
|
2023
|
-
externalErrors,
|
|
2024
2107
|
...properties
|
|
2025
2108
|
}) {
|
|
2026
2109
|
if (isCollectionRulesDef(rulesDef, properties.state)) {
|
|
2027
2110
|
return createReactiveCollectionStatus({
|
|
2028
2111
|
rulesDef,
|
|
2029
|
-
externalErrors,
|
|
2030
2112
|
...properties
|
|
2031
2113
|
});
|
|
2032
2114
|
} else if (isNestedRulesDef(properties.state, rulesDef)) {
|
|
2033
2115
|
if (isRefObject(properties.state)) {
|
|
2034
2116
|
return createReactiveNestedStatus({
|
|
2035
2117
|
rulesDef,
|
|
2036
|
-
externalErrors,
|
|
2037
2118
|
...properties
|
|
2038
2119
|
});
|
|
2039
2120
|
} else {
|
|
@@ -2059,7 +2140,6 @@ function createReactiveChildrenStatus({
|
|
|
2059
2140
|
const { state, ...restProperties } = properties;
|
|
2060
2141
|
return createReactiveNestedStatus({
|
|
2061
2142
|
rulesDef,
|
|
2062
|
-
externalErrors,
|
|
2063
2143
|
...restProperties,
|
|
2064
2144
|
state: scopeState.fakeState
|
|
2065
2145
|
});
|
|
@@ -2067,11 +2147,10 @@ function createReactiveChildrenStatus({
|
|
|
2067
2147
|
} else if (isValidatorRulesDef(rulesDef)) {
|
|
2068
2148
|
return createReactiveFieldStatus({
|
|
2069
2149
|
rulesDef,
|
|
2070
|
-
externalErrors,
|
|
2071
2150
|
...properties
|
|
2072
2151
|
});
|
|
2073
2152
|
}
|
|
2074
|
-
return
|
|
2153
|
+
return undefined;
|
|
2075
2154
|
}
|
|
2076
2155
|
|
|
2077
2156
|
// src/core/useRegle/root/useRootStorage.ts
|
|
@@ -2081,7 +2160,10 @@ function useRootStorage({
|
|
|
2081
2160
|
scopeRules,
|
|
2082
2161
|
state,
|
|
2083
2162
|
customRules,
|
|
2084
|
-
shortcuts
|
|
2163
|
+
shortcuts,
|
|
2164
|
+
schemaErrors,
|
|
2165
|
+
schemaMode = false,
|
|
2166
|
+
onValidate
|
|
2085
2167
|
}) {
|
|
2086
2168
|
const storage = useStorage();
|
|
2087
2169
|
const regle = vue.ref();
|
|
@@ -2097,7 +2179,11 @@ function useRootStorage({
|
|
|
2097
2179
|
initialState,
|
|
2098
2180
|
shortcuts,
|
|
2099
2181
|
fieldName: "root",
|
|
2100
|
-
path: ""
|
|
2182
|
+
path: "",
|
|
2183
|
+
schemaErrors,
|
|
2184
|
+
rootSchemaErrors: schemaErrors,
|
|
2185
|
+
schemaMode,
|
|
2186
|
+
onValidate
|
|
2101
2187
|
});
|
|
2102
2188
|
if (vue.getCurrentScope()) {
|
|
2103
2189
|
vue.onScopeDispose(() => {
|
package/dist/regle-core.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, Raw, MaybeRefOrGetter
|
|
1
|
+
import { MaybeRef, Ref, UnwrapRef, UnwrapNestedRefs, Raw, MaybeRefOrGetter } from 'vue';
|
|
2
2
|
|
|
3
3
|
type Prettify<T> = T extends infer R ? {
|
|
4
4
|
[K in keyof R]: R[K];
|
|
@@ -591,7 +591,7 @@ type useRegleFn<TCustomRules extends Partial<AllRulesDeclarations>, TShortcuts e
|
|
|
591
591
|
declare const useRegle: useRegleFn<Partial<AllRulesDeclarations>, RegleShortcutDefinition<any>>;
|
|
592
592
|
|
|
593
593
|
interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
|
|
594
|
-
<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} :
|
|
594
|
+
<TState extends Record<string, any>, TRules extends ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules> & TValid, TValid = isDeepExact<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>> extends true ? {} : MismatchInfo<NoInferLegacy<TRules>, ReglePartialRuleTree<Unwrap<TState>, Partial<AllRulesDeclarations> & TCustomRules>>>(state: MaybeRef<TState> | DeepReactiveState<TState> | undefined, rulesFactory: TRules): NoInferLegacy<TRules>;
|
|
595
595
|
<TState extends PrimitiveTypes, TRules extends RegleRuleDecl>(state: MaybeRef<TState>, rulesFactory: TRules): NoInferLegacy<TRules>;
|
|
596
596
|
}
|
|
597
597
|
/**
|
|
@@ -603,13 +603,16 @@ interface inferRulesFn<TCustomRules extends Partial<AllRulesDeclarations>> {
|
|
|
603
603
|
*/
|
|
604
604
|
declare const inferRules: inferRulesFn<Partial<AllRulesDeclarations>>;
|
|
605
605
|
|
|
606
|
-
declare function useRootStorage({ initialState, options, scopeRules, state, customRules, shortcuts, }: {
|
|
607
|
-
scopeRules:
|
|
606
|
+
declare function useRootStorage({ initialState, options, scopeRules, state, customRules, shortcuts, schemaErrors, schemaMode, onValidate, }: {
|
|
607
|
+
scopeRules: Ref<$InternalReglePartialRuleTree>;
|
|
608
608
|
state: Ref<Record<string, any>>;
|
|
609
609
|
options: ResolvedRegleBehaviourOptions;
|
|
610
610
|
initialState: Ref<Record<string, any>>;
|
|
611
611
|
customRules?: () => CustomRulesDeclarationTree;
|
|
612
612
|
shortcuts: RegleShortcutDefinition | undefined;
|
|
613
|
+
schemaErrors?: Ref<Partial<$InternalRegleErrorTree> | undefined>;
|
|
614
|
+
schemaMode?: boolean;
|
|
615
|
+
onValidate?: () => Promise<$InternalRegleResult>;
|
|
613
616
|
}): {
|
|
614
617
|
regle: $InternalRegleStatus | undefined;
|
|
615
618
|
};
|
|
@@ -1688,4 +1691,4 @@ declare function defineRegleConfig<TShortcuts extends RegleShortcutDefinition<TC
|
|
|
1688
1691
|
inferRules: inferRulesFn<TCustomRules>;
|
|
1689
1692
|
};
|
|
1690
1693
|
|
|
1691
|
-
export { type $InternalRegleStatus, type AllRulesDeclarations, type DeepMaybeRef, type DeepReactiveState, type FormRuleDeclaration, type InferRegleRoot, type InferRegleRule, type InferRegleRules, type InferRegleShortcuts, type InferRegleStatusType, type InlineRuleDeclaration, InternalRuleType, type JoinDiscriminatedUnions, type LocalRegleBehaviourOptions, type Maybe, type NoInferLegacy, type PrimitiveTypes, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleEnforceCustomRequiredRules, type RegleEnforceRequiredRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialRuleTree, type RegleResult, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleMetadataExtended, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleTypeReturn, type RegleRuleWithParamsDefinition, type RegleShortcutDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleRuleTree as RegleValidationTree, type ResolvedRegleBehaviourOptions, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle, useRootStorage };
|
|
1694
|
+
export { type $InternalRegleStatus, type AllRulesDeclarations, type DeepMaybeRef, type DeepReactiveState, type FormRuleDeclaration, type InferRegleRoot, type InferRegleRule, type InferRegleRules, type InferRegleShortcuts, type InferRegleStatusType, type InlineRuleDeclaration, InternalRuleType, type JoinDiscriminatedUnions, type LocalRegleBehaviourOptions, type Maybe, type MismatchInfo, type NoInferLegacy, type PrimitiveTypes, type Regle, type RegleBehaviourOptions, type RegleCollectionErrors, type RegleCollectionRuleDecl, type RegleCollectionRuleDefinition, type RegleCollectionStatus, type RegleCommonStatus, type RegleComputedRules, type RegleEnforceCustomRequiredRules, type RegleEnforceRequiredRules, type RegleErrorTree, type RegleExternalCollectionErrors, type RegleExternalErrorTree, type RegleFieldStatus, type RegleFormPropertyType, type RegleInternalRuleDefs, type ReglePartialRuleTree, type RegleResult, type RegleRoot, type RegleRuleCore, type RegleRuleDecl, type RegleRuleDefinition, type RegleRuleDefinitionProcessor, type RegleRuleDefinitionWithMetadataProcessor, type RegleRuleInit, type RegleRuleMetadataConsumer, type RegleRuleMetadataDefinition, type RegleRuleMetadataExtended, type RegleRuleRaw, type RegleRuleStatus, type RegleRuleTypeReturn, type RegleRuleWithParamsDefinition, type RegleShortcutDefinition, type RegleStatus, type RegleUniversalParams, type RegleValidationErrors, type RegleValidationGroupEntry, type RegleValidationGroupOutput, type RegleRuleTree as RegleValidationTree, type ResolvedRegleBehaviourOptions, type Unwrap, type UnwrapRegleUniversalParams, type UnwrapRuleWithParams, createRule, defineRegleConfig, inferRules, unwrapRuleParameters, useRegle, useRootStorage };
|