@os-design/form 1.0.8 → 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,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.set = exports.isObjectOrArray = exports.get = void 0;
7
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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); }
10
+ 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; }
11
+ 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; }
12
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
13
+ 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); }
14
+ /* eslint-disable @typescript-eslint/no-explicit-any,no-param-reassign */
15
+
16
+ var isObjectOrArray = function isObjectOrArray(value) {
17
+ return _typeof(value) === 'object' && value !== null;
18
+ };
19
+ exports.isObjectOrArray = isObjectOrArray;
20
+ var split = function split(path) {
21
+ var groups = path.match(/^([^.]*)\.(.*)$/);
22
+ return groups ? [groups[1], groups[2]] : null;
23
+ };
24
+ var get = function get(data, path) {
25
+ if (Object.hasOwn(data, path)) {
26
+ return data[path];
27
+ }
28
+ var groups = split(path);
29
+ if (!groups) return undefined;
30
+ var _groups = _slicedToArray(groups, 2),
31
+ key = _groups[0],
32
+ nextPath = _groups[1];
33
+ if (!Object.hasOwn(data, key)) return undefined;
34
+ if (!isObjectOrArray(data[key])) return undefined;
35
+ return get(data[key], nextPath);
36
+ };
37
+ exports.get = get;
38
+ var set = function set(data, path, value) {
39
+ if (Object.hasOwn(data, path)) {
40
+ data[path] = value;
41
+ return true;
42
+ }
43
+ var groups = split(path);
44
+ if (!groups) return false;
45
+ var _groups2 = _slicedToArray(groups, 2),
46
+ key = _groups2[0],
47
+ nextPath = _groups2[1];
48
+ if (!Object.hasOwn(data, key)) return false;
49
+ if (!isObjectOrArray(data[key])) return false;
50
+ return set(data[key], nextPath, value);
51
+ };
52
+ exports.set = set;
53
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","names":["isObjectOrArray","value","split","path","groups","match","get","data","Object","hasOwn","undefined","key","nextPath","set"],"sources":["../../../src/utils/path.ts"],"sourcesContent":["import { StringMap } from '../types';\n\n/* eslint-disable @typescript-eslint/no-explicit-any,no-param-reassign */\n\nexport const isObjectOrArray = (value: any): value is object =>\n typeof value === 'object' && value !== null;\n\nconst split = (path: string) => {\n const groups = path.match(/^([^.]*)\\.(.*)$/);\n return groups ? [groups[1], groups[2]] : null;\n};\n\nexport const get = (data: StringMap, path: string): any => {\n if (Object.hasOwn(data, path)) {\n return data[path];\n }\n\n const groups = split(path);\n if (!groups) return undefined;\n\n const [key, nextPath] = groups;\n if (!Object.hasOwn(data, key)) return undefined;\n if (!isObjectOrArray(data[key])) return undefined;\n\n return get(data[key], nextPath);\n};\n\nexport const set = (data: StringMap, path: string, value: any): boolean => {\n if (Object.hasOwn(data, path)) {\n data[path] = value;\n return true;\n }\n\n const groups = split(path);\n if (!groups) return false;\n\n const [key, nextPath] = groups;\n if (!Object.hasOwn(data, key)) return false;\n if (!isObjectOrArray(data[key])) return false;\n\n return set(data[key], nextPath, value);\n};\n"],"mappings":";;;;;;;;;;;;;AAEA;;AAEO,IAAMA,eAAe,GAAG,SAAlBA,eAAe,CAAIC,KAAU;EAAA,OACxC,QAAOA,KAAK,MAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI;AAAA;AAAC;AAE9C,IAAMC,KAAK,GAAG,SAARA,KAAK,CAAIC,IAAY,EAAK;EAC9B,IAAMC,MAAM,GAAGD,IAAI,CAACE,KAAK,CAAC,iBAAiB,CAAC;EAC5C,OAAOD,MAAM,GAAG,CAACA,MAAM,CAAC,CAAC,CAAC,EAAEA,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AAC/C,CAAC;AAEM,IAAME,GAAG,GAAG,SAANA,GAAG,CAAIC,IAAe,EAAEJ,IAAY,EAAU;EACzD,IAAIK,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEJ,IAAI,CAAC,EAAE;IAC7B,OAAOI,IAAI,CAACJ,IAAI,CAAC;EACnB;EAEA,IAAMC,MAAM,GAAGF,KAAK,CAACC,IAAI,CAAC;EAC1B,IAAI,CAACC,MAAM,EAAE,OAAOM,SAAS;EAE7B,6BAAwBN,MAAM;IAAvBO,GAAG;IAAEC,QAAQ;EACpB,IAAI,CAACJ,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEI,GAAG,CAAC,EAAE,OAAOD,SAAS;EAC/C,IAAI,CAACV,eAAe,CAACO,IAAI,CAACI,GAAG,CAAC,CAAC,EAAE,OAAOD,SAAS;EAEjD,OAAOJ,GAAG,CAACC,IAAI,CAACI,GAAG,CAAC,EAAEC,QAAQ,CAAC;AACjC,CAAC;AAAC;AAEK,IAAMC,GAAG,GAAG,SAANA,GAAG,CAAIN,IAAe,EAAEJ,IAAY,EAAEF,KAAU,EAAc;EACzE,IAAIO,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEJ,IAAI,CAAC,EAAE;IAC7BI,IAAI,CAACJ,IAAI,CAAC,GAAGF,KAAK;IAClB,OAAO,IAAI;EACb;EAEA,IAAMG,MAAM,GAAGF,KAAK,CAACC,IAAI,CAAC;EAC1B,IAAI,CAACC,MAAM,EAAE,OAAO,KAAK;EAEzB,8BAAwBA,MAAM;IAAvBO,GAAG;IAAEC,QAAQ;EACpB,IAAI,CAACJ,MAAM,CAACC,MAAM,CAACF,IAAI,EAAEI,GAAG,CAAC,EAAE,OAAO,KAAK;EAC3C,IAAI,CAACX,eAAe,CAACO,IAAI,CAACI,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK;EAE7C,OAAOE,GAAG,CAACN,IAAI,CAACI,GAAG,CAAC,EAAEC,QAAQ,EAAEX,KAAK,CAAC;AACxC,CAAC;AAAC"}
@@ -0,0 +1,18 @@
1
+ import deleteFromArray from './utils/deleteFromArray';
2
+ class BroadcastObserverManager {
3
+ constructor() {
4
+ this.broadcastObservers = void 0;
5
+ this.broadcastObservers = [];
6
+ }
7
+ subscribeToAll(observer) {
8
+ this.broadcastObservers.push(observer);
9
+ return {
10
+ unsubscribe: () => deleteFromArray(this.broadcastObservers, observer)
11
+ };
12
+ }
13
+ callBroadcastObservers(name, value) {
14
+ this.broadcastObservers.forEach(observer => observer(name, value));
15
+ }
16
+ }
17
+ export default BroadcastObserverManager;
18
+ //# sourceMappingURL=BroadcastObserverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BroadcastObserverManager.js","names":["deleteFromArray","BroadcastObserverManager","constructor","broadcastObservers","subscribeToAll","observer","push","unsubscribe","callBroadcastObservers","name","value","forEach"],"sources":["../../src/BroadcastObserverManager.ts"],"sourcesContent":["import { Subscription } from './types';\nimport deleteFromArray from './utils/deleteFromArray';\n\nexport type BroadcastObserver<TName, TValue> = (\n name: TName,\n value: TValue\n) => void;\n\nclass BroadcastObserverManager<TName, TValue> {\n private readonly broadcastObservers: Array<BroadcastObserver<TName, TValue>>;\n\n public constructor() {\n this.broadcastObservers = [];\n }\n\n public subscribeToAll(\n observer: BroadcastObserver<TName, TValue>\n ): Subscription {\n this.broadcastObservers.push(observer);\n return {\n unsubscribe: () => deleteFromArray(this.broadcastObservers, observer),\n };\n }\n\n protected callBroadcastObservers<N extends TName, V extends TValue>(\n name: N,\n value: V\n ): void {\n this.broadcastObservers.forEach((observer) => observer(name, value));\n }\n}\n\nexport default BroadcastObserverManager;\n"],"mappings":"AACA,OAAOA,eAAe,MAAM,yBAAyB;AAOrD,MAAMC,wBAAwB,CAAgB;EAGrCC,WAAW,GAAG;IAAA,KAFJC,kBAAkB;IAGjC,IAAI,CAACA,kBAAkB,GAAG,EAAE;EAC9B;EAEOC,cAAc,CACnBC,QAA0C,EAC5B;IACd,IAAI,CAACF,kBAAkB,CAACG,IAAI,CAACD,QAAQ,CAAC;IACtC,OAAO;MACLE,WAAW,EAAE,MAAMP,eAAe,CAAC,IAAI,CAACG,kBAAkB,EAAEE,QAAQ;IACtE,CAAC;EACH;EAEUG,sBAAsB,CAC9BC,IAAO,EACPC,KAAQ,EACF;IACN,IAAI,CAACP,kBAAkB,CAACQ,OAAO,CAAEN,QAAQ,IAAKA,QAAQ,CAACI,IAAI,EAAEC,KAAK,CAAC,CAAC;EACtE;AACF;AAEA,eAAeT,wBAAwB"}
@@ -0,0 +1,20 @@
1
+ import ErrorObserverManager from './ErrorObserverManager';
2
+ class ErrorData extends ErrorObserverManager {
3
+ constructor(errors) {
4
+ super();
5
+ this.errors = void 0;
6
+ this.errors = errors;
7
+ }
8
+ get(name) {
9
+ return this.errors[name];
10
+ }
11
+ getAll() {
12
+ return this.errors;
13
+ }
14
+ set(name, value) {
15
+ this.errors[name] = value;
16
+ this.callObservers(name, value);
17
+ }
18
+ }
19
+ export default ErrorData;
20
+ //# sourceMappingURL=ErrorData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorData.js","names":["ErrorObserverManager","ErrorData","constructor","errors","get","name","getAll","set","value","callObservers"],"sources":["../../src/ErrorData.ts"],"sourcesContent":["import ErrorObserverManager from './ErrorObserverManager';\nimport { StringMap } from './types';\n\nclass ErrorData<\n TErrors extends StringMap<string | undefined>,\n TName extends keyof TErrors = keyof TErrors\n> extends ErrorObserverManager<TErrors> {\n private readonly errors: TErrors;\n\n public constructor(errors: TErrors) {\n super();\n this.errors = errors;\n }\n\n public get<T extends TName>(name: T): TErrors[T] {\n return this.errors[name];\n }\n\n public getAll(): TErrors {\n return this.errors;\n }\n\n public set<T extends TName>(name: T, value: TErrors[T]): void {\n this.errors[name] = value;\n this.callObservers(name, value);\n }\n}\n\nexport default ErrorData;\n"],"mappings":"AAAA,OAAOA,oBAAoB,MAAM,wBAAwB;AAGzD,MAAMC,SAAS,SAGLD,oBAAoB,CAAU;EAG/BE,WAAW,CAACC,MAAe,EAAE;IAClC,KAAK,EAAE;IAAC,KAHOA,MAAM;IAIrB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACtB;EAEOC,GAAG,CAAkBC,IAAO,EAAc;IAC/C,OAAO,IAAI,CAACF,MAAM,CAACE,IAAI,CAAC;EAC1B;EAEOC,MAAM,GAAY;IACvB,OAAO,IAAI,CAACH,MAAM;EACpB;EAEOI,GAAG,CAAkBF,IAAO,EAAEG,KAAiB,EAAQ;IAC5D,IAAI,CAACL,MAAM,CAACE,IAAI,CAAC,GAAGG,KAAK;IACzB,IAAI,CAACC,aAAa,CAACJ,IAAI,EAAEG,KAAK,CAAC;EACjC;AACF;AAEA,eAAeP,SAAS"}
@@ -0,0 +1,26 @@
1
+ import BroadcastObserverManager from './BroadcastObserverManager';
2
+ import deleteFromArray from './utils/deleteFromArray';
3
+ class ErrorObserverManager extends BroadcastObserverManager {
4
+ constructor() {
5
+ super();
6
+ this.observers = void 0;
7
+ this.observers = {};
8
+ }
9
+ getObservers(name) {
10
+ if (!this.observers[name]) this.observers[name] = [];
11
+ return this.observers[name];
12
+ }
13
+ subscribe(name, observer) {
14
+ const observers = this.getObservers(name);
15
+ observers.push(observer);
16
+ return {
17
+ unsubscribe: () => deleteFromArray(observers, observer)
18
+ };
19
+ }
20
+ callObservers(name, value) {
21
+ this.callBroadcastObservers(name, value);
22
+ this.getObservers(name).forEach(observer => observer(value));
23
+ }
24
+ }
25
+ export default ErrorObserverManager;
26
+ //# sourceMappingURL=ErrorObserverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorObserverManager.js","names":["BroadcastObserverManager","deleteFromArray","ErrorObserverManager","constructor","observers","getObservers","name","subscribe","observer","push","unsubscribe","callObservers","value","callBroadcastObservers","forEach"],"sources":["../../src/ErrorObserverManager.ts"],"sourcesContent":["import BroadcastObserverManager from './BroadcastObserverManager';\nimport { Observer, StringMap, Subscription } from './types';\nimport deleteFromArray from './utils/deleteFromArray';\n\nexport type ErrorObserver = Observer<string | undefined>;\n\nclass ErrorObserverManager<\n TErrors extends StringMap<string | undefined>,\n TName extends keyof TErrors = keyof TErrors\n> extends BroadcastObserverManager<TName, string | undefined> {\n private readonly observers: {\n [K in TName]?: ErrorObserver[];\n };\n\n public constructor() {\n super();\n this.observers = {};\n }\n\n private getObservers<T extends TName>(name: T): ErrorObserver[] {\n if (!this.observers[name]) this.observers[name] = [];\n return this.observers[name] as ErrorObserver[];\n }\n\n public subscribe<T extends TName>(\n name: T,\n observer: ErrorObserver\n ): Subscription {\n const observers = this.getObservers(name);\n observers.push(observer);\n return { unsubscribe: () => deleteFromArray(observers, observer) };\n }\n\n protected callObservers<T extends TName>(name: T, value: string | undefined) {\n this.callBroadcastObservers(name, value);\n this.getObservers(name).forEach((observer) => observer(value));\n }\n}\n\nexport default ErrorObserverManager;\n"],"mappings":"AAAA,OAAOA,wBAAwB,MAAM,4BAA4B;AAEjE,OAAOC,eAAe,MAAM,yBAAyB;AAIrD,MAAMC,oBAAoB,SAGhBF,wBAAwB,CAA4B;EAKrDG,WAAW,GAAG;IACnB,KAAK,EAAE;IAAC,KALOC,SAAS;IAMxB,IAAI,CAACA,SAAS,GAAG,CAAC,CAAC;EACrB;EAEQC,YAAY,CAAkBC,IAAO,EAAmB;IAC9D,IAAI,CAAC,IAAI,CAACF,SAAS,CAACE,IAAI,CAAC,EAAE,IAAI,CAACF,SAAS,CAACE,IAAI,CAAC,GAAG,EAAE;IACpD,OAAO,IAAI,CAACF,SAAS,CAACE,IAAI,CAAC;EAC7B;EAEOC,SAAS,CACdD,IAAO,EACPE,QAAuB,EACT;IACd,MAAMJ,SAAS,GAAG,IAAI,CAACC,YAAY,CAACC,IAAI,CAAC;IACzCF,SAAS,CAACK,IAAI,CAACD,QAAQ,CAAC;IACxB,OAAO;MAAEE,WAAW,EAAE,MAAMT,eAAe,CAACG,SAAS,EAAEI,QAAQ;IAAE,CAAC;EACpE;EAEUG,aAAa,CAAkBL,IAAO,EAAEM,KAAyB,EAAE;IAC3E,IAAI,CAACC,sBAAsB,CAACP,IAAI,EAAEM,KAAK,CAAC;IACxC,IAAI,CAACP,YAAY,CAACC,IAAI,CAAC,CAACQ,OAAO,CAAEN,QAAQ,IAAKA,QAAQ,CAACI,KAAK,CAAC,CAAC;EAChE;AACF;AAEA,eAAeV,oBAAoB"}
@@ -0,0 +1,26 @@
1
+ import ErrorData from './ErrorData';
2
+ import clone from './utils/clone';
3
+ import ValueData from './ValueData';
4
+ class Form {
5
+ constructor(initValues) {
6
+ this.initValues = void 0;
7
+ this.values = void 0;
8
+ this.errors = void 0;
9
+ this.initValues = initValues;
10
+ this.values = new ValueData(clone(initValues));
11
+ this.errors = new ErrorData({});
12
+ }
13
+ reset() {
14
+ // Reset values
15
+ Object.keys(this.values.getAll()).forEach(name => {
16
+ this.values.set(name, clone(this.initValues[name]));
17
+ });
18
+
19
+ // Reset errors
20
+ Object.keys(this.errors.getAll()).forEach(name => {
21
+ this.errors.set(name, undefined);
22
+ });
23
+ }
24
+ }
25
+ export default Form;
26
+ //# sourceMappingURL=Form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Form.js","names":["ErrorData","clone","ValueData","Form","constructor","initValues","values","errors","reset","Object","keys","getAll","forEach","name","set","undefined"],"sources":["../../src/Form.ts"],"sourcesContent":["import ErrorData from './ErrorData';\nimport { Errors, RecursivePath, StringMap } from './types';\nimport clone from './utils/clone';\nimport ValueData from './ValueData';\n\nclass Form<\n TValues extends StringMap = StringMap,\n TErrors extends Errors<TValues> = Errors<TValues>\n> {\n public initValues: TValues;\n\n public readonly values: ValueData<TValues>;\n\n public readonly errors: ErrorData<TErrors>;\n\n public constructor(initValues: TValues) {\n this.initValues = initValues;\n this.values = new ValueData(clone(initValues));\n this.errors = new ErrorData({} as TErrors);\n }\n\n public reset() {\n // Reset values\n Object.keys(this.values.getAll()).forEach((name) => {\n this.values.set(\n name as RecursivePath<TValues>,\n clone(this.initValues[name])\n );\n });\n\n // Reset errors\n Object.keys(this.errors.getAll()).forEach((name) => {\n this.errors.set(\n name as keyof TErrors,\n undefined as TErrors[keyof TErrors]\n );\n });\n }\n}\n\nexport default Form;\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,aAAa;AAEnC,OAAOC,KAAK,MAAM,eAAe;AACjC,OAAOC,SAAS,MAAM,aAAa;AAEnC,MAAMC,IAAI,CAGR;EAOOC,WAAW,CAACC,UAAmB,EAAE;IAAA,KANjCA,UAAU;IAAA,KAEDC,MAAM;IAAA,KAENC,MAAM;IAGpB,IAAI,CAACF,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,MAAM,GAAG,IAAIJ,SAAS,CAACD,KAAK,CAACI,UAAU,CAAC,CAAC;IAC9C,IAAI,CAACE,MAAM,GAAG,IAAIP,SAAS,CAAC,CAAC,CAAC,CAAY;EAC5C;EAEOQ,KAAK,GAAG;IACb;IACAC,MAAM,CAACC,IAAI,CAAC,IAAI,CAACJ,MAAM,CAACK,MAAM,EAAE,CAAC,CAACC,OAAO,CAAEC,IAAI,IAAK;MAClD,IAAI,CAACP,MAAM,CAACQ,GAAG,CACbD,IAAI,EACJZ,KAAK,CAAC,IAAI,CAACI,UAAU,CAACQ,IAAI,CAAC,CAAC,CAC7B;IACH,CAAC,CAAC;;IAEF;IACAJ,MAAM,CAACC,IAAI,CAAC,IAAI,CAACH,MAAM,CAACI,MAAM,EAAE,CAAC,CAACC,OAAO,CAAEC,IAAI,IAAK;MAClD,IAAI,CAACN,MAAM,CAACO,GAAG,CACbD,IAAI,EACJE,SAAS,CACV;IACH,CAAC,CAAC;EACJ;AACF;AAEA,eAAeZ,IAAI"}
@@ -0,0 +1,31 @@
1
+ import deleteFromArray from './utils/deleteFromArray';
2
+ class Node {
3
+ constructor(parent = null, name = '') {
4
+ this.name = void 0;
5
+ this.parent = void 0;
6
+ this.nodes = void 0;
7
+ this.observers = void 0;
8
+ this.name = name;
9
+ this.parent = parent;
10
+ this.nodes = {};
11
+ this.observers = [];
12
+ }
13
+ getNode(name) {
14
+ return this.nodes[name];
15
+ }
16
+ createNode(name) {
17
+ this.nodes[name] = new Node(this, name);
18
+ return this.nodes[name];
19
+ }
20
+ deleteNode(name) {
21
+ delete this.nodes[name];
22
+ }
23
+ addObserver(observer) {
24
+ this.observers.push(observer);
25
+ }
26
+ deleteObserver(observer) {
27
+ deleteFromArray(this.observers, observer);
28
+ }
29
+ }
30
+ export default Node;
31
+ //# sourceMappingURL=Node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Node.js","names":["deleteFromArray","Node","constructor","parent","name","nodes","observers","getNode","createNode","deleteNode","addObserver","observer","push","deleteObserver"],"sources":["../../src/Node.ts"],"sourcesContent":["import { Observer } from './types';\nimport deleteFromArray from './utils/deleteFromArray';\n\nclass Node {\n public readonly name: string;\n\n public readonly parent: Node | null;\n\n public readonly nodes: Record<string, Node>;\n\n public readonly observers: Observer[];\n\n public constructor(parent: Node | null = null, name = '') {\n this.name = name;\n this.parent = parent;\n this.nodes = {};\n this.observers = [];\n }\n\n public getNode(name: string): Node | undefined {\n return this.nodes[name];\n }\n\n public createNode(name: string): Node {\n this.nodes[name] = new Node(this, name);\n return this.nodes[name];\n }\n\n public deleteNode(name: string): void {\n delete this.nodes[name];\n }\n\n public addObserver(observer: Observer): void {\n this.observers.push(observer);\n }\n\n public deleteObserver(observer: Observer): void {\n deleteFromArray(this.observers, observer);\n }\n}\n\nexport default Node;\n"],"mappings":"AACA,OAAOA,eAAe,MAAM,yBAAyB;AAErD,MAAMC,IAAI,CAAC;EASFC,WAAW,CAACC,MAAmB,GAAG,IAAI,EAAEC,IAAI,GAAG,EAAE,EAAE;IAAA,KAR1CA,IAAI;IAAA,KAEJD,MAAM;IAAA,KAENE,KAAK;IAAA,KAELC,SAAS;IAGvB,IAAI,CAACF,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,KAAK,GAAG,CAAC,CAAC;IACf,IAAI,CAACC,SAAS,GAAG,EAAE;EACrB;EAEOC,OAAO,CAACH,IAAY,EAAoB;IAC7C,OAAO,IAAI,CAACC,KAAK,CAACD,IAAI,CAAC;EACzB;EAEOI,UAAU,CAACJ,IAAY,EAAQ;IACpC,IAAI,CAACC,KAAK,CAACD,IAAI,CAAC,GAAG,IAAIH,IAAI,CAAC,IAAI,EAAEG,IAAI,CAAC;IACvC,OAAO,IAAI,CAACC,KAAK,CAACD,IAAI,CAAC;EACzB;EAEOK,UAAU,CAACL,IAAY,EAAQ;IACpC,OAAO,IAAI,CAACC,KAAK,CAACD,IAAI,CAAC;EACzB;EAEOM,WAAW,CAACC,QAAkB,EAAQ;IAC3C,IAAI,CAACL,SAAS,CAACM,IAAI,CAACD,QAAQ,CAAC;EAC/B;EAEOE,cAAc,CAACF,QAAkB,EAAQ;IAC9CX,eAAe,CAAC,IAAI,CAACM,SAAS,EAAEK,QAAQ,CAAC;EAC3C;AACF;AAEA,eAAeV,IAAI"}
@@ -0,0 +1,21 @@
1
+ import { get, set } from './utils/path';
2
+ import ValueObserverManager from './ValueObserverManager';
3
+ class ValueData extends ValueObserverManager {
4
+ constructor(values) {
5
+ super();
6
+ this.values = void 0;
7
+ this.values = values;
8
+ }
9
+ get(name) {
10
+ return get(this.values, name);
11
+ }
12
+ getAll() {
13
+ return this.values;
14
+ }
15
+ set(name, value) {
16
+ const ok = set(this.values, name, value);
17
+ if (ok) this.callObservers(name, this.values);
18
+ }
19
+ }
20
+ export default ValueData;
21
+ //# sourceMappingURL=ValueData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueData.js","names":["get","set","ValueObserverManager","ValueData","constructor","values","name","getAll","value","ok","callObservers"],"sources":["../../src/ValueData.ts"],"sourcesContent":["import { PathReturn, RecursivePath, StringMap } from './types';\nimport { get, set } from './utils/path';\nimport ValueObserverManager from './ValueObserverManager';\n\nclass ValueData<\n TValues extends StringMap,\n TName extends RecursivePath<TValues> = RecursivePath<TValues>\n> extends ValueObserverManager<TValues> {\n private readonly values: TValues;\n\n public constructor(values: TValues) {\n super();\n this.values = values;\n }\n\n public get<T extends TName>(name: T): PathReturn<TValues, T> {\n return get(this.values, name);\n }\n\n public getAll(): TValues {\n return this.values;\n }\n\n public set<T extends TName>(name: T, value: PathReturn<TValues, T>): void {\n const ok = set(this.values, name, value);\n if (ok) this.callObservers(name, this.values);\n }\n}\n\nexport default ValueData;\n"],"mappings":"AACA,SAASA,GAAG,EAAEC,GAAG,QAAQ,cAAc;AACvC,OAAOC,oBAAoB,MAAM,wBAAwB;AAEzD,MAAMC,SAAS,SAGLD,oBAAoB,CAAU;EAG/BE,WAAW,CAACC,MAAe,EAAE;IAClC,KAAK,EAAE;IAAC,KAHOA,MAAM;IAIrB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACtB;EAEOL,GAAG,CAAkBM,IAAO,EAA0B;IAC3D,OAAON,GAAG,CAAC,IAAI,CAACK,MAAM,EAAEC,IAAI,CAAC;EAC/B;EAEOC,MAAM,GAAY;IACvB,OAAO,IAAI,CAACF,MAAM;EACpB;EAEOJ,GAAG,CAAkBK,IAAO,EAAEE,KAA6B,EAAQ;IACxE,MAAMC,EAAE,GAAGR,GAAG,CAAC,IAAI,CAACI,MAAM,EAAEC,IAAI,EAAEE,KAAK,CAAC;IACxC,IAAIC,EAAE,EAAE,IAAI,CAACC,aAAa,CAACJ,IAAI,EAAE,IAAI,CAACD,MAAM,CAAC;EAC/C;AACF;AAEA,eAAeF,SAAS"}
@@ -0,0 +1,67 @@
1
+ import BroadcastObserverManager from './BroadcastObserverManager';
2
+ import Node from './Node';
3
+ import { get, isObjectOrArray } from './utils/path';
4
+ const split = path => path.split('.');
5
+ class ValueObserverManager extends BroadcastObserverManager {
6
+ constructor() {
7
+ super();
8
+ this.root = void 0;
9
+ this.root = new Node();
10
+ }
11
+ findNode(path) {
12
+ const keys = split(path);
13
+ let cur = this.root;
14
+ keys.forEach(key => {
15
+ cur = cur.getNode(key) || cur.createNode(key);
16
+ });
17
+ return cur;
18
+ }
19
+ subscribe(name, observer) {
20
+ const node = this.findNode(name);
21
+ node.addObserver(observer);
22
+ return {
23
+ unsubscribe: () => {
24
+ node.deleteObserver(observer);
25
+ if (node.observers.length === 0) {
26
+ node.parent?.deleteNode(node.name);
27
+ }
28
+ }
29
+ };
30
+ }
31
+ callObservers(name, data) {
32
+ this.callBroadcastObservers(name, get(data, name));
33
+ this.callNodeObservers(name, data);
34
+ }
35
+ callNodeObservers(name, data) {
36
+ const keys = split(name);
37
+ let curNode = this.root;
38
+ let curData = data;
39
+
40
+ // Call the observers for the root node
41
+ curNode.observers.forEach(observer => observer(curData));
42
+
43
+ // Call observers on each node from the root to the specified one
44
+ for (let i = 0; i < keys.length; i += 1) {
45
+ const key = keys[i];
46
+ const node = curNode.getNode(key);
47
+ if (!node || !isObjectOrArray(curData)) return;
48
+ curNode = node;
49
+ curData = curData[key];
50
+ // eslint-disable-next-line @typescript-eslint/no-loop-func
51
+ curNode.observers.forEach(observer => observer(curData));
52
+ }
53
+
54
+ // Call observers of all child nodes started from the specified one
55
+ this.callChildObservers(curNode, curData);
56
+ }
57
+ callChildObservers(parent, data) {
58
+ if (!isObjectOrArray(data)) return;
59
+ Object.entries(parent.nodes).forEach(([name, node]) => {
60
+ const value = data[name];
61
+ node.observers.forEach(observer => observer(value));
62
+ this.callChildObservers(node, value);
63
+ });
64
+ }
65
+ }
66
+ export default ValueObserverManager;
67
+ //# sourceMappingURL=ValueObserverManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueObserverManager.js","names":["BroadcastObserverManager","Node","get","isObjectOrArray","split","path","ValueObserverManager","constructor","root","findNode","keys","cur","forEach","key","getNode","createNode","subscribe","name","observer","node","addObserver","unsubscribe","deleteObserver","observers","length","parent","deleteNode","callObservers","data","callBroadcastObservers","callNodeObservers","curNode","curData","i","callChildObservers","Object","entries","nodes","value"],"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":"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"}
package/dist/esm/index.js CHANGED
@@ -1,66 +1,37 @@
1
- import React, { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';
2
- import SubscribableData from './SubscribableData';
3
- import clone from './utils/clone';
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import Form from './Form';
3
+ import useFormContext from './useFormContext';
4
4
  import isEqual from './utils/isEqual';
5
+ import { get } from './utils/path';
5
6
  import useDeepEqualMemo from './utils/useDeepEqualMemo';
6
- export * from './SubscriptionManager';
7
-
8
- /* eslint-disable @typescript-eslint/no-explicit-any */
9
-
10
- export class Form {
11
- constructor(initValues) {
12
- this.initValues = void 0;
13
- this.values = void 0;
14
- this.errors = void 0;
15
- this.initValues = initValues;
16
- this.values = new SubscribableData(clone(initValues));
17
- this.errors = new SubscribableData({});
18
- }
19
- reset() {
20
- // Reset values
21
- Object.keys(this.values.getAll()).forEach(name => {
22
- this.values.set(name, this.initValues[name]);
23
- });
24
-
25
- // Reset errors
26
- Object.keys(this.errors.getAll()).forEach(name => {
27
- this.errors.set(name, undefined);
28
- });
29
- }
30
- }
31
- const FormContext = /*#__PURE__*/createContext(null);
32
- // eslint-disable-next-line react/function-component-definition
33
- export function FormProvider({
34
- form,
35
- children
36
- }) {
37
- return /*#__PURE__*/React.createElement(FormContext.Provider, {
38
- value: form
39
- }, children);
40
- }
7
+ export * from './BroadcastObserverManager';
8
+ export * from './ErrorObserverManager';
9
+ export { default as Form } from './Form';
10
+ export * from './types';
11
+ export * from './useFormContext';
41
12
  const createUseValueHook = form => name => {
42
13
  const [value, setValue] = useState(form.values.get(name));
43
14
  useEffect(() => {
44
- const subscription = form.values.subscribeToField(name, v => {
15
+ const subscription = form.values.subscribe(name, v => {
45
16
  setValue(v);
46
17
  });
47
18
  return () => subscription.unsubscribe();
48
19
  }, [name]);
49
20
  return value;
50
21
  };
51
- export const useError = (name, form) => {
52
- const currentForm = useContext(FormContext) || form;
53
- if (!currentForm) throw new Error('Specify the form');
54
- const [value, setValue] = useState(currentForm.errors.get(name));
22
+ const createUseErrorHook = form => name => {
23
+ const [value, setValue] = useState(form.errors.get(name));
55
24
  useEffect(() => {
56
- const subscription = currentForm.errors.subscribeToField(name, v => {
25
+ const subscription = form.errors.subscribe(name, v => {
57
26
  setValue(v);
58
27
  });
59
28
  return () => subscription.unsubscribe();
60
- }, [currentForm.errors, name]);
29
+ }, [name]);
61
30
  return value;
62
31
  };
63
32
  const createUseTransformerHook = form => {
33
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
34
+ // @ts-ignore
64
35
  const useValue = createUseValueHook(form);
65
36
  return (name, transformer) => {
66
37
  const value = useValue(name);
@@ -71,6 +42,7 @@ const createUseTransformerHook = form => {
71
42
  useEffect(() => {
72
43
  const partialValues = transformerRef.current(value);
73
44
  Object.entries(partialValues).forEach(([n, v]) => {
45
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
46
  form.values.set(n, v);
75
47
  });
76
48
  }, [value]);
@@ -78,36 +50,36 @@ const createUseTransformerHook = form => {
78
50
  };
79
51
  const createFieldComponent = form => {
80
52
  const useValue = createUseValueHook(form);
53
+ const useError = createUseErrorHook(form);
81
54
  return props => {
82
55
  const {
83
56
  name,
84
- toValue,
85
- fromValue,
57
+ transformer = v => v,
86
58
  render
87
59
  } = props;
88
60
  const value = useValue(name);
89
- const transformedValue = useMemo(() => toValue ? toValue(value) : value, [toValue, value]);
90
- const error = useError(name, form);
91
- const modified = useMemo(() => !isEqual(value, form.initValues[name]), [name, value]);
92
- const reset = useCallback(() => form.values.set(name, form.initValues[name]), [name]);
93
- const fromValueRef = useRef(fromValue);
61
+ const error = useError(name);
62
+ const initValue = useMemo(() => get(form.initValues, name), [name]);
63
+ const modified = useMemo(() => !isEqual(value, initValue), [initValue, value]);
64
+ const reset = useCallback(() => form.values.set(name, initValue), [initValue, name]);
65
+ const transformerRef = useRef(transformer);
94
66
  useEffect(() => {
95
- fromValueRef.current = fromValue;
96
- }, [fromValue]);
67
+ transformerRef.current = transformer;
68
+ }, [transformer]);
97
69
  const onChange = useCallback(v => {
98
- form.values.set(name, fromValueRef.current ? fromValueRef.current(v) : v);
99
- form.errors.set(name, undefined);
70
+ form.values.set(name, transformerRef.current(v));
71
+ form.errors.set(name, undefined); // Reset the error when the value is changed
100
72
  }, [name]);
101
73
  const renderRef = useRef(render);
102
74
  useEffect(() => {
103
75
  renderRef.current = render;
104
76
  }, [render]);
105
77
  const inputProps = useMemo(() => ({
106
- value: transformedValue,
78
+ value,
107
79
  onChange
108
- }), [onChange, transformedValue]);
80
+ }), [onChange, value]);
109
81
  const fieldState = useMemo(() => ({
110
- error: error || null,
82
+ error,
111
83
  modified,
112
84
  reset
113
85
  }), [error, modified, reset]);
@@ -125,8 +97,8 @@ const useModifiedFields = form => {
125
97
  initValuesRef.current = form.initValues;
126
98
  }, [form.initValues]);
127
99
  useEffect(() => {
128
- const subscription = form.values.subscribeToAllFields((name, value) => {
129
- const isInitValue = isEqual(value, initValuesRef.current[name]);
100
+ const subscription = form.values.subscribeToAll((name, value) => {
101
+ const isInitValue = isEqual(value, get(initValuesRef.current, name));
130
102
  const fields = modifiedFieldsRef.current;
131
103
  if (fields.includes(name)) {
132
104
  if (isInitValue) {
@@ -141,27 +113,33 @@ const useModifiedFields = form => {
141
113
  return modifiedFields;
142
114
  };
143
115
  const useFormResponse = form => {
116
+ const Field = useMemo(() => createFieldComponent(form), [form]);
144
117
  const useValue = useMemo(() => createUseValueHook(form), [form]);
118
+ const useError = useMemo(() => createUseErrorHook(form), [form]);
145
119
  const useTransformer = useMemo(() => createUseTransformerHook(form), [form]);
146
- const Field = useMemo(() => createFieldComponent(form), [form]);
147
120
  const modifiedFields = useModifiedFields(form);
148
121
  const modified = useMemo(() => modifiedFields.length > 0, [modifiedFields.length]);
149
122
  return useMemo(() => ({
150
123
  form,
151
124
  Field,
152
125
  useValue,
126
+ useError,
153
127
  useTransformer,
154
128
  modifiedFields,
155
129
  modified
156
- }), [Field, form, modified, modifiedFields, useTransformer, useValue]);
130
+ }), [Field, form, modified, modifiedFields, useError, useTransformer, useValue]);
157
131
  };
158
132
  export const useForm = initValues => {
159
133
  const memoizedInitValues = useDeepEqualMemo(() => initValues, [initValues]);
160
- const form = useMemo(() => new Form(memoizedInitValues), [memoizedInitValues]);
161
- return useFormResponse(form);
134
+ const formRef = useRef(new Form(memoizedInitValues));
135
+ useEffect(() => {
136
+ formRef.current.initValues = memoizedInitValues;
137
+ formRef.current.reset();
138
+ }, [memoizedInitValues]);
139
+ return useFormResponse(formRef.current);
162
140
  };
163
141
  export const useExistingForm = () => {
164
- const form = useContext(FormContext);
142
+ const form = useFormContext();
165
143
  if (!form) throw new Error('Wrap your form in a FormProvider');
166
144
  return useFormResponse(form);
167
145
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["React","createContext","useCallback","useContext","useEffect","useMemo","useRef","useState","SubscribableData","clone","isEqual","useDeepEqualMemo","Form","constructor","initValues","values","errors","reset","Object","keys","getAll","forEach","name","set","undefined","FormContext","FormProvider","form","children","createUseValueHook","value","setValue","get","subscription","subscribeToField","v","unsubscribe","useError","currentForm","Error","createUseTransformerHook","useValue","transformer","transformerRef","current","partialValues","entries","n","createFieldComponent","props","toValue","fromValue","render","transformedValue","error","modified","fromValueRef","onChange","renderRef","inputProps","fieldState","useModifiedFields","modifiedFields","setModifiedFields","modifiedFieldsRef","initValuesRef","subscribeToAllFields","isInitValue","fields","includes","filter","field","useFormResponse","useTransformer","Field","length","useForm","memoizedInitValues","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":["useCallback","useEffect","useMemo","useRef","useState","Form","useFormContext","isEqual","get","useDeepEqualMemo","default","createUseValueHook","form","name","value","setValue","values","subscription","subscribe","v","unsubscribe","createUseErrorHook","errors","createUseTransformerHook","useValue","transformer","transformerRef","current","partialValues","Object","entries","forEach","n","set","createFieldComponent","useError","props","render","error","initValue","initValues","modified","reset","onChange","undefined","renderRef","inputProps","fieldState","useModifiedFields","modifiedFields","setModifiedFields","modifiedFieldsRef","initValuesRef","subscribeToAll","isInitValue","fields","includes","filter","field","useFormResponse","Field","useTransformer","length","useForm","memoizedInitValues","formRef","useExistingForm","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,2 @@
1
+ export {};
2
+ //# 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,17 @@
1
+ import React, { createContext, useContext } from 'react';
2
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
3
+ const FormContext = /*#__PURE__*/createContext(null);
4
+ // eslint-disable-next-line react/function-component-definition
5
+ export function FormProvider({
6
+ form,
7
+ children
8
+ }) {
9
+ return /*#__PURE__*/React.createElement(FormContext.Provider, {
10
+ value: form
11
+ }, children);
12
+ }
13
+ function useFormContext() {
14
+ return useContext(FormContext);
15
+ }
16
+ export default useFormContext;
17
+ //# sourceMappingURL=useFormContext.js.map