studiokit-scaffolding-js 7.0.12-next.1.4 → 7.0.12-next.1.6

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.
@@ -27,11 +27,7 @@ const ActionList = ({ actions = [], model = null, className, alwaysShowKebab })
27
27
  if (defaultAction) {
28
28
  allowedActions = allowedActions.filter(a => a !== defaultAction);
29
29
  }
30
- return ((0, jsx_runtime_1.jsxs)("div", { className: !!defaultAction && !!model && (actionCount > 1 || alwaysShowKebab) ? 'inline-flex' : 'di', children: [!!defaultAction && ((0, jsx_runtime_1.jsxs)(core_1.Button, { color: "primary", onClick: defaultAction.action, id: defaultAction.id, className: defaultAction.className || '', disabled: defaultAction.disabled, children: [defaultAction.icon, defaultAction.name] })), !!model && (actionCount > 1 || alwaysShowKebab) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(core_1.Button, { ref: anchorRef, onClick: event => {
31
- setInfoMenuAnchorElement(event.currentTarget);
32
- }, "aria-label": "Actions", "aria-haspopup": "true", "aria-controls": infoMenuAnchorElement ? `info-menu-${model.id}` : undefined, className: `action-list-text-button${defaultAction ? ' with-default-action' : ''}`, color: "primary", children: ["Actions", (0, jsx_runtime_1.jsx)(MoreVert_1.default, { color: "primary" })] }), (0, jsx_runtime_1.jsx)(core_1.IconButton, { ref: anchorRef, onClick: event => {
33
- setInfoMenuAnchorElement(event.currentTarget);
34
- }, "aria-label": "Actions", "aria-haspopup": "true", "aria-controls": infoMenuAnchorElement ? `info-menu-${model.id}` : undefined, className: `action-list-icon-button${defaultAction ? ' with-default-action' : ''}`, children: (0, jsx_runtime_1.jsx)(MoreVert_1.default, { color: "primary" }) }), (0, jsx_runtime_1.jsx)(core_1.Popper, { open: !!infoMenuAnchorElement, anchorEl: infoMenuAnchorElement, placement: "bottom-end", className: `z-1${className ? ` ${className}` : ''}`, transition: true, children: ({ TransitionProps, placement }) => ((0, jsx_runtime_1.jsx)(core_1.Grow, Object.assign({}, TransitionProps, { style: { transformOrigin: placement === 'bottom-end' ? 'top right' : 'bottom right' }, children: (0, jsx_runtime_1.jsx)(core_1.Paper, { children: (0, jsx_runtime_1.jsx)(core_1.ClickAwayListener, { onClickAway: onActionItemClick(), children: (0, jsx_runtime_1.jsx)(core_1.MenuList, { id: `info-menu-${model.id}`, autoFocusItem: !!infoMenuAnchorElement, onKeyDown: handleListKeyDown, className: "action-list shadow-large", children: allowedActions.map((a, index) => a.predicate
30
+ return ((0, jsx_runtime_1.jsxs)("div", { className: !!defaultAction && !!model && (actionCount > 1 || alwaysShowKebab) ? 'inline-flex' : 'di', children: [!!defaultAction && ((0, jsx_runtime_1.jsxs)(core_1.Button, { color: "primary", onClick: defaultAction.action, id: defaultAction.id, className: defaultAction.className || '', disabled: defaultAction.disabled, children: [defaultAction.icon, defaultAction.name] })), !!model && (actionCount > 1 || alwaysShowKebab) && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(core_1.Button, { ref: anchorRef, onClick: event => setInfoMenuAnchorElement(event.currentTarget), "aria-label": "Actions", "aria-haspopup": "true", "aria-controls": infoMenuAnchorElement ? `info-menu-${model.id}` : undefined, className: `action-list-text-button${defaultAction ? ' with-default-action' : ''}`, color: "primary", children: ["Actions", (0, jsx_runtime_1.jsx)(MoreVert_1.default, { color: "primary" })] }), (0, jsx_runtime_1.jsx)(core_1.IconButton, { ref: anchorRef, onClick: event => setInfoMenuAnchorElement(event.currentTarget), "aria-label": "Actions", "aria-haspopup": "true", "aria-controls": infoMenuAnchorElement ? `info-menu-${model.id}` : undefined, className: `action-list-icon-button${defaultAction ? ' with-default-action' : ''}`, children: (0, jsx_runtime_1.jsx)(MoreVert_1.default, { color: "primary" }) }), (0, jsx_runtime_1.jsx)(core_1.Popper, { open: !!infoMenuAnchorElement, anchorEl: infoMenuAnchorElement, placement: "bottom-end", className: `z-1${className ? ` ${className}` : ''}`, transition: true, children: ({ TransitionProps, placement }) => ((0, jsx_runtime_1.jsx)(core_1.Grow, Object.assign({}, TransitionProps, { style: { transformOrigin: placement === 'bottom-end' ? 'top right' : 'bottom right' }, children: (0, jsx_runtime_1.jsx)(core_1.Paper, { children: (0, jsx_runtime_1.jsx)(core_1.ClickAwayListener, { onClickAway: onActionItemClick(), children: (0, jsx_runtime_1.jsx)(core_1.MenuList, { id: `info-menu-${model.id}`, autoFocusItem: !!infoMenuAnchorElement, onKeyDown: handleListKeyDown, className: "action-list shadow-large", children: allowedActions.map((a, index) => a.predicate
35
31
  ? [
36
32
  ...(index > 0 ? [(0, jsx_runtime_1.jsx)(core_1.Divider, {})] : []),
37
33
  (0, jsx_runtime_1.jsxs)(core_1.MenuItem, { className: `action-list-menu mv1 pv2 ${a.className}`, onClick: onActionItemClick(a.action), color: "primary", disabled: a.disabled, children: [a.icon, a.name] }, a.id)
@@ -20,8 +20,6 @@ const UserDropdown = (_a) => {
20
20
  var { userInfo, children } = _a, props = tslib_1.__rest(_a, ["userInfo", "children"]);
21
21
  const [guid] = (0, react_1.useState)((0, uuid_1.v4)());
22
22
  const dropdownTitle = userInfo.isImpersonated ? ((0, jsx_runtime_1.jsx)(UserDetail_1.ImpersonationUserDetail, Object.assign({ userInfo: userInfo }, props))) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: ["Hi, ", (0, user_1.displayFirstName)(userInfo)] }));
23
- return ((0, jsx_runtime_1.jsxs)(ManagedNavDropdown_1.ManagedNavDropdown, { id: "user-menu", className: `user-menu${userInfo.isImpersonated ? ' user-menu-impersonated' : ''}`, title: dropdownTitle, children: [children, userInfo.isImpersonated && ((0, jsx_runtime_1.jsxs)(react_bootstrap_1.NavDropdown.Item, { onSelect: () => {
24
- (0, user_1.stopImpersonation)(guid);
25
- }, children: [(0, jsx_runtime_1.jsx)(IconStopImpersonating_1.IconStopImpersonating, { className: "menu-icon" }), "Stop Impersonating"] })), (0, jsx_runtime_1.jsxs)(react_bootstrap_1.NavDropdown.Item, { onSelect: doLogOut, children: [(0, jsx_runtime_1.jsx)(Lock_1.default, { className: "menu-icon" }), "Log Out"] })] }));
23
+ return ((0, jsx_runtime_1.jsxs)(ManagedNavDropdown_1.ManagedNavDropdown, { id: "user-menu", className: `user-menu${userInfo.isImpersonated ? ' user-menu-impersonated' : ''}`, title: dropdownTitle, children: [children, userInfo.isImpersonated && ((0, jsx_runtime_1.jsxs)(react_bootstrap_1.NavDropdown.Item, { onSelect: () => (0, user_1.stopImpersonation)(guid), children: [(0, jsx_runtime_1.jsx)(IconStopImpersonating_1.IconStopImpersonating, { className: "menu-icon" }), "Stop Impersonating"] })), (0, jsx_runtime_1.jsxs)(react_bootstrap_1.NavDropdown.Item, { onSelect: doLogOut, children: [(0, jsx_runtime_1.jsx)(Lock_1.default, { className: "menu-icon" }), "Log Out"] })] }));
26
24
  };
27
25
  exports.UserDropdown = UserDropdown;
@@ -6,10 +6,6 @@ const jsx_runtime_1 = require("react/jsx-runtime");
6
6
  const Button_1 = tslib_1.__importDefault(require("@material-ui/core/Button"));
7
7
  const CircularProgress_1 = tslib_1.__importDefault(require("@material-ui/core/CircularProgress"));
8
8
  const GroupCreateEditCopySaveButtons = ({ disabled, cannotSave, cannotSaveAndAddOwners, canAddInstructors, save, cancel }) => {
9
- return ((0, jsx_runtime_1.jsxs)("div", { children: [!!disabled && (0, jsx_runtime_1.jsx)(CircularProgress_1.default, { size: 30, className: "fr" }), (0, jsx_runtime_1.jsx)(Button_1.default, { onClick: () => {
10
- save();
11
- }, color: "primary", className: `fr btn-primary${disabled ? ' visually-hidden' : ''}`, disabled: cannotSave(), children: "Save" }), canAddInstructors && ((0, jsx_runtime_1.jsx)(Button_1.default, { onClick: () => {
12
- save(true);
13
- }, color: "primary", className: `fr btn-primary mr1${disabled ? ' visually-hidden' : ''}`, disabled: cannotSaveAndAddOwners(), children: "Save and Add Instructors" })), (0, jsx_runtime_1.jsx)(Button_1.default, { onClick: cancel, color: "primary", className: `fr btn-text mr1${disabled ? ' visually-hidden' : ''}`, children: "Cancel" })] }));
9
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [!!disabled && (0, jsx_runtime_1.jsx)(CircularProgress_1.default, { size: 30, className: "fr" }), (0, jsx_runtime_1.jsx)(Button_1.default, { onClick: () => save(), color: "primary", className: `fr btn-primary${disabled ? ' visually-hidden' : ''}`, disabled: cannotSave(), children: "Save" }), canAddInstructors && ((0, jsx_runtime_1.jsx)(Button_1.default, { onClick: () => save(true), color: "primary", className: `fr btn-primary mr1${disabled ? ' visually-hidden' : ''}`, disabled: cannotSaveAndAddOwners(), children: "Save and Add Instructors" })), (0, jsx_runtime_1.jsx)(Button_1.default, { onClick: cancel, color: "primary", className: `fr btn-text mr1${disabled ? ' visually-hidden' : ''}`, children: "Cancel" })] }));
14
10
  };
15
11
  exports.GroupCreateEditCopySaveButtons = GroupCreateEditCopySaveButtons;
@@ -131,9 +131,7 @@ class ExternalGroupsAttach extends react_1.Component {
131
131
  }
132
132
  componentWillUnmount() {
133
133
  const { ownerSchedules } = this.state;
134
- (0, lodash_1.forEach)(ownerSchedules, os => {
135
- (0, noStoreSaga_1.unregisterNoStoreActionHook)(os.hookId);
136
- });
134
+ (0, lodash_1.forEach)(ownerSchedules, os => (0, noStoreSaga_1.unregisterNoStoreActionHook)(os.hookId));
137
135
  }
138
136
  componentDidUpdate(prevProps) {
139
137
  const { externalTermId: prevExternalTermId, groupUserRoles: prevGroupUserRoles } = prevProps;
@@ -13,12 +13,6 @@ const RosterSyncInfo = ({ hasLtiRosterSync }) => {
13
13
  const [isModalOpen, setIsModalOpen] = (0, react_1.useState)(false);
14
14
  const lmsName = (0, configuration_1.getAppConfig)().LMS_NAME;
15
15
  const title = `${hasLtiRosterSync ? `${lmsName} ` : ''}Roster Sync`;
16
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Button_1.default, { color: "primary", className: "mb0 mr1-ns pv2 ph2 fr-ns btn-text", onClick: () => {
17
- setIsModalOpen(true);
18
- }, children: [(0, jsx_runtime_1.jsx)(Highlight_1.default, { className: "v-mid mr1" }), (0, jsx_runtime_1.jsx)("span", { className: "mb0 b", children: title })] }), (0, jsx_runtime_1.jsxs)(ConnectedModal_1.default, { show: isModalOpen, onHide: () => {
19
- setIsModalOpen(false);
20
- }, children: [(0, jsx_runtime_1.jsx)(react_bootstrap_1.Modal.Header, { closeButton: true, children: (0, jsx_runtime_1.jsx)(react_bootstrap_1.Modal.Title, { className: "f4", children: title }) }), (0, jsx_runtime_1.jsxs)(react_bootstrap_1.Modal.Body, { children: [(0, jsx_runtime_1.jsx)("h3", { children: "When is the roster synced?" }), (0, jsx_runtime_1.jsxs)("p", { children: ["The roster is synced nightly throughout the duration of the course. People are added and removed automatically as the", ' ', hasLtiRosterSync ? `roster changes in ${lmsName}` : 'external roster changes', "."] })] }), (0, jsx_runtime_1.jsx)(react_bootstrap_1.Modal.Footer, { children: (0, jsx_runtime_1.jsx)(Button_1.default, { color: "primary", className: "ma0 btn-primary", onClick: () => {
21
- setIsModalOpen(false);
22
- }, children: "Close" }) })] })] }));
16
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)(Button_1.default, { color: "primary", className: "mb0 mr1-ns pv2 ph2 fr-ns btn-text", onClick: () => setIsModalOpen(true), children: [(0, jsx_runtime_1.jsx)(Highlight_1.default, { className: "v-mid mr1" }), (0, jsx_runtime_1.jsx)("span", { className: "mb0 b", children: title })] }), (0, jsx_runtime_1.jsxs)(ConnectedModal_1.default, { show: isModalOpen, onHide: () => setIsModalOpen(false), children: [(0, jsx_runtime_1.jsx)(react_bootstrap_1.Modal.Header, { closeButton: true, children: (0, jsx_runtime_1.jsx)(react_bootstrap_1.Modal.Title, { className: "f4", children: title }) }), (0, jsx_runtime_1.jsxs)(react_bootstrap_1.Modal.Body, { children: [(0, jsx_runtime_1.jsx)("h3", { children: "When is the roster synced?" }), (0, jsx_runtime_1.jsxs)("p", { children: ["The roster is synced nightly throughout the duration of the course. People are added and removed automatically as the", ' ', hasLtiRosterSync ? `roster changes in ${lmsName}` : 'external roster changes', "."] })] }), (0, jsx_runtime_1.jsx)(react_bootstrap_1.Modal.Footer, { children: (0, jsx_runtime_1.jsx)(Button_1.default, { color: "primary", className: "ma0 btn-primary", onClick: () => setIsModalOpen(false), children: "Close" }) })] })] }));
23
17
  };
24
18
  exports.RosterSyncInfo = RosterSyncInfo;
@@ -162,9 +162,9 @@ const configureMapDispatchToProps = (key) => (dispatch) => {
162
162
  };
163
163
  const persistSearchDebounce = (search) => {
164
164
  if (searchDebounce) {
165
- clearTimeout(searchDebounce);
165
+ window.clearTimeout(searchDebounce);
166
166
  }
167
- searchDebounce = setTimeout(() => dispatchPersistSearch(search), 1000);
167
+ searchDebounce = window.setTimeout(() => dispatchPersistSearch(search), 1000);
168
168
  };
169
169
  return {
170
170
  persistSearch: persistSearchDebounce
@@ -16,7 +16,7 @@ interface NotificationsState {
16
16
  isOpen: boolean;
17
17
  }
18
18
  export declare class Notifications extends Component<NotificationsProps, NotificationsState> {
19
- afterCloseTimeout: NodeJS.Timeout | undefined;
19
+ afterCloseTimeout: number | undefined;
20
20
  constructor(props: NotificationsProps);
21
21
  componentDidMount(): void;
22
22
  componentDidUpdate(): void;
@@ -17,7 +17,7 @@ class Notifications extends react_1.Component {
17
17
  this.afterCloseTimeout = undefined;
18
18
  this.clearAfterCloseTimeout = () => {
19
19
  if (this.afterCloseTimeout) {
20
- clearTimeout(this.afterCloseTimeout);
20
+ window.clearTimeout(this.afterCloseTimeout);
21
21
  this.afterCloseTimeout = undefined;
22
22
  }
23
23
  };
@@ -60,7 +60,7 @@ class Notifications extends react_1.Component {
60
60
  isOpen: false
61
61
  }, () => {
62
62
  // wait until after Snackbar hide animation to clear the UI
63
- this.afterCloseTimeout = setTimeout(() => {
63
+ this.afterCloseTimeout = window.setTimeout(() => {
64
64
  this.removeNotification();
65
65
  this.clearAfterCloseTimeout();
66
66
  // removing the last notification, clear state
@@ -54,7 +54,7 @@ class ImageDropModule {
54
54
  if (evt.clipboardData && evt.clipboardData.items && evt.clipboardData.items.length) {
55
55
  this.readFiles(evt.clipboardData.items, base64DataUrl => {
56
56
  // wait until after the default paste action finishes
57
- setTimeout(() => this.insert(base64DataUrl, alt), 50);
57
+ window.setTimeout(() => this.insert(base64DataUrl, alt), 50);
58
58
  });
59
59
  }
60
60
  };
@@ -30,4 +30,3 @@ const config = (0, config_1.defineConfig)({
30
30
  extends: [typescript_1.default]
31
31
  });
32
32
  exports.default = config;
33
- module.exports = config;
@@ -115,4 +115,3 @@ const typescriptRules = (0, config_1.defineConfig)({
115
115
  }
116
116
  });
117
117
  exports.default = typescriptRules;
118
- module.exports = typescriptRules;
@@ -15,4 +15,3 @@ const reactConfig = (0, config_1.defineConfig)(index_1.default, Object.assign(Ob
15
15
  }
16
16
  });
17
17
  exports.default = reactConfig;
18
- module.exports = reactConfig;
@@ -1,5 +1,18 @@
1
1
  /**
2
- * `usePrevious` persists a previous `value` when the `value` changes.
2
+ * Persists a previous `value` when the `value` changes. This change will not cause a re-render, causing it to 'lag' one
3
+ * render behind the current value.
4
+ *
3
5
  * @param value A value, e.g. a prop or a value from `useState`.
6
+ * @deprecated Reading ref values in render is not recommended. If you want to use the previous value to make a one-time
7
+ * calculation based on a change, you probably want to use `usePreviousState` instead. If you want to persist the
8
+ * previous value across renders, you probably want to just use `useState` instead.
4
9
  */
5
10
  export declare function usePrevious<T>(value: T): T;
11
+ /**
12
+ * Returns the value from the previous render. This will update to the new value on the next render (and immediately
13
+ * re-render your component), making it helpful to make one-time changes based on the difference between an object and
14
+ * its previous value.
15
+ *
16
+ * @param currentValue The variable you want to track the value of in the previous render.
17
+ */
18
+ export declare function usePreviousState<T>(currentValue: T): T;
@@ -1,10 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.usePrevious = usePrevious;
4
+ exports.usePreviousState = usePreviousState;
4
5
  const react_1 = require("react");
5
6
  /**
6
- * `usePrevious` persists a previous `value` when the `value` changes.
7
+ * Persists a previous `value` when the `value` changes. This change will not cause a re-render, causing it to 'lag' one
8
+ * render behind the current value.
9
+ *
7
10
  * @param value A value, e.g. a prop or a value from `useState`.
11
+ * @deprecated Reading ref values in render is not recommended. If you want to use the previous value to make a one-time
12
+ * calculation based on a change, you probably want to use `usePreviousState` instead. If you want to persist the
13
+ * previous value across renders, you probably want to just use `useState` instead.
8
14
  */
9
15
  function usePrevious(value) {
10
16
  const ref = (0, react_1.useRef)(value); // uses value as the initial value
@@ -16,3 +22,19 @@ function usePrevious(value) {
16
22
  // eslint-disable-next-line react-hooks/refs
17
23
  return ref.current;
18
24
  }
25
+ /**
26
+ * Returns the value from the previous render. This will update to the new value on the next render (and immediately
27
+ * re-render your component), making it helpful to make one-time changes based on the difference between an object and
28
+ * its previous value.
29
+ *
30
+ * @param currentValue The variable you want to track the value of in the previous render.
31
+ */
32
+ function usePreviousState(currentValue) {
33
+ // uses currentValue as the initial value
34
+ const [value, setValue] = (0, react_1.useState)(currentValue);
35
+ if (!Object.is(currentValue, value)) {
36
+ setValue(currentValue);
37
+ }
38
+ // Returns the previous value (happens before the state changes from calling setValue above)
39
+ return value;
40
+ }
@@ -1,5 +1,5 @@
1
- import type http from 'node:http';
2
1
  import { LocationDescriptor } from 'history';
2
+ import { Dictionary } from 'lodash';
3
3
  import { TIER } from '../constants/tier';
4
4
  import { AppConfiguration } from '../types';
5
5
  export declare function getApiBaseUrl(tier: TIER, apiUrlString: string): string;
@@ -21,7 +21,7 @@ export interface ParsedHeadersResponse {
21
21
  * @param headers An array of request headers.
22
22
  * @returns The parsed result
23
23
  */
24
- export declare const parseHeadersResponse: (headers?: http.IncomingHttpHeaders) => ParsedHeadersResponse;
24
+ export declare const parseHeadersResponse: (headers?: Dictionary<string | string[] | undefined>) => ParsedHeadersResponse;
25
25
  /**
26
26
  * Parse a path string into a location with separate pathname, search, and hash components.
27
27
  * @param path A path string
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "studiokit-scaffolding-js",
3
- "version": "7.0.12-next.1.4",
3
+ "version": "7.0.12-next.1.6",
4
4
  "description": "Common scaffolding for Studio apps at Purdue",
5
5
  "repository": "https://gitlab.com/purdue-informatics/studiokit/studiokit-scaffolding-js",
6
6
  "license": "MIT",
@@ -25,17 +25,17 @@
25
25
  "prepublishOnly": "yarn build",
26
26
  "test": "jest",
27
27
  "test:ci": "cross-env CI=true yarn test",
28
- "test:ci-junit": "cross-env CI=true npm run test -- --coverage --reporters='default' --reporters='jest-junit' --coverageReporters='cobertura' --coverageReporters='html'"
28
+ "test:ci-junit": "cross-env CI=true yarn test -- --coverage --reporters='default' --reporters='jest-junit' --coverageReporters='cobertura' --coverageReporters='html'"
29
29
  },
30
30
  "husky": {
31
31
  "hooks": {
32
32
  "pre-commit": "lint-staged",
33
- "pre-push": "npm run test"
33
+ "pre-push": "yarn test"
34
34
  }
35
35
  },
36
36
  "lint-staged": {
37
37
  "**/*.(j|t)s?(x)": [
38
- "yarn lint-code-core --fix"
38
+ "yarn fix:code"
39
39
  ],
40
40
  "*.css": [
41
41
  "stylelint --fix"
@@ -143,7 +143,7 @@
143
143
  "redux-logger": "^3.0.6",
144
144
  "redux-persist": "^6.0.0",
145
145
  "redux-saga": "^1.3.0",
146
- "studiokit-caliper-js": "1.0.26-alpha.3",
146
+ "studiokit-caliper-js": "1.0.26-alpha.4",
147
147
  "tachyons": "^4.12.0",
148
148
  "tslib": "^2.8.1",
149
149
  "uuid": "^11.1.0"
@@ -157,7 +157,7 @@
157
157
  "@types/mockdate": "^3.0.0",
158
158
  "@types/pluralize": "^0.0.33",
159
159
  "@types/react": "^17.0.89",
160
- "@typescript-eslint/parser": "^8.46.1",
160
+ "@typescript-eslint/parser": "^8.46.2",
161
161
  "@wojtekmaj/enzyme-adapter-react-17": "^0.8.0",
162
162
  "copyfiles": "^2.4.1",
163
163
  "cross-env": "^7.0.3",
@@ -169,9 +169,9 @@
169
169
  "eslint-plugin-flowtype": "^8.0.3",
170
170
  "eslint-plugin-import": "~2.32.0",
171
171
  "eslint-plugin-jsx-a11y": "^6.10.2",
172
- "eslint-plugin-prettier": "^5.5.4",
172
+ "eslint-plugin-prettier": "~5.3.1",
173
173
  "eslint-plugin-react": "^7.37.5",
174
- "eslint-plugin-react-hooks": "^7.0.0",
174
+ "eslint-plugin-react-hooks": "^7.0.1",
175
175
  "globals": "^16.4.0",
176
176
  "husky": "^4.3.8",
177
177
  "identity-obj-proxy": "^3.0.0",
@@ -194,7 +194,7 @@
194
194
  "stylelint-config-standard": "^39.0.1",
195
195
  "ts-jest": "^29.4.5",
196
196
  "typescript": "~5.9.3",
197
- "typescript-eslint": "^8.46.1"
197
+ "typescript-eslint": "^8.46.2"
198
198
  },
199
199
  "peerDependencies": {
200
200
  "@types/react": "^17.0.0",