@webkrafters/react-observable-context 4.7.6 → 5.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +13 -13
  2. package/dist/constants.d.ts +2 -9
  3. package/dist/constants.js +64 -19
  4. package/dist/index.d.ts +90 -0
  5. package/dist/index.js +98 -0
  6. package/dist/main/hooks/use-prehooks-ref/index.d.ts +3 -3
  7. package/dist/main/hooks/use-prehooks-ref/index.js +8 -8
  8. package/dist/main/hooks/use-prehooks-ref/index.test.d.ts +1 -0
  9. package/dist/main/hooks/use-prehooks-ref/index.test.js +21 -0
  10. package/dist/main/hooks/use-render-key-provider/index.d.ts +4 -5
  11. package/dist/main/hooks/use-render-key-provider/index.js +23 -11
  12. package/dist/main/hooks/use-render-key-provider/index.test.d.ts +1 -0
  13. package/dist/main/hooks/use-render-key-provider/index.test.js +72 -0
  14. package/dist/main/hooks/use-store/index.d.ts +8 -21
  15. package/dist/main/hooks/use-store/index.js +113 -93
  16. package/dist/main/hooks/use-store/index.test.d.ts +1 -0
  17. package/dist/main/hooks/use-store/index.test.js +456 -0
  18. package/dist/main/index.d.ts +11 -140
  19. package/dist/main/index.js +301 -159
  20. package/dist/main/index.test.d.ts +11 -0
  21. package/dist/main/index.test.js +1298 -0
  22. package/dist/main/test-apps/normal.d.ts +36 -0
  23. package/dist/main/test-apps/normal.js +243 -0
  24. package/dist/main/test-apps/with-connected-children.d.ts +25 -0
  25. package/dist/main/test-apps/with-connected-children.js +229 -0
  26. package/dist/main/test-apps/with-pure-children.d.ts +15 -0
  27. package/dist/main/test-apps/with-pure-children.js +127 -0
  28. package/dist/model/storage/index.d.ts +7 -7
  29. package/dist/model/storage/index.js +55 -59
  30. package/dist/model/storage/index.test.d.ts +1 -0
  31. package/dist/model/storage/index.test.js +139 -0
  32. package/dist/test-artifacts/data/create-state-obj.d.ts +58 -0
  33. package/dist/test-artifacts/data/create-state-obj.js +95 -0
  34. package/dist/test-artifacts/suppress-render-compat.d.ts +1 -0
  35. package/dist/test-artifacts/suppress-render-compat.js +7 -0
  36. package/logo.png +0 -0
  37. package/package.json +34 -70
  38. package/dist/main/hooks/use-state-manager/index.d.ts +0 -12
  39. package/dist/main/hooks/use-state-manager/index.js +0 -42
  40. package/dist/main/set-state/index.d.ts +0 -31
  41. package/dist/main/set-state/index.js +0 -211
  42. package/dist/main/set-state/tag-functions/index.d.ts +0 -38
  43. package/dist/main/set-state/tag-functions/index.js +0 -360
  44. package/dist/model/accessor/index.d.ts +0 -23
  45. package/dist/model/accessor/index.js +0 -180
  46. package/dist/model/accessor-cache/index.d.ts +0 -12
  47. package/dist/model/accessor-cache/index.js +0 -170
  48. package/dist/model/atom/index.d.ts +0 -10
  49. package/dist/model/atom/index.js +0 -79
  50. package/dist/types.d.ts +0 -91
  51. package/dist/utils/clonedeep-eligibility-check.d.ts +0 -7
  52. package/dist/utils/clonedeep-eligibility-check.js +0 -52
  53. package/dist/utils/index.d.ts +0 -12
  54. package/dist/utils/index.js +0 -173
  55. package/index.js +0 -1
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.Product = exports.MemoizedTallyDisplay = exports.MemoizedPriceSticker = exports.MemoizedProductDescription = exports.MemoizedEditor = exports.MemoizedCustomerPhoneDisplay = exports.MemoizedReset = void 0;
30
+ const react_1 = __importStar(require("react"));
31
+ const lodash_isempty_1 = __importDefault(require("lodash.isempty"));
32
+ const normal_1 = require("./normal");
33
+ exports.MemoizedReset = (0, react_1.memo)(normal_1.Reset);
34
+ exports.MemoizedCustomerPhoneDisplay = (0, react_1.memo)(normal_1.CustomerPhoneDisplay);
35
+ exports.MemoizedEditor = (0, react_1.memo)(normal_1.Editor);
36
+ exports.MemoizedProductDescription = (0, react_1.memo)(normal_1.ProductDescription);
37
+ exports.MemoizedPriceSticker = (0, react_1.memo)(normal_1.PriceSticker);
38
+ const TallyDisplay = () => {
39
+ const { data: { color, name, price, type } } = (0, normal_1.useObservableContext)({
40
+ color: 'color',
41
+ name: 'customer.name',
42
+ price: 'price',
43
+ type: 'type'
44
+ });
45
+ (0, react_1.useEffect)(() => console.log('TallyDisplay component rendered.....'));
46
+ return (react_1.default.createElement("div", { style: { margin: '20px 0 10px' } },
47
+ react_1.default.createElement("div", { style: { float: 'left', fontSize: '1.75rem' } },
48
+ "Customer:",
49
+ ' ',
50
+ (0, lodash_isempty_1.default)(name.first) && (0, lodash_isempty_1.default)(name.last)
51
+ ? 'n.a.'
52
+ : (react_1.default.createElement(react_1.default.Fragment, null,
53
+ react_1.default.createElement(normal_1.CapitalizedDisplay, { text: name.first }),
54
+ ' ',
55
+ react_1.default.createElement(normal_1.CapitalizedDisplay, { text: name.last })))),
56
+ react_1.default.createElement("div", { style: { clear: 'both', paddingLeft: 3 } },
57
+ react_1.default.createElement(exports.MemoizedCustomerPhoneDisplay, null)),
58
+ react_1.default.createElement("table", null,
59
+ react_1.default.createElement("tbody", null,
60
+ react_1.default.createElement("tr", null,
61
+ react_1.default.createElement("td", null,
62
+ react_1.default.createElement("label", null, "Type:")),
63
+ react_1.default.createElement("td", null,
64
+ react_1.default.createElement(normal_1.CapitalizedDisplay, { text: type }))),
65
+ react_1.default.createElement("tr", null,
66
+ react_1.default.createElement("td", null,
67
+ react_1.default.createElement("label", null, "Color:")),
68
+ react_1.default.createElement("td", null,
69
+ react_1.default.createElement(normal_1.CapitalizedDisplay, { text: color }))),
70
+ react_1.default.createElement("tr", null,
71
+ react_1.default.createElement("td", null,
72
+ react_1.default.createElement("label", null, "Price:")),
73
+ react_1.default.createElement("td", null, price.toFixed(2))))),
74
+ react_1.default.createElement("div", { style: { textAlign: 'right' } },
75
+ react_1.default.createElement(exports.MemoizedReset, null))));
76
+ };
77
+ TallyDisplay.displayName = 'TallyDisplay';
78
+ exports.MemoizedTallyDisplay = (0, react_1.memo)(TallyDisplay);
79
+ const Product = ({ prehooks = undefined, type }) => {
80
+ const [state, setState] = (0, react_1.useState)(() => ({
81
+ color: 'Burgundy',
82
+ customer: {
83
+ name: { first: null, last: null },
84
+ phone: null
85
+ },
86
+ price: 22.5,
87
+ type
88
+ }));
89
+ (0, react_1.useEffect)(() => {
90
+ setState({ type }); // use this to update only the changed state
91
+ // setState({ ...state, type }); // this will override the context internal state for these values
92
+ }, [type]);
93
+ const overridePricing = (0, react_1.useCallback)(e => setState({
94
+ price: Number(e.target.value)
95
+ }), []);
96
+ return (react_1.default.createElement("div", null,
97
+ react_1.default.createElement("div", { style: { marginBottom: 10 } },
98
+ react_1.default.createElement("label", null,
99
+ "$ ",
100
+ react_1.default.createElement("input", { onKeyUp: overridePricing, placeholder: "override price here..." }))),
101
+ react_1.default.createElement(normal_1.ObservableContext.Provider, { prehooks: prehooks, value: state },
102
+ react_1.default.createElement("div", { style: {
103
+ borderBottom: '1px solid #333',
104
+ marginBottom: 10,
105
+ paddingBottom: 5
106
+ } },
107
+ react_1.default.createElement(exports.MemoizedEditor, null),
108
+ react_1.default.createElement(exports.MemoizedTallyDisplay, null)),
109
+ react_1.default.createElement(exports.MemoizedProductDescription, null),
110
+ react_1.default.createElement(exports.MemoizedPriceSticker, null))));
111
+ };
112
+ exports.Product = Product;
113
+ exports.Product.displayName = 'Product';
114
+ const App = () => {
115
+ const [productType, setProductType] = (0, react_1.useState)('Calculator');
116
+ const updateType = (0, react_1.useCallback)(e => setProductType(e.target.value), []);
117
+ return (react_1.default.createElement("div", { className: "App" },
118
+ react_1.default.createElement("h1", null, "Demo"),
119
+ react_1.default.createElement("h2", null, "A contrived product app."),
120
+ react_1.default.createElement("div", { style: { marginBottom: 10 } },
121
+ react_1.default.createElement("label", null,
122
+ "Type: ",
123
+ react_1.default.createElement("input", { onKeyUp: updateType, placeholder: "override product type here..." }))),
124
+ react_1.default.createElement(exports.Product, { type: productType })));
125
+ };
126
+ App.displayName = 'App';
127
+ exports.default = App;
@@ -1,12 +1,12 @@
1
- export default Storage;
2
- export type IStorage<T extends import("../../types").State> = import("../../types").IStorage<T>;
3
- export type State = import("../../types").State;
4
- declare class Storage<T extends import("../../types").State> {
1
+ import type { IStorage, State } from '../..';
2
+ declare class Storage<T extends State> implements IStorage<T> {
3
+ #private;
5
4
  static supportsSession: boolean;
5
+ constructor();
6
6
  get isKeyRequired(): boolean;
7
- clone(data: T): T;
7
+ clone(data: any): T;
8
8
  getItem(key: string): T;
9
9
  removeItem(key: string): void;
10
10
  setItem(key: string, data: T): void;
11
- #private;
12
- }
11
+ }
12
+ export default Storage;
@@ -1,68 +1,69 @@
1
1
  "use strict";
2
- 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); }
2
+
3
+ var _globalThis$sessionSt;
4
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
5
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
6
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
7
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
8
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
9
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
+ var __classPrivateFieldSet = void 0 && (void 0).__classPrivateFieldSet || function (receiver, state, value, kind, f) {
11
+ if (kind === "m") throw new TypeError("Private method is not writable");
12
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
13
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
14
+ return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value;
15
+ };
16
+ var __classPrivateFieldGet = void 0 && (void 0).__classPrivateFieldGet || function (receiver, state, kind, f) {
17
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
18
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
19
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
20
+ };
21
+ var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
22
+ return mod && mod.__esModule ? mod : {
23
+ "default": mod
24
+ };
25
+ };
26
+ var _MemoryStorage_data, _SessionStorage_storage, _Storage_storage;
3
27
  Object.defineProperty(exports, "__esModule", {
4
28
  value: true
5
29
  });
6
- exports["default"] = void 0;
7
- var _utils = require("../../utils");
8
- var _globalThis$sessionSt;
9
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
10
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
- function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
12
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
13
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
14
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
15
- function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
16
- function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
17
- function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); }
18
- function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }
19
- function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
20
- function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); }
21
- function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } }
22
- var _data = new WeakMap();
23
- var MemoryStorage = function () {
30
+ var clone_total_1 = __importDefault(require("@webkrafters/clone-total"));
31
+ var MemoryStorage = /*#__PURE__*/function () {
24
32
  function MemoryStorage() {
25
33
  _classCallCheck(this, MemoryStorage);
26
- _classPrivateFieldInitSpec(this, _data, {
27
- writable: true,
28
- value: void 0
29
- });
30
- _classPrivateFieldSet(this, _data, null);
34
+ _MemoryStorage_data.set(this, void 0);
35
+ __classPrivateFieldSet(this, _MemoryStorage_data, null, "f");
31
36
  }
32
- _createClass(MemoryStorage, [{
37
+ return _createClass(MemoryStorage, [{
33
38
  key: "clone",
34
39
  value: function clone(data) {
35
- return (0, _utils.clonedeep)(data);
40
+ return (0, clone_total_1["default"])(data);
36
41
  }
37
42
  }, {
38
43
  key: "getItem",
39
44
  value: function getItem(key) {
40
- return _classPrivateFieldGet(this, _data);
45
+ return __classPrivateFieldGet(this, _MemoryStorage_data, "f");
41
46
  }
42
47
  }, {
43
48
  key: "removeItem",
44
49
  value: function removeItem(key) {
45
- _classPrivateFieldSet(this, _data, null);
50
+ __classPrivateFieldSet(this, _MemoryStorage_data, null, "f");
46
51
  }
47
52
  }, {
48
53
  key: "setItem",
49
54
  value: function setItem(key, data) {
50
- _classPrivateFieldSet(this, _data, data);
55
+ __classPrivateFieldSet(this, _MemoryStorage_data, data, "f");
51
56
  }
52
57
  }]);
53
- return MemoryStorage;
54
58
  }();
55
- var _storage = new WeakMap();
56
- var SessionStorage = function () {
59
+ _MemoryStorage_data = new WeakMap();
60
+ var SessionStorage = /*#__PURE__*/function () {
57
61
  function SessionStorage() {
58
62
  _classCallCheck(this, SessionStorage);
59
- _classPrivateFieldInitSpec(this, _storage, {
60
- writable: true,
61
- value: void 0
62
- });
63
- _classPrivateFieldSet(this, _storage, globalThis.sessionStorage);
63
+ _SessionStorage_storage.set(this, void 0);
64
+ __classPrivateFieldSet(this, _SessionStorage_storage, globalThis.sessionStorage, "f");
64
65
  }
65
- _createClass(SessionStorage, [{
66
+ return _createClass(SessionStorage, [{
66
67
  key: "clone",
67
68
  value: function clone(data) {
68
69
  return data;
@@ -70,59 +71,54 @@ var SessionStorage = function () {
70
71
  }, {
71
72
  key: "getItem",
72
73
  value: function getItem(key) {
73
- return JSON.parse(_classPrivateFieldGet(this, _storage).getItem(key));
74
+ return JSON.parse(__classPrivateFieldGet(this, _SessionStorage_storage, "f").getItem(key));
74
75
  }
75
76
  }, {
76
77
  key: "removeItem",
77
78
  value: function removeItem(key) {
78
- return _classPrivateFieldGet(this, _storage).removeItem(key);
79
+ return __classPrivateFieldGet(this, _SessionStorage_storage, "f").removeItem(key);
79
80
  }
80
81
  }, {
81
82
  key: "setItem",
82
83
  value: function setItem(key, data) {
83
- return _classPrivateFieldGet(this, _storage).setItem(key, JSON.stringify(data));
84
+ return __classPrivateFieldGet(this, _SessionStorage_storage, "f").setItem(key, JSON.stringify(data));
84
85
  }
85
86
  }]);
86
- return SessionStorage;
87
87
  }();
88
- var _storage2 = new WeakMap();
89
- var Storage = function () {
88
+ _SessionStorage_storage = new WeakMap();
89
+ var Storage = /*#__PURE__*/function () {
90
90
  function Storage() {
91
91
  _classCallCheck(this, Storage);
92
- _classPrivateFieldInitSpec(this, _storage2, {
93
- writable: true,
94
- value: void 0
95
- });
96
- _classPrivateFieldSet(this, _storage2, Storage.supportsSession ? new SessionStorage() : new MemoryStorage());
92
+ _Storage_storage.set(this, void 0);
93
+ __classPrivateFieldSet(this, _Storage_storage, Storage.supportsSession ? new SessionStorage() : new MemoryStorage(), "f");
97
94
  }
98
- _createClass(Storage, [{
95
+ return _createClass(Storage, [{
99
96
  key: "isKeyRequired",
100
97
  get: function get() {
101
- return _classPrivateFieldGet(this, _storage2) instanceof SessionStorage;
98
+ return __classPrivateFieldGet(this, _Storage_storage, "f") instanceof SessionStorage;
102
99
  }
103
100
  }, {
104
101
  key: "clone",
105
102
  value: function clone(data) {
106
- return _classPrivateFieldGet(this, _storage2).clone(data);
103
+ return __classPrivateFieldGet(this, _Storage_storage, "f").clone(data);
107
104
  }
108
105
  }, {
109
106
  key: "getItem",
110
107
  value: function getItem(key) {
111
- return _classPrivateFieldGet(this, _storage2).getItem(key);
108
+ return __classPrivateFieldGet(this, _Storage_storage, "f").getItem(key);
112
109
  }
113
110
  }, {
114
111
  key: "removeItem",
115
112
  value: function removeItem(key) {
116
- _classPrivateFieldGet(this, _storage2).removeItem(key);
113
+ __classPrivateFieldGet(this, _Storage_storage, "f").removeItem(key);
117
114
  }
118
115
  }, {
119
116
  key: "setItem",
120
117
  value: function setItem(key, data) {
121
- _classPrivateFieldGet(this, _storage2).setItem(key, data);
118
+ __classPrivateFieldGet(this, _Storage_storage, "f").setItem(key, data);
122
119
  }
123
120
  }]);
124
- return Storage;
125
121
  }();
126
- _defineProperty(Storage, "supportsSession", typeof ((_globalThis$sessionSt = globalThis.sessionStorage) === null || _globalThis$sessionSt === void 0 ? void 0 : _globalThis$sessionSt.setItem) === 'undefined');
127
- var _default = Storage;
128
- exports["default"] = _default;
122
+ _Storage_storage = new WeakMap();
123
+ Storage.supportsSession = typeof ((_globalThis$sessionSt = globalThis.sessionStorage) === null || _globalThis$sessionSt === void 0 ? void 0 : _globalThis$sessionSt.setItem) === 'undefined';
124
+ exports["default"] = Storage;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const _1 = __importDefault(require("."));
7
+ const data = {
8
+ isTest: true,
9
+ name: {
10
+ first: 'test',
11
+ last: 'data'
12
+ }
13
+ };
14
+ describe('Storage class', () => {
15
+ const mockImpls = {};
16
+ let origWinStorage;
17
+ beforeAll(() => {
18
+ if (typeof globalThis.sessionStorage?.setItem !== 'undefined') {
19
+ origWinStorage = globalThis.sessionStorage;
20
+ }
21
+ ['getItem', 'removeItem', 'setItem'].forEach(k => { mockImpls[k] = jest.fn(); });
22
+ Object.defineProperty(globalThis, 'sessionStorage', {
23
+ value: {
24
+ data: null,
25
+ getItem(...args) { mockImpls.getItem(...args); return this.data; },
26
+ removeItem(...args) { mockImpls.removeItem(...args); this.data = null; },
27
+ setItem(...args) { mockImpls.setItem(...args); this.data = args[1].toString(); }
28
+ }
29
+ });
30
+ });
31
+ afterAll(() => {
32
+ if (origWinStorage) {
33
+ Object.defineProperty(globalThis, 'sessionStorage', { value: origWinStorage });
34
+ }
35
+ else {
36
+ delete globalThis.sessionStorage;
37
+ }
38
+ });
39
+ describe('in environment with built-in sesssion storage support', () => {
40
+ let storage;
41
+ beforeAll(() => {
42
+ _1.default.supportsSession = true;
43
+ storage = new _1.default();
44
+ });
45
+ afterAll(jest.clearAllMocks);
46
+ test('creates an storage', () => expect(storage).toBeInstanceOf(_1.default));
47
+ test('requires a key for entries into this storage', () => {
48
+ expect(storage.isKeyRequired).toBe(true);
49
+ });
50
+ describe('clone(...)', () => {
51
+ test('performs no cloning of the data - not needed as serialization operation takes care of this', () => {
52
+ const data = { a: 30, b: false, c: 'test', d: [8], e: { w: 55 } };
53
+ const cloned = storage.clone(data);
54
+ expect(cloned).toBe(data);
55
+ expect(cloned).toStrictEqual(data);
56
+ });
57
+ });
58
+ describe('getItem(...)', () => {
59
+ const key = 'a';
60
+ let _data;
61
+ beforeAll(() => {
62
+ storage.setItem(key, data);
63
+ _data = storage.getItem(key);
64
+ });
65
+ afterAll(jest.clearAllMocks);
66
+ test('gets data directly from the session storage', () => {
67
+ expect(mockImpls.getItem).toHaveBeenCalledTimes(1);
68
+ expect(mockImpls.getItem).toHaveBeenCalledWith(key);
69
+ });
70
+ test('gets a copy of the stored data', () => {
71
+ expect(_data).not.toBe(data);
72
+ expect(_data).toStrictEqual(data);
73
+ });
74
+ });
75
+ describe('removeItem(...)', () => {
76
+ test('removes data directly from the session storage', () => {
77
+ const key = 'a';
78
+ storage.removeItem(key);
79
+ expect(mockImpls.removeItem).toHaveBeenCalledTimes(1);
80
+ expect(mockImpls.removeItem).toHaveBeenCalledWith(key);
81
+ });
82
+ });
83
+ describe('setItem(...)', () => {
84
+ test('stores stringified version of the data directly into the session storage', () => {
85
+ const key = 'a';
86
+ storage.setItem(key, data);
87
+ expect(mockImpls.setItem).toHaveBeenCalledTimes(1);
88
+ expect(mockImpls.setItem).toHaveBeenCalledWith(key, expect.any(String));
89
+ expect(mockImpls.setItem.mock.calls[0][1]).toBe(JSON.stringify(data));
90
+ });
91
+ });
92
+ });
93
+ describe('in environment with NO sesssion storage support', () => {
94
+ let storage;
95
+ beforeAll(() => {
96
+ _1.default.supportsSession = false;
97
+ storage = new _1.default();
98
+ });
99
+ test('creates an storage', () => expect(storage).toBeInstanceOf(_1.default));
100
+ test('does not require any key for entries into this storage', () => {
101
+ expect(storage.isKeyRequired).toBe(false);
102
+ });
103
+ describe('clone(...)', () => {
104
+ test('returns a copy of the data', () => {
105
+ const data = { a: 30, b: false, c: 'test', d: [8], e: { w: 55 } };
106
+ const cloned = storage.clone(data);
107
+ expect(cloned).not.toBe(data);
108
+ expect(cloned).toStrictEqual(data);
109
+ });
110
+ });
111
+ describe('getItem(...)', () => {
112
+ let _data;
113
+ beforeAll(() => {
114
+ const key = 'a';
115
+ storage.setItem(key, data);
116
+ _data = storage.getItem(key);
117
+ });
118
+ test('does not get data from the session storage', () => {
119
+ expect(mockImpls.getItem).not.toHaveBeenCalled();
120
+ });
121
+ test('gets the stored data', () => {
122
+ expect(_data).toBe(data);
123
+ expect(_data).toStrictEqual(data);
124
+ });
125
+ });
126
+ describe('removeItem(...)', () => {
127
+ test('does interact with the session storage', () => {
128
+ storage.removeItem('a');
129
+ expect(mockImpls.removeItem).not.toHaveBeenCalled();
130
+ });
131
+ });
132
+ describe('setItem(...)', () => {
133
+ test('does not interact with the session storage', () => {
134
+ storage.setItem('a', data);
135
+ expect(mockImpls.setItem).not.toHaveBeenCalled();
136
+ });
137
+ });
138
+ });
139
+ });
@@ -0,0 +1,58 @@
1
+ /** @returns {SourceData} */
2
+ declare const createSourceData: () => {
3
+ _id: string;
4
+ about: string;
5
+ address: string;
6
+ age: number;
7
+ balance: string;
8
+ company: string;
9
+ email: string;
10
+ eyeColor: string;
11
+ favoriteFruit: string;
12
+ friends: {
13
+ id: number;
14
+ name: {
15
+ first: string;
16
+ last: string;
17
+ };
18
+ }[];
19
+ gender: string;
20
+ greeting: string;
21
+ guid: string;
22
+ history: {
23
+ places: {
24
+ city: string;
25
+ country: string;
26
+ state: string;
27
+ year: string;
28
+ }[];
29
+ };
30
+ isActive: boolean;
31
+ latitude: number;
32
+ longitude: number;
33
+ name: {
34
+ first: string;
35
+ last: string;
36
+ };
37
+ phone: {
38
+ area: string;
39
+ country: string;
40
+ line: string;
41
+ local: string;
42
+ };
43
+ picture: string;
44
+ registered: {
45
+ day: number;
46
+ month: number;
47
+ time: {
48
+ hours: number;
49
+ minutes: number;
50
+ seconds: number;
51
+ };
52
+ timezone: string;
53
+ year: number;
54
+ };
55
+ tags: string[];
56
+ };
57
+ export default createSourceData;
58
+ /** @typedef {typeof sourceData} SourceData */
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const clone_total_1 = __importDefault(require("@webkrafters/clone-total"));
7
+ const sourceData = {
8
+ _id: '639737cc5ac1df69cda79413',
9
+ about: 'Eu deserunt proident id id eu veniam enim qui nostrud eu sit. Aliquip pariatur non cillum adipisicing nisi officia culpa commodo fugiat anim. Exercitation culpa id esse incididunt nostrud non adipisicing laboris labore ullamco. Consectetur Lorem culpa veniam cillum laboris irure aliquip qui sit dolore aute nostrud veniam.\r\n',
10
+ address: '760 Midwood Street, Harborton, Massachusetts, 7547',
11
+ age: 38,
12
+ balance: '$3,311.66',
13
+ company: 'VORTEXACO',
14
+ email: 'ambersears@vortexaco.com',
15
+ eyeColor: 'blue',
16
+ favoriteFruit: 'banana',
17
+ friends: [{
18
+ id: 0,
19
+ name: {
20
+ first: 'Pollard',
21
+ last: 'Hunter'
22
+ }
23
+ }, {
24
+ id: 1,
25
+ name: {
26
+ first: 'Holly',
27
+ last: 'Roberson'
28
+ }
29
+ }, {
30
+ id: 2,
31
+ name: {
32
+ first: 'Carey',
33
+ last: 'Osborne'
34
+ }
35
+ }],
36
+ gender: 'female',
37
+ greeting: 'Hello, Amber Sears! You have 1 unread messages.',
38
+ guid: '628babfc-63c7-446a-8782-057d22ca286a',
39
+ history: {
40
+ places: [{
41
+ city: 'Topeka',
42
+ country: 'US',
43
+ state: 'KS',
44
+ year: '1997 - 2002'
45
+ }, {
46
+ city: 'Atlanta',
47
+ country: 'US',
48
+ state: 'GA',
49
+ year: '2008'
50
+ }, {
51
+ city: 'Miami',
52
+ country: 'US',
53
+ state: 'FL',
54
+ year: '2017'
55
+ }]
56
+ },
57
+ isActive: false,
58
+ latitude: 31.963572,
59
+ longitude: -171.530547,
60
+ name: {
61
+ first: 'Amber',
62
+ last: 'Sears'
63
+ },
64
+ phone: {
65
+ area: '947',
66
+ country: '+1',
67
+ line: '2282',
68
+ local: '552'
69
+ },
70
+ picture: 'http://placehold.it/32x32',
71
+ registered: {
72
+ day: 18,
73
+ month: 2,
74
+ time: {
75
+ hours: 9,
76
+ minutes: 55,
77
+ seconds: 46
78
+ },
79
+ timezone: '+08:00',
80
+ year: 2016
81
+ },
82
+ tags: [
83
+ 'minim',
84
+ 'nisi',
85
+ 'dolor',
86
+ 'in',
87
+ 'ullamco',
88
+ 'laborum',
89
+ 'proident'
90
+ ]
91
+ };
92
+ /** @returns {SourceData} */
93
+ const createSourceData = () => (0, clone_total_1.default)(sourceData);
94
+ exports.default = createSourceData;
95
+ /** @typedef {typeof sourceData} SourceData */
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const consoleError = console.error.bind(console);
4
+ beforeAll(() => {
5
+ console.error = (...args) => !/Warning: ReactDOM\.render is no longer supported in React 18/.test(args[0]) && consoleError(...args);
6
+ });
7
+ afterAll(() => { console.error = consoleError; });
package/logo.png ADDED
Binary file