@rainbow-oh/yee-c 0.4.5 → 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.
Files changed (104) hide show
  1. package/dist/cjs/Dialog/demo/basic.js +1 -1
  2. package/dist/cjs/Dialog/dialog.js +1 -1
  3. package/dist/cjs/Field/demo/validation.js +23 -3
  4. package/dist/cjs/Field/field.js +1 -1
  5. package/dist/cjs/Form/Field.js +1 -4
  6. package/dist/cjs/Form/Form.js +1 -1
  7. package/dist/cjs/Form/Group.js +36 -14
  8. package/dist/cjs/Form/List.js +23 -3
  9. package/dist/cjs/Form/demo/async-validate.d.ts +3 -0
  10. package/dist/cjs/Form/demo/async-validate.js +108 -0
  11. package/dist/cjs/Form/demo/virtual.js +1 -1
  12. package/dist/cjs/Form/form-store.d.ts +4 -4
  13. package/dist/cjs/Form/form-store.js +55 -25
  14. package/dist/cjs/Form/interface.d.ts +10 -7
  15. package/dist/cjs/Form/utils/validate.d.ts +23 -2
  16. package/dist/cjs/Form/utils/validate.js +59 -10
  17. package/dist/cjs/Select/demo/basic.js +1 -1
  18. package/dist/cjs/Select/demo/virtual.d.ts +3 -0
  19. package/dist/cjs/Select/demo/virtual.js +55 -0
  20. package/dist/cjs/Select/hooks/useSelectKeyboard.d.ts +7 -1
  21. package/dist/cjs/Select/hooks/useSelectKeyboard.js +16 -6
  22. package/dist/cjs/Select/interface.d.ts +44 -0
  23. package/dist/cjs/Select/option.js +3 -2
  24. package/dist/cjs/Select/options.js +115 -15
  25. package/dist/cjs/Select/select.js +20 -4
  26. package/dist/cjs/Select/style/index.less +17 -0
  27. package/dist/cjs/Table/style/index.less +19 -0
  28. package/dist/cjs/hooks/index.d.ts +2 -1
  29. package/dist/cjs/hooks/index.js +3 -1
  30. package/dist/cjs/hooks/useVirtualList.d.ts +71 -0
  31. package/dist/cjs/hooks/useVirtualList.js +117 -0
  32. package/dist/cjs/style/themes.css +1 -1
  33. package/dist/cjs/style/variables.css +1 -1
  34. package/dist/cjs/version.d.ts +1 -1
  35. package/dist/cjs/version.js +1 -1
  36. package/dist/esm/Dialog/demo/basic.js +1 -1
  37. package/dist/esm/Dialog/dialog.js +1 -1
  38. package/dist/esm/Field/demo/validation.js +30 -9
  39. package/dist/esm/Field/field.js +2 -1
  40. package/dist/esm/Form/Field.js +3 -4
  41. package/dist/esm/Form/Form.js +1 -1
  42. package/dist/esm/Form/Group.js +142 -53
  43. package/dist/esm/Form/List.js +61 -42
  44. package/dist/esm/Form/demo/async-validate.d.ts +3 -0
  45. package/dist/esm/Form/demo/async-validate.js +95 -0
  46. package/dist/esm/Form/demo/virtual.js +1 -1
  47. package/dist/esm/Form/form-store.d.ts +4 -4
  48. package/dist/esm/Form/form-store.js +187 -93
  49. package/dist/esm/Form/interface.d.ts +10 -7
  50. package/dist/esm/Form/utils/validate.d.ts +23 -2
  51. package/dist/esm/Form/utils/validate.js +122 -17
  52. package/dist/esm/Select/demo/basic.js +1 -1
  53. package/dist/esm/Select/demo/virtual.d.ts +3 -0
  54. package/dist/esm/Select/demo/virtual.js +38 -0
  55. package/dist/esm/Select/hooks/useSelectKeyboard.d.ts +7 -1
  56. package/dist/esm/Select/hooks/useSelectKeyboard.js +25 -9
  57. package/dist/esm/Select/interface.d.ts +44 -0
  58. package/dist/esm/Select/option.js +4 -2
  59. package/dist/esm/Select/options.js +132 -13
  60. package/dist/esm/Select/select.js +19 -4
  61. package/dist/esm/Select/style/index.less +17 -0
  62. package/dist/esm/Table/style/index.less +19 -0
  63. package/dist/esm/hooks/index.d.ts +2 -1
  64. package/dist/esm/hooks/index.js +2 -1
  65. package/dist/esm/hooks/useVirtualList.d.ts +71 -0
  66. package/dist/esm/hooks/useVirtualList.js +129 -0
  67. package/dist/esm/style/themes.css +1 -1
  68. package/dist/esm/style/variables.css +1 -1
  69. package/dist/esm/version.d.ts +1 -1
  70. package/dist/esm/version.js +1 -1
  71. package/dist/umd/yee-c.min.css +1 -1
  72. package/dist/umd/yee-c.min.js +1 -1
  73. package/package.json +1 -1
  74. package/src/Dialog/demo/basic.tsx +1 -1
  75. package/src/Dialog/dialog.tsx +1 -1
  76. package/src/Field/demo/validation.tsx +2 -2
  77. package/src/Field/field.tsx +2 -1
  78. package/src/Field/index.en-US.md +1 -1
  79. package/src/Field/index.zh-CN.md +1 -1
  80. package/src/Form/Field.tsx +3 -4
  81. package/src/Form/Form.tsx +1 -1
  82. package/src/Form/Group.tsx +15 -12
  83. package/src/Form/List.tsx +3 -3
  84. package/src/Form/demo/async-validate.tsx +71 -0
  85. package/src/Form/demo/virtual.tsx +1 -1
  86. package/src/Form/form-store.ts +37 -21
  87. package/src/Form/index.en-US.md +6 -5
  88. package/src/Form/index.zh-CN.md +6 -5
  89. package/src/Form/interface.ts +13 -7
  90. package/src/Form/utils/validate.ts +65 -13
  91. package/src/Select/demo/basic.tsx +1 -1
  92. package/src/Select/demo/virtual.tsx +25 -0
  93. package/src/Select/hooks/useSelectKeyboard.ts +30 -6
  94. package/src/Select/index.en-US.md +4 -0
  95. package/src/Select/index.zh-CN.md +4 -0
  96. package/src/Select/interface.ts +48 -2
  97. package/src/Select/option.tsx +2 -1
  98. package/src/Select/options.tsx +139 -8
  99. package/src/Select/select.tsx +23 -1
  100. package/src/Select/style/index.less +17 -0
  101. package/src/Table/style/index.less +19 -0
  102. package/src/hooks/index.ts +2 -0
  103. package/src/hooks/useVirtualList.ts +169 -0
  104. package/src/version.ts +1 -1
@@ -51,7 +51,7 @@ var basic_default = () => {
51
51
  onCancel: () => {
52
52
  setOpen(false);
53
53
  },
54
- onConfirm: () => form.submit()
54
+ onConfirm: () => void form.submit()
55
55
  },
56
56
  /* @__PURE__ */ import_react.default.createElement(
57
57
  import_yee_c.Form,
@@ -162,7 +162,7 @@ var Dialog = (baseprops) => {
162
162
  [`${prefixCls}-fullscreen`]: fullscreen
163
163
  });
164
164
  const renderFooter = () => {
165
- if (footer === false) {
165
+ if (footer === false || footer === null) {
166
166
  return null;
167
167
  }
168
168
  if (footer === true || footer === void 0) {
@@ -25,6 +25,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  mod
26
26
  ));
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var __async = (__this, __arguments, generator) => {
29
+ return new Promise((resolve, reject) => {
30
+ var fulfilled = (value) => {
31
+ try {
32
+ step(generator.next(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var rejected = (value) => {
38
+ try {
39
+ step(generator.throw(value));
40
+ } catch (e) {
41
+ reject(e);
42
+ }
43
+ };
44
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
45
+ step((generator = generator.apply(__this, __arguments)).next());
46
+ });
47
+ };
28
48
 
29
49
  // src/Field/demo/validation.tsx
30
50
  var validation_exports = {};
@@ -39,15 +59,15 @@ var validation_default = () => {
39
59
  (0, import_react.useLayoutEffect)(() => {
40
60
  createForm("validationForm");
41
61
  }, []);
42
- const handleSubmit = () => {
62
+ const handleSubmit = () => __async(void 0, null, function* () {
43
63
  const form = getForm("validationForm");
44
64
  console.log("form: ", form);
45
- const errors = form == null ? void 0 : form.submit();
65
+ const errors = yield form == null ? void 0 : form.submit();
46
66
  console.log("errors: ", errors);
47
67
  if (errors && errors.length === 0) {
48
68
  console.log("Submit success:", form == null ? void 0 : form.getFieldsValue());
49
69
  }
50
- };
70
+ });
51
71
  return /* @__PURE__ */ import_react.default.createElement("div", { style: { maxWidth: 400 } }, /* @__PURE__ */ import_react.default.createElement(
52
72
  import_yee_c.Field,
53
73
  {
@@ -98,7 +98,7 @@ var Field = (props) => {
98
98
  forceUpdate();
99
99
  },
100
100
  onBlur: (event) => {
101
- validateField == null ? void 0 : validateField(name, "onBlur");
101
+ void (validateField == null ? void 0 : validateField(name, "onBlur"));
102
102
  if (children2.props.onBlur) {
103
103
  children2.props.onBlur(event);
104
104
  }
@@ -171,10 +171,7 @@ var Field = (props) => {
171
171
  },
172
172
  onBlur: (event) => {
173
173
  var _a2;
174
- const err = validateField == null ? void 0 : validateField(normalizedName, "onBlur");
175
- if (err.length) {
176
- forceUpdate();
177
- }
174
+ void (validateField == null ? void 0 : validateField(normalizedName, "onBlur"));
178
175
  (_a2 = props2 == null ? void 0 : props2.onBlur) == null ? void 0 : _a2.call(props2, event);
179
176
  }
180
177
  });
@@ -128,7 +128,7 @@ var Form = (baseprops) => {
128
128
  onSubmit: (e) => {
129
129
  e.preventDefault();
130
130
  e.stopPropagation();
131
- formInstance.submit();
131
+ void formInstance.submit();
132
132
  },
133
133
  onReset: (e) => {
134
134
  e.preventDefault();
@@ -25,6 +25,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  mod
26
26
  ));
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var __async = (__this, __arguments, generator) => {
29
+ return new Promise((resolve, reject) => {
30
+ var fulfilled = (value) => {
31
+ try {
32
+ step(generator.next(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var rejected = (value) => {
38
+ try {
39
+ step(generator.throw(value));
40
+ } catch (e) {
41
+ reject(e);
42
+ }
43
+ };
44
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
45
+ step((generator = generator.apply(__this, __arguments)).next());
46
+ });
47
+ };
28
48
 
29
49
  // src/Form/Group.tsx
30
50
  var Group_exports = {};
@@ -36,6 +56,7 @@ var import_clsx = __toESM(require("clsx"));
36
56
  var import_react = require("motion/react");
37
57
  var import_react2 = __toESM(require("react"));
38
58
  var import_Grid = __toESM(require("../Grid"));
59
+ var import_validate = require("./utils/validate");
39
60
  var import_FieldContext = __toESM(require("./FieldContext"));
40
61
  var import_FormContext = __toESM(require("./FormContext"));
41
62
  var Group = (props) => {
@@ -53,7 +74,8 @@ var Group = (props) => {
53
74
  }, [children]);
54
75
  const touchedRef = (0, import_react2.useRef)(false);
55
76
  const [, forceValidate] = (0, import_react2.useReducer)((x) => x + 1, 0);
56
- const validate = (force) => {
77
+ const validate = (force) => __async(void 0, null, function* () {
78
+ var _a2, _b;
57
79
  if (!required && (!rules || rules.length === 0))
58
80
  return [];
59
81
  if (!force && !touchedRef.current)
@@ -77,47 +99,47 @@ var Group = (props) => {
77
99
  }
78
100
  }
79
101
  if (rules) {
80
- rules.forEach((rule) => {
102
+ for (const rule of rules) {
81
103
  if (rule.validator) {
82
- const passed = rule.validator(values);
83
- if (!passed) {
104
+ const result = yield (0, import_validate.runValidator)(rule.validator, values);
105
+ if (!result.passed) {
84
106
  errors2.push({
85
107
  name: childNames,
86
108
  status: "error",
87
109
  value: values,
88
- message: rule.message || ""
110
+ message: (_b = (_a2 = result.message) != null ? _a2 : rule.message) != null ? _b : ""
89
111
  });
90
112
  }
91
113
  }
92
- });
114
+ }
93
115
  }
94
116
  return errors2;
95
- };
117
+ });
96
118
  const [errors, setErrors] = (0, import_react2.useReducer)(
97
119
  (prev, next) => next,
98
120
  []
99
121
  );
100
- const runValidation = () => {
101
- const result = validate(false);
122
+ const runValidation = () => __async(void 0, null, function* () {
123
+ const result = yield validate(false);
102
124
  setErrors(result);
103
- };
125
+ });
104
126
  (0, import_react2.useEffect)(() => {
105
127
  const unsubscribes = childNames.map(
106
128
  (name) => formInstance.subscribe(name, () => {
107
129
  touchedRef.current = true;
108
- runValidation();
130
+ void runValidation();
109
131
  })
110
132
  );
111
133
  return () => unsubscribes.forEach((fn) => fn());
112
134
  }, [childNames, formInstance]);
113
135
  (0, import_react2.useEffect)(() => {
114
136
  const unregister = formInstance.registerGroupEntity(groupId, {
115
- validate: (force) => {
116
- const result = validate(force);
137
+ validate: (force) => __async(void 0, null, function* () {
138
+ const result = yield validate(force);
117
139
  setErrors(result);
118
140
  forceUpdate();
119
141
  return result;
120
- },
142
+ }),
121
143
  reset: () => {
122
144
  touchedRef.current = false;
123
145
  setErrors([]);
@@ -25,6 +25,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
25
25
  mod
26
26
  ));
27
27
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var __async = (__this, __arguments, generator) => {
29
+ return new Promise((resolve, reject) => {
30
+ var fulfilled = (value) => {
31
+ try {
32
+ step(generator.next(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var rejected = (value) => {
38
+ try {
39
+ step(generator.throw(value));
40
+ } catch (e) {
41
+ reject(e);
42
+ }
43
+ };
44
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
45
+ step((generator = generator.apply(__this, __arguments)).next());
46
+ });
47
+ };
28
48
 
29
49
  // src/Form/List.tsx
30
50
  var List_exports = {};
@@ -75,7 +95,7 @@ var List = ({
75
95
  return Array.isArray(value) ? value : [];
76
96
  };
77
97
  const operations = (0, import_react.useMemo)(() => {
78
- const add = (defaultValue, insertIndex) => {
98
+ const add = (defaultValue, insertIndex) => __async(void 0, null, function* () {
79
99
  const currentValue = getListValue();
80
100
  const pathStr = prefixName.join(".");
81
101
  const fieldPaths = [];
@@ -87,7 +107,7 @@ var List = ({
87
107
  });
88
108
  }
89
109
  });
90
- const errors = validateFields == null ? void 0 : validateFields(fieldPaths);
110
+ const errors = yield validateFields == null ? void 0 : validateFields(fieldPaths);
91
111
  if (errors && errors.length > 0) {
92
112
  forceUpdate((prev) => prev + 1);
93
113
  return;
@@ -114,7 +134,7 @@ var List = ({
114
134
  }
115
135
  keyManager.id += 1;
116
136
  forceUpdate((prev) => prev + 1);
117
- };
137
+ });
118
138
  const remove = (index) => {
119
139
  const indices = Array.isArray(index) ? index : [index];
120
140
  const indexSet = new Set(indices);
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,108 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var __async = (__this, __arguments, generator) => {
29
+ return new Promise((resolve, reject) => {
30
+ var fulfilled = (value) => {
31
+ try {
32
+ step(generator.next(value));
33
+ } catch (e) {
34
+ reject(e);
35
+ }
36
+ };
37
+ var rejected = (value) => {
38
+ try {
39
+ step(generator.throw(value));
40
+ } catch (e) {
41
+ reject(e);
42
+ }
43
+ };
44
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
45
+ step((generator = generator.apply(__this, __arguments)).next());
46
+ });
47
+ };
48
+
49
+ // src/Form/demo/async-validate.tsx
50
+ var async_validate_exports = {};
51
+ __export(async_validate_exports, {
52
+ default: () => async_validate_default
53
+ });
54
+ module.exports = __toCommonJS(async_validate_exports);
55
+ var import_yee_c = require("../..");
56
+ var import_react = __toESM(require("react"));
57
+ var TAKEN_USERNAMES = /* @__PURE__ */ new Set(["admin", "root", "test"]);
58
+ function checkUsernameUnique(username) {
59
+ return new Promise((resolve) => {
60
+ setTimeout(() => resolve(!TAKEN_USERNAMES.has(username)), 600);
61
+ });
62
+ }
63
+ var async_validate_default = () => {
64
+ const [form] = import_yee_c.Form.useForm();
65
+ const onFinish = (values) => {
66
+ console.log("Received values:", values);
67
+ };
68
+ const onFinishFailed = (errorInfo) => {
69
+ console.log("Failed:", errorInfo);
70
+ };
71
+ return /* @__PURE__ */ import_react.default.createElement(import_yee_c.Form, { form, onFinish, onFinishFailed }, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Grid, null, /* @__PURE__ */ import_react.default.createElement(
72
+ import_yee_c.Form.Field,
73
+ {
74
+ name: "username",
75
+ label: "Username",
76
+ rules: [
77
+ { required: true, message: "Please input your username!" },
78
+ {
79
+ // Async validator: resolve to pass, throw / reject to fail.
80
+ // The thrown Error's message overrides rule.message.
81
+ validator: (value) => __async(void 0, null, function* () {
82
+ const isUnique = yield checkUsernameUnique(String(value));
83
+ if (!isUnique) {
84
+ throw new Error("This username is already taken");
85
+ }
86
+ }),
87
+ // Validate on blur so we don't hit the "API" on every keystroke.
88
+ validateTrigger: "onBlur"
89
+ }
90
+ ]
91
+ },
92
+ /* @__PURE__ */ import_react.default.createElement(import_yee_c.Input, { placeholder: "Try admin / root / test (already taken)" })
93
+ ), /* @__PURE__ */ import_react.default.createElement(
94
+ import_yee_c.Form.Field,
95
+ {
96
+ name: "email",
97
+ label: "Email",
98
+ rules: [
99
+ { required: true, message: "Please input your email!" },
100
+ {
101
+ regexp: /^[\w.+-]+@[\w-]+\.[\w.-]+$/,
102
+ message: "Please enter a valid email!"
103
+ }
104
+ ]
105
+ },
106
+ /* @__PURE__ */ import_react.default.createElement(import_yee_c.Input, { placeholder: "Please input your email" })
107
+ )), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Space, null, /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { type: "primary", htmlType: "submit" }, "Submit"), /* @__PURE__ */ import_react.default.createElement(import_yee_c.Button, { htmlType: "reset" }, "Reset")));
108
+ };
@@ -72,7 +72,7 @@ function Virtual() {
72
72
  type: "primary",
73
73
  onClick: () => {
74
74
  const form = getForm("form");
75
- form.submit();
75
+ void form.submit();
76
76
  }
77
77
  },
78
78
  "Submit"
@@ -26,13 +26,13 @@ export declare class FormStore {
26
26
  setFieldsValue: (newStore: Store, trigger?: TRIGGER) => void;
27
27
  resetFields: (name?: Name[]) => void;
28
28
  clearFields: (name?: Name[]) => void;
29
- validateField: (name: Name, trigger?: TRIGGER) => ValidateMessage[];
30
- validateFields: (names?: string[], trigger?: TRIGGER) => ValidateMessage[];
29
+ validateField: (name: Name, trigger?: TRIGGER) => Promise<ValidateMessage[]>;
30
+ validateFields: (names?: string[], trigger?: TRIGGER) => Promise<ValidateMessage[]>;
31
31
  refreshField: (newStore?: Store) => void;
32
32
  subscribe: (namePath?: NamePath, callback?: () => void) => (() => void);
33
33
  private notifyWatchers;
34
34
  registerGroupEntity: (id: string, entity: GroupEntity) => (() => void);
35
- validateGroups: (force?: boolean) => ValidateMessage[];
35
+ validateGroups: (force?: boolean) => Promise<ValidateMessage[]>;
36
36
  setCallbacks: (callbacks: Callbacks) => void;
37
37
  getCallbacks: () => Callbacks<any>;
38
38
  /**
@@ -53,6 +53,6 @@ export declare class FormStore {
53
53
  */
54
54
  private setListValue;
55
55
  registerFieldEntities: (entity: FieldEntity) => () => void;
56
- submit: () => ValidateMessage[];
56
+ submit: () => Promise<ValidateMessage[]>;
57
57
  getForm(): FormInstance;
58
58
  }
@@ -42,6 +42,26 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
42
42
  mod
43
43
  ));
44
44
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
45
+ var __async = (__this, __arguments, generator) => {
46
+ return new Promise((resolve, reject) => {
47
+ var fulfilled = (value) => {
48
+ try {
49
+ step(generator.next(value));
50
+ } catch (e) {
51
+ reject(e);
52
+ }
53
+ };
54
+ var rejected = (value) => {
55
+ try {
56
+ step(generator.throw(value));
57
+ } catch (e) {
58
+ reject(e);
59
+ }
60
+ };
61
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
62
+ step((generator = generator.apply(__this, __arguments)).next());
63
+ });
64
+ };
45
65
 
46
66
  // src/Form/form-store.ts
47
67
  var form_store_exports = {};
@@ -151,7 +171,7 @@ var FormStore = class {
151
171
  });
152
172
  }
153
173
  if (trigger === "onChange" || trigger === "onBlur" || trigger === "onSubmit") {
154
- this.validateFields(Object.keys(newStore), trigger);
174
+ void this.validateFields(Object.keys(newStore), trigger);
155
175
  }
156
176
  this.refreshField(newStore);
157
177
  };
@@ -197,7 +217,8 @@ var FormStore = class {
197
217
  }, {});
198
218
  this.setFieldsValue(clearStore, "clear");
199
219
  };
200
- this.validateField = (name, trigger) => {
220
+ this.validateField = (name, trigger) => __async(this, null, function* () {
221
+ var _a;
201
222
  const entity = this.fieldMap.get(name);
202
223
  if (!entity) {
203
224
  return [];
@@ -225,27 +246,32 @@ var FormStore = class {
225
246
  });
226
247
  }
227
248
  const value = this.getFieldValue(name);
228
- mergedRules.forEach((rule) => {
229
- const mark = (0, import_validate.default)(rule, value);
230
- if (name && !mark) {
231
- err.push(__spreadValues({
249
+ for (const rule of mergedRules) {
250
+ const result = yield (0, import_validate.default)(rule, value);
251
+ if (name && !result.passed) {
252
+ err.push(__spreadProps(__spreadValues({}, rule), {
232
253
  name,
233
254
  status: "error",
234
- value
235
- }, rule));
255
+ value,
256
+ message: (_a = result.message) != null ? _a : rule.message
257
+ }));
236
258
  }
237
- });
259
+ }
238
260
  if (err.length > 0) {
239
261
  this.validateMessages.set(name, err);
240
262
  } else if (this.validateMessages.has(name)) {
241
263
  this.validateMessages.delete(name);
242
264
  }
265
+ entity == null ? void 0 : entity.onStoreChange();
243
266
  return err;
244
- };
245
- this.validateFields = (names = Array.from(this.fieldMap.keys()), trigger) => {
267
+ });
268
+ this.validateFields = (..._0) => __async(this, [..._0], function* (names = Array.from(this.fieldMap.keys()), trigger) {
269
+ const results = yield Promise.all(
270
+ names.map((name) => this.validateField(name, trigger))
271
+ );
246
272
  let err = [];
247
- names.forEach((name) => {
248
- const messages = this.validateField(name, trigger);
273
+ names.forEach((name, index) => {
274
+ const messages = results[index];
249
275
  err = err.concat(messages);
250
276
  if (messages.length > 0) {
251
277
  this.validateMessages.set(name, messages);
@@ -254,7 +280,7 @@ var FormStore = class {
254
280
  }
255
281
  });
256
282
  return err;
257
- };
283
+ });
258
284
  this.refreshField = (newStore) => {
259
285
  if (newStore) {
260
286
  const keys = Object.keys(newStore);
@@ -301,13 +327,17 @@ var FormStore = class {
301
327
  this.groupEntities.delete(id);
302
328
  };
303
329
  };
304
- this.validateGroups = (force = false) => {
305
- let err = [];
306
- this.groupEntities.forEach((entity) => {
307
- err = err.concat(entity.validate(force));
308
- });
309
- return err;
310
- };
330
+ this.validateGroups = (force = false) => __async(this, null, function* () {
331
+ const results = yield Promise.all(
332
+ Array.from(this.groupEntities.values()).map(
333
+ (entity) => entity.validate(force)
334
+ )
335
+ );
336
+ return results.reduce(
337
+ (acc, messages) => acc.concat(messages),
338
+ []
339
+ );
340
+ });
311
341
  this.setCallbacks = (callbacks) => {
312
342
  this.callbacks = __spreadValues(__spreadValues({}, this.callbacks), callbacks);
313
343
  };
@@ -431,10 +461,10 @@ var FormStore = class {
431
461
  this.fieldMap.delete(normalizedName);
432
462
  };
433
463
  };
434
- this.submit = () => {
464
+ this.submit = () => __async(this, null, function* () {
435
465
  const { onFinish, onFinishFailed } = this.callbacks;
436
- const fieldErrors = this.validateFields();
437
- const groupErrors = this.validateGroups(true);
466
+ const fieldErrors = yield this.validateFields();
467
+ const groupErrors = yield this.validateGroups(true);
438
468
  const allErrors = [...fieldErrors, ...groupErrors];
439
469
  if (allErrors.length === 0) {
440
470
  onFinish == null ? void 0 : onFinish(this.getFieldsValue());
@@ -443,7 +473,7 @@ var FormStore = class {
443
473
  }
444
474
  this.refreshField();
445
475
  return allErrors;
446
- };
476
+ });
447
477
  }
448
478
  // Set default validation message
449
479
  setDefaultValidateMessage(message) {
@@ -103,7 +103,7 @@ export interface FormInstance<Values = any> {
103
103
  /**
104
104
  * Submit form
105
105
  */
106
- submit: () => ValidateMessage[];
106
+ submit: () => Promise<ValidateMessage[]>;
107
107
  /**
108
108
  * Get all field values
109
109
  */
@@ -127,7 +127,7 @@ export interface FormInstance<Values = any> {
127
127
  /**
128
128
  * Validate field
129
129
  */
130
- validateField: (name: Name, trigger?: 'onChange' | 'onBlur') => ValidateMessage[];
130
+ validateField: (name: Name, trigger?: 'onChange' | 'onBlur') => Promise<ValidateMessage[]>;
131
131
  /**
132
132
  * Get callback functions
133
133
  */
@@ -139,7 +139,7 @@ export interface FormInstance<Values = any> {
139
139
  /**
140
140
  * Validate fields and get error messages
141
141
  */
142
- validateFields: (names?: Name[], trigger?: TRIGGER) => ValidateMessage[];
142
+ validateFields: (names?: Name[], trigger?: TRIGGER) => Promise<ValidateMessage[]>;
143
143
  /**
144
144
  * Initialize form - mainly used to set initial values and callbacks
145
145
  */
@@ -214,9 +214,12 @@ export type Rule = {
214
214
  */
215
215
  message?: string;
216
216
  /**
217
- * Custom validation function, returns true for pass, false or throw for fail
217
+ * Custom validation function. Supports sync and async:
218
+ * - sync: return true/undefined to pass, return false or throw to fail
219
+ * - async: return a Promise (resolve to pass, reject/throw to fail)
220
+ * When throwing/rejecting with an Error, its message overrides rule.message.
218
221
  */
219
- validator?: (value: unknown) => boolean;
222
+ validator?: (value: unknown) => boolean | void | Promise<boolean | void>;
220
223
  /**
221
224
  * Validation trigger timing
222
225
  */
@@ -314,7 +317,7 @@ export type FormListField<T = any> = {
314
317
  value: T;
315
318
  };
316
319
  export type FormListOperation = {
317
- add: (defaultValue?: any, insertIndex?: number) => void;
320
+ add: (defaultValue?: any, insertIndex?: number) => void | Promise<void>;
318
321
  remove: (index: number | number[]) => void;
319
322
  move: (from: number, to: number) => void;
320
323
  };
@@ -357,6 +360,6 @@ export type FieldGroupProps = {
357
360
  className?: string;
358
361
  };
359
362
  export interface GroupEntity {
360
- validate: (force: boolean) => ValidateMessage[];
363
+ validate: (force: boolean) => Promise<ValidateMessage[]>;
361
364
  reset: () => void;
362
365
  }
@@ -1,3 +1,24 @@
1
- import { Rule } from '../interface';
2
- declare function validate(rule: Rule, value: unknown): boolean;
1
+ import type { Rule } from '../interface';
2
+ export interface ValidateResult {
3
+ passed: boolean;
4
+ message?: string;
5
+ }
6
+ /**
7
+ * Run a custom validator, dispatching between sync and async at runtime.
8
+ *
9
+ * Supports all of the following shapes (backwards compatible):
10
+ * - sync `return true` / `return undefined` → pass
11
+ * - sync `return false` → fail (use rule.message)
12
+ * - sync `throw new Error(msg)` → fail (use msg)
13
+ * - async `return Promise.resolve()` → pass
14
+ * - async `return Promise.resolve(false)` → fail (use rule.message)
15
+ * - async `throw` / `return Promise.reject(new Error(msg))` → fail (use msg)
16
+ */
17
+ export declare function runValidator(validator: NonNullable<Rule['validator']>, value: unknown): Promise<ValidateResult>;
18
+ /**
19
+ * Validate a single rule against a value.
20
+ * Returns { passed, message? }. Sync rules short-circuit; the custom validator
21
+ * is awaited so async validators are supported.
22
+ */
23
+ declare function validate(rule: Rule, value: unknown): Promise<ValidateResult>;
3
24
  export default validate;