@os-design/form 1.0.7 → 1.0.9

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 (85) hide show
  1. package/README.md +70 -36
  2. package/dist/cjs/BroadcastObserverManager.js +41 -0
  3. package/dist/cjs/BroadcastObserverManager.js.map +1 -0
  4. package/dist/cjs/{SubscribableData.js → ErrorData.js} +17 -17
  5. package/dist/cjs/ErrorData.js.map +1 -0
  6. package/dist/cjs/ErrorObserverManager.js +62 -0
  7. package/dist/cjs/ErrorObserverManager.js.map +1 -0
  8. package/dist/cjs/Form.js +43 -0
  9. package/dist/cjs/Form.js.map +1 -0
  10. package/dist/cjs/Node.js +57 -0
  11. package/dist/cjs/Node.js.map +1 -0
  12. package/dist/cjs/ValueData.js +53 -0
  13. package/dist/cjs/ValueData.js.map +1 -0
  14. package/dist/cjs/ValueObserverManager.js +122 -0
  15. package/dist/cjs/ValueObserverManager.js.map +1 -0
  16. package/dist/cjs/index.js +114 -105
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/types.js +6 -0
  19. package/dist/cjs/types.js.map +1 -0
  20. package/dist/cjs/useFormContext.js +27 -0
  21. package/dist/cjs/useFormContext.js.map +1 -0
  22. package/dist/cjs/utils/deleteFromArray.js +17 -0
  23. package/dist/cjs/utils/deleteFromArray.js.map +1 -0
  24. package/dist/cjs/utils/path.js +53 -0
  25. package/dist/cjs/utils/path.js.map +1 -0
  26. package/dist/esm/BroadcastObserverManager.js +18 -0
  27. package/dist/esm/BroadcastObserverManager.js.map +1 -0
  28. package/dist/esm/ErrorData.js +20 -0
  29. package/dist/esm/ErrorData.js.map +1 -0
  30. package/dist/esm/ErrorObserverManager.js +26 -0
  31. package/dist/esm/ErrorObserverManager.js.map +1 -0
  32. package/dist/esm/Form.js +26 -0
  33. package/dist/esm/Form.js.map +1 -0
  34. package/dist/esm/Node.js +31 -0
  35. package/dist/esm/Node.js.map +1 -0
  36. package/dist/esm/ValueData.js +21 -0
  37. package/dist/esm/ValueData.js.map +1 -0
  38. package/dist/esm/ValueObserverManager.js +67 -0
  39. package/dist/esm/ValueObserverManager.js.map +1 -0
  40. package/dist/esm/index.js +44 -66
  41. package/dist/esm/index.js.map +1 -1
  42. package/dist/esm/types.js +2 -0
  43. package/dist/esm/types.js.map +1 -0
  44. package/dist/esm/useFormContext.js +17 -0
  45. package/dist/esm/useFormContext.js.map +1 -0
  46. package/dist/esm/utils/deleteFromArray.js +8 -0
  47. package/dist/esm/utils/deleteFromArray.js.map +1 -0
  48. package/dist/esm/utils/path.js +31 -0
  49. package/dist/esm/utils/path.js.map +1 -0
  50. package/dist/types/BroadcastObserverManager.d.ts +10 -0
  51. package/dist/types/BroadcastObserverManager.d.ts.map +1 -0
  52. package/dist/types/ErrorData.d.ts +11 -0
  53. package/dist/types/ErrorData.d.ts.map +1 -0
  54. package/dist/types/ErrorObserverManager.d.ts +12 -0
  55. package/dist/types/ErrorObserverManager.d.ts.map +1 -0
  56. package/dist/types/Form.d.ts +12 -0
  57. package/dist/types/Form.d.ts.map +1 -0
  58. package/dist/types/Node.d.ts +15 -0
  59. package/dist/types/Node.d.ts.map +1 -0
  60. package/dist/types/ValueData.d.ts +11 -0
  61. package/dist/types/ValueData.d.ts.map +1 -0
  62. package/dist/types/ValueObserverManager.d.ts +13 -0
  63. package/dist/types/ValueObserverManager.d.ts.map +1 -0
  64. package/dist/types/index.d.ts +32 -46
  65. package/dist/types/index.d.ts.map +1 -1
  66. package/dist/types/types.d.ts +15 -0
  67. package/dist/types/types.d.ts.map +1 -0
  68. package/dist/types/useFormContext.d.ts +11 -0
  69. package/dist/types/useFormContext.d.ts.map +1 -0
  70. package/dist/types/utils/deleteFromArray.d.ts +3 -0
  71. package/dist/types/utils/deleteFromArray.d.ts.map +1 -0
  72. package/dist/types/utils/path.d.ts +5 -0
  73. package/dist/types/utils/path.d.ts.map +1 -0
  74. package/package.json +3 -3
  75. package/dist/cjs/SubscribableData.js.map +0 -1
  76. package/dist/cjs/SubscriptionManager.js +0 -83
  77. package/dist/cjs/SubscriptionManager.js.map +0 -1
  78. package/dist/esm/SubscribableData.js +0 -23
  79. package/dist/esm/SubscribableData.js.map +0 -1
  80. package/dist/esm/SubscriptionManager.js +0 -46
  81. package/dist/esm/SubscriptionManager.js.map +0 -1
  82. package/dist/types/SubscribableData.d.ts +0 -11
  83. package/dist/types/SubscribableData.d.ts.map +0 -1
  84. package/dist/types/SubscriptionManager.d.ts +0 -19
  85. package/dist/types/SubscriptionManager.d.ts.map +0 -1
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _BroadcastObserverManager = _interopRequireDefault(require("./BroadcastObserverManager"));
9
+ var _Node = _interopRequireDefault(require("./Node"));
10
+ var _path = require("./utils/path");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
13
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
14
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
16
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
17
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
18
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
19
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
20
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
21
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); }
22
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
23
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
24
+ function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
25
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
26
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
27
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
28
+ var split = function split(path) {
29
+ return path.split('.');
30
+ };
31
+ var ValueObserverManager = /*#__PURE__*/function (_BroadcastObserverMan) {
32
+ _inherits(ValueObserverManager, _BroadcastObserverMan);
33
+ var _super = _createSuper(ValueObserverManager);
34
+ function ValueObserverManager() {
35
+ var _this;
36
+ _classCallCheck(this, ValueObserverManager);
37
+ _this = _super.call(this);
38
+ _this.root = void 0;
39
+ _this.root = new _Node["default"]();
40
+ return _this;
41
+ }
42
+ _createClass(ValueObserverManager, [{
43
+ key: "findNode",
44
+ value: function findNode(path) {
45
+ var keys = split(path);
46
+ var cur = this.root;
47
+ keys.forEach(function (key) {
48
+ cur = cur.getNode(key) || cur.createNode(key);
49
+ });
50
+ return cur;
51
+ }
52
+ }, {
53
+ key: "subscribe",
54
+ value: function subscribe(name, observer) {
55
+ var node = this.findNode(name);
56
+ node.addObserver(observer);
57
+ return {
58
+ unsubscribe: function unsubscribe() {
59
+ node.deleteObserver(observer);
60
+ if (node.observers.length === 0) {
61
+ var _node$parent;
62
+ (_node$parent = node.parent) === null || _node$parent === void 0 ? void 0 : _node$parent.deleteNode(node.name);
63
+ }
64
+ }
65
+ };
66
+ }
67
+ }, {
68
+ key: "callObservers",
69
+ value: function callObservers(name, data) {
70
+ this.callBroadcastObservers(name, (0, _path.get)(data, name));
71
+ this.callNodeObservers(name, data);
72
+ }
73
+ }, {
74
+ key: "callNodeObservers",
75
+ value: function callNodeObservers(name, data) {
76
+ var keys = split(name);
77
+ var curNode = this.root;
78
+ var curData = data;
79
+
80
+ // Call the observers for the root node
81
+ curNode.observers.forEach(function (observer) {
82
+ return observer(curData);
83
+ });
84
+
85
+ // Call observers on each node from the root to the specified one
86
+ for (var i = 0; i < keys.length; i += 1) {
87
+ var key = keys[i];
88
+ var node = curNode.getNode(key);
89
+ if (!node || !(0, _path.isObjectOrArray)(curData)) return;
90
+ curNode = node;
91
+ curData = curData[key];
92
+ // eslint-disable-next-line @typescript-eslint/no-loop-func
93
+ curNode.observers.forEach(function (observer) {
94
+ return observer(curData);
95
+ });
96
+ }
97
+
98
+ // Call observers of all child nodes started from the specified one
99
+ this.callChildObservers(curNode, curData);
100
+ }
101
+ }, {
102
+ key: "callChildObservers",
103
+ value: function callChildObservers(parent, data) {
104
+ var _this2 = this;
105
+ if (!(0, _path.isObjectOrArray)(data)) return;
106
+ Object.entries(parent.nodes).forEach(function (_ref) {
107
+ var _ref2 = _slicedToArray(_ref, 2),
108
+ name = _ref2[0],
109
+ node = _ref2[1];
110
+ var value = data[name];
111
+ node.observers.forEach(function (observer) {
112
+ return observer(value);
113
+ });
114
+ _this2.callChildObservers(node, value);
115
+ });
116
+ }
117
+ }]);
118
+ return ValueObserverManager;
119
+ }(_BroadcastObserverManager["default"]);
120
+ var _default = ValueObserverManager;
121
+ exports["default"] = _default;
122
+ //# sourceMappingURL=ValueObserverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueObserverManager.js","names":["split","path","ValueObserverManager","root","Node","keys","cur","forEach","key","getNode","createNode","name","observer","node","findNode","addObserver","unsubscribe","deleteObserver","observers","length","parent","deleteNode","data","callBroadcastObservers","get","callNodeObservers","curNode","curData","i","isObjectOrArray","callChildObservers","Object","entries","nodes","value","BroadcastObserverManager"],"sources":["../../src/ValueObserverManager.ts"],"sourcesContent":["import BroadcastObserverManager from './BroadcastObserverManager';\nimport Node from './Node';\nimport {\n Observer,\n PathReturn,\n RecursivePath,\n StringMap,\n Subscription,\n} from './types';\nimport { get, isObjectOrArray } from './utils/path';\n\nconst split = (path: string) => path.split('.');\n\nclass ValueObserverManager<\n TValues extends StringMap,\n TName extends RecursivePath<TValues> = RecursivePath<TValues>\n> extends BroadcastObserverManager<TName, TValues[TName]> {\n private readonly root: Node;\n\n public constructor() {\n super();\n this.root = new Node();\n }\n\n private findNode(path: string) {\n const keys = split(path);\n let cur = this.root;\n keys.forEach((key) => {\n cur = cur.getNode(key) || cur.createNode(key);\n });\n return cur;\n }\n\n public subscribe<T extends TName>(\n name: T,\n observer: Observer<PathReturn<TValues, T>>\n ): Subscription {\n const node = this.findNode(name);\n node.addObserver(observer);\n\n return {\n unsubscribe: () => {\n node.deleteObserver(observer);\n if (node.observers.length === 0) {\n node.parent?.deleteNode(node.name);\n }\n },\n };\n }\n\n protected callObservers<T extends TName>(name: T, data: TValues): void {\n this.callBroadcastObservers(name, get(data, name));\n this.callNodeObservers(name, data);\n }\n\n private callNodeObservers<T extends TName>(name: T, data: TValues): void {\n const keys = split(name);\n let curNode = this.root;\n let curData = data;\n\n // Call the observers for the root node\n curNode.observers.forEach((observer) => observer(curData));\n\n // Call observers on each node from the root to the specified one\n for (let i = 0; i < keys.length; i += 1) {\n const key = keys[i];\n const node = curNode.getNode(key);\n if (!node || !isObjectOrArray(curData)) return;\n curNode = node;\n curData = curData[key];\n // eslint-disable-next-line @typescript-eslint/no-loop-func\n curNode.observers.forEach((observer) => observer(curData));\n }\n\n // Call observers of all child nodes started from the specified one\n this.callChildObservers(curNode, curData);\n }\n\n private callChildObservers(parent: Node, data: TValues): void {\n if (!isObjectOrArray(data)) return;\n Object.entries(parent.nodes).forEach(([name, node]) => {\n const value = data[name];\n node.observers.forEach((observer) => observer(value));\n this.callChildObservers(node, value);\n });\n }\n}\n\nexport default ValueObserverManager;\n"],"mappings":";;;;;;;AAAA;AACA;AAQA;AAAoD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEpD,IAAMA,KAAK,GAAG,SAARA,KAAK,CAAIC,IAAY;EAAA,OAAKA,IAAI,CAACD,KAAK,CAAC,GAAG,CAAC;AAAA;AAAC,IAE1CE,oBAAoB;EAAA;EAAA;EAMxB,gCAAqB;IAAA;IAAA;IACnB;IAAQ,MAHOC,IAAI;IAInB,MAAKA,IAAI,GAAG,IAAIC,gBAAI,EAAE;IAAC;EACzB;EAAC;IAAA;IAAA,OAED,kBAAiBH,IAAY,EAAE;MAC7B,IAAMI,IAAI,GAAGL,KAAK,CAACC,IAAI,CAAC;MACxB,IAAIK,GAAG,GAAG,IAAI,CAACH,IAAI;MACnBE,IAAI,CAACE,OAAO,CAAC,UAACC,GAAG,EAAK;QACpBF,GAAG,GAAGA,GAAG,CAACG,OAAO,CAACD,GAAG,CAAC,IAAIF,GAAG,CAACI,UAAU,CAACF,GAAG,CAAC;MAC/C,CAAC,CAAC;MACF,OAAOF,GAAG;IACZ;EAAC;IAAA;IAAA,OAED,mBACEK,IAAO,EACPC,QAA0C,EAC5B;MACd,IAAMC,IAAI,GAAG,IAAI,CAACC,QAAQ,CAACH,IAAI,CAAC;MAChCE,IAAI,CAACE,WAAW,CAACH,QAAQ,CAAC;MAE1B,OAAO;QACLI,WAAW,EAAE,uBAAM;UACjBH,IAAI,CAACI,cAAc,CAACL,QAAQ,CAAC;UAC7B,IAAIC,IAAI,CAACK,SAAS,CAACC,MAAM,KAAK,CAAC,EAAE;YAAA;YAC/B,gBAAAN,IAAI,CAACO,MAAM,iDAAX,aAAaC,UAAU,CAACR,IAAI,CAACF,IAAI,CAAC;UACpC;QACF;MACF,CAAC;IACH;EAAC;IAAA;IAAA,OAED,uBAAyCA,IAAO,EAAEW,IAAa,EAAQ;MACrE,IAAI,CAACC,sBAAsB,CAACZ,IAAI,EAAE,IAAAa,SAAG,EAACF,IAAI,EAAEX,IAAI,CAAC,CAAC;MAClD,IAAI,CAACc,iBAAiB,CAACd,IAAI,EAAEW,IAAI,CAAC;IACpC;EAAC;IAAA;IAAA,OAED,2BAA2CX,IAAO,EAAEW,IAAa,EAAQ;MACvE,IAAMjB,IAAI,GAAGL,KAAK,CAACW,IAAI,CAAC;MACxB,IAAIe,OAAO,GAAG,IAAI,CAACvB,IAAI;MACvB,IAAIwB,OAAO,GAAGL,IAAI;;MAElB;MACAI,OAAO,CAACR,SAAS,CAACX,OAAO,CAAC,UAACK,QAAQ;QAAA,OAAKA,QAAQ,CAACe,OAAO,CAAC;MAAA,EAAC;;MAE1D;MACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGvB,IAAI,CAACc,MAAM,EAAES,CAAC,IAAI,CAAC,EAAE;QACvC,IAAMpB,GAAG,GAAGH,IAAI,CAACuB,CAAC,CAAC;QACnB,IAAMf,IAAI,GAAGa,OAAO,CAACjB,OAAO,CAACD,GAAG,CAAC;QACjC,IAAI,CAACK,IAAI,IAAI,CAAC,IAAAgB,qBAAe,EAACF,OAAO,CAAC,EAAE;QACxCD,OAAO,GAAGb,IAAI;QACdc,OAAO,GAAGA,OAAO,CAACnB,GAAG,CAAC;QACtB;QACAkB,OAAO,CAACR,SAAS,CAACX,OAAO,CAAC,UAACK,QAAQ;UAAA,OAAKA,QAAQ,CAACe,OAAO,CAAC;QAAA,EAAC;MAC5D;;MAEA;MACA,IAAI,CAACG,kBAAkB,CAACJ,OAAO,EAAEC,OAAO,CAAC;IAC3C;EAAC;IAAA;IAAA,OAED,4BAA2BP,MAAY,EAAEE,IAAa,EAAQ;MAAA;MAC5D,IAAI,CAAC,IAAAO,qBAAe,EAACP,IAAI,CAAC,EAAE;MAC5BS,MAAM,CAACC,OAAO,CAACZ,MAAM,CAACa,KAAK,CAAC,CAAC1B,OAAO,CAAC,gBAAkB;QAAA;UAAhBI,IAAI;UAAEE,IAAI;QAC/C,IAAMqB,KAAK,GAAGZ,IAAI,CAACX,IAAI,CAAC;QACxBE,IAAI,CAACK,SAAS,CAACX,OAAO,CAAC,UAACK,QAAQ;UAAA,OAAKA,QAAQ,CAACsB,KAAK,CAAC;QAAA,EAAC;QACrD,MAAI,CAACJ,kBAAkB,CAACjB,IAAI,EAAEqB,KAAK,CAAC;MACtC,CAAC,CAAC;IACJ;EAAC;EAAA;AAAA,EArEOC,oCAAwB;AAAA,eAwEnBjC,oBAAoB;AAAA"}
package/dist/cjs/index.js CHANGED
@@ -5,35 +5,73 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  var _exportNames = {
8
- Form: true,
9
- FormProvider: true,
10
- useError: true,
11
8
  useForm: true,
12
- useExistingForm: true
9
+ useExistingForm: true,
10
+ Form: true
13
11
  };
14
- exports.Form = void 0;
15
- exports.FormProvider = FormProvider;
16
- exports.useForm = exports.useExistingForm = exports.useError = void 0;
17
- var _react = _interopRequireWildcard(require("react"));
18
- var _SubscribableData = _interopRequireDefault(require("./SubscribableData"));
19
- var _clone = _interopRequireDefault(require("./utils/clone"));
12
+ Object.defineProperty(exports, "Form", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _Form["default"];
16
+ }
17
+ });
18
+ exports.useForm = exports.useExistingForm = void 0;
19
+ var _react = require("react");
20
+ var _Form = _interopRequireDefault(require("./Form"));
21
+ var _useFormContext = _interopRequireWildcard(require("./useFormContext"));
22
+ Object.keys(_useFormContext).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
25
+ if (key in exports && exports[key] === _useFormContext[key]) return;
26
+ Object.defineProperty(exports, key, {
27
+ enumerable: true,
28
+ get: function get() {
29
+ return _useFormContext[key];
30
+ }
31
+ });
32
+ });
20
33
  var _isEqual = _interopRequireDefault(require("./utils/isEqual"));
34
+ var _path = require("./utils/path");
21
35
  var _useDeepEqualMemo = _interopRequireDefault(require("./utils/useDeepEqualMemo"));
22
- var _SubscriptionManager = require("./SubscriptionManager");
23
- Object.keys(_SubscriptionManager).forEach(function (key) {
36
+ var _BroadcastObserverManager = require("./BroadcastObserverManager");
37
+ Object.keys(_BroadcastObserverManager).forEach(function (key) {
24
38
  if (key === "default" || key === "__esModule") return;
25
39
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
26
- if (key in exports && exports[key] === _SubscriptionManager[key]) return;
40
+ if (key in exports && exports[key] === _BroadcastObserverManager[key]) return;
27
41
  Object.defineProperty(exports, key, {
28
42
  enumerable: true,
29
43
  get: function get() {
30
- return _SubscriptionManager[key];
44
+ return _BroadcastObserverManager[key];
45
+ }
46
+ });
47
+ });
48
+ var _ErrorObserverManager = require("./ErrorObserverManager");
49
+ Object.keys(_ErrorObserverManager).forEach(function (key) {
50
+ if (key === "default" || key === "__esModule") return;
51
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
52
+ if (key in exports && exports[key] === _ErrorObserverManager[key]) return;
53
+ Object.defineProperty(exports, key, {
54
+ enumerable: true,
55
+ get: function get() {
56
+ return _ErrorObserverManager[key];
57
+ }
58
+ });
59
+ });
60
+ var _types = require("./types");
61
+ Object.keys(_types).forEach(function (key) {
62
+ if (key === "default" || key === "__esModule") return;
63
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
64
+ if (key in exports && exports[key] === _types[key]) return;
65
+ Object.defineProperty(exports, key, {
66
+ enumerable: true,
67
+ get: function get() {
68
+ return _types[key];
31
69
  }
32
70
  });
33
71
  });
34
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
35
72
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
36
73
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
74
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
37
75
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
38
76
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
39
77
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
@@ -44,46 +82,6 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
44
82
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
45
83
  function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
46
84
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
47
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
48
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
49
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
50
- var Form = /*#__PURE__*/function () {
51
- function Form(initValues) {
52
- _classCallCheck(this, Form);
53
- this.initValues = void 0;
54
- this.values = void 0;
55
- this.errors = void 0;
56
- this.initValues = initValues;
57
- this.values = new _SubscribableData["default"]((0, _clone["default"])(initValues));
58
- this.errors = new _SubscribableData["default"]({});
59
- }
60
- _createClass(Form, [{
61
- key: "reset",
62
- value: function reset() {
63
- var _this = this;
64
- // Reset values
65
- Object.keys(this.values.getAll()).forEach(function (name) {
66
- _this.values.set(name, _this.initValues[name]);
67
- });
68
-
69
- // Reset errors
70
- Object.keys(this.errors.getAll()).forEach(function (name) {
71
- _this.errors.set(name, undefined);
72
- });
73
- }
74
- }]);
75
- return Form;
76
- }();
77
- exports.Form = Form;
78
- var FormContext = /*#__PURE__*/(0, _react.createContext)(null);
79
- // eslint-disable-next-line react/function-component-definition
80
- function FormProvider(_ref) {
81
- var form = _ref.form,
82
- children = _ref.children;
83
- return /*#__PURE__*/_react["default"].createElement(FormContext.Provider, {
84
- value: form
85
- }, children);
86
- }
87
85
  var createUseValueHook = function createUseValueHook(form) {
88
86
  return function (name) {
89
87
  var _useState = (0, _react.useState)(form.values.get(name)),
@@ -91,7 +89,7 @@ var createUseValueHook = function createUseValueHook(form) {
91
89
  value = _useState2[0],
92
90
  setValue = _useState2[1];
93
91
  (0, _react.useEffect)(function () {
94
- var subscription = form.values.subscribeToField(name, function (v) {
92
+ var subscription = form.values.subscribe(name, function (v) {
95
93
  setValue(v);
96
94
  });
97
95
  return function () {
@@ -101,25 +99,26 @@ var createUseValueHook = function createUseValueHook(form) {
101
99
  return value;
102
100
  };
103
101
  };
104
- var useError = function useError(name, form) {
105
- var currentForm = (0, _react.useContext)(FormContext) || form;
106
- if (!currentForm) throw new Error('Specify the form');
107
- var _useState3 = (0, _react.useState)(currentForm.errors.get(name)),
108
- _useState4 = _slicedToArray(_useState3, 2),
109
- value = _useState4[0],
110
- setValue = _useState4[1];
111
- (0, _react.useEffect)(function () {
112
- var subscription = currentForm.errors.subscribeToField(name, function (v) {
113
- setValue(v);
114
- });
115
- return function () {
116
- return subscription.unsubscribe();
117
- };
118
- }, [currentForm.errors, name]);
119
- return value;
102
+ var createUseErrorHook = function createUseErrorHook(form) {
103
+ return function (name) {
104
+ var _useState3 = (0, _react.useState)(form.errors.get(name)),
105
+ _useState4 = _slicedToArray(_useState3, 2),
106
+ value = _useState4[0],
107
+ setValue = _useState4[1];
108
+ (0, _react.useEffect)(function () {
109
+ var subscription = form.errors.subscribe(name, function (v) {
110
+ setValue(v);
111
+ });
112
+ return function () {
113
+ return subscription.unsubscribe();
114
+ };
115
+ }, [name]);
116
+ return value;
117
+ };
120
118
  };
121
- exports.useError = useError;
122
119
  var createUseTransformerHook = function createUseTransformerHook(form) {
120
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
121
+ // @ts-ignore
123
122
  var useValue = createUseValueHook(form);
124
123
  return function (name, transformer) {
125
124
  var value = useValue(name);
@@ -129,10 +128,11 @@ var createUseTransformerHook = function createUseTransformerHook(form) {
129
128
  }, [transformer]);
130
129
  (0, _react.useEffect)(function () {
131
130
  var partialValues = transformerRef.current(value);
132
- Object.entries(partialValues).forEach(function (_ref2) {
133
- var _ref3 = _slicedToArray(_ref2, 2),
134
- n = _ref3[0],
135
- v = _ref3[1];
131
+ Object.entries(partialValues).forEach(function (_ref) {
132
+ var _ref2 = _slicedToArray(_ref, 2),
133
+ n = _ref2[0],
134
+ v = _ref2[1];
135
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
136
136
  form.values.set(n, v);
137
137
  });
138
138
  }, [value]);
@@ -140,29 +140,32 @@ var createUseTransformerHook = function createUseTransformerHook(form) {
140
140
  };
141
141
  var createFieldComponent = function createFieldComponent(form) {
142
142
  var useValue = createUseValueHook(form);
143
+ var useError = createUseErrorHook(form);
143
144
  return function (props) {
144
145
  var name = props.name,
145
- toValue = props.toValue,
146
- fromValue = props.fromValue,
146
+ _props$transformer = props.transformer,
147
+ transformer = _props$transformer === void 0 ? function (v) {
148
+ return v;
149
+ } : _props$transformer,
147
150
  render = props.render;
148
151
  var value = useValue(name);
149
- var transformedValue = (0, _react.useMemo)(function () {
150
- return toValue ? toValue(value) : value;
151
- }, [toValue, value]);
152
- var error = useError(name, form);
152
+ var error = useError(name);
153
+ var initValue = (0, _react.useMemo)(function () {
154
+ return (0, _path.get)(form.initValues, name);
155
+ }, [name]);
153
156
  var modified = (0, _react.useMemo)(function () {
154
- return !(0, _isEqual["default"])(value, form.initValues[name]);
155
- }, [name, value]);
157
+ return !(0, _isEqual["default"])(value, initValue);
158
+ }, [initValue, value]);
156
159
  var reset = (0, _react.useCallback)(function () {
157
- return form.values.set(name, form.initValues[name]);
158
- }, [name]);
159
- var fromValueRef = (0, _react.useRef)(fromValue);
160
+ return form.values.set(name, initValue);
161
+ }, [initValue, name]);
162
+ var transformerRef = (0, _react.useRef)(transformer);
160
163
  (0, _react.useEffect)(function () {
161
- fromValueRef.current = fromValue;
162
- }, [fromValue]);
164
+ transformerRef.current = transformer;
165
+ }, [transformer]);
163
166
  var onChange = (0, _react.useCallback)(function (v) {
164
- form.values.set(name, fromValueRef.current ? fromValueRef.current(v) : v);
165
- form.errors.set(name, undefined);
167
+ form.values.set(name, transformerRef.current(v));
168
+ form.errors.set(name, undefined); // Reset the error when the value is changed
166
169
  }, [name]);
167
170
  var renderRef = (0, _react.useRef)(render);
168
171
  (0, _react.useEffect)(function () {
@@ -170,13 +173,13 @@ var createFieldComponent = function createFieldComponent(form) {
170
173
  }, [render]);
171
174
  var inputProps = (0, _react.useMemo)(function () {
172
175
  return {
173
- value: transformedValue,
176
+ value: value,
174
177
  onChange: onChange
175
178
  };
176
- }, [onChange, transformedValue]);
179
+ }, [onChange, value]);
177
180
  var fieldState = (0, _react.useMemo)(function () {
178
181
  return {
179
- error: error || null,
182
+ error: error,
180
183
  modified: modified,
181
184
  reset: reset
182
185
  };
@@ -200,8 +203,8 @@ var useModifiedFields = function useModifiedFields(form) {
200
203
  initValuesRef.current = form.initValues;
201
204
  }, [form.initValues]);
202
205
  (0, _react.useEffect)(function () {
203
- var subscription = form.values.subscribeToAllFields(function (name, value) {
204
- var isInitValue = (0, _isEqual["default"])(value, initValuesRef.current[name]);
206
+ var subscription = form.values.subscribeToAll(function (name, value) {
207
+ var isInitValue = (0, _isEqual["default"])(value, (0, _path.get)(initValuesRef.current, name));
205
208
  var fields = modifiedFieldsRef.current;
206
209
  if (fields.includes(name)) {
207
210
  if (isInitValue) {
@@ -220,15 +223,18 @@ var useModifiedFields = function useModifiedFields(form) {
220
223
  return modifiedFields;
221
224
  };
222
225
  var useFormResponse = function useFormResponse(form) {
226
+ var Field = (0, _react.useMemo)(function () {
227
+ return createFieldComponent(form);
228
+ }, [form]);
223
229
  var useValue = (0, _react.useMemo)(function () {
224
230
  return createUseValueHook(form);
225
231
  }, [form]);
232
+ var useError = (0, _react.useMemo)(function () {
233
+ return createUseErrorHook(form);
234
+ }, [form]);
226
235
  var useTransformer = (0, _react.useMemo)(function () {
227
236
  return createUseTransformerHook(form);
228
237
  }, [form]);
229
- var Field = (0, _react.useMemo)(function () {
230
- return createFieldComponent(form);
231
- }, [form]);
232
238
  var modifiedFields = useModifiedFields(form);
233
239
  var modified = (0, _react.useMemo)(function () {
234
240
  return modifiedFields.length > 0;
@@ -238,24 +244,27 @@ var useFormResponse = function useFormResponse(form) {
238
244
  form: form,
239
245
  Field: Field,
240
246
  useValue: useValue,
247
+ useError: useError,
241
248
  useTransformer: useTransformer,
242
249
  modifiedFields: modifiedFields,
243
250
  modified: modified
244
251
  };
245
- }, [Field, form, modified, modifiedFields, useTransformer, useValue]);
252
+ }, [Field, form, modified, modifiedFields, useError, useTransformer, useValue]);
246
253
  };
247
254
  var useForm = function useForm(initValues) {
248
255
  var memoizedInitValues = (0, _useDeepEqualMemo["default"])(function () {
249
256
  return initValues;
250
257
  }, [initValues]);
251
- var form = (0, _react.useMemo)(function () {
252
- return new Form(memoizedInitValues);
258
+ var formRef = (0, _react.useRef)(new _Form["default"](memoizedInitValues));
259
+ (0, _react.useEffect)(function () {
260
+ formRef.current.initValues = memoizedInitValues;
261
+ formRef.current.reset();
253
262
  }, [memoizedInitValues]);
254
- return useFormResponse(form);
263
+ return useFormResponse(formRef.current);
255
264
  };
256
265
  exports.useForm = useForm;
257
266
  var useExistingForm = function useExistingForm() {
258
- var form = (0, _react.useContext)(FormContext);
267
+ var form = (0, _useFormContext["default"])();
259
268
  if (!form) throw new Error('Wrap your form in a FormProvider');
260
269
  return useFormResponse(form);
261
270
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Form","initValues","values","errors","SubscribableData","clone","Object","keys","getAll","forEach","name","set","undefined","FormContext","createContext","FormProvider","form","children","createUseValueHook","useState","get","value","setValue","useEffect","subscription","subscribeToField","v","unsubscribe","useError","currentForm","useContext","Error","createUseTransformerHook","useValue","transformer","transformerRef","useRef","current","partialValues","entries","n","createFieldComponent","props","toValue","fromValue","render","transformedValue","useMemo","error","modified","isEqual","reset","useCallback","fromValueRef","onChange","renderRef","inputProps","fieldState","useModifiedFields","modifiedFields","setModifiedFields","modifiedFieldsRef","initValuesRef","subscribeToAllFields","isInitValue","fields","includes","filter","field","useFormResponse","useTransformer","Field","length","useForm","memoizedInitValues","useDeepEqualMemo","useExistingForm"],"sources":["../../src/index.tsx"],"sourcesContent":["import React, {\n createContext,\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport SubscribableData from './SubscribableData';\nimport clone from './utils/clone';\nimport isEqual from './utils/isEqual';\nimport useDeepEqualMemo from './utils/useDeepEqualMemo';\n\nexport * from './SubscriptionManager';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Values = Record<string, any>;\ntype Errors<TValues extends Values> = Record<keyof TValues, string | undefined>;\n\nexport class Form<\n TValues extends Values = Values,\n TErrors extends Errors<TValues> = Errors<TValues>\n> {\n public readonly initValues: TValues;\n\n public readonly values: SubscribableData<TValues>;\n\n public readonly errors: SubscribableData<TErrors>;\n\n public constructor(initValues: TValues) {\n this.initValues = initValues;\n this.values = new SubscribableData(clone(initValues));\n this.errors = new SubscribableData({} as TErrors);\n }\n\n public reset() {\n // Reset values\n Object.keys(this.values.getAll()).forEach((name) => {\n this.values.set(name, this.initValues[name]);\n });\n\n // Reset errors\n Object.keys(this.errors.getAll()).forEach((name) => {\n this.errors.set(name, undefined as any);\n });\n }\n}\n\nconst FormContext = createContext<any>(null);\n\ninterface FormProviderProps<TValues extends Values> {\n form: Form<TValues>;\n children?: ReactNode;\n}\n\n// eslint-disable-next-line react/function-component-definition\nexport function FormProvider<TValues extends Values>({\n form,\n children,\n}: FormProviderProps<TValues>) {\n return <FormContext.Provider value={form}>{children}</FormContext.Provider>;\n}\n\nconst createUseValueHook =\n <TValues extends Values>(form: Form<TValues>) =>\n <TName extends keyof TValues>(name: TName) => {\n const [value, setValue] = useState<TValues[TName]>(form.values.get(name));\n\n useEffect(() => {\n const subscription = form.values.subscribeToField(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [name]);\n\n return value;\n };\n\nexport const useError = <\n TValues extends Values = Values,\n TName extends keyof TValues = keyof TValues\n>(\n name: TName,\n form?: Form<TValues>\n) => {\n const currentForm = useContext(FormContext) || form;\n if (!currentForm) throw new Error('Specify the form');\n const [value, setValue] = useState<string | undefined>(\n currentForm.errors.get(name)\n );\n\n useEffect(() => {\n const subscription = currentForm.errors.subscribeToField(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [currentForm.errors, name]);\n\n return value;\n};\n\nexport type Transformer<TValues extends Values, TName extends keyof TValues> = (\n value: TValues[TName]\n) => Partial<TValues>;\n\nconst createUseTransformerHook = <TValues extends Values>(\n form: Form<TValues>\n) => {\n const useValue = createUseValueHook(form);\n return <TName extends keyof TValues>(\n name: TName,\n transformer: Transformer<TValues, TName>\n ) => {\n const value = useValue(name);\n\n const transformerRef = useRef(transformer);\n useEffect(() => {\n transformerRef.current = transformer;\n }, [transformer]);\n\n useEffect(() => {\n const partialValues = transformerRef.current(value);\n Object.entries(partialValues).forEach(([n, v]) => {\n form.values.set(n, v);\n });\n }, [value]);\n };\n};\n\ninterface InputProps<T> {\n value: T;\n onChange: (value: T) => void;\n}\ninterface FieldState {\n error: string | null;\n modified: boolean;\n reset: () => void;\n}\ninterface FieldPropsWithoutTransformers<TName, TStateValue> {\n name: TName;\n toValue?: never;\n fromValue?: never;\n render: (\n inputProps: InputProps<TStateValue>,\n fieldState: FieldState\n ) => ReactElement | null;\n}\ninterface FieldPropsWithTransformers<TName, TStateValue, TInputValue> {\n name: TName;\n toValue: (value: TStateValue) => TInputValue;\n fromValue?: (value: TInputValue) => TStateValue;\n render: (\n inputProps: InputProps<TInputValue>,\n fieldState: FieldState\n ) => ReactElement | null;\n}\ntype FieldProps<TName, TStateValue, TInputValue> =\n | FieldPropsWithoutTransformers<TName, TStateValue>\n | FieldPropsWithTransformers<TName, TStateValue, TInputValue>;\n\nconst createFieldComponent = <TValues extends Values>(form: Form<TValues>) => {\n const useValue = createUseValueHook(form);\n return <TName extends keyof TValues>(\n props: FieldProps<TName, TValues[TName], any>\n ) => {\n const { name, toValue, fromValue, render } = props;\n\n const value = useValue(name);\n const transformedValue = useMemo<any>(\n () => (toValue ? toValue(value) : value),\n [toValue, value]\n );\n const error = useError<TValues>(name, form);\n\n const modified = useMemo(\n () => !isEqual(value, form.initValues[name]),\n [name, value]\n );\n const reset = useCallback(\n () => form.values.set(name, form.initValues[name]),\n [name]\n );\n\n const fromValueRef = useRef(fromValue);\n useEffect(() => {\n fromValueRef.current = fromValue;\n }, [fromValue]);\n\n const onChange = useCallback(\n (v: any) => {\n form.values.set(\n name,\n fromValueRef.current ? fromValueRef.current(v) : (v as TValues[TName])\n );\n form.errors.set(name, undefined);\n },\n [name]\n );\n\n const renderRef = useRef(render);\n useEffect(() => {\n renderRef.current = render;\n }, [render]);\n\n const inputProps = useMemo(\n () => ({ value: transformedValue, onChange }),\n [onChange, transformedValue]\n );\n const fieldState = useMemo(\n () => ({ error: error || null, modified, reset }),\n [error, modified, reset]\n );\n\n return useMemo(\n () => renderRef.current(inputProps, fieldState),\n [fieldState, inputProps]\n );\n };\n};\n\nconst useModifiedFields = <TValues extends Values>(form: Form<TValues>) => {\n const [modifiedFields, setModifiedFields] = useState<Array<keyof TValues>>(\n []\n );\n\n const modifiedFieldsRef = useRef(modifiedFields);\n useEffect(() => {\n modifiedFieldsRef.current = modifiedFields;\n }, [modifiedFields]);\n\n const initValuesRef = useRef(form.initValues);\n useEffect(() => {\n initValuesRef.current = form.initValues;\n }, [form.initValues]);\n\n useEffect(() => {\n const subscription = form.values.subscribeToAllFields((name, value) => {\n const isInitValue = isEqual(value, initValuesRef.current[name]);\n const fields = modifiedFieldsRef.current;\n\n if (fields.includes(name)) {\n if (isInitValue) {\n setModifiedFields(fields.filter((field) => field !== name));\n }\n } else if (!isInitValue) {\n setModifiedFields([...fields, name]);\n }\n });\n return () => subscription.unsubscribe();\n }, [form.values]);\n\n return modifiedFields;\n};\n\nconst useFormResponse = <TValues extends Values>(form: Form<TValues>) => {\n const useValue = useMemo(() => createUseValueHook(form), [form]);\n const useTransformer = useMemo(() => createUseTransformerHook(form), [form]);\n const Field = useMemo(() => createFieldComponent(form), [form]);\n\n const modifiedFields = useModifiedFields(form);\n const modified = useMemo(\n () => modifiedFields.length > 0,\n [modifiedFields.length]\n );\n\n return useMemo(\n () => ({\n form,\n Field,\n useValue,\n useTransformer,\n modifiedFields,\n modified,\n }),\n [Field, form, modified, modifiedFields, useTransformer, useValue]\n );\n};\n\nexport const useForm = <TValues extends Values = Values>(\n initValues: TValues\n) => {\n const memoizedInitValues = useDeepEqualMemo<TValues>(\n () => initValues,\n [initValues]\n );\n const form = useMemo(\n () => new Form<TValues>(memoizedInitValues),\n [memoizedInitValues]\n );\n return useFormResponse(form);\n};\n\nexport const useExistingForm = <TValues extends Values = Values>() => {\n const form = useContext<Form<TValues> | null>(FormContext);\n if (!form) throw new Error('Wrap your form in a FormProvider');\n return useFormResponse(form);\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["createUseValueHook","form","name","useState","values","get","value","setValue","useEffect","subscription","subscribe","v","unsubscribe","createUseErrorHook","errors","createUseTransformerHook","useValue","transformer","transformerRef","useRef","current","partialValues","Object","entries","forEach","n","set","createFieldComponent","useError","props","render","error","initValue","useMemo","initValues","modified","isEqual","reset","useCallback","onChange","undefined","renderRef","inputProps","fieldState","useModifiedFields","modifiedFields","setModifiedFields","modifiedFieldsRef","initValuesRef","subscribeToAll","isInitValue","fields","includes","filter","field","useFormResponse","Field","useTransformer","length","useForm","memoizedInitValues","useDeepEqualMemo","formRef","Form","useExistingForm","useFormContext","Error"],"sources":["../../src/index.tsx"],"sourcesContent":["import {\n ReactElement,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Form from './Form';\nimport { PathReturn, RecursivePath, StringMap } from './types';\nimport useFormContext from './useFormContext';\nimport isEqual from './utils/isEqual';\nimport { get } from './utils/path';\nimport useDeepEqualMemo from './utils/useDeepEqualMemo';\n\nexport * from './BroadcastObserverManager';\nexport * from './ErrorObserverManager';\nexport { default as Form } from './Form';\nexport * from './types';\nexport * from './useFormContext';\n\nconst createUseValueHook =\n <TValues extends StringMap>(form: Form<TValues>) =>\n <TName extends RecursivePath<TValues>>(name: TName) => {\n const [value, setValue] = useState<PathReturn<TValues, TName>>(\n form.values.get(name)\n );\n\n useEffect(() => {\n const subscription = form.values.subscribe(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [name]);\n\n return value;\n };\n\nconst createUseErrorHook =\n <TValues extends StringMap>(form: Form<TValues>) =>\n <TName extends RecursivePath<TValues>>(name: TName) => {\n const [value, setValue] = useState<string | undefined>(\n form.errors.get(name)\n );\n\n useEffect(() => {\n const subscription = form.errors.subscribe(name, (v) => {\n setValue(v);\n });\n return () => subscription.unsubscribe();\n }, [name]);\n\n return value;\n };\n\nexport type Transformer<\n TValues extends StringMap,\n TName extends RecursivePath<TValues>\n> = (value: PathReturn<TValues, TName>) => {\n [K in RecursivePath<TValues>]?: PathReturn<TValues, K>;\n};\n\nconst createUseTransformerHook = <TValues extends StringMap>(\n form: Form<TValues>\n) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const useValue = createUseValueHook(form);\n return <TName extends RecursivePath<TValues>>(\n name: TName,\n transformer: Transformer<TValues, TName>\n ) => {\n const value = useValue(name);\n\n const transformerRef = useRef(transformer);\n useEffect(() => {\n transformerRef.current = transformer;\n }, [transformer]);\n\n useEffect(() => {\n const partialValues = transformerRef.current(value);\n Object.entries(partialValues).forEach(([n, v]) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n form.values.set(n as RecursivePath<TValues>, v as any);\n });\n }, [value]);\n };\n};\n\ninterface InputProps<TValue> {\n value: TValue;\n onChange: (value: TValue) => void;\n}\ninterface FieldState {\n error?: string;\n modified: boolean;\n reset: () => void;\n}\ninterface FieldProps<TName, TValue> {\n name: TName;\n transformer?: (value: TValue) => TValue;\n render: (\n inputProps: InputProps<TValue>,\n fieldState: FieldState\n ) => ReactElement | null;\n}\n\nconst createFieldComponent = <TValues extends StringMap>(\n form: Form<TValues>\n) => {\n const useValue = createUseValueHook(form);\n const useError = createUseErrorHook(form);\n return <TName extends RecursivePath<TValues>>(\n props: FieldProps<TName, PathReturn<TValues, TName>>\n ) => {\n const { name, transformer = (v) => v, render } = props;\n\n const value = useValue(name);\n const error = useError(name);\n\n const initValue = useMemo(() => get(form.initValues, name), [name]);\n const modified = useMemo(\n () => !isEqual(value, initValue),\n [initValue, value]\n );\n const reset = useCallback(\n () => form.values.set(name, initValue),\n [initValue, name]\n );\n\n const transformerRef = useRef(transformer);\n useEffect(() => {\n transformerRef.current = transformer;\n }, [transformer]);\n\n const onChange = useCallback(\n (v: PathReturn<TValues, TName>) => {\n form.values.set(name, transformerRef.current(v));\n form.errors.set(name, undefined); // Reset the error when the value is changed\n },\n [name]\n );\n\n const renderRef = useRef(render);\n useEffect(() => {\n renderRef.current = render;\n }, [render]);\n\n const inputProps = useMemo(() => ({ value, onChange }), [onChange, value]);\n const fieldState = useMemo(\n () => ({ error, modified, reset }),\n [error, modified, reset]\n );\n\n return useMemo(\n () => renderRef.current(inputProps, fieldState),\n [fieldState, inputProps]\n );\n };\n};\n\nconst useModifiedFields = <TValues extends StringMap>(form: Form<TValues>) => {\n const [modifiedFields, setModifiedFields] = useState<\n Array<RecursivePath<TValues>>\n >([]);\n\n const modifiedFieldsRef = useRef(modifiedFields);\n useEffect(() => {\n modifiedFieldsRef.current = modifiedFields;\n }, [modifiedFields]);\n\n const initValuesRef = useRef(form.initValues);\n useEffect(() => {\n initValuesRef.current = form.initValues;\n }, [form.initValues]);\n\n useEffect(() => {\n const subscription = form.values.subscribeToAll((name, value) => {\n const isInitValue = isEqual(value, get(initValuesRef.current, name));\n const fields = modifiedFieldsRef.current;\n\n if (fields.includes(name)) {\n if (isInitValue) {\n setModifiedFields(fields.filter((field) => field !== name));\n }\n } else if (!isInitValue) {\n setModifiedFields([...fields, name]);\n }\n });\n return () => subscription.unsubscribe();\n }, [form.values]);\n\n return modifiedFields;\n};\n\nconst useFormResponse = <TValues extends StringMap>(form: Form<TValues>) => {\n const Field = useMemo(() => createFieldComponent(form), [form]);\n const useValue = useMemo(() => createUseValueHook(form), [form]);\n const useError = useMemo(() => createUseErrorHook(form), [form]);\n const useTransformer = useMemo(() => createUseTransformerHook(form), [form]);\n\n const modifiedFields = useModifiedFields(form);\n const modified = useMemo(\n () => modifiedFields.length > 0,\n [modifiedFields.length]\n );\n\n return useMemo(\n () => ({\n form,\n Field,\n useValue,\n useError,\n useTransformer,\n modifiedFields,\n modified,\n }),\n [Field, form, modified, modifiedFields, useError, useTransformer, useValue]\n );\n};\n\nexport const useForm = <TValues extends StringMap = StringMap>(\n initValues: TValues\n) => {\n const memoizedInitValues = useDeepEqualMemo<TValues>(\n () => initValues,\n [initValues]\n );\n\n const formRef = useRef(new Form<TValues>(memoizedInitValues));\n useEffect(() => {\n formRef.current.initValues = memoizedInitValues;\n formRef.current.reset();\n }, [memoizedInitValues]);\n\n return useFormResponse(formRef.current);\n};\n\nexport const useExistingForm = <TValues extends StringMap = StringMap>() => {\n const form = useFormContext<Form<TValues> | null>();\n if (!form) throw new Error('Wrap your form in a FormProvider');\n return useFormResponse(form);\n};\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/types.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type StringMap<T = any> = Record<string, T>;\n\ntype Separator = '.';\ntype KeysWithSeparator<K1, K2> = `${K1 & string}${Separator}${K2 & string}`;\ntype KeyOf<T> = Exclude<keyof T, symbol | keyof any[]>;\n\nexport type Path<T, K = KeyOf<T>> = T extends StringMap\n ?\n | K\n | (K extends keyof T\n ? T[K] extends StringMap\n ? KeysWithSeparator<K, Path<T[K]>>\n : never\n : never)\n : never;\n\nexport type PathReturn<T, K> = K extends keyof T\n ? T[K]\n : K extends `${infer U}${Separator}${infer R}`\n ? U extends keyof T\n ? PathReturn<T[U], R>\n : never\n : never;\n\ntype Cast<T1, T2> = T1 extends T2 ? T1 : T2;\nexport type RecursivePath<T> = Path<T> extends infer U\n ? Cast<U, string>\n : never;\n\nexport type Errors<T> = Record<RecursivePath<T>, string | undefined>;\n\nexport type Observer<V = any> = (value: V) => void;\nexport interface Subscription {\n unsubscribe: () => void;\n}\n"],"mappings":""}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.FormProvider = FormProvider;
8
+ exports["default"] = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
11
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ var FormContext = /*#__PURE__*/(0, _react.createContext)(null);
14
+ // eslint-disable-next-line react/function-component-definition
15
+ function FormProvider(_ref) {
16
+ var form = _ref.form,
17
+ children = _ref.children;
18
+ return /*#__PURE__*/_react["default"].createElement(FormContext.Provider, {
19
+ value: form
20
+ }, children);
21
+ }
22
+ function useFormContext() {
23
+ return (0, _react.useContext)(FormContext);
24
+ }
25
+ var _default = useFormContext;
26
+ exports["default"] = _default;
27
+ //# sourceMappingURL=useFormContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFormContext.js","names":["FormContext","createContext","FormProvider","form","children","useFormContext","useContext"],"sources":["../../src/useFormContext.tsx"],"sourcesContent":["import React, { createContext, ReactNode, useContext } from 'react';\nimport Form from './Form';\nimport { StringMap } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst FormContext = createContext<any>(null);\n\nexport interface FormProviderProps<TValues extends StringMap> {\n form: Form<TValues>;\n children?: ReactNode;\n}\n\n// eslint-disable-next-line react/function-component-definition\nexport function FormProvider<TValues extends StringMap>({\n form,\n children,\n}: FormProviderProps<TValues>) {\n return <FormContext.Provider value={form}>{children}</FormContext.Provider>;\n}\n\nfunction useFormContext<T>() {\n return useContext<T>(FormContext);\n}\n\nexport default useFormContext;\n"],"mappings":";;;;;;;;AAAA;AAAoE;AAAA;AAIpE;AACA,IAAMA,WAAW,gBAAG,IAAAC,oBAAa,EAAM,IAAI,CAAC;AAO5C;AACO,SAASC,YAAY,OAGG;EAAA,IAF7BC,IAAI,QAAJA,IAAI;IACJC,QAAQ,QAARA,QAAQ;EAER,oBAAO,gCAAC,WAAW,CAAC,QAAQ;IAAC,KAAK,EAAED;EAAK,GAAEC,QAAQ,CAAwB;AAC7E;AAEA,SAASC,cAAc,GAAM;EAC3B,OAAO,IAAAC,iBAAU,EAAIN,WAAW,CAAC;AACnC;AAAC,eAEcK,cAAc;AAAA"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
8
+ var deleteFromArray = function deleteFromArray(arr, item) {
9
+ var index = arr.findIndex(function (i) {
10
+ return i === item;
11
+ });
12
+ if (index === -1) return;
13
+ arr.splice(index, 1);
14
+ };
15
+ var _default = deleteFromArray;
16
+ exports["default"] = _default;
17
+ //# sourceMappingURL=deleteFromArray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteFromArray.js","names":["deleteFromArray","arr","item","index","findIndex","i","splice"],"sources":["../../../src/utils/deleteFromArray.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst deleteFromArray = (arr: any[], item: any) => {\n const index = arr.findIndex((i) => i === item);\n if (index === -1) return;\n arr.splice(index, 1);\n};\n\nexport default deleteFromArray;\n"],"mappings":";;;;;;AAAA;AACA,IAAMA,eAAe,GAAG,SAAlBA,eAAe,CAAIC,GAAU,EAAEC,IAAS,EAAK;EACjD,IAAMC,KAAK,GAAGF,GAAG,CAACG,SAAS,CAAC,UAACC,CAAC;IAAA,OAAKA,CAAC,KAAKH,IAAI;EAAA,EAAC;EAC9C,IAAIC,KAAK,KAAK,CAAC,CAAC,EAAE;EAClBF,GAAG,CAACK,MAAM,CAACH,KAAK,EAAE,CAAC,CAAC;AACtB,CAAC;AAAC,eAEaH,eAAe;AAAA"}