From ffb4c7691bb4f75bee94640b280fb9f916022bd0 Mon Sep 17 00:00:00 2001 From: xy <10816187@qq.com> Date: Tue, 11 Mar 2025 14:26:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=B3=BB=E7=BB=9F=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/package-lock.json | 2 +- admin/src/api/permission/index.ts | 4 +- admin/src/api/resource/index.ts | 21 + admin/src/pages/resource/constants.tsx | 60 ++ admin/src/pages/resource/form.tsx | 101 +++ admin/src/pages/resource/index.tsx | 100 +++ admin/src/utils/request.ts | 4 + admin/yarn.lock | 678 ++++++------------ .../migrations/20250311054029_/migration.sql | 14 + server/prisma/schema.prisma | 7 +- server/prisma/seed.ts | 2 +- server/src/common/enum/index.ts | 2 +- .../system/menu/dto/create-menu.dto.ts | 3 +- .../src/modules/system/menu/menu.service.ts | 61 +- .../permission/permission.controller.ts | 16 +- .../system/permission/permission.service.ts | 10 +- .../resource/dto/create-resource.dto.ts | 24 + .../resource/dto/update-resource.dto.ts | 4 + .../system/resource/resource.controller.ts | 42 ++ .../system/resource/resource.module.ts | 9 + .../system/resource/resource.service.ts | 113 +++ server/src/modules/system/system.module.ts | 6 + .../src/modules/system/test/test.service.ts | 4 +- .../src/modules/system/user/user.service.ts | 6 +- 24 files changed, 761 insertions(+), 532 deletions(-) create mode 100644 admin/src/api/resource/index.ts create mode 100644 admin/src/pages/resource/constants.tsx create mode 100644 admin/src/pages/resource/form.tsx create mode 100644 admin/src/pages/resource/index.tsx create mode 100644 server/prisma/migrations/20250311054029_/migration.sql create mode 100644 server/src/modules/system/resource/dto/create-resource.dto.ts create mode 100644 server/src/modules/system/resource/dto/update-resource.dto.ts create mode 100644 server/src/modules/system/resource/resource.controller.ts create mode 100644 server/src/modules/system/resource/resource.module.ts create mode 100644 server/src/modules/system/resource/resource.service.ts diff --git a/admin/package-lock.json b/admin/package-lock.json index ff01185..9ca97c1 100644 --- a/admin/package-lock.json +++ b/admin/package-lock.json @@ -9416,7 +9416,7 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.4.0.tgz", "integrity": "sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q==", - "deprecated": "This was arguably a breaking change. Not in API, but more results can be returned. Upgrade to the next major when you are ready for that", + "deprecated": "This was arguably a breaking change. Not in Api, but more results can be returned. Upgrade to the next major when you are ready for that", "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.8", diff --git a/admin/src/api/permission/index.ts b/admin/src/api/permission/index.ts index c852fc5..da82040 100644 --- a/admin/src/api/permission/index.ts +++ b/admin/src/api/permission/index.ts @@ -1,9 +1,9 @@ import request from '@/utils/request'; export function grantPermission(id: string, menuIds: string[]) { - return request.patch('/permission/' + id, { menuIds }); + return request.put(`/permission/roles/${id}/menus`, { menuIds }); } export function getRoleMenuIds(id: string) { - return request.get('/permission/' + id + '/menu'); + return request.get(`/permission/roles/${id}/menus`); } diff --git a/admin/src/api/resource/index.ts b/admin/src/api/resource/index.ts new file mode 100644 index 0000000..3d201da --- /dev/null +++ b/admin/src/api/resource/index.ts @@ -0,0 +1,21 @@ +import request from '@/utils/request'; + +export function createResource(data) { + return request.post('/resource', data); +} + +export function getResource() { + return request.get('/resource'); +} + +export function getTreeResource() { + return request.get('/resource/tree'); +} + +export function updateResource(data) { + return request.patch('/resource/' + data.id, data); +} + +export function deleteResource(id: string) { + return request.delete('/resource/' + id); +} diff --git a/admin/src/pages/resource/constants.tsx b/admin/src/pages/resource/constants.tsx new file mode 100644 index 0000000..8dca381 --- /dev/null +++ b/admin/src/pages/resource/constants.tsx @@ -0,0 +1,60 @@ +import React from 'react'; + +import { + TableColumnProps, + Button, + Popconfirm, + Space, +} from '@arco-design/web-react'; + +export const enum TableOptions { + EDIT = 'edit', + DELETE = 'delete', +} + + + +export function getColumns(callback: (type: TableOptions, record: any) => Promise): TableColumnProps[] { + return [ + { + title: '权限id', + dataIndex: 'id', + align: 'center', + }, + { + title: '权限名称', + dataIndex: 'name', + align: 'center', + }, + { + title: '权限字符', + dataIndex: 'permission', + align: 'center', + }, + { + title: '排序', + dataIndex: 'sort', + align: 'center', + }, + { + title: '操作', + dataIndex: 'operations', + align: 'center', + width: '300px', + render: (_, record) => ( + + + callback(TableOptions.DELETE, record)} + > + + + + ) + } + ] +} diff --git a/admin/src/pages/resource/form.tsx b/admin/src/pages/resource/form.tsx new file mode 100644 index 0000000..1038f28 --- /dev/null +++ b/admin/src/pages/resource/form.tsx @@ -0,0 +1,101 @@ +import React, {useEffect, useState} from 'react'; +import {Modal, Form, Input, Message, Select, InputNumber} from '@arco-design/web-react'; +import {createResource, getResource, updateResource} from '@/api/resource'; + +interface Props { + record: { [key: string]: any } | null, + visible: boolean, + handleConfirm: () => void, + handleCancel: () => void +} + +export default function FormComponent(props: Props) { + const {visible, record, handleConfirm, handleCancel} = props; + const [confirmLoading, setConfirmLoading] = useState(false); + + const onOk = async () => { + try { + setConfirmLoading(true); + const values = await form.validate(); + if (record?.id) { + await updateResource(values); + } else { + await createResource(values); + } + Message.success(`${record?.id ? '更新' : '新增'}成功!`); + handleConfirm(); + } catch (e) { + console.log(e); + } finally { + setConfirmLoading(false); + } + }; + + const [form] = Form.useForm(); + const [menuList, setMenuList] = useState([]); + + const fetchMenuList = async () => { + const {data} = await getResource(); + const mergeMenu = [ + { + id: null, + name: '无父级' + }, + ...data + ]; + setMenuList(mergeMenu); + }; + + useEffect(() => { + record && form.setFieldsValue({ + ...record + }); + }, [record]); + + useEffect(() => { + if (visible) { + fetchMenuList(); + } else { + form.resetFields(); + } + }, [visible]); + + return ( +
+ {`${record?.id ? '更新' : '新增'}数据`}} + visible={visible} + onOk={onOk} + onCancel={handleCancel} + confirmLoading={confirmLoading} + > +
+ + + + + + + + + + + + + +
+
+
+ ); +} diff --git a/admin/src/pages/resource/index.tsx b/admin/src/pages/resource/index.tsx new file mode 100644 index 0000000..7a9f429 --- /dev/null +++ b/admin/src/pages/resource/index.tsx @@ -0,0 +1,100 @@ +import React, {useState} from 'react'; +import { + Card, + Table, + Typography, + TableColumnProps, + Button, + Space, + Message +} from '@arco-design/web-react'; +import {useQuery} from 'react-query'; +import Form from './form'; +import {deleteResource, getTreeResource} from '@/api/resource'; +import {getColumns, TableOptions} from './constants'; +import {useHistory} from "react-router"; + +const {Title} = Typography; + +function ConfigManage() { + const reactQueryKey = useHistory().location.pathname; + const [visible, setVisible] = useState(false); + const [record, setRecord] = useState(null); + + const onDelete = async ({id}) => { + await deleteResource(id); + Message.success('删除成功!'); + await refetch(); + }; + + const tableCallback = async (type: TableOptions, record: any) => { + switch (type) { + case TableOptions.EDIT: + showModal(record) + break; + case TableOptions.DELETE: + await onDelete(record); + break + } + } + + const columns: TableColumnProps[] = getColumns(tableCallback) + + const fetchData = async () => { + const {data} = await getTreeResource(); + return data + }; + + const { + data, + isLoading, + isFetching, + refetch + } = useQuery( + [reactQueryKey], fetchData); + + const showModal = (payload?) => { + payload && setRecord(payload); + setVisible(true); + }; + + const handleConfirm = async () => { + setRecord(null); + setVisible(false); + await refetch(); + }; + + const handleCancel = () => { + setRecord(null); + setVisible(false); + }; + + return ( + <> + +
+ 数据权限 + + + + + + + + + ); +} + + +export default ConfigManage; diff --git a/admin/src/utils/request.ts b/admin/src/utils/request.ts index 848215f..188749e 100644 --- a/admin/src/utils/request.ts +++ b/admin/src/utils/request.ts @@ -50,6 +50,10 @@ class Request { return this.instance.patch(url, data); } + put(url: string, data?: object) { + return this.instance.put(url, data); + } + delete(url: string) { return this.instance.delete(url); } diff --git a/admin/yarn.lock b/admin/yarn.lock index 8d01a21..ed01377 100644 --- a/admin/yarn.lock +++ b/admin/yarn.lock @@ -52,7 +52,7 @@ dependencies: color "^3.1.3" -"@arco-design/web-react@^2.25.1", "@arco-design/web-react@^2.32.2": +"@arco-design/web-react@^2.32.2": version "2.64.0" resolved "https://registry.npmjs.org/@arco-design/web-react/-/web-react-2.64.0.tgz" integrity sha512-2CSRUqpD1obc84OQnZLdTE54Pb5OJe7OmgToUAbY9jlQiapMWIn2GZRJs12jkMTvAkzOv19sRU+UyoC/OYBNrg== @@ -120,7 +120,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz" integrity sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.17.10", "@babel/core@^7.19.6", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": +"@babel/core@^7.12.3", "@babel/core@^7.17.10", "@babel/core@^7.19.6": version "7.26.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -975,6 +975,11 @@ resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== +"@esbuild/linux-loong64@0.14.54": + version "0.14.54" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028" + integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.1" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" @@ -1088,7 +1093,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1723,7 +1728,7 @@ "@turf/helpers" "^6.5.0" "@turf/invariant" "^6.5.0" -"@turf/helpers@^6.5.0", "@turf/helpers@6.x": +"@turf/helpers@6.x", "@turf/helpers@^6.5.0": version "6.5.0" resolved "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz" integrity sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw== @@ -1927,7 +1932,7 @@ "@turf/helpers" "^6.5.0" polygon-clipping "^0.15.3" -"@turf/meta@^6.5.0", "@turf/meta@6.x": +"@turf/meta@6.x", "@turf/meta@^6.5.0": version "6.5.0" resolved "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz" integrity sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA== @@ -2432,33 +2437,12 @@ "@turf/invariant" "^6.5.0" d3-voronoi "1.1.2" -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.6": - version "1.0.6" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - "@types/geojson@7946.0.8": version "7946.0.8" resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz" integrity sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA== -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2468,7 +2452,7 @@ resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== -"@types/node@*", "@types/node@^16.11.10": +"@types/node@^16.11.10": version "16.18.115" resolved "https://registry.npmjs.org/@types/node/-/node-16.18.115.tgz" integrity sha512-NF5ajYn+dq0tRfswdyp8Df75h7D9z+L8TCIwrXoh46ZLK6KZVXkRhf/luXaZytvm/keUo9vU4m1Bg39St91a5w== @@ -2500,7 +2484,7 @@ dependencies: "@types/react" "^17" -"@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^17", "@types/react@^17.0.0", "@types/react@>=16.8": +"@types/react@^17", "@types/react@^17.0.0": version "17.0.83" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.83.tgz" integrity sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw== @@ -2535,7 +2519,7 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.4.0": +"@typescript-eslint/parser@^5.4.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== @@ -2622,137 +2606,6 @@ react-refresh "^0.13.0" resolve "^1.22.0" -"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - abs-svg-path@~0.1.1: version "0.1.1" resolved "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz" @@ -2763,31 +2616,17 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.8.2, acorn@^8.9.0: version "8.14.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2797,16 +2636,6 @@ ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - ajv@^8.0.1: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" @@ -2817,16 +2646,6 @@ ajv@^8.0.1: json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -ajv@^8.8.2, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" @@ -3092,7 +2911,7 @@ broadcast-channel@^3.4.1: rimraf "3.0.2" unload "2.2.0" -browserslist@^4.23.3, browserslist@^4.24.0, "browserslist@>= 4.21.0": +browserslist@^4.23.3, browserslist@^4.24.0: version "4.24.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz" integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== @@ -3172,11 +2991,6 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - classnames@^2.3.1: version "2.5.1" resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" @@ -3198,14 +3012,7 @@ coa@^2.0.2: chalk "^2.4.1" q "^1.1.2" -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^1.9.3: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -3219,16 +3026,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@^1.0.0, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^1.6.0: version "1.9.1" resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" @@ -3255,7 +3062,7 @@ colorette@^2.0.16: resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -commander@^2.20.0, commander@2: +commander@2, commander@^2.20.0: version "2.20.3" resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3265,16 +3072,16 @@ commander@^8.3.0: resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -compute-scroll-into-view@^1.0.17: - version "1.0.20" - resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz" - integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== - compute-scroll-into-view@1.0.11: version "1.0.11" resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.11.tgz" integrity sha512-uUnglJowSe0IPmWOdDtrlHXof5CTIJitfJEyITHBW6zDVOGu9Pjk5puaLM73SLcwak0L4hEjO7Td88/a6P5i7A== +compute-scroll-into-view@^1.0.17: + version "1.0.20" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz" + integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -3377,14 +3184,6 @@ css-select@^4.2.1: domutils "^2.8.0" nth-check "^2.0.1" -css-tree@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" @@ -3393,6 +3192,14 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + css-what@^3.2.1: version "3.4.2" resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" @@ -3420,6 +3227,11 @@ csstype@^3.0.2, csstype@^3.0.8: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +d3-array@1: + version "1.2.4" + resolved "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + d3-array@^2.5.0: version "2.12.1" resolved "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz" @@ -3427,11 +3239,6 @@ d3-array@^2.5.0: dependencies: internmap "^1.0.0" -d3-array@1: - version "1.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - d3-collection@1: version "1.0.7" resolved "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz" @@ -3463,6 +3270,13 @@ d3-geo-projection@~2.1.2: d3-array "1" d3-geo "^1.1.0" +d3-geo@1.7.1: + version "1.7.1" + resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz" + integrity sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw== + dependencies: + d3-array "1" + d3-geo@^1.1.0, d3-geo@~1.6.4: version "1.6.4" resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.6.4.tgz" @@ -3477,13 +3291,6 @@ d3-geo@^2.0.1: dependencies: d3-array "^2.5.0" -d3-geo@1.7.1: - version "1.7.1" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.7.1.tgz" - integrity sha512-O4AempWAr+P5qbk2bC2FuN/sDW4z+dN2wDf9QV3bxQt4M5HfOEeXLgJ/UKQW0+o1Dj8BE+L5kiDbdWUMjsmQpw== - dependencies: - d3-array "1" - d3-hexjson@^1.0.1: version "1.1.1" resolved "https://registry.npmjs.org/d3-hexjson/-/d3-hexjson-1.1.1.tgz" @@ -3496,16 +3303,16 @@ d3-hierarchy@^1.1.5: resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz" integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== -d3-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz" - integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== - d3-path@1: version "1.0.9" resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== +d3-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz" + integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== + d3-sankey@^0.9.1: version "0.9.1" resolved "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.9.1.tgz" @@ -3522,16 +3329,16 @@ d3-shape@^1.2.0: dependencies: d3-path "1" -d3-voronoi@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== - d3-voronoi@1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz" integrity sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw== +d3-voronoi@^1.1.2: + version "1.1.4" + resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + dagre@^0.8.2: version "0.8.5" resolved "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz" @@ -3597,7 +3404,7 @@ decode-uri-component@^0.2.0: resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== -deep-equal@^1.0.0, deep-equal@1.x: +deep-equal@1.x, deep-equal@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz" integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== @@ -3681,6 +3488,14 @@ dom-helpers@^5.0.1: "@babel/runtime" "^7.8.7" csstype "^3.0.2" +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" @@ -3690,24 +3505,16 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" +domelementtype@1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== -domelementtype@1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" @@ -3784,14 +3591,6 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.17.1: - version "5.18.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz" - integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" @@ -3905,11 +3704,6 @@ es-iterator-helpers@^1.1.0: iterator.prototype "^1.1.3" safe-array-concat "^1.1.2" -es-module-lexer@^1.2.1: - version "1.6.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz" - integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== - es-object-atoms@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" @@ -3942,11 +3736,106 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-android-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be" + integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ== + +esbuild-android-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771" + integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg== + +esbuild-darwin-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25" + integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug== + esbuild-darwin-arm64@0.14.54: version "0.14.54" resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz" integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw== +esbuild-freebsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d" + integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg== + +esbuild-freebsd-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48" + integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q== + +esbuild-linux-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5" + integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw== + +esbuild-linux-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652" + integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg== + +esbuild-linux-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b" + integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig== + +esbuild-linux-arm@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59" + integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw== + +esbuild-linux-mips64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34" + integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw== + +esbuild-linux-ppc64le@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e" + integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ== + +esbuild-linux-riscv64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8" + integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg== + +esbuild-linux-s390x@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6" + integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA== + +esbuild-netbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81" + integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w== + +esbuild-openbsd-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b" + integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw== + +esbuild-sunos-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da" + integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw== + +esbuild-windows-32@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31" + integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w== + +esbuild-windows-64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4" + integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ== + +esbuild-windows-arm64@0.14.54: + version "0.14.54" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982" + integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg== + esbuild@^0.14.27: version "0.14.54" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz" @@ -4042,7 +3931,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4063,7 +3952,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@*, "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.10.0, eslint@>=4.0.0, eslint@>=7.0.0, eslint@>=7.28.0: +eslint@^8.10.0: version "8.57.1" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== @@ -4155,11 +4044,6 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - execa@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" @@ -4312,6 +4196,11 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + function-bind@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" @@ -4396,11 +4285,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - glob@^7.1.3: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -4473,7 +4357,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -4541,7 +4425,7 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" -he@^1.2.0, he@1.2.0: +he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -4600,13 +4484,6 @@ human-signals@^1.1.1: resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - iconv-lite@0.4: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -4614,6 +4491,13 @@ iconv-lite@0.4: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ignore@^5.2.0, ignore@^5.2.1, ignore@^5.3.0: version "5.3.2" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" @@ -4892,16 +4776,16 @@ is-what@^3.14.1: resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== +isarray@0.0.1, isarray@~0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isarray@^2.0.5: version "2.0.5" resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== -isarray@~0.0.1, isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -4928,15 +4812,6 @@ jake@^10.8.5: filelist "^1.0.4" minimatch "^3.1.2" -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - js-sha3@0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" @@ -4972,7 +4847,7 @@ json-buffer@3.0.1: resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -5047,7 +4922,7 @@ less-loader@7.3.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -less@*, "less@^3.5.0 || ^4.0.0", less@^4.1.2: +less@^4.1.2: version "4.2.0" resolved "https://registry.npmjs.org/less/-/less-4.2.0.tgz" integrity sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA== @@ -5077,11 +4952,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" @@ -5245,18 +5115,6 @@ microseconds@0.2.0: resolved "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz" integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - mime@^1.4.1: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" @@ -5347,11 +5205,6 @@ needle@^3.1.0: iconv-lite "^0.6.3" sax "^1.2.4" -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" @@ -5716,7 +5569,7 @@ postcss-safe-parser@^6.0.0: resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11: +postcss-selector-parser@^6.0.11: version "6.1.2" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -5729,7 +5582,7 @@ postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.2, postcss@^8.3.3, postcss@^8.4.13, postcss@^8.4.19: +postcss@^8.1.2, postcss@^8.4.13, postcss@^8.4.19: version "8.4.47" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz" integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ== @@ -5750,7 +5603,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.0.0, prettier@^2.4.1, prettier@>=2.0.0: +prettier@^2.4.1: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -5830,14 +5683,7 @@ quickselect@^2.0.0: resolved "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz" integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -rbush@^2.0.1, rbush@2.x: +rbush@2.x, rbush@^2.0.1: version "2.0.2" resolved "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz" integrity sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA== @@ -5871,7 +5717,7 @@ react-color@^2.18.1: reactcss "^1.2.0" tinycolor2 "^1.4.1" -react-dom@^17.0.2, react-dom@>=16, react-dom@>=16.6.0: +react-dom@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -5892,22 +5738,7 @@ react-focus-lock@^2.12.1: use-callback-ref "^1.3.2" use-sidecar "^1.1.2" -react-is@^16.12.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.6.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^16.7.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -5944,7 +5775,7 @@ react-router-dom@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@^5.2.0, react-router@5.3.4: +react-router@5.3.4, react-router@^5.2.0: version "5.3.4" resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== @@ -5969,7 +5800,7 @@ react-transition-group@^4.3.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react@*, "react@^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.3.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", react@^17.0.2, react@>=15, react@>=16, react@>=16.6.0, react@>=16.8, react@17.0.2: +react@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -6145,7 +5976,7 @@ reusify@^1.0.4: resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^3.0.2, rimraf@3.0.2: +rimraf@3.0.2, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -6191,11 +6022,6 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz" @@ -6237,16 +6063,6 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz" - integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - scroll-into-view-if-needed@2.2.20: version "2.2.20" resolved "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.20.tgz" @@ -6254,7 +6070,7 @@ scroll-into-view-if-needed@2.2.20: dependencies: compute-scroll-into-view "1.0.11" -semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.6.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== @@ -6264,28 +6080,11 @@ semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4: +semver@^7.3.4, semver@^7.3.7: version "7.6.3" resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^7.3.7: - version "7.6.3" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" @@ -6549,7 +6348,7 @@ stylelint-config-standard@^24.0.0: dependencies: stylelint-config-recommended "^6.0.0" -stylelint@^14.0.0, stylelint@^14.1.0, "stylelint@>= 11.x < 15": +stylelint@^14.1.0: version "14.16.1" resolved "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz" integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A== @@ -6607,13 +6406,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-hyperlinks@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" @@ -6667,23 +6459,7 @@ table@^6.8.1: string-width "^4.2.3" strip-ansi "^6.0.1" -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.10.0, terser@^5.31.1: +terser@^5.10.0: version "5.36.0" resolved "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz" integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== @@ -6730,7 +6506,7 @@ toggle-selection@^1.0.6: resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== -topojson-client@^3.0.0, topojson-client@3.x: +topojson-client@3.x, topojson-client@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz" integrity sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw== @@ -6842,7 +6618,7 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@^4.5.2, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": +typescript@^4.5.2: version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== @@ -6984,7 +6760,7 @@ vite-plugin-html@^3.2.0: node-html-parser "^5.3.3" pathe "^0.2.0" -vite@^2.6.0, vite@^2.6.14, vite@>=2.0.0: +vite@^2.6.14: version "2.9.18" resolved "https://registry.npmjs.org/vite/-/vite-2.9.18.tgz" integrity sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ== @@ -6996,48 +6772,6 @@ vite@^2.6.0, vite@^2.6.14, vite@>=2.0.0: optionalDependencies: fsevents "~2.3.2" -watchpack@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz" - integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -"webpack@^4.0.0 || ^5.0.0", webpack@^5.1.0: - version "5.98.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz" - integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.6" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.14.0" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.1" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.2.3" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" diff --git a/server/prisma/migrations/20250311054029_/migration.sql b/server/prisma/migrations/20250311054029_/migration.sql new file mode 100644 index 0000000..7b74993 --- /dev/null +++ b/server/prisma/migrations/20250311054029_/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - A unique constraint covering the columns `[permission]` on the table `sys_resource` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "sys_resource_name_type_key"; + +-- AlterTable +ALTER TABLE "sys_resource" ADD COLUMN "permission" TEXT; + +-- CreateIndex +CREATE UNIQUE INDEX "sys_resource_permission_key" ON "sys_resource"("permission"); diff --git a/server/prisma/schema.prisma b/server/prisma/schema.prisma index b3dcb98..62bff8a 100644 --- a/server/prisma/schema.prisma +++ b/server/prisma/schema.prisma @@ -107,15 +107,14 @@ model SysResource { id String @id @default(cuid()) /// 主键id createdAt DateTime @default(now()) @map("created_at") /// 创建时间 updatedAt DateTime @updatedAt @map("updated_at") /// 修改时间 - name String - path String? /// 菜单或api路径 + name String /// 菜单名称或者接口名称 + path String? @unique() /// 菜单或api路径 + permission String? @unique() /// 权限字符 parentId String? @map("parent_id") sort Int @default(0) type Int /// 资源类型 0:菜单 1:api sysResourcePermission SysResourcePermission[] - @@unique([name, type]) - @@unique([path]) @@map("sys_resource") } diff --git a/server/prisma/seed.ts b/server/prisma/seed.ts index f96e000..6aa0fe2 100644 --- a/server/prisma/seed.ts +++ b/server/prisma/seed.ts @@ -3,7 +3,7 @@ const prisma = new PrismaClient(); enum PermissionType { Menu, - API, + Api, } async function main() { diff --git a/server/src/common/enum/index.ts b/server/src/common/enum/index.ts index 47f8ef0..ab98fc2 100644 --- a/server/src/common/enum/index.ts +++ b/server/src/common/enum/index.ts @@ -10,5 +10,5 @@ export enum RedisGroup { export enum PermissionType { Menu, - API, + Api, } diff --git a/server/src/modules/system/menu/dto/create-menu.dto.ts b/server/src/modules/system/menu/dto/create-menu.dto.ts index e893b2b..43b8542 100644 --- a/server/src/modules/system/menu/dto/create-menu.dto.ts +++ b/server/src/modules/system/menu/dto/create-menu.dto.ts @@ -1,4 +1,5 @@ import { IsInt, IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { PermissionType } from '@/common/enum'; export class CreateMenuDto { @IsNotEmpty() @@ -19,5 +20,5 @@ export class CreateMenuDto { @IsOptional() @IsInt() - type: number; + type = PermissionType.Menu; } diff --git a/server/src/modules/system/menu/menu.service.ts b/server/src/modules/system/menu/menu.service.ts index ba94779..989d6c0 100644 --- a/server/src/modules/system/menu/menu.service.ts +++ b/server/src/modules/system/menu/menu.service.ts @@ -9,29 +9,21 @@ import { PermissionType } from '@/common/enum'; export class MenuService { constructor(private readonly prisma: PrismaService) {} - findOne(params: { id?: string; excludeId?: string }) { - const { id, excludeId } = params; - return this.prisma.sysResource.findFirst({ - where: { - type: PermissionType.Menu, - ...(id ? { id } : {}), - ...(excludeId ? { NOT: { id: excludeId } } : {}), - }, - }); - } - - findOneById(id: string) { - return this.prisma.sysResource.findUnique({ where: { id } }); - } - async create(data: CreateMenuDto) { + const doesExists = await this.prisma.sysResource.findUnique({ + where: { path: data.path }, + }); + + if (doesExists) + throw new HttpException('菜单路径不可重复!', HttpStatus.NOT_FOUND); + await this.prisma.$transaction(async (prisma) => { const { id: resourceId } = await prisma.sysResource.create({ data }); // 创建菜单权限 const { id: permissionId } = await prisma.sysPermission.create({ data: {}, }); - // // 关联权限和菜单 + // 关联权限和菜单 await prisma.sysResourcePermission.create({ data: { resourceId, permissionId }, }); @@ -54,7 +46,10 @@ export class MenuService { async getTreeMenu() { const query: Prisma.SysResourceFindManyArgs = { - orderBy: [{ sort: 'desc' }, { createdAt: 'desc' }], + orderBy: [{ sort: 'desc' }, { createdAt: 'asc' }], + where: { + type: PermissionType.Menu, + }, }; const list = await this.prisma.sysResource.findMany(query); return this.generatorMenu(list); @@ -62,20 +57,23 @@ export class MenuService { findAll() { const query: Prisma.SysResourceFindManyArgs = { - select: { - id: true, - name: true, - path: true, - parentId: true, + where: { + type: PermissionType.Menu, }, + orderBy: [{ sort: 'desc' }, { createdAt: 'asc' }], }; return this.prisma.sysResource.findMany(query); } async update(id: string, data: UpdateMenuDto) { - const doesExists = await this.findOne({ id }); - if (!doesExists) { - throw new HttpException('菜单不存在!', HttpStatus.NOT_FOUND); + const doesExists = await this.prisma.sysResource.findUnique({ + where: { path: data.path }, + }); + + console.log(doesExists); + + if (doesExists) { + throw new HttpException('菜单路径不可重复!', HttpStatus.NOT_FOUND); } if (data.parentId === id) { @@ -88,15 +86,10 @@ export class MenuService { await this.prisma.sysResource.update({ data, where: { id } }); } - async remove(resourceId: string) { - const doesExists = await this.findOneById(resourceId); - if (!doesExists) { - throw new HttpException('菜单不存在!', HttpStatus.NOT_FOUND); - } - + async remove(id: string) { // 判断是否存在子菜单 const doesExistsChildren = await this.prisma.sysResource.findFirst({ - where: { parentId: resourceId }, + where: { parentId: id, NOT: { id } }, }); if (doesExistsChildren) { @@ -112,13 +105,13 @@ export class MenuService { await prisma.sysPermission.deleteMany({ where: { sysResourcePermission: { - some: { resourceId }, + some: { resourceId: id }, }, }, }); //step2 删除菜单数据 - await prisma.sysResourcePermission.delete({ where: { id: resourceId } }); + await prisma.sysResourcePermission.delete({ where: { id } }); }); } } diff --git a/server/src/modules/system/permission/permission.controller.ts b/server/src/modules/system/permission/permission.controller.ts index ba34adf..b9132f4 100644 --- a/server/src/modules/system/permission/permission.controller.ts +++ b/server/src/modules/system/permission/permission.controller.ts @@ -1,19 +1,19 @@ -import { Controller, Body, Patch, Param, Get } from '@nestjs/common'; +import { Controller, Body, Put, Param, Get } from '@nestjs/common'; import { PermissionService } from './permission.service'; -import { GrantMenuDto } from '@/modules/system/permission/dto/grant-menu.dto'; +import { GrantMenuDto } from './dto/grant-menu.dto'; @Controller() export class PermissionController { constructor(private readonly permissionService: PermissionService) {} - @Get(':id/menu') - getMenu(@Param('id') id: string) { - return this.permissionService.getMenu(id); + @Get('/roles/:roleId/menus') + getRoleMenus(@Param('roleId') roleId: string) { + return this.permissionService.getRoleMenus(roleId); } - @Patch(':id') - grantMenu(@Param('id') id: string, @Body() dto: GrantMenuDto) { - return this.permissionService.grantMenu(id, dto); + @Put('/roles/:roleId/menus') + assignMenus(@Param('roleId') roleId: string, @Body() dto: GrantMenuDto) { + return this.permissionService.assignMenus(roleId, dto); } } diff --git a/server/src/modules/system/permission/permission.service.ts b/server/src/modules/system/permission/permission.service.ts index 65e09c3..1a29c6e 100644 --- a/server/src/modules/system/permission/permission.service.ts +++ b/server/src/modules/system/permission/permission.service.ts @@ -6,7 +6,7 @@ import { PrismaService } from '@/prisma/prisma.service'; export class PermissionService { constructor(private readonly prisma: PrismaService) {} - async getMenu(id: string) { + async getRoleMenus(roleId: string) { const menuIds = await this.prisma.sysResourcePermission.findMany({ select: { resourceId: true, @@ -14,7 +14,7 @@ export class PermissionService { where: { permission: { sysRolePermission: { - some: { roleId: id }, + some: { roleId }, }, }, }, @@ -23,11 +23,11 @@ export class PermissionService { return menuIds.map((item) => item.resourceId); } - async grantMenu(id: string, { menuIds }: GrantMenuDto) { + async assignMenus(roleId: string, { menuIds }: GrantMenuDto) { await this.prisma.$transaction(async (prisma) => { // 删除角色对应的权限 await prisma.sysRolePermission.deleteMany({ - where: { roleId: id }, + where: { roleId }, }); // 通过菜单id 找出所有权限id const rolePermIds = await prisma.sysResourcePermission.findMany({ @@ -37,7 +37,7 @@ export class PermissionService { // 根据权限id 关联菜单和权限 if (rolePermIds.length > 0) { await prisma.sysRolePermission.createMany({ - data: rolePermIds.map((item) => ({ ...item, roleId: id })), + data: rolePermIds.map((item) => ({ ...item, roleId })), }); } }); diff --git a/server/src/modules/system/resource/dto/create-resource.dto.ts b/server/src/modules/system/resource/dto/create-resource.dto.ts new file mode 100644 index 0000000..7c4508d --- /dev/null +++ b/server/src/modules/system/resource/dto/create-resource.dto.ts @@ -0,0 +1,24 @@ +import { IsInt, IsNotEmpty, IsOptional, IsString } from 'class-validator'; +import { PermissionType } from '@/common/enum'; + +export class CreateResourceDto { + @IsNotEmpty() + @IsString() + name: string; + + @IsNotEmpty() + @IsString() + permission: string; + + @IsOptional() + @IsString() + parentId?: string; + + @IsOptional() + @IsInt() + sort?: number; + + @IsOptional() + @IsInt() + type = PermissionType.Api; +} diff --git a/server/src/modules/system/resource/dto/update-resource.dto.ts b/server/src/modules/system/resource/dto/update-resource.dto.ts new file mode 100644 index 0000000..0410746 --- /dev/null +++ b/server/src/modules/system/resource/dto/update-resource.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateResourceDto } from './create-resource.dto'; + +export class UpdateResourceDto extends PartialType(CreateResourceDto) {} diff --git a/server/src/modules/system/resource/resource.controller.ts b/server/src/modules/system/resource/resource.controller.ts new file mode 100644 index 0000000..fe881ab --- /dev/null +++ b/server/src/modules/system/resource/resource.controller.ts @@ -0,0 +1,42 @@ +import { + Controller, + Get, + Post, + Body, + Patch, + Param, + Delete, +} from '@nestjs/common'; +import { ResourceService } from './resource.service'; +import { CreateResourceDto } from './dto/create-resource.dto'; +import { UpdateResourceDto } from './dto/update-resource.dto'; + +@Controller() +export class ResourceController { + constructor(private readonly resourceService: ResourceService) {} + + @Post() + create(@Body() data: CreateResourceDto) { + return this.resourceService.create(data); + } + + @Get('tree') + getTreeData() { + return this.resourceService.getTreeData(); + } + + @Get() + findAll() { + return this.resourceService.findAll(); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() data: UpdateResourceDto) { + return this.resourceService.update(id, data); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.resourceService.remove(id); + } +} diff --git a/server/src/modules/system/resource/resource.module.ts b/server/src/modules/system/resource/resource.module.ts new file mode 100644 index 0000000..1bfc653 --- /dev/null +++ b/server/src/modules/system/resource/resource.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ResourceService } from './resource.service'; +import { ResourceController } from './resource.controller'; + +@Module({ + controllers: [ResourceController], + providers: [ResourceService], +}) +export class ResourceModule {} diff --git a/server/src/modules/system/resource/resource.service.ts b/server/src/modules/system/resource/resource.service.ts new file mode 100644 index 0000000..2c4c305 --- /dev/null +++ b/server/src/modules/system/resource/resource.service.ts @@ -0,0 +1,113 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { CreateResourceDto } from './dto/create-resource.dto'; +import { UpdateResourceDto } from './dto/update-resource.dto'; +import { PrismaService } from '@/prisma/prisma.service'; +import { PermissionType } from '@/common/enum'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export class ResourceService { + constructor(private readonly prisma: PrismaService) {} + + async create(data: CreateResourceDto) { + const doesExists = await this.prisma.sysResource.findUnique({ + where: { path: data.permission }, + }); + + if (doesExists) + throw new HttpException('权限字符不可重复!', HttpStatus.NOT_FOUND); + + await this.prisma.$transaction(async (prisma) => { + const { id: resourceId } = await prisma.sysResource.create({ data }); + // 创建资源权限 + const { id: permissionId } = await prisma.sysPermission.create({ + data: {}, + }); + //关联权限和api + await prisma.sysResourcePermission.create({ + data: { resourceId, permissionId }, + }); + }); + } + + generatorTreeData(data, parentId = '-') { + const list = []; + for (const item of data) { + if ((item.parentId || '-') === parentId) { + const children = this.generatorTreeData(data, item.id); + if (children.length) { + item.children = children; + } + list.push(item); + } + } + return list; + } + + async getTreeData() { + const query: Prisma.SysResourceFindManyArgs = { + orderBy: [{ sort: 'desc' }, { createdAt: 'desc' }], + where: { + type: PermissionType.Api, + }, + }; + const list = await this.prisma.sysResource.findMany(query); + return this.generatorTreeData(list); + } + + findAll() { + const query: Prisma.SysResourceFindManyArgs = { + where: { + type: PermissionType.Api, + }, + }; + return this.prisma.sysResource.findMany(query); + } + + async update(id: string, data: UpdateResourceDto) { + const doesExists = await this.prisma.sysResource.findUnique({ + where: { path: data.permission, NOT: { id } }, + }); + + if (doesExists) + throw new HttpException('权限字符不可重复!', HttpStatus.NOT_FOUND); + + if (data.parentId === id) { + throw new HttpException( + '父级id不可与自身id相同!', + HttpStatus.BAD_REQUEST, + ); + } + + await this.prisma.sysResource.update({ data, where: { id } }); + } + + async remove(id: string) { + // 判断是否存在子资源 + const doesExistsChildren = await this.prisma.sysResource.findFirst({ + where: { parentId: id }, + }); + + if (doesExistsChildren) { + throw new HttpException( + '删除失败:请确保当前资源下不存在子资源!', + HttpStatus.FORBIDDEN, + ); + } + + await this.prisma.$transaction(async (prisma) => { + // step1 通过关联表删除权限表数据 这一步必须在前 + // 因为schema文件中设置了onDelete: Cascade 删除资源会删除关联表数据 则无法找出对应权限 + await prisma.sysPermission.deleteMany({ + where: { + sysResourcePermission: { + some: { resourceId: id }, + }, + }, + }); + + //step2 删除资源数据 + await prisma.sysResourcePermission.delete({ where: { id } }); + }); + } +} diff --git a/server/src/modules/system/system.module.ts b/server/src/modules/system/system.module.ts index 0d01853..75d0ad2 100644 --- a/server/src/modules/system/system.module.ts +++ b/server/src/modules/system/system.module.ts @@ -8,6 +8,7 @@ import { MenuModule } from './menu/menu.module'; import { ConfigModule } from './config/config.module'; import { PermissionModule } from './permission/permission.module'; import { TestModule } from './test/test.module'; +import { ResourceModule } from './resource/resource.module'; @Module({ imports: [ @@ -44,6 +45,10 @@ import { TestModule } from './test/test.module'; path: 'permission', module: PermissionModule, }, + { + path: 'resource', + module: ResourceModule, + }, { path: 'test', module: TestModule, @@ -59,6 +64,7 @@ import { TestModule } from './test/test.module'; ConfigModule, PermissionModule, TestModule, + ResourceModule, ], }) export class SystemModule {} diff --git a/server/src/modules/system/test/test.service.ts b/server/src/modules/system/test/test.service.ts index df90e3e..e6639ee 100644 --- a/server/src/modules/system/test/test.service.ts +++ b/server/src/modules/system/test/test.service.ts @@ -1,8 +1,8 @@ -import { Injectable } from '@nestjs/common'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; @Injectable() export class TestService { findAll() { - return `This action returns all test`; + throw new HttpException('用户不存在!', HttpStatus.NOT_FOUND); } } diff --git a/server/src/modules/system/user/user.service.ts b/server/src/modules/system/user/user.service.ts index d36c16e..18f7b70 100644 --- a/server/src/modules/system/user/user.service.ts +++ b/server/src/modules/system/user/user.service.ts @@ -141,9 +141,13 @@ export class UserService { }, }, }; + } else { + query.where = { + type: PermissionType.Menu, + }; } - const menus = await this.prisma.sysResource.findMany(); + const menus = await this.prisma.sysResource.findMany(query); return { ...user,