@os-design/form 1.0.8 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +70 -36
- package/dist/cjs/BroadcastObserverManager.js +44 -0
- package/dist/cjs/BroadcastObserverManager.js.map +1 -0
- package/dist/cjs/{SubscribableData.js → ErrorData.js} +20 -18
- package/dist/cjs/ErrorData.js.map +1 -0
- package/dist/cjs/ErrorObserverManager.js +64 -0
- package/dist/cjs/ErrorObserverManager.js.map +1 -0
- package/dist/cjs/Form.js +46 -0
- package/dist/cjs/Form.js.map +1 -0
- package/dist/cjs/Node.js +60 -0
- package/dist/cjs/Node.js.map +1 -0
- package/dist/cjs/ValueData.js +55 -0
- package/dist/cjs/ValueData.js.map +1 -0
- package/dist/cjs/ValueObserverManager.js +124 -0
- package/dist/cjs/ValueObserverManager.js.map +1 -0
- package/dist/cjs/index.js +115 -106
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/useFormContext.js +27 -0
- package/dist/cjs/useFormContext.js.map +1 -0
- package/dist/cjs/utils/clone.js +1 -1
- package/dist/cjs/utils/deleteFromArray.js +17 -0
- package/dist/cjs/utils/deleteFromArray.js.map +1 -0
- package/dist/cjs/utils/isEqual.js +1 -1
- package/dist/cjs/utils/path.js +53 -0
- package/dist/cjs/utils/path.js.map +1 -0
- package/dist/esm/BroadcastObserverManager.js +18 -0
- package/dist/esm/BroadcastObserverManager.js.map +1 -0
- package/dist/esm/ErrorData.js +20 -0
- package/dist/esm/ErrorData.js.map +1 -0
- package/dist/esm/ErrorObserverManager.js +26 -0
- package/dist/esm/ErrorObserverManager.js.map +1 -0
- package/dist/esm/Form.js +26 -0
- package/dist/esm/Form.js.map +1 -0
- package/dist/esm/Node.js +31 -0
- package/dist/esm/Node.js.map +1 -0
- package/dist/esm/ValueData.js +21 -0
- package/dist/esm/ValueData.js.map +1 -0
- package/dist/esm/ValueObserverManager.js +67 -0
- package/dist/esm/ValueObserverManager.js.map +1 -0
- package/dist/esm/index.js +44 -66
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/types.js +2 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/useFormContext.js +17 -0
- package/dist/esm/useFormContext.js.map +1 -0
- package/dist/esm/utils/deleteFromArray.js +8 -0
- package/dist/esm/utils/deleteFromArray.js.map +1 -0
- package/dist/esm/utils/path.js +31 -0
- package/dist/esm/utils/path.js.map +1 -0
- package/dist/types/BroadcastObserverManager.d.ts +10 -0
- package/dist/types/BroadcastObserverManager.d.ts.map +1 -0
- package/dist/types/ErrorData.d.ts +11 -0
- package/dist/types/ErrorData.d.ts.map +1 -0
- package/dist/types/ErrorObserverManager.d.ts +12 -0
- package/dist/types/ErrorObserverManager.d.ts.map +1 -0
- package/dist/types/Form.d.ts +12 -0
- package/dist/types/Form.d.ts.map +1 -0
- package/dist/types/Node.d.ts +15 -0
- package/dist/types/Node.d.ts.map +1 -0
- package/dist/types/ValueData.d.ts +11 -0
- package/dist/types/ValueData.d.ts.map +1 -0
- package/dist/types/ValueObserverManager.d.ts +13 -0
- package/dist/types/ValueObserverManager.d.ts.map +1 -0
- package/dist/types/index.d.ts +32 -46
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types.d.ts +15 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/useFormContext.d.ts +11 -0
- package/dist/types/useFormContext.d.ts.map +1 -0
- package/dist/types/utils/deleteFromArray.d.ts +3 -0
- package/dist/types/utils/deleteFromArray.d.ts.map +1 -0
- package/dist/types/utils/path.d.ts +5 -0
- package/dist/types/utils/path.d.ts.map +1 -0
- package/package.json +3 -3
- package/dist/cjs/SubscribableData.js.map +0 -1
- package/dist/cjs/SubscriptionManager.js +0 -83
- package/dist/cjs/SubscriptionManager.js.map +0 -1
- package/dist/esm/SubscribableData.js +0 -23
- package/dist/esm/SubscribableData.js.map +0 -1
- package/dist/esm/SubscriptionManager.js +0 -46
- package/dist/esm/SubscriptionManager.js.map +0 -1
- package/dist/types/SubscribableData.d.ts +0 -11
- package/dist/types/SubscribableData.d.ts.map +0 -1
- package/dist/types/SubscriptionManager.d.ts +0 -19
- package/dist/types/SubscriptionManager.d.ts.map +0 -1
|
@@ -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"}
|
|
@@ -8,7 +8,7 @@ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArra
|
|
|
8
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
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
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 =
|
|
11
|
+
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
12
12
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
13
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
14
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -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 = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0) { ; } } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) 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"}
|
package/dist/esm/Form.js
ADDED
|
@@ -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, Path, 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(name as Path<TValues>, clone(this.initValues[name]));\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,CAACD,IAAI,EAAmBZ,KAAK,CAAC,IAAI,CAACI,UAAU,CAACQ,IAAI,CAAC,CAAC,CAAC;IACtE,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"}
|
package/dist/esm/Node.js
ADDED
|
@@ -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, Path, StringMap } from './types';\nimport { get, set } from './utils/path';\nimport ValueObserverManager from './ValueObserverManager';\n\nclass ValueData<\n TValues extends StringMap,\n TName extends Path<TValues> = Path<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 { Observer, PathReturn, Path, StringMap, Subscription } 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 Path<TValues> = Path<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
|
|
2
|
-
import
|
|
3
|
-
import
|
|
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 './
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export
|
|
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.
|
|
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
|
-
|
|
52
|
-
const
|
|
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 =
|
|
25
|
+
const subscription = form.errors.subscribe(name, v => {
|
|
57
26
|
setValue(v);
|
|
58
27
|
});
|
|
59
28
|
return () => subscription.unsubscribe();
|
|
60
|
-
}, [
|
|
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
|
-
|
|
85
|
-
fromValue,
|
|
57
|
+
transformer = v => v,
|
|
86
58
|
render
|
|
87
59
|
} = props;
|
|
88
60
|
const value = useValue(name);
|
|
89
|
-
const
|
|
90
|
-
const
|
|
91
|
-
const modified = useMemo(() => !isEqual(value,
|
|
92
|
-
const reset = useCallback(() => form.values.set(name,
|
|
93
|
-
const
|
|
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
|
-
|
|
96
|
-
}, [
|
|
67
|
+
transformerRef.current = transformer;
|
|
68
|
+
}, [transformer]);
|
|
97
69
|
const onChange = useCallback(v => {
|
|
98
|
-
form.values.set(name,
|
|
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
|
|
78
|
+
value,
|
|
107
79
|
onChange
|
|
108
|
-
}), [onChange,
|
|
80
|
+
}), [onChange, value]);
|
|
109
81
|
const fieldState = useMemo(() => ({
|
|
110
|
-
error
|
|
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.
|
|
129
|
-
const isInitValue = isEqual(value, initValuesRef.current
|
|
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
|
|
161
|
-
|
|
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 =
|
|
142
|
+
const form = useFormContext();
|
|
165
143
|
if (!form) throw new Error('Wrap your form in a FormProvider');
|
|
166
144
|
return useFormResponse(form);
|
|
167
145
|
};
|