@measured/puck-plugin-heading-analyzer 0.16.0-canary.6d43ba0 → 0.16.0-canary.7a6a65c
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.d.mts +39 -39
- package/dist/index.d.ts +39 -39
- package/dist/index.js +41 -32
- package/dist/index.mjs +37 -28
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
@@ -1,48 +1,10 @@
|
|
1
|
-
import {
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
2
2
|
|
3
3
|
type ItemSelector = {
|
4
4
|
index: number;
|
5
5
|
zone?: string;
|
6
6
|
};
|
7
7
|
|
8
|
-
type iconTypes = "Smartphone" | "Monitor" | "Tablet";
|
9
|
-
type Viewport = {
|
10
|
-
width: number;
|
11
|
-
height?: number | "auto";
|
12
|
-
label?: string;
|
13
|
-
icon?: iconTypes | ReactNode;
|
14
|
-
};
|
15
|
-
|
16
|
-
type ItemWithId = {
|
17
|
-
_arrayId: string;
|
18
|
-
_originalIndex: number;
|
19
|
-
};
|
20
|
-
type ArrayState = {
|
21
|
-
items: ItemWithId[];
|
22
|
-
openId: string;
|
23
|
-
};
|
24
|
-
type UiState = {
|
25
|
-
leftSideBarVisible: boolean;
|
26
|
-
rightSideBarVisible: boolean;
|
27
|
-
itemSelector: ItemSelector | null;
|
28
|
-
arrayState: Record<string, ArrayState | undefined>;
|
29
|
-
componentList: Record<string, {
|
30
|
-
components?: string[];
|
31
|
-
title?: string;
|
32
|
-
visible?: boolean;
|
33
|
-
expanded?: boolean;
|
34
|
-
}>;
|
35
|
-
isDragging: boolean;
|
36
|
-
viewports: {
|
37
|
-
current: {
|
38
|
-
width: number;
|
39
|
-
height: number | "auto";
|
40
|
-
};
|
41
|
-
controlsVisible: boolean;
|
42
|
-
options: Viewport[];
|
43
|
-
};
|
44
|
-
};
|
45
|
-
|
46
8
|
type FieldOption = {
|
47
9
|
label: string;
|
48
10
|
value: string | number | boolean;
|
@@ -157,6 +119,36 @@ type FieldProps<ValueType = any, F = Field<any>> = {
|
|
157
119
|
readOnly?: boolean;
|
158
120
|
};
|
159
121
|
|
122
|
+
type ItemWithId = {
|
123
|
+
_arrayId: string;
|
124
|
+
_originalIndex: number;
|
125
|
+
};
|
126
|
+
type ArrayState = {
|
127
|
+
items: ItemWithId[];
|
128
|
+
openId: string;
|
129
|
+
};
|
130
|
+
type UiState = {
|
131
|
+
leftSideBarVisible: boolean;
|
132
|
+
rightSideBarVisible: boolean;
|
133
|
+
itemSelector: ItemSelector | null;
|
134
|
+
arrayState: Record<string, ArrayState | undefined>;
|
135
|
+
componentList: Record<string, {
|
136
|
+
components?: string[];
|
137
|
+
title?: string;
|
138
|
+
visible?: boolean;
|
139
|
+
expanded?: boolean;
|
140
|
+
}>;
|
141
|
+
isDragging: boolean;
|
142
|
+
viewports: {
|
143
|
+
current: {
|
144
|
+
width: number;
|
145
|
+
height: number | "auto";
|
146
|
+
};
|
147
|
+
controlsVisible: boolean;
|
148
|
+
options: Viewport[];
|
149
|
+
};
|
150
|
+
};
|
151
|
+
|
160
152
|
type RenderFunc<Props extends {
|
161
153
|
[key: string]: any;
|
162
154
|
} = {
|
@@ -220,6 +212,14 @@ type FieldRenderFunctions = Omit<{
|
|
220
212
|
}>;
|
221
213
|
};
|
222
214
|
|
215
|
+
type iconTypes = "Smartphone" | "Monitor" | "Tablet";
|
216
|
+
type Viewport = {
|
217
|
+
width: number;
|
218
|
+
height?: number | "auto";
|
219
|
+
label?: string;
|
220
|
+
icon?: iconTypes | ReactNode;
|
221
|
+
};
|
222
|
+
|
223
223
|
type Plugin = {
|
224
224
|
overrides: Partial<Overrides>;
|
225
225
|
};
|
package/dist/index.d.ts
CHANGED
@@ -1,48 +1,10 @@
|
|
1
|
-
import {
|
1
|
+
import { ReactElement, ReactNode } from 'react';
|
2
2
|
|
3
3
|
type ItemSelector = {
|
4
4
|
index: number;
|
5
5
|
zone?: string;
|
6
6
|
};
|
7
7
|
|
8
|
-
type iconTypes = "Smartphone" | "Monitor" | "Tablet";
|
9
|
-
type Viewport = {
|
10
|
-
width: number;
|
11
|
-
height?: number | "auto";
|
12
|
-
label?: string;
|
13
|
-
icon?: iconTypes | ReactNode;
|
14
|
-
};
|
15
|
-
|
16
|
-
type ItemWithId = {
|
17
|
-
_arrayId: string;
|
18
|
-
_originalIndex: number;
|
19
|
-
};
|
20
|
-
type ArrayState = {
|
21
|
-
items: ItemWithId[];
|
22
|
-
openId: string;
|
23
|
-
};
|
24
|
-
type UiState = {
|
25
|
-
leftSideBarVisible: boolean;
|
26
|
-
rightSideBarVisible: boolean;
|
27
|
-
itemSelector: ItemSelector | null;
|
28
|
-
arrayState: Record<string, ArrayState | undefined>;
|
29
|
-
componentList: Record<string, {
|
30
|
-
components?: string[];
|
31
|
-
title?: string;
|
32
|
-
visible?: boolean;
|
33
|
-
expanded?: boolean;
|
34
|
-
}>;
|
35
|
-
isDragging: boolean;
|
36
|
-
viewports: {
|
37
|
-
current: {
|
38
|
-
width: number;
|
39
|
-
height: number | "auto";
|
40
|
-
};
|
41
|
-
controlsVisible: boolean;
|
42
|
-
options: Viewport[];
|
43
|
-
};
|
44
|
-
};
|
45
|
-
|
46
8
|
type FieldOption = {
|
47
9
|
label: string;
|
48
10
|
value: string | number | boolean;
|
@@ -157,6 +119,36 @@ type FieldProps<ValueType = any, F = Field<any>> = {
|
|
157
119
|
readOnly?: boolean;
|
158
120
|
};
|
159
121
|
|
122
|
+
type ItemWithId = {
|
123
|
+
_arrayId: string;
|
124
|
+
_originalIndex: number;
|
125
|
+
};
|
126
|
+
type ArrayState = {
|
127
|
+
items: ItemWithId[];
|
128
|
+
openId: string;
|
129
|
+
};
|
130
|
+
type UiState = {
|
131
|
+
leftSideBarVisible: boolean;
|
132
|
+
rightSideBarVisible: boolean;
|
133
|
+
itemSelector: ItemSelector | null;
|
134
|
+
arrayState: Record<string, ArrayState | undefined>;
|
135
|
+
componentList: Record<string, {
|
136
|
+
components?: string[];
|
137
|
+
title?: string;
|
138
|
+
visible?: boolean;
|
139
|
+
expanded?: boolean;
|
140
|
+
}>;
|
141
|
+
isDragging: boolean;
|
142
|
+
viewports: {
|
143
|
+
current: {
|
144
|
+
width: number;
|
145
|
+
height: number | "auto";
|
146
|
+
};
|
147
|
+
controlsVisible: boolean;
|
148
|
+
options: Viewport[];
|
149
|
+
};
|
150
|
+
};
|
151
|
+
|
160
152
|
type RenderFunc<Props extends {
|
161
153
|
[key: string]: any;
|
162
154
|
} = {
|
@@ -220,6 +212,14 @@ type FieldRenderFunctions = Omit<{
|
|
220
212
|
}>;
|
221
213
|
};
|
222
214
|
|
215
|
+
type iconTypes = "Smartphone" | "Monitor" | "Tablet";
|
216
|
+
type Viewport = {
|
217
|
+
width: number;
|
218
|
+
height?: number | "auto";
|
219
|
+
label?: string;
|
220
|
+
icon?: iconTypes | ReactNode;
|
221
|
+
};
|
222
|
+
|
223
223
|
type Plugin = {
|
224
224
|
overrides: Partial<Overrides>;
|
225
225
|
};
|
package/dist/index.js
CHANGED
@@ -1419,7 +1419,7 @@ init_react_import();
|
|
1419
1419
|
|
1420
1420
|
// src/HeadingAnalyzer.tsx
|
1421
1421
|
init_react_import();
|
1422
|
-
var
|
1422
|
+
var import_react8 = require("react");
|
1423
1423
|
|
1424
1424
|
// css-module:/home/runner/work/puck/puck/packages/plugin-heading-analyzer/src/HeadingAnalyzer.module.css#css-module
|
1425
1425
|
init_react_import();
|
@@ -1542,7 +1542,7 @@ var ChevronRight = createLucideIcon("ChevronRight", [
|
|
1542
1542
|
|
1543
1543
|
// ../core/lib/use-breadcrumbs.ts
|
1544
1544
|
init_react_import();
|
1545
|
-
var
|
1545
|
+
var import_react7 = require("react");
|
1546
1546
|
|
1547
1547
|
// ../core/components/DropZone/context.tsx
|
1548
1548
|
init_react_import();
|
@@ -1557,25 +1557,6 @@ var rootDroppableId = "default-zone";
|
|
1557
1557
|
|
1558
1558
|
// ../core/lib/setup-zone.ts
|
1559
1559
|
init_react_import();
|
1560
|
-
var setupZone = (data, zoneKey) => {
|
1561
|
-
if (zoneKey === rootDroppableId) {
|
1562
|
-
return data;
|
1563
|
-
}
|
1564
|
-
const newData = __spreadValues({}, data);
|
1565
|
-
newData.zones = data.zones || {};
|
1566
|
-
newData.zones[zoneKey] = newData.zones[zoneKey] || [];
|
1567
|
-
return newData;
|
1568
|
-
};
|
1569
|
-
|
1570
|
-
// ../core/lib/get-item.ts
|
1571
|
-
var getItem = (selector, data, dynamicProps = {}) => {
|
1572
|
-
if (!selector.zone || selector.zone === rootDroppableId) {
|
1573
|
-
const item2 = data.content[selector.index];
|
1574
|
-
return (item2 == null ? void 0 : item2.props) ? __spreadProps(__spreadValues({}, item2), { props: dynamicProps[item2.props.id] || item2.props }) : void 0;
|
1575
|
-
}
|
1576
|
-
const item = setupZone(data, selector.zone).zones[selector.zone][selector.index];
|
1577
|
-
return (item == null ? void 0 : item.props) ? __spreadProps(__spreadValues({}, item), { props: dynamicProps[item.props.id] || item.props }) : void 0;
|
1578
|
-
};
|
1579
1560
|
|
1580
1561
|
// ../core/lib/get-zone-id.ts
|
1581
1562
|
init_react_import();
|
@@ -1595,7 +1576,7 @@ var dropZoneContext = (0, import_react3.createContext)(null);
|
|
1595
1576
|
|
1596
1577
|
// ../core/components/Puck/context.tsx
|
1597
1578
|
init_react_import();
|
1598
|
-
var
|
1579
|
+
var import_react6 = require("react");
|
1599
1580
|
|
1600
1581
|
// ../core/components/ViewportControls/default-viewports.ts
|
1601
1582
|
init_react_import();
|
@@ -1607,6 +1588,31 @@ var defaultViewports = [
|
|
1607
1588
|
|
1608
1589
|
// ../core/components/Puck/context.tsx
|
1609
1590
|
var import_ua_parser_js = __toESM(require_ua_parser());
|
1591
|
+
|
1592
|
+
// ../core/lib/use-resolved-permissions.ts
|
1593
|
+
init_react_import();
|
1594
|
+
var import_react4 = require("react");
|
1595
|
+
|
1596
|
+
// ../core/lib/flatten-data.ts
|
1597
|
+
init_react_import();
|
1598
|
+
|
1599
|
+
// ../core/lib/get-changed.ts
|
1600
|
+
init_react_import();
|
1601
|
+
|
1602
|
+
// ../core/lib/use-resolved-data.ts
|
1603
|
+
init_react_import();
|
1604
|
+
var import_react5 = require("react");
|
1605
|
+
|
1606
|
+
// ../core/lib/resolve-component-data.ts
|
1607
|
+
init_react_import();
|
1608
|
+
|
1609
|
+
// ../core/lib/apply-dynamic-props.ts
|
1610
|
+
init_react_import();
|
1611
|
+
|
1612
|
+
// ../core/lib/resolve-root-data.ts
|
1613
|
+
init_react_import();
|
1614
|
+
|
1615
|
+
// ../core/components/Puck/context.tsx
|
1610
1616
|
var import_jsx_runtime3 = require("react/jsx-runtime");
|
1611
1617
|
var defaultAppState = {
|
1612
1618
|
data: { content: [], root: {} },
|
@@ -1632,6 +1638,8 @@ var defaultContext = {
|
|
1632
1638
|
dispatch: () => null,
|
1633
1639
|
config: { components: {} },
|
1634
1640
|
componentState: {},
|
1641
|
+
setComponentState: () => {
|
1642
|
+
},
|
1635
1643
|
resolveData: () => {
|
1636
1644
|
},
|
1637
1645
|
plugins: [],
|
@@ -1648,15 +1656,15 @@ var defaultContext = {
|
|
1648
1656
|
setStatus: () => null,
|
1649
1657
|
iframe: {},
|
1650
1658
|
safariFallbackMode: false,
|
1651
|
-
globalPermissions: {}
|
1659
|
+
globalPermissions: {},
|
1660
|
+
getPermissions: () => ({}),
|
1661
|
+
refreshPermissions: () => null
|
1652
1662
|
};
|
1653
|
-
var appContext = (0,
|
1663
|
+
var appContext = (0, import_react6.createContext)(defaultContext);
|
1654
1664
|
function useAppContext() {
|
1655
|
-
const mainContext = (0,
|
1656
|
-
const selectedItem = mainContext.state.ui.itemSelector ? getItem(mainContext.state.ui.itemSelector, mainContext.state.data) : void 0;
|
1665
|
+
const mainContext = (0, import_react6.useContext)(appContext);
|
1657
1666
|
return __spreadProps(__spreadValues({}, mainContext), {
|
1658
1667
|
// Helpers
|
1659
|
-
selectedItem,
|
1660
1668
|
setUi: (ui, recordHistory) => {
|
1661
1669
|
return mainContext.dispatch({
|
1662
1670
|
type: "setUi",
|
@@ -1717,8 +1725,8 @@ var useBreadcrumbs = (renderCount) => {
|
|
1717
1725
|
state: { data },
|
1718
1726
|
selectedItem
|
1719
1727
|
} = useAppContext();
|
1720
|
-
const dzContext = (0,
|
1721
|
-
return (0,
|
1728
|
+
const dzContext = (0, import_react7.useContext)(dropZoneContext);
|
1729
|
+
return (0, import_react7.useMemo)(() => {
|
1722
1730
|
const breadcrumbs = convertPathDataToBreadcrumbs(
|
1723
1731
|
selectedItem,
|
1724
1732
|
dzContext == null ? void 0 : dzContext.pathData,
|
@@ -1800,6 +1808,7 @@ var SidebarSection = ({
|
|
1800
1808
|
/* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
|
1801
1809
|
"button",
|
1802
1810
|
{
|
1811
|
+
type: "button",
|
1803
1812
|
className: getClassName3("breadcrumbLabel"),
|
1804
1813
|
onClick: () => setUi({ itemSelector: breadcrumb.selector }),
|
1805
1814
|
children: breadcrumb.label
|
@@ -1927,9 +1936,9 @@ function buildHierarchy(frame) {
|
|
1927
1936
|
}
|
1928
1937
|
var HeadingAnalyzer = () => {
|
1929
1938
|
const { appState } = (0, import_puck.usePuck)();
|
1930
|
-
const [hierarchy, setHierarchy] = (0,
|
1931
|
-
const [firstRender, setFirstRender] = (0,
|
1932
|
-
(0,
|
1939
|
+
const [hierarchy, setHierarchy] = (0, import_react8.useState)([]);
|
1940
|
+
const [firstRender, setFirstRender] = (0, import_react8.useState)(true);
|
1941
|
+
(0, import_react8.useEffect)(() => {
|
1933
1942
|
const frame = getFrame();
|
1934
1943
|
if (!frame) return;
|
1935
1944
|
if (firstRender) {
|
package/dist/index.mjs
CHANGED
@@ -1407,7 +1407,7 @@ init_react_import();
|
|
1407
1407
|
|
1408
1408
|
// src/HeadingAnalyzer.tsx
|
1409
1409
|
init_react_import();
|
1410
|
-
import { useEffect as
|
1410
|
+
import { useEffect as useEffect4, useState as useState5 } from "react";
|
1411
1411
|
|
1412
1412
|
// css-module:/home/runner/work/puck/puck/packages/plugin-heading-analyzer/src/HeadingAnalyzer.module.css#css-module
|
1413
1413
|
init_react_import();
|
@@ -1549,25 +1549,6 @@ var rootDroppableId = "default-zone";
|
|
1549
1549
|
|
1550
1550
|
// ../core/lib/setup-zone.ts
|
1551
1551
|
init_react_import();
|
1552
|
-
var setupZone = (data, zoneKey) => {
|
1553
|
-
if (zoneKey === rootDroppableId) {
|
1554
|
-
return data;
|
1555
|
-
}
|
1556
|
-
const newData = __spreadValues({}, data);
|
1557
|
-
newData.zones = data.zones || {};
|
1558
|
-
newData.zones[zoneKey] = newData.zones[zoneKey] || [];
|
1559
|
-
return newData;
|
1560
|
-
};
|
1561
|
-
|
1562
|
-
// ../core/lib/get-item.ts
|
1563
|
-
var getItem = (selector, data, dynamicProps = {}) => {
|
1564
|
-
if (!selector.zone || selector.zone === rootDroppableId) {
|
1565
|
-
const item2 = data.content[selector.index];
|
1566
|
-
return (item2 == null ? void 0 : item2.props) ? __spreadProps(__spreadValues({}, item2), { props: dynamicProps[item2.props.id] || item2.props }) : void 0;
|
1567
|
-
}
|
1568
|
-
const item = setupZone(data, selector.zone).zones[selector.zone][selector.index];
|
1569
|
-
return (item == null ? void 0 : item.props) ? __spreadProps(__spreadValues({}, item), { props: dynamicProps[item.props.id] || item.props }) : void 0;
|
1570
|
-
};
|
1571
1552
|
|
1572
1553
|
// ../core/lib/get-zone-id.ts
|
1573
1554
|
init_react_import();
|
@@ -1590,8 +1571,8 @@ init_react_import();
|
|
1590
1571
|
import {
|
1591
1572
|
createContext as createContext2,
|
1592
1573
|
useContext,
|
1593
|
-
useEffect,
|
1594
|
-
useState as
|
1574
|
+
useEffect as useEffect3,
|
1575
|
+
useState as useState4
|
1595
1576
|
} from "react";
|
1596
1577
|
|
1597
1578
|
// ../core/components/ViewportControls/default-viewports.ts
|
@@ -1604,6 +1585,31 @@ var defaultViewports = [
|
|
1604
1585
|
|
1605
1586
|
// ../core/components/Puck/context.tsx
|
1606
1587
|
var import_ua_parser_js = __toESM(require_ua_parser());
|
1588
|
+
|
1589
|
+
// ../core/lib/use-resolved-permissions.ts
|
1590
|
+
init_react_import();
|
1591
|
+
import { useCallback as useCallback2, useEffect, useState as useState2 } from "react";
|
1592
|
+
|
1593
|
+
// ../core/lib/flatten-data.ts
|
1594
|
+
init_react_import();
|
1595
|
+
|
1596
|
+
// ../core/lib/get-changed.ts
|
1597
|
+
init_react_import();
|
1598
|
+
|
1599
|
+
// ../core/lib/use-resolved-data.ts
|
1600
|
+
init_react_import();
|
1601
|
+
import { useCallback as useCallback3, useEffect as useEffect2, useState as useState3 } from "react";
|
1602
|
+
|
1603
|
+
// ../core/lib/resolve-component-data.ts
|
1604
|
+
init_react_import();
|
1605
|
+
|
1606
|
+
// ../core/lib/apply-dynamic-props.ts
|
1607
|
+
init_react_import();
|
1608
|
+
|
1609
|
+
// ../core/lib/resolve-root-data.ts
|
1610
|
+
init_react_import();
|
1611
|
+
|
1612
|
+
// ../core/components/Puck/context.tsx
|
1607
1613
|
import { jsx as jsx3 } from "react/jsx-runtime";
|
1608
1614
|
var defaultAppState = {
|
1609
1615
|
data: { content: [], root: {} },
|
@@ -1629,6 +1635,8 @@ var defaultContext = {
|
|
1629
1635
|
dispatch: () => null,
|
1630
1636
|
config: { components: {} },
|
1631
1637
|
componentState: {},
|
1638
|
+
setComponentState: () => {
|
1639
|
+
},
|
1632
1640
|
resolveData: () => {
|
1633
1641
|
},
|
1634
1642
|
plugins: [],
|
@@ -1645,15 +1653,15 @@ var defaultContext = {
|
|
1645
1653
|
setStatus: () => null,
|
1646
1654
|
iframe: {},
|
1647
1655
|
safariFallbackMode: false,
|
1648
|
-
globalPermissions: {}
|
1656
|
+
globalPermissions: {},
|
1657
|
+
getPermissions: () => ({}),
|
1658
|
+
refreshPermissions: () => null
|
1649
1659
|
};
|
1650
1660
|
var appContext = createContext2(defaultContext);
|
1651
1661
|
function useAppContext() {
|
1652
1662
|
const mainContext = useContext(appContext);
|
1653
|
-
const selectedItem = mainContext.state.ui.itemSelector ? getItem(mainContext.state.ui.itemSelector, mainContext.state.data) : void 0;
|
1654
1663
|
return __spreadProps(__spreadValues({}, mainContext), {
|
1655
1664
|
// Helpers
|
1656
|
-
selectedItem,
|
1657
1665
|
setUi: (ui, recordHistory) => {
|
1658
1666
|
return mainContext.dispatch({
|
1659
1667
|
type: "setUi",
|
@@ -1797,6 +1805,7 @@ var SidebarSection = ({
|
|
1797
1805
|
/* @__PURE__ */ jsx5(
|
1798
1806
|
"button",
|
1799
1807
|
{
|
1808
|
+
type: "button",
|
1800
1809
|
className: getClassName3("breadcrumbLabel"),
|
1801
1810
|
onClick: () => setUi({ itemSelector: breadcrumb.selector }),
|
1802
1811
|
children: breadcrumb.label
|
@@ -1924,9 +1933,9 @@ function buildHierarchy(frame) {
|
|
1924
1933
|
}
|
1925
1934
|
var HeadingAnalyzer = () => {
|
1926
1935
|
const { appState } = usePuck();
|
1927
|
-
const [hierarchy, setHierarchy] =
|
1928
|
-
const [firstRender, setFirstRender] =
|
1929
|
-
|
1936
|
+
const [hierarchy, setHierarchy] = useState5([]);
|
1937
|
+
const [firstRender, setFirstRender] = useState5(true);
|
1938
|
+
useEffect4(() => {
|
1930
1939
|
const frame = getFrame();
|
1931
1940
|
if (!frame) return;
|
1932
1941
|
if (firstRender) {
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@measured/puck-plugin-heading-analyzer",
|
3
|
-
"version": "0.16.0-canary.
|
3
|
+
"version": "0.16.0-canary.7a6a65c",
|
4
4
|
"author": "Measured Corporation Ltd <hello@measured.co>",
|
5
5
|
"repository": "measuredco/puck",
|
6
6
|
"bugs": "https://github.com/measuredco/puck/issues",
|
@@ -25,7 +25,7 @@
|
|
25
25
|
"dist"
|
26
26
|
],
|
27
27
|
"devDependencies": {
|
28
|
-
"@measured/puck": "^0.16.0-canary.
|
28
|
+
"@measured/puck": "^0.16.0-canary.7a6a65c",
|
29
29
|
"@types/react": "^18.2.0",
|
30
30
|
"@types/react-dom": "^18.2.0",
|
31
31
|
"eslint": "^7.32.0",
|