feat: components 패키지에 Table 컴포넌트 추가

This commit is contained in:
2025-02-27 13:12:47 +09:00
parent 8b3a5f4007
commit 37a30bf642
6 changed files with 280 additions and 217 deletions
+1 -2
View File
@@ -38,12 +38,11 @@
"@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.3",
"@toast-ui/react-grid": "^4.21.22",
"@tanstack/react-table": "^8.21.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"date-fns": "^3.6.0",
"lucide-react": "^0.474.0",
"react": "17.0.2",
"react-day-picker": "^8.10.1",
"tailwind-merge": "^3.0.1",
"tailwindcss-animate": "^1.0.7"
@@ -1,78 +0,0 @@
import type { Meta, StoryObj } from "@storybook/react";
import "@common/assets/styles/grid.css";
import Grid from "@toast-ui/react-grid";
const meta: Meta<typeof Grid> = {
title: "External/Grid",
component: Grid,
parameters: {
docs: {
description: {
component: `
- [Docs](https://github.com/nhn/tui.grid/blob/master/packages/toast-ui.react-grid/README.md)
- [API Reference](https://nhn.github.io/tui.grid/latest/Grid)
`,
},
source: {
code: `
import "@common/assets/styles/grid.css";
import Grid from "@toast-ui/react-grid";
const data = [
{ id: 1, name: "Editor" },
{ id: 2, name: "Grid" },
{ id: 3, name: "Chart" },
];
const columns = [
{ name: "id", header: "ID" },
{ name: "name", header: "Name" },
];
return (
<Grid
data={data}
columns={columns}
rowHeight={25}
bodyHeight={100}
heightResizable={true}
rowHeaders={["rowNum"]}
/>
);
`,
},
},
},
};
export default meta;
type Story = StoryObj<typeof Grid>;
export const Default: Story = {
render: () => {
const data = [
{ id: 1, name: "Editor" },
{ id: 2, name: "Grid" },
{ id: 3, name: "Chart" },
];
const columns = [
{ name: "id", header: "ID" },
{ name: "name", header: "Name" },
];
return (
<div className="w-[50vw]">
<Grid
data={data}
columns={columns}
rowHeight={25}
bodyHeight={100}
heightResizable={true}
rowHeaders={["rowNum"]}
/>
</div>
);
},
};
@@ -0,0 +1,74 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import "./table.css";
import {
flexRender,
getCoreRowModel,
useReactTable,
type ColumnDef,
} from "@tanstack/react-table";
interface TableProps<T> {
data: T[];
columns: ColumnDef<T, any>[];
}
function Table<T>({ data, columns }: TableProps<T>) {
const table = useReactTable({
data,
columns,
getCoreRowModel: getCoreRowModel(),
});
return (
<div className="p-2">
<table>
<thead>
{table.getHeaderGroups().map((headerGroup) => (
<tr key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<th key={header.id}>
{header.isPlaceholder
? null
: flexRender(
header.column.columnDef.header,
header.getContext(),
)}
</th>
))}
</tr>
))}
</thead>
<tbody>
{table.getRowModel().rows.map((row) => (
<tr key={row.id}>
{row.getVisibleCells().map((cell) => (
<td key={cell.id}>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</td>
))}
</tr>
))}
</tbody>
{/* <tfoot>
{table.getFooterGroups().map((footerGroup) => (
<tr key={footerGroup.id}>
{footerGroup.headers.map((header) => (
<th key={header.id}>
{header.isPlaceholder
? null
: flexRender(
header.column.columnDef.footer,
header.getContext(),
)}
</th>
))}
</tr>
))}
</tfoot> */}
</table>
</div>
);
}
export { Table };
@@ -0,0 +1,6 @@
th {
@apply bg-[#c6ccd1] px-4 py-[1.2rem] text-[1.3rem] font-normal text-[#fff];
}
td {
@apply border-b border-b-[#e0e6ea] px-4 py-[1.2rem] text-[1.3rem] font-normal text-[#666];
}
@@ -0,0 +1,170 @@
import type { Meta, StoryObj } from "@storybook/react";
import { Table } from ".";
import { createColumnHelper } from "@tanstack/react-table";
const meta: Meta<typeof Table> = {
title: "Elements/Table",
component: Table,
parameters: {
docs: {
description: {
component: `
- [Docs](https://ui.shadcn.com/docs/components/switch)
- [API Reference](https://www.radix-ui.com/primitives/docs/components/switch#api-reference)
`,
},
source: {
code: `
import { createColumnHelper } from "@tanstack/react-table";
type Person = {
firstName: string;
lastName: string;
age: number;
visits: number;
status: string;
progress: number;
};
const defaultData: Person[] = [
{
firstName: "tanner",
lastName: "linsley",
age: 24,
visits: 100,
status: "In Relationship",
progress: 50,
},
{
firstName: "tandy",
lastName: "miller",
age: 40,
visits: 40,
status: "Single",
progress: 80,
},
{
firstName: "joe",
lastName: "dirte",
age: 45,
visits: 20,
status: "Complicated",
progress: 10,
},
];
const columnHelper = createColumnHelper<Person>();
const columns = [
columnHelper.accessor("firstName", {
cell: (info) => info.getValue(),
footer: (info) => info.column.id,
}),
columnHelper.accessor((row) => row.lastName, {
id: "lastName",
cell: (info) => <i>{info.getValue()}</i>,
header: () => <span>Last Name</span>,
footer: (info) => info.column.id,
}),
columnHelper.accessor("age", {
header: () => "Age",
cell: (info) => info.renderValue(),
footer: (info) => info.column.id,
}),
columnHelper.accessor("visits", {
header: () => <span>Visits</span>,
footer: (info) => info.column.id,
}),
columnHelper.accessor("status", {
header: "Status",
footer: (info) => info.column.id,
}),
columnHelper.accessor("progress", {
header: "Profile Progress",
footer: (info) => info.column.id,
}),
];
return <Table data={defaultData} columns={columns} />;
`,
},
},
},
};
export default meta;
type Story = StoryObj<typeof Table>;
export const Default: Story = {
render: () => {
type Person = {
firstName: string;
lastName: string;
age: number;
visits: number;
status: string;
progress: number;
};
const defaultData: Person[] = [
{
firstName: "tanner",
lastName: "linsley",
age: 24,
visits: 100,
status: "In Relationship",
progress: 50,
},
{
firstName: "tandy",
lastName: "miller",
age: 40,
visits: 40,
status: "Single",
progress: 80,
},
{
firstName: "joe",
lastName: "dirte",
age: 45,
visits: 20,
status: "Complicated",
progress: 10,
},
];
const columnHelper = createColumnHelper<Person>();
const columns = [
columnHelper.accessor("firstName", {
cell: (info) => info.getValue(),
footer: (info) => info.column.id,
}),
columnHelper.accessor((row) => row.lastName, {
id: "lastName",
cell: (info) => <i>{info.getValue()}</i>,
header: () => <span>Last Name</span>,
footer: (info) => info.column.id,
}),
columnHelper.accessor("age", {
header: () => "Age",
cell: (info) => info.renderValue(),
footer: (info) => info.column.id,
}),
columnHelper.accessor("visits", {
header: () => <span>Visits</span>,
footer: (info) => info.column.id,
}),
columnHelper.accessor("status", {
header: "Status",
footer: (info) => info.column.id,
}),
columnHelper.accessor("progress", {
header: "Profile Progress",
footer: (info) => info.column.id,
}),
];
return <Table data={defaultData} columns={columns} />;
},
};
+29 -137
View File
@@ -36,15 +36,9 @@ importers:
'@common/components':
specifier: workspace:*
version: link:../../packages/common/components
'@toast-ui/react-grid':
specifier: ^4.21.22
version: 4.21.22(react@18.3.1)
next:
specifier: 15.1.7
version: 15.1.7(react-dom@18.3.1)(react@18.3.1)
tui-grid:
specifier: ^4.21.22
version: 4.21.22
devDependencies:
'@eslint/eslintrc':
specifier: ^3
@@ -124,9 +118,9 @@ importers:
'@radix-ui/react-tabs':
specifier: ^1.1.3
version: 1.1.3(@types/react-dom@18.3.5)(@types/react@18.3.18)(react-dom@18.3.1)(react@18.3.1)
'@toast-ui/react-grid':
specifier: ^4.21.22
version: 4.21.22(react@18.3.1)
'@tanstack/react-table':
specifier: ^8.21.2
version: 8.21.2(react-dom@18.3.1)(react@18.3.1)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -139,9 +133,6 @@ importers:
lucide-react:
specifier: ^0.474.0
version: 0.474.0(react@18.3.1)
react:
specifier: ^18.3.1
version: 18.3.1
react-day-picker:
specifier: ^8.10.1
version: 8.10.1(date-fns@3.6.0)(react@18.3.1)
@@ -2504,7 +2495,7 @@ packages:
jsdoc-type-pratt-parser: 4.1.0
prettier: 3.5.2
process: 0.11.10
recast: 0.23.9
recast: 0.23.10
semver: 7.7.1
util: 0.12.5
ws: 8.18.1
@@ -2677,6 +2668,23 @@ packages:
tslib: 2.8.1
dev: false
/@tanstack/react-table@8.21.2(react-dom@18.3.1)(react@18.3.1):
resolution: {integrity: sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==}
engines: {node: '>=12'}
peerDependencies:
react: ^18.3.1
react-dom: ^18.3.1
dependencies:
'@tanstack/table-core': 8.21.2
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
dev: false
/@tanstack/table-core@8.21.2:
resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==}
engines: {node: '>=12'}
dev: false
/@testing-library/dom@10.4.0:
resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
engines: {node: '>=18'}
@@ -2713,15 +2721,6 @@ packages:
'@testing-library/dom': 10.4.0
dev: true
/@toast-ui/react-grid@4.21.22(react@18.3.1):
resolution: {integrity: sha512-jztju1olTFs9tBeWXesNM29tOgjI2KwvcgKfgBjaAcpuZUAfD1FtHnqXSpjp33d1T+hZh3M19Wj8tTu0lRr5kQ==}
peerDependencies:
react: ^18.3.1
dependencies:
react: 18.3.1
tui-grid: 4.21.22
dev: false
/@types/aria-query@5.0.4:
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
dev: true
@@ -3062,20 +3061,6 @@ packages:
hasBin: true
dev: true
/adler-32@1.2.0:
resolution: {integrity: sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==}
engines: {node: '>=0.8'}
hasBin: true
dependencies:
exit-on-epipe: 1.0.1
printj: 1.1.2
dev: false
/adler-32@1.3.1:
resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==}
engines: {node: '>=0.8'}
dev: false
/ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
dependencies:
@@ -3332,9 +3317,9 @@ packages:
hasBin: true
dependencies:
caniuse-lite: 1.0.30001701
electron-to-chromium: 1.5.105
electron-to-chromium: 1.5.106
node-releases: 2.0.19
update-browserslist-db: 1.1.2(browserslist@4.24.4)
update-browserslist-db: 1.1.3(browserslist@4.24.4)
dev: true
/bundle-require@5.1.0(esbuild@0.24.2):
@@ -3397,14 +3382,6 @@ packages:
/caniuse-lite@1.0.30001701:
resolution: {integrity: sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==}
/cfb@1.2.2:
resolution: {integrity: sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==}
engines: {node: '>=0.8'}
dependencies:
adler-32: 1.3.1
crc-32: 1.2.2
dev: false
/chai@5.2.0:
resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==}
engines: {node: '>=12'}
@@ -3482,11 +3459,6 @@ packages:
engines: {node: '>=6'}
dev: false
/codepage@1.15.0:
resolution: {integrity: sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==}
engines: {node: '>=0.8'}
dev: false
/color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -3553,12 +3525,6 @@ packages:
typescript: 5.6.3
dev: true
/crc-32@1.2.2:
resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==}
engines: {node: '>=0.8'}
hasBin: true
dev: false
/cross-spawn@7.0.6:
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
engines: {node: '>= 8'}
@@ -3803,10 +3769,6 @@ packages:
resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
dev: true
/dompurify@2.5.8:
resolution: {integrity: sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==}
dev: false
/dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
@@ -3824,8 +3786,8 @@ packages:
engines: {node: '>=11.0.0'}
dev: true
/electron-to-chromium@1.5.105:
resolution: {integrity: sha512-ccp7LocdXx3yBhwiG0qTQ7XFrK48Ua2pxIxBdJO8cbddp/MvbBtPFzvnTchtyHQTsgqqczO8cdmAIbpMa0u2+g==}
/electron-to-chromium@1.5.106:
resolution: {integrity: sha512-12keJGdXQWPnfVOu6/6ZzZgPPNodiDOSe3LjA8qk2yXTjnCnw2LeGUsAmtlNAmH4UW0K7tOLcz0j9lI2eJCJRA==}
dev: true
/emoji-regex@8.0.0:
@@ -4413,11 +4375,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
/exit-on-epipe@1.0.1:
resolution: {integrity: sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==}
engines: {node: '>=0.8'}
dev: false
/fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
dev: true
@@ -4519,11 +4476,6 @@ packages:
cross-spawn: 7.0.6
signal-exit: 4.1.0
/frac@1.1.2:
resolution: {integrity: sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==}
engines: {node: '>=0.8'}
dev: false
/fraction.js@4.3.7:
resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
dev: true
@@ -5778,12 +5730,6 @@ packages:
engines: {node: '>=12'}
dev: true
/printj@1.1.2:
resolution: {integrity: sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==}
engines: {node: '>=0.8'}
hasBin: true
dev: false
/process@0.11.10:
resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
engines: {node: '>= 0.6.0'}
@@ -5940,8 +5886,8 @@ packages:
engines: {node: '>= 14.18.0'}
dev: true
/recast@0.23.9:
resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==}
/recast@0.23.10:
resolution: {integrity: sha512-mbCmRMJUKCJ1h41V0cu2C26ULBURwuoZ34C9rChjcDaeJ/4Kv5al3O2HPwTs2m0wQ1vGhMY+tguhzU1aE8md1A==}
engines: {node: '>= 4'}
dependencies:
ast-types: 0.16.1
@@ -6256,13 +6202,6 @@ packages:
whatwg-url: 7.1.0
dev: true
/ssf@0.11.2:
resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==}
engines: {node: '>=0.8'}
dependencies:
frac: 1.1.2
dev: false
/stable-hash@0.0.4:
resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
dev: true
@@ -6680,29 +6619,6 @@ packages:
- yaml
dev: true
/tui-date-picker@4.3.3:
resolution: {integrity: sha512-/2YoLnj5c1e+Ag1ZZYOgzEs2o0v7Ol7c5UAnBj438zGlkwkMxyH0HwP2pVqqIYX05WE7K0+6nTWVMybS8otBgw==}
dependencies:
tui-time-picker: 2.1.6
dev: false
/tui-grid@4.21.22:
resolution: {integrity: sha512-RxkFcveR2tWf3QrtuW9/zejXjeXL3SdrQPK89DbrrM6N7TlyUcb5HAf0U3MBn/hYT1p5kt5wyOwHPCQJuIBrsA==}
dependencies:
dompurify: 2.5.8
tui-date-picker: 4.3.3
tui-pagination: 3.4.1
xlsx: 0.17.5
dev: false
/tui-pagination@3.4.1:
resolution: {integrity: sha512-W09L0wPMSFstthBhQjcLNDnN1yuCEDn/tIXmaKdTpNFYa11eNrNo/rOwXzrugXvP2arZ60KmVhkFzoAOEuV0Sg==}
dev: false
/tui-time-picker@2.1.6:
resolution: {integrity: sha512-4Jmo3wjGS+Ii4/qQgt5DaFEohHpB3U6BzWeTODVVFHD9sx3NOsbomY9K0xMobSLODi+tQEH7wfOtNU0IJmcQ6Q==}
dev: false
/turbo-darwin-64@2.4.2:
resolution: {integrity: sha512-HFfemyWB60CJtEvVQj9yby5rkkWw9fLAdLtAPGtPQoU3tKh8t/uzCAZKso2aPVbib9vGUuGbPGoGpaRXdVhj5g==}
cpu: [x64]
@@ -6879,8 +6795,8 @@ packages:
webpack-virtual-modules: 0.6.2
dev: true
/update-browserslist-db@1.1.2(browserslist@4.24.4):
resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
/update-browserslist-db@1.1.3(browserslist@4.24.4):
resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -7085,21 +7001,11 @@ packages:
dependencies:
isexe: 2.0.0
/wmf@1.0.2:
resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==}
engines: {node: '>=0.8'}
dev: false
/word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
dev: true
/word@0.3.0:
resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==}
engines: {node: '>=0.8'}
dev: false
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -7129,20 +7035,6 @@ packages:
optional: true
dev: true
/xlsx@0.17.5:
resolution: {integrity: sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==}
engines: {node: '>=0.8'}
hasBin: true
dependencies:
adler-32: 1.2.0
cfb: 1.2.2
codepage: 1.15.0
crc-32: 1.2.2
ssf: 0.11.2
wmf: 1.0.2
word: 0.3.0
dev: false
/y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}