@regle/core 0.0.6 → 0.0.8

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/index.js CHANGED
@@ -18,29 +18,47 @@ function createReactiveParams(params) {
18
18
  return toRef(() => param);
19
19
  });
20
20
  }
21
+ function getFunctionParametersLength(func) {
22
+ const funcStr = func.toString();
23
+ const params = funcStr.slice(funcStr.indexOf("(") + 1, funcStr.indexOf(")")).split(",").map((param) => param.trim());
24
+ const defaults = params.filter((param) => param.includes("="));
25
+ return defaults.length + func.length;
26
+ }
21
27
 
22
28
  // src/core/createRule/defineRuleProcessors.ts
23
29
  function defineRuleProcessors(definition, ...params) {
24
30
  const { message, validator, active, ...properties } = definition;
25
31
  const isAsync = validator.constructor.name === "AsyncFunction";
26
- const processors = {
27
- message(value, ...args) {
32
+ const defaultProcessors = {
33
+ validator(value, ...args) {
34
+ return definition.validator(value, ...unwrapRuleParameters(args.length ? args : params));
35
+ },
36
+ message(value, metadata) {
28
37
  if (typeof definition.message === "function") {
29
- return definition.message(value, ...args.length ? args : params);
38
+ return definition.message(value, {
39
+ ...metadata,
40
+ $params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
41
+ });
30
42
  } else {
31
43
  return definition.message;
32
44
  }
33
45
  },
34
- validator(value, ...args) {
35
- return definition.validator(value, ...args.length ? args : params);
36
- },
37
- active(value, ...args) {
46
+ active(value, metadata) {
38
47
  if (typeof definition.active === "function") {
39
- return definition.active(value, ...args.length ? args : params);
48
+ return definition.active(value, {
49
+ ...metadata,
50
+ $params: unwrapRuleParameters(metadata.$params?.length ? metadata.$params : params)
51
+ });
40
52
  } else {
41
53
  return definition.active ?? true;
42
54
  }
43
55
  },
56
+ exec(value) {
57
+ return definition.validator(value, ...unwrapRuleParameters(params));
58
+ }
59
+ };
60
+ const processors = {
61
+ ...defaultProcessors,
44
62
  ...properties,
45
63
  ...{
46
64
  _validator: definition.validator,
@@ -61,7 +79,7 @@ function createRule(definition) {
61
79
  let fakeParams = [];
62
80
  const staticProcessors = defineRuleProcessors(definition, ...fakeParams);
63
81
  const isAsync = definition.validator.constructor.name === "AsyncFunction";
64
- if (definition.validator.length > 1) {
82
+ if (getFunctionParametersLength(definition.validator) > 1) {
65
83
  const ruleFactory = function(...params) {
66
84
  return defineRuleProcessors(definition, ...params);
67
85
  };
@@ -69,9 +87,10 @@ function createRule(definition) {
69
87
  ruleFactory.message = staticProcessors.message;
70
88
  ruleFactory.active = staticProcessors.active;
71
89
  ruleFactory.type = staticProcessors.type;
72
- ruleFactory._validator = definition.validator;
73
- ruleFactory._message = definition.message;
74
- ruleFactory._active = definition.active;
90
+ ruleFactory.exec = staticProcessors.exec;
91
+ ruleFactory._validator = staticProcessors.validator;
92
+ ruleFactory._message = staticProcessors.message;
93
+ ruleFactory._active = staticProcessors.active;
75
94
  ruleFactory._type = definition.type;
76
95
  ruleFactory._patched = false;
77
96
  ruleFactory._async = isAsync;
@@ -82,15 +101,18 @@ function createRule(definition) {
82
101
  }
83
102
  throw new Error("Validator must be a function");
84
103
  }
104
+ function defineType(ruleName) {
105
+ return ruleName;
106
+ }
85
107
 
86
108
  // src/core/useRegle/useRegle.ts
87
- import { computed as computed7, isRef as isRef2, ref as ref4, shallowRef as shallowRef2, toRaw } from "vue";
109
+ import { computed as computed6, isRef as isRef2, ref as ref4, shallowRef as shallowRef2, toRaw } from "vue";
88
110
 
89
111
  // src/core/useRegle/useStateProperties/useStateProperties.ts
90
- import { computed as computed6, reactive as reactive5, unref as unref3 } from "vue";
112
+ import { computed as computed5, reactive as reactive5, unref as unref3 } from "vue";
91
113
 
92
114
  // src/core/useStorage/useStorage.ts
93
- import { ref, shallowRef } from "vue";
115
+ import { onScopeDispose, ref, shallowRef } from "vue";
94
116
  function useStorage() {
95
117
  const ruleDeclStorage = shallowRef(/* @__PURE__ */ new Map());
96
118
  const fieldsStorage = shallowRef(
@@ -179,10 +201,20 @@ function useStorage() {
179
201
  } else {
180
202
  const $pending = ref(false);
181
203
  const $valid = ref(true);
182
- ruleStatusStorage.value.set(path, { $pending, $valid });
183
- return { $pending, $valid };
204
+ const $metadata = ref({});
205
+ const $validating = ref(false);
206
+ ruleStatusStorage.value.set(path, { $pending, $valid, $metadata, $validating });
207
+ return { $pending, $valid, $metadata, $validating };
184
208
  }
185
209
  }
210
+ onScopeDispose(() => {
211
+ ruleDeclStorage.value.clear();
212
+ fieldsStorage.value.clear();
213
+ collectionsStorage.value.clear();
214
+ dirtyStorage.value.clear();
215
+ ruleStatusStorage.value.clear();
216
+ arrayStatusStorage.value.clear();
217
+ });
186
218
  return {
187
219
  addRuleDeclEntry,
188
220
  setDirtyEntry,
@@ -232,7 +264,7 @@ function isEmpty(value) {
232
264
  }
233
265
 
234
266
  // src/utils/composables.ts
235
- import { effectScope, getCurrentScope, onScopeDispose } from "vue";
267
+ import { effectScope, getCurrentScope, onScopeDispose as onScopeDispose2 } from "vue";
236
268
 
237
269
  // src/core/useRegle/guards/ruleDef.guards.ts
238
270
  function isNestedRulesDef(state, rule) {
@@ -274,7 +306,13 @@ function extractRulesErrors(rules, externalErrors) {
274
306
  return rule.$message;
275
307
  }
276
308
  return null;
277
- }).filter((msg) => !!msg).concat(externalErrors ?? []);
309
+ }).filter((msg) => !!msg).reduce((acc, value) => {
310
+ if (typeof value === "string") {
311
+ return acc?.concat([value]);
312
+ } else {
313
+ return acc?.concat(value);
314
+ }
315
+ }, []).concat(externalErrors ?? []);
278
316
  }
279
317
  function processFieldErrors(fieldStatus) {
280
318
  if (isNestedRulesStatus(fieldStatus)) {
@@ -328,7 +366,7 @@ function useErrors($regle) {
328
366
  }
329
367
 
330
368
  // src/core/useRegle/useStateProperties/createReactiveNestedStatus.ts
331
- import { computed as computed5, effectScope as effectScope4, reactive as reactive4, toRef as toRef4, watch as watch4 } from "vue";
369
+ import { computed as computed4, effectScope as effectScope4, reactive as reactive4, toRef as toRef4, watch as watch4 } from "vue";
332
370
 
333
371
  // src/core/useRegle/useStateProperties/createReactiveCollectionStatus.ts
334
372
  import { nextTick, reactive as reactive3, ref as ref3, toRef as toRef3, toRefs, watch as watch3 } from "vue";
@@ -365,13 +403,20 @@ function createReactiveRuleStatus({
365
403
  }) {
366
404
  let scope = effectScope2();
367
405
  let scopeState;
368
- const { $pending, $valid } = storage.trySetRuleStatusRef(`${path}.${ruleKey}`);
406
+ const { $pending, $valid, $metadata, $validating } = storage.trySetRuleStatusRef(
407
+ `${path}.${ruleKey}`
408
+ );
369
409
  function $watch() {
370
410
  scopeState = scope.run(() => {
411
+ const $defaultMetadata = computed2(() => ({
412
+ $invalid: !$valid.value,
413
+ $params: $params.value,
414
+ ...$metadata.value
415
+ }));
371
416
  const $active = computed2(() => {
372
417
  if (isFormRuleDefinition(rule)) {
373
418
  if (typeof rule.value.active === "function") {
374
- return rule.value.active(state.value, ...$params.value);
419
+ return rule.value.active(state.value, $defaultMetadata.value);
375
420
  } else {
376
421
  return rule.value.active;
377
422
  }
@@ -381,31 +426,33 @@ function createReactiveRuleStatus({
381
426
  });
382
427
  const $message = computed2(() => {
383
428
  let message = "";
384
- const customMessageRule = customMessages ? customMessages[ruleKey]?.message : void 0;
385
- if (customMessageRule) {
386
- if (typeof customMessageRule === "function") {
387
- message = customMessageRule(state.value, ...$params.value);
388
- } else {
389
- message = customMessageRule;
390
- }
391
- }
392
- if (isFormRuleDefinition(rule)) {
393
- if (!(customMessageRule && !rule.value._patched)) {
394
- if (typeof rule.value.message === "function") {
395
- message = rule.value.message(state.value, ...$params.value);
429
+ if ($dirty.value && !$validating.value) {
430
+ const customMessageRule = customMessages ? customMessages[ruleKey]?.message : void 0;
431
+ if (customMessageRule) {
432
+ if (typeof customMessageRule === "function") {
433
+ message = customMessageRule(state.value, $defaultMetadata.value);
396
434
  } else {
397
- message = rule.value.message;
435
+ message = customMessageRule;
398
436
  }
399
437
  }
400
- }
401
- if (isEmpty(message)) {
402
- message = "Error";
403
- console.warn(`No error message defined for ${ruleKey}`);
438
+ if (isFormRuleDefinition(rule)) {
439
+ if (!(customMessageRule && !rule.value._patched)) {
440
+ if (typeof rule.value.message === "function") {
441
+ message = rule.value.message(state.value, $defaultMetadata.value);
442
+ } else {
443
+ message = rule.value.message;
444
+ }
445
+ }
446
+ }
447
+ if (isEmpty(message)) {
448
+ message = "Error";
449
+ console.warn(`No error message defined for ${ruleKey}`);
450
+ }
404
451
  }
405
452
  return message;
406
453
  });
407
454
  const $type = computed2(() => {
408
- if (isFormRuleDefinition(rule)) {
455
+ if (isFormRuleDefinition(rule) && rule.value.type) {
409
456
  return Object.values(InternalRuleType).includes(rule.value.type) ? ruleKey : rule.value.type;
410
457
  } else {
411
458
  return ruleKey;
@@ -440,29 +487,48 @@ function createReactiveRuleStatus({
440
487
  deep: true
441
488
  });
442
489
  async function $validate() {
443
- const validator = scopeState.$validator.value;
444
- let ruleResult = false;
445
- const resultOrPromise = validator(state.value, ...scopeState.$params.value);
446
- if (resultOrPromise instanceof Promise) {
447
- if ($dirty.value && !$pending.value) {
448
- try {
449
- $valid.value = true;
450
- $pending.value = true;
451
- const promiseResult = await resultOrPromise;
452
- ruleResult = promiseResult;
453
- } catch (e) {
454
- ruleResult = false;
455
- } finally {
456
- $pending.value = false;
490
+ try {
491
+ $validating.value = true;
492
+ const validator = scopeState.$validator.value;
493
+ let ruleResult = false;
494
+ const resultOrPromise = validator(state.value, ...scopeState.$params.value);
495
+ if (resultOrPromise instanceof Promise) {
496
+ if ($dirty.value && !$pending.value) {
497
+ try {
498
+ $valid.value = true;
499
+ $pending.value = true;
500
+ const promiseResult = await resultOrPromise;
501
+ if (typeof promiseResult === "boolean") {
502
+ ruleResult = promiseResult;
503
+ } else {
504
+ const { $valid: $valid2, ...rest } = promiseResult;
505
+ ruleResult = $valid2;
506
+ $metadata.value = rest;
507
+ }
508
+ } catch (e) {
509
+ ruleResult = false;
510
+ } finally {
511
+ $pending.value = false;
512
+ }
513
+ }
514
+ } else {
515
+ if (resultOrPromise != null) {
516
+ if (typeof resultOrPromise === "boolean") {
517
+ ruleResult = resultOrPromise;
518
+ } else {
519
+ const { $valid: $valid2, ...rest } = resultOrPromise;
520
+ ruleResult = $valid2;
521
+ $metadata.value = rest;
522
+ }
457
523
  }
458
524
  }
459
- } else {
460
- ruleResult = resultOrPromise;
461
- }
462
- $valid.value = ruleResult;
463
- if (options.$externalErrors) {
525
+ $valid.value = ruleResult;
526
+ if (options.$externalErrors) {
527
+ }
528
+ return ruleResult;
529
+ } finally {
530
+ $validating.value = false;
464
531
  }
465
- return ruleResult;
466
532
  }
467
533
  function $unwatch() {
468
534
  $unwatchState();
@@ -548,7 +614,6 @@ function createReactiveFieldStatus({
548
614
  $commit();
549
615
  }
550
616
  $externalErrors.value = [];
551
- console.log($externalErrors.value);
552
617
  });
553
618
  function $unwatch() {
554
619
  if ($rules.value) {
@@ -682,7 +747,7 @@ function createCollectionElement({
682
747
  });
683
748
  }
684
749
  const $state = toRefs(value);
685
- const $externalErrors = toRefs(externalErrors.value ?? reactive3([void 0]));
750
+ const $externalErrors = toRef3(() => externalErrors.value?.[index]);
686
751
  const $status = createReactiveChildrenStatus({
687
752
  state: $state[index],
688
753
  rulesDef: toRef3(() => rules),
@@ -690,7 +755,7 @@ function createCollectionElement({
690
755
  path: $path,
691
756
  storage,
692
757
  options,
693
- externalErrors: $externalErrors?.[index]
758
+ externalErrors: $externalErrors
694
759
  });
695
760
  if ($status) {
696
761
  $status.$id = value[index].$id ?? $id;
@@ -942,28 +1007,28 @@ function createReactiveNestedStatus({
942
1007
  );
943
1008
  }
944
1009
  scopeState = scope.run(() => {
945
- const $dirty = computed5(() => {
1010
+ const $dirty = computed4(() => {
946
1011
  return Object.entries($fields.value).every(([key, statusOrField]) => {
947
1012
  return statusOrField.$dirty;
948
1013
  });
949
1014
  });
950
- const $anyDirty = computed5(() => {
1015
+ const $anyDirty = computed4(() => {
951
1016
  return Object.entries($fields.value).some(([key, statusOrField]) => {
952
1017
  return statusOrField.$dirty;
953
1018
  });
954
1019
  });
955
- const $invalid = computed5(() => {
1020
+ const $invalid = computed4(() => {
956
1021
  return Object.entries($fields.value).some(([key, statusOrField]) => {
957
1022
  return statusOrField.$invalid;
958
1023
  });
959
1024
  });
960
- const $valid = computed5(() => !$invalid.value);
961
- const $error = computed5(() => {
1025
+ const $valid = computed4(() => !$invalid.value);
1026
+ const $error = computed4(() => {
962
1027
  return Object.entries($fields.value).some(([key, statusOrField]) => {
963
1028
  return statusOrField.$error;
964
1029
  });
965
1030
  });
966
- const $pending = computed5(() => {
1031
+ const $pending = computed4(() => {
967
1032
  return Object.entries($fields.value).some(([key, statusOrField]) => {
968
1033
  return statusOrField.$pending;
969
1034
  });
@@ -1053,7 +1118,7 @@ function createReactiveChildrenStatus({
1053
1118
  // src/core/useRegle/useStateProperties/useStateProperties.ts
1054
1119
  function useStateProperties(scopeRules, state, options, customRules) {
1055
1120
  const storage = useStorage();
1056
- const externalErrors = computed6(() => unref3(options.$externalErrors));
1121
+ const externalErrors = computed5(() => unref3(options.$externalErrors));
1057
1122
  const $regle = reactive5(
1058
1123
  createReactiveNestedStatus({
1059
1124
  rootRules: scopeRules,
@@ -1077,7 +1142,7 @@ function createUseRegleComposable(customRules, options) {
1077
1142
  rewardEarly: options?.rewardEarly ?? false
1078
1143
  };
1079
1144
  function useRegle2(state, rulesFactory, options2) {
1080
- const scopeRules = isRef2(rulesFactory) ? rulesFactory : computed7(rulesFactory);
1145
+ const scopeRules = isRef2(rulesFactory) ? rulesFactory : computed6(rulesFactory);
1081
1146
  const resolvedOptions = {
1082
1147
  ...globalOptions,
1083
1148
  ...options2
@@ -1094,10 +1159,10 @@ function createUseRegleComposable(customRules, options) {
1094
1159
  state.value = toRaw(initialState.value);
1095
1160
  $regle.$reset();
1096
1161
  }
1097
- const $valid = computed7(() => {
1162
+ const $valid = computed6(() => {
1098
1163
  return $regle.$valid && $regle.$dirty && !$regle.$pending;
1099
1164
  });
1100
- const $invalid = computed7(() => {
1165
+ const $invalid = computed6(() => {
1101
1166
  return $regle.$invalid && $regle.$dirty || $regle.$pending;
1102
1167
  });
1103
1168
  async function validateForm() {
@@ -1122,8 +1187,8 @@ function createUseRegleComposable(customRules, options) {
1122
1187
  }
1123
1188
  var useRegle = createUseRegleComposable();
1124
1189
 
1125
- // src/core/defineRegleOptions.ts
1126
- function defineRegleOptions({
1190
+ // src/core/defineRegleConfig.ts
1191
+ function defineRegleConfig({
1127
1192
  rules,
1128
1193
  options
1129
1194
  }) {
@@ -1133,6 +1198,8 @@ function defineRegleOptions({
1133
1198
  export {
1134
1199
  InternalRuleType,
1135
1200
  createRule,
1136
- defineRegleOptions,
1137
- unwrapRuleParameters
1201
+ defineRegleConfig,
1202
+ defineType,
1203
+ unwrapRuleParameters,
1204
+ useRegle
1138
1205
  };
package/package.json CHANGED
@@ -1,34 +1,36 @@
1
1
  {
2
2
  "name": "@regle/core",
3
- "version": "0.0.6",
3
+ "version": "0.0.8",
4
4
  "description": "Vue form validator",
5
5
  "scripts": {
6
6
  "lint": "eslint --ext .ts --ext .vue .",
7
7
  "typecheck": "tsc --noEmit",
8
8
  "release": "npm publish",
9
9
  "build": "tsup",
10
- "dev": "tsup --config=tsup.dev.ts --watch"
10
+ "build:local": "tsup --clean false",
11
+ "dev": "tsup --config=tsup.dev.ts --watch",
12
+ "test": "echo 'no tests'"
11
13
  },
12
14
  "devDependencies": {
15
+ "@total-typescript/ts-reset": "0.5.1",
16
+ "@types/node": "20.11.5",
13
17
  "@types/prettier": "3.0.0",
14
- "@typescript-eslint/eslint-plugin": "6.7.4",
15
- "@typescript-eslint/parser": "6.7.4",
16
- "@types/node": "20.8.3",
17
- "@vue/test-utils": "2.4.1",
18
- "bumpp": "9.2.0",
19
- "changelogithub": "0.13.0",
18
+ "@typescript-eslint/eslint-plugin": "6.19.0",
19
+ "@typescript-eslint/parser": "6.19.0",
20
+ "@vue/test-utils": "2.4.3",
21
+ "bumpp": "9.3.0",
22
+ "changelogithub": "0.13.3",
20
23
  "cross-env": "7.0.3",
21
- "eslint": "8.50.0",
22
- "eslint-config-prettier": "9.0.0",
23
- "eslint-plugin-vue": "9.17.0",
24
- "prettier": "3.0.3",
25
- "typescript": "5.2.2",
26
- "vue": "3.3.4",
27
- "vue-eslint-parser": "9.3.1",
28
- "vue-tsc": "1.8.15",
29
- "tsup": "7.2.0",
30
- "@total-typescript/ts-reset": "0.5.1",
31
- "type-fest": "4.4.0"
24
+ "eslint": "8.56.0",
25
+ "eslint-config-prettier": "9.1.0",
26
+ "eslint-plugin-vue": "9.20.1",
27
+ "prettier": "3.2.4",
28
+ "tsup": "8.0.1",
29
+ "type-fest": "4.9.0",
30
+ "typescript": "5.3.3",
31
+ "vue": "3.4.14",
32
+ "vue-eslint-parser": "9.4.0",
33
+ "vue-tsc": "1.8.27"
32
34
  },
33
35
  "type": "module",
34
36
  "exports": {