@homebound/form-state 2.18.1 → 2.20.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 (39) hide show
  1. package/dist/FormStateApp.d.ts +2 -3
  2. package/dist/FormStateApp.js +8 -47
  3. package/dist/FormStateApp.test.js +14 -14
  4. package/dist/config.d.ts +6 -6
  5. package/dist/fields/fragmentField.js +3 -3
  6. package/dist/fields/listField.js +12 -12
  7. package/dist/fields/objectField.d.ts +4 -4
  8. package/dist/fields/objectField.js +10 -10
  9. package/dist/fields/valueField.d.ts +13 -0
  10. package/dist/fields/valueField.js +49 -14
  11. package/dist/formState.stories.d.ts +2 -4
  12. package/dist/formState.stories.js +1 -1
  13. package/dist/formState.test.js +171 -77
  14. package/dist/formStateDomain.js +1 -1
  15. package/dist/index.d.ts +3 -4
  16. package/dist/index.js +0 -11
  17. package/dist/proxies.d.ts +5 -0
  18. package/dist/proxies.js +21 -0
  19. package/dist/rules.d.ts +1 -1
  20. package/dist/rules.js +1 -1
  21. package/dist/setupTests.js +2 -2
  22. package/dist/useFormState.d.ts +4 -4
  23. package/dist/useFormState.js +13 -17
  24. package/dist/useFormState.test.js +141 -198
  25. package/dist/useFormStates.d.ts +3 -3
  26. package/dist/useFormStates.js +7 -11
  27. package/dist/useFormStates.test.js +56 -89
  28. package/dist/utils.d.ts +3 -3
  29. package/dist/utils.js +8 -8
  30. package/dist/utils.test.js +49 -49
  31. package/package.json +44 -39
  32. package/dist/AutoSaveStatus/AutoSaveStatusProvider.d.ts +0 -24
  33. package/dist/AutoSaveStatus/AutoSaveStatusProvider.js +0 -91
  34. package/dist/AutoSaveStatus/index.d.ts +0 -2
  35. package/dist/AutoSaveStatus/index.js +0 -9
  36. package/dist/AutoSaveStatus/useAutoSaveStatus.d.ts +0 -1
  37. package/dist/AutoSaveStatus/useAutoSaveStatus.js +0 -9
  38. package/dist/AutoSaveStatus/useAutoSaveStatus.test.d.ts +0 -1
  39. package/dist/AutoSaveStatus/useAutoSaveStatus.test.js +0 -152
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homebound/form-state",
3
- "version": "2.18.1",
3
+ "version": "2.20.0",
4
4
  "author": "Homebound",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -13,11 +13,11 @@
13
13
  "dist"
14
14
  ],
15
15
  "scripts": {
16
- "build": "ttsc",
17
- "build:storybook": "build-storybook",
16
+ "build": "tspc",
17
+ "build:storybook": "storybook build",
18
18
  "test": "jest",
19
19
  "lint": "eslint . --cache --fix --ext .js,.ts,.tsx",
20
- "storybook": "start-storybook -p 9000",
20
+ "storybook": "storybook dev -p 9000",
21
21
  "format": "prettier --loglevel warn --write \"**/*.{ts,tsx,css,md}\"",
22
22
  "semantic-release": "semantic-release"
23
23
  },
@@ -32,30 +32,32 @@
32
32
  "dependencies": {
33
33
  "fast-deep-equal": "^3.1.3",
34
34
  "is-plain-object": "^5.0.0",
35
- "mobx": "^6.3.2",
36
- "mobx-react": "^7.2.0"
35
+ "mobx": "^6.10.2",
36
+ "mobx-react": "^9.0.1"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": ">=16"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@babel/core": "^7.13.1",
43
- "@homebound/rtl-utils": "^2.59.2",
44
- "@semantic-release/exec": "^5.0.0",
45
- "@semantic-release/git": "^9.0.0",
46
- "@storybook/addon-essentials": "^6.2.9",
47
- "@storybook/addon-info": "^5.3.21",
48
- "@storybook/addon-links": "^6.2.9",
49
- "@storybook/addons": "^6.2.9",
50
- "@storybook/react": "^6.2.9",
51
- "@testing-library/dom": "^8.11.3",
52
- "@testing-library/jest-dom": "^5.16.2",
53
- "@testing-library/react": "^12.1.2",
54
- "@testing-library/react-hooks": "^8.0.0",
55
- "@tsconfig/recommended": "^1.0.1",
56
- "@types/jest": "^26.0.20",
57
- "@types/react": "^16.14.5",
58
- "@types/react-dom": "^16.9.11",
43
+ "@babel/preset-env": "^7.22.15",
44
+ "@babel/preset-react": "^7.22.15",
45
+ "@babel/preset-typescript": "^7.22.15",
46
+ "@homebound/rtl-utils": "2.65.0",
47
+ "@semantic-release/exec": "^6.0.3",
48
+ "@semantic-release/git": "^10.0.1",
49
+ "@storybook/addon-essentials": "^7.4.0",
50
+ "@storybook/addon-links": "^7.4.0",
51
+ "@storybook/addons": "^7.4.0",
52
+ "@storybook/react": "^7.4.0",
53
+ "@storybook/react-webpack5": "^7.4.0",
54
+ "@testing-library/dom": "^9.3.1",
55
+ "@testing-library/jest-dom": "^6.1.3",
56
+ "@testing-library/react": "^14.0.0",
57
+ "@tsconfig/recommended": "^1.0.2",
58
+ "@types/jest": "^29.5.4",
59
+ "@types/react": "^18.2.21",
60
+ "@types/react-dom": "^18.2.7",
59
61
  "@typescript-eslint/eslint-plugin": "^4.17.0",
60
62
  "@typescript-eslint/parser": "^4.17.0",
61
63
  "babel-eslint": "^10.1.0",
@@ -69,21 +71,24 @@
69
71
  "eslint-plugin-jsx-a11y": "^6.4.1",
70
72
  "eslint-plugin-react": "^7.22.0",
71
73
  "eslint-plugin-react-hooks": "^4.2.0",
72
- "husky": "^3.0.9",
73
- "jest": "^27.0.2",
74
- "lint-staged": "^10.1.2",
75
- "mobx": "^6.3.2",
76
- "mobx-react": "^7.2.0",
77
- "prettier": "^2.2.1",
78
- "prettier-plugin-organize-imports": "^1.1.1",
79
- "react": "^16.14.0",
80
- "react-dom": "^16.14.0",
81
- "semantic-release": "^17.4.0",
82
- "ts-jest": "^27.0.1",
83
- "ts-node": "^9.1.1",
84
- "tslib": "^2.1.0",
85
- "ttypescript": "^1.5.12",
86
- "typescript": "^4.3.2",
87
- "typescript-transform-paths": "^2.0.1"
88
- }
74
+ "husky": "^3.1.0",
75
+ "jest": "^29.6.4",
76
+ "jest-environment-jsdom": "^29.6.4",
77
+ "lint-staged": "^14.0.1",
78
+ "mobx": "^6.10.2",
79
+ "mobx-react": "^9.0.1",
80
+ "prettier": "2.8.8",
81
+ "prettier-plugin-organize-imports": "^3.2.3",
82
+ "react": "^18.2.0",
83
+ "react-dom": "^18.2.0",
84
+ "semantic-release": "^21.1.1",
85
+ "storybook": "^7.4.0",
86
+ "ts-jest": "^29.1.1",
87
+ "ts-node": "^10.9.1",
88
+ "ts-patch": "^3.0.2",
89
+ "tslib": "^2.6.2",
90
+ "typescript": "^5.2.2",
91
+ "typescript-transform-paths": "^3.4.6"
92
+ },
93
+ "packageManager": "yarn@3.6.3"
89
94
  }
@@ -1,24 +0,0 @@
1
- import React, { PropsWithChildren } from "react";
2
- export declare enum AutoSaveStatus {
3
- IDLE = "idle",
4
- SAVING = "saving",
5
- DONE = "done",
6
- ERROR = "error"
7
- }
8
- export interface AutoSaveStatusContextType {
9
- status: AutoSaveStatus;
10
- /** Resets status to IDLE, particularly useful if "Error" or "Done" is stale */
11
- resetStatus: VoidFunction;
12
- errors: unknown[];
13
- /** Notifies AutoSaveContext that a request is in-flight */
14
- triggerAutoSave: VoidFunction;
15
- /** Notifies AutoSaveContext that a request has settled, optionally taking an error */
16
- resolveAutoSave: (error?: unknown) => void;
17
- }
18
- export declare const AutoSaveStatusContext: React.Context<AutoSaveStatusContextType>;
19
- declare type AutoSaveStatusProviderProps = PropsWithChildren<{
20
- /** After a successful save, reset Status back to `Idle` after this many milliseconds */
21
- resetToIdleTimeout?: number;
22
- }>;
23
- export declare function AutoSaveStatusProvider({ children, resetToIdleTimeout }: AutoSaveStatusProviderProps): JSX.Element;
24
- export {};
@@ -1,91 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.AutoSaveStatusProvider = exports.AutoSaveStatusContext = exports.AutoSaveStatus = void 0;
23
- const jsx_runtime_1 = require("react/jsx-runtime");
24
- const react_1 = __importStar(require("react"));
25
- var AutoSaveStatus;
26
- (function (AutoSaveStatus) {
27
- AutoSaveStatus["IDLE"] = "idle";
28
- AutoSaveStatus["SAVING"] = "saving";
29
- AutoSaveStatus["DONE"] = "done";
30
- AutoSaveStatus["ERROR"] = "error";
31
- })(AutoSaveStatus = exports.AutoSaveStatus || (exports.AutoSaveStatus = {}));
32
- exports.AutoSaveStatusContext = react_1.default.createContext({
33
- status: AutoSaveStatus.IDLE,
34
- resetStatus() { },
35
- errors: [],
36
- triggerAutoSave() { },
37
- resolveAutoSave() { },
38
- });
39
- function AutoSaveStatusProvider({ children, resetToIdleTimeout = 6000 }) {
40
- const [status, setStatus] = react_1.useState(AutoSaveStatus.IDLE);
41
- const [errors, setErrors] = react_1.useState([]);
42
- const [inFlight, setInFlight] = react_1.useState(0);
43
- const resetToIdleTimeoutRef = react_1.useRef(null);
44
- /** Handles setting Status */
45
- react_1.useEffect(() => {
46
- if (inFlight > 0)
47
- return setStatus(AutoSaveStatus.SAVING);
48
- if (status === AutoSaveStatus.IDLE)
49
- return;
50
- if (errors.length)
51
- return setStatus(AutoSaveStatus.ERROR);
52
- return setStatus(AutoSaveStatus.DONE);
53
- }, [errors.length, inFlight, status]);
54
- const triggerAutoSave = react_1.useCallback(() => {
55
- setInFlight((c) => c + 1);
56
- setErrors([]);
57
- }, []);
58
- const resolveAutoSave = react_1.useCallback((error) => {
59
- setInFlight((c) => Math.max(0, c - 1));
60
- if (error)
61
- setErrors((errs) => errs.concat(error));
62
- }, []);
63
- const resetStatus = react_1.useCallback(() => {
64
- setStatus(AutoSaveStatus.IDLE);
65
- setErrors([]);
66
- }, []);
67
- /** Resets AutoSaveStatus from "Done" to "Idle" after a timeout, if one is provided */
68
- react_1.useEffect(() => {
69
- if (resetToIdleTimeout === undefined)
70
- return;
71
- // Specifically avoid auto-reset if Errors are present
72
- if (status !== AutoSaveStatus.DONE)
73
- return;
74
- // Only run the latest Timeout
75
- if (resetToIdleTimeoutRef.current)
76
- clearTimeout(resetToIdleTimeoutRef.current);
77
- resetToIdleTimeoutRef.current = window.setTimeout(() => {
78
- resetStatus();
79
- resetToIdleTimeoutRef.current = null;
80
- }, resetToIdleTimeout);
81
- }, [resetStatus, resetToIdleTimeout, status]);
82
- const value = react_1.useMemo(() => ({ status, resetStatus, errors, triggerAutoSave, resolveAutoSave }), [
83
- errors,
84
- resetStatus,
85
- resolveAutoSave,
86
- status,
87
- triggerAutoSave,
88
- ]);
89
- return jsx_runtime_1.jsx(exports.AutoSaveStatusContext.Provider, Object.assign({ value: value }, { children: children }), void 0);
90
- }
91
- exports.AutoSaveStatusProvider = AutoSaveStatusProvider;
@@ -1,2 +0,0 @@
1
- export { AutoSaveStatus, AutoSaveStatusContext, AutoSaveStatusProvider } from "./AutoSaveStatusProvider";
2
- export { useAutoSaveStatus } from "./useAutoSaveStatus";
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useAutoSaveStatus = exports.AutoSaveStatusProvider = exports.AutoSaveStatusContext = exports.AutoSaveStatus = void 0;
4
- var AutoSaveStatusProvider_1 = require("./AutoSaveStatusProvider");
5
- Object.defineProperty(exports, "AutoSaveStatus", { enumerable: true, get: function () { return AutoSaveStatusProvider_1.AutoSaveStatus; } });
6
- Object.defineProperty(exports, "AutoSaveStatusContext", { enumerable: true, get: function () { return AutoSaveStatusProvider_1.AutoSaveStatusContext; } });
7
- Object.defineProperty(exports, "AutoSaveStatusProvider", { enumerable: true, get: function () { return AutoSaveStatusProvider_1.AutoSaveStatusProvider; } });
8
- var useAutoSaveStatus_1 = require("./useAutoSaveStatus");
9
- Object.defineProperty(exports, "useAutoSaveStatus", { enumerable: true, get: function () { return useAutoSaveStatus_1.useAutoSaveStatus; } });
@@ -1 +0,0 @@
1
- export declare function useAutoSaveStatus(): import("./AutoSaveStatusProvider").AutoSaveStatusContextType;
@@ -1,9 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useAutoSaveStatus = void 0;
4
- const react_1 = require("react");
5
- const AutoSaveStatusProvider_1 = require("./AutoSaveStatusProvider");
6
- function useAutoSaveStatus() {
7
- return react_1.useContext(AutoSaveStatusProvider_1.AutoSaveStatusContext);
8
- }
9
- exports.useAutoSaveStatus = useAutoSaveStatus;
@@ -1 +0,0 @@
1
- export {};
@@ -1,152 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const jsx_runtime_1 = require("react/jsx-runtime");
4
- const react_hooks_1 = require("@testing-library/react-hooks");
5
- const AutoSaveStatusProvider_1 = require("./AutoSaveStatusProvider");
6
- const useAutoSaveStatus_1 = require("./useAutoSaveStatus");
7
- describe(useAutoSaveStatus_1.useAutoSaveStatus, () => {
8
- /** The internal setTimeout running after tests is spamming the console, so cancel them all here */
9
- afterEach(() => {
10
- jest.clearAllTimers();
11
- });
12
- it("renders without a provider", () => {
13
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus());
14
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
15
- });
16
- it("renders with a provider", () => {
17
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
18
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
19
- });
20
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
21
- });
22
- it("indicates when something is in-flight", () => {
23
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
24
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
25
- });
26
- react_hooks_1.act(() => result.current.triggerAutoSave());
27
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.SAVING);
28
- });
29
- it("indicates when a request has settled", () => {
30
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
31
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
32
- });
33
- react_hooks_1.act(() => result.current.triggerAutoSave());
34
- react_hooks_1.act(() => result.current.resolveAutoSave());
35
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.DONE);
36
- });
37
- it("indicates when an error happened", () => {
38
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
39
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
40
- });
41
- react_hooks_1.act(() => result.current.triggerAutoSave());
42
- react_hooks_1.act(() => result.current.resolveAutoSave(new Error("Some error")));
43
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.ERROR);
44
- expect(result.current.errors.length).toBe(1);
45
- });
46
- it("resets status to Idle when told to", () => {
47
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
48
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
49
- });
50
- react_hooks_1.act(() => result.current.triggerAutoSave());
51
- react_hooks_1.act(() => result.current.resolveAutoSave());
52
- react_hooks_1.act(() => result.current.resetStatus());
53
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
54
- });
55
- it("status goes through the full lifecycle when passed a reset timeout", async () => {
56
- // Given a timeout has been passed to `useAutoSave()`
57
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
58
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, Object.assign({ resetToIdleTimeout: 1000 }, { children: children }), void 0),
59
- });
60
- // When we trigger a save
61
- react_hooks_1.act(() => result.current.triggerAutoSave());
62
- // Then status is Saving
63
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.SAVING);
64
- // And when we trigger a resolution
65
- react_hooks_1.act(() => result.current.resolveAutoSave());
66
- // Then status is Done
67
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.DONE);
68
- // But when the timer runs out
69
- react_hooks_1.act(() => {
70
- jest.runOnlyPendingTimers();
71
- });
72
- // Then the status is reset to Idle
73
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
74
- });
75
- it("clears errors on reset status", () => {
76
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
77
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
78
- });
79
- react_hooks_1.act(() => result.current.triggerAutoSave());
80
- react_hooks_1.act(() => result.current.resolveAutoSave(new Error("some error")));
81
- expect(result.current.errors.length).toBe(1);
82
- react_hooks_1.act(() => result.current.resetStatus());
83
- expect(result.current.errors.length).toBe(0);
84
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
85
- });
86
- it("does not automatically invoke reset timeout if there are errors", () => {
87
- // Given a timeout has been passed to `useAutoSave()`
88
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
89
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
90
- });
91
- react_hooks_1.act(() => result.current.triggerAutoSave());
92
- react_hooks_1.act(() => result.current.resolveAutoSave(new Error("Some error")));
93
- react_hooks_1.act(() => {
94
- jest.runOnlyPendingTimers();
95
- });
96
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.ERROR);
97
- expect(result.current.errors.length).toBe(1);
98
- });
99
- it("does allow manual resetting even if there are errors", () => {
100
- // Given a timeout has been passed to `useAutoSave()`
101
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
102
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
103
- });
104
- react_hooks_1.act(() => result.current.triggerAutoSave());
105
- react_hooks_1.act(() => result.current.resolveAutoSave(new Error("Some error")));
106
- react_hooks_1.act(() => {
107
- jest.runOnlyPendingTimers();
108
- });
109
- react_hooks_1.act(() => result.current.resetStatus());
110
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
111
- expect(result.current.errors.length).toBe(0);
112
- });
113
- it("handles multiple in-flight requests", () => {
114
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
115
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
116
- });
117
- // When we trigger 2 AutoSaves and only resolve 1
118
- react_hooks_1.act(() => result.current.triggerAutoSave());
119
- react_hooks_1.act(() => result.current.triggerAutoSave());
120
- react_hooks_1.act(() => result.current.resolveAutoSave());
121
- // We expect something to still be in-flight
122
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.SAVING);
123
- // And when we resolve the final one
124
- react_hooks_1.act(() => result.current.resolveAutoSave());
125
- // We expect it to finally settle
126
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.DONE);
127
- });
128
- it("clears errors when a new save is triggered", () => {
129
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
130
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
131
- });
132
- react_hooks_1.act(() => result.current.triggerAutoSave());
133
- react_hooks_1.act(() => result.current.resolveAutoSave(new Error("some error")));
134
- react_hooks_1.act(() => result.current.triggerAutoSave());
135
- expect(result.current.errors.length).toBe(0);
136
- });
137
- it("handles calling resolve too much", () => {
138
- const { result } = react_hooks_1.renderHook(() => useAutoSaveStatus_1.useAutoSaveStatus(), {
139
- wrapper: ({ children }) => jsx_runtime_1.jsx(AutoSaveStatusProvider_1.AutoSaveStatusProvider, { children: children }, void 0),
140
- });
141
- // When save hasn't been invoked yet
142
- react_hooks_1.act(() => result.current.resolveAutoSave());
143
- // Then we effectively didn't run
144
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.IDLE);
145
- // And when 1 save has triggered, and we resolve too much
146
- react_hooks_1.act(() => result.current.triggerAutoSave());
147
- react_hooks_1.act(() => result.current.resolveAutoSave());
148
- react_hooks_1.act(() => result.current.resolveAutoSave());
149
- // Then we expect it to be happily "Done"
150
- expect(result.current.status).toBe(AutoSaveStatusProvider_1.AutoSaveStatus.DONE);
151
- });
152
- });