From c0ffd8ab4d59ae09d4f22ae5382743fcb3e7477b Mon Sep 17 00:00:00 2001 From: doublekou <951513186@qq.com> Date: Wed, 16 Aug 2023 16:01:21 +0800 Subject: [PATCH] =?UTF-8?q?ui=E6=9B=B4=E6=96=B0=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 28 + .env | 2 + .env.development | 4 + .env.production | 4 + .env.test | 4 + .eslintrc-auto-import.json | 79 + .eslintrc.cjs | 28 + .github/workflows/deploy-preview.yml | 49 + .gitignore | 30 + .husky/commit-msg | 4 + .husky/common.sh | 8 + .husky/pre-commit | 4 + .lintstagedrc.json | 5 + .prettierignore | 9 + .prettierrc | 7 + .vscode/extensions.json | 6 + LICENSE | 202 + README.md | 60 + commitlint.config.js | 3 + guidelines/UX 规范.md | 38 + index.html | 222 + package-lock.json | 15305 ++++++++++++++++ package.json | 75 + pnpm-lock.yaml | 5766 ++++++ pro-components/card/ProCard.tsx | 20 + .../card/components/Actions/index.less | 75 + .../card/components/Actions/index.tsx | 33 + .../card/components/Card/index.less | 216 + pro-components/card/components/Card/index.tsx | 263 + .../card/components/Loading/index.less | 42 + .../card/components/Loading/index.tsx | 62 + pro-components/card/index.tsx | 8 + pro-components/card/types.ts | 98 + pro-components/field/index.ts | 1 + .../form/BaseForm/LightWrapper/index.less | 14 + .../form/BaseForm/LightWrapper/index.tsx | 44 + .../form/layouts/QueryFilter/Actions.tsx | 89 + .../form/layouts/QueryFilter/index.tsx | 106 + pro-components/layout/BasicLayout.less | 68 + pro-components/layout/BasicLayout.tsx | 383 + pro-components/layout/Footer.tsx | 54 + pro-components/layout/Header.less | 20 + pro-components/layout/Header.tsx | 146 + pro-components/layout/RouteContext.tsx | 43 + pro-components/layout/WrapContent.tsx | 32 + .../layout/components/AntIcon/index.tsx | 30 + .../components/FooterToolbar/index.less | 33 + .../layout/components/FooterToolbar/index.tsx | 80 + .../layout/components/GlobalFooter/index.less | 32 + .../layout/components/GlobalFooter/index.tsx | 84 + .../layout/components/GlobalHeader/index.less | 98 + .../layout/components/GlobalHeader/index.tsx | 188 + .../components/GridContent/GridContent.less | 11 + .../layout/components/GridContent/index.tsx | 36 + .../components/PageContainer/index.less | 116 + .../layout/components/PageContainer/index.tsx | 385 + .../layout/components/PageLoading/index.tsx | 13 + .../SettingDrawer/BlockCheckbox.tsx | 49 + .../components/SettingDrawer/LayoutChange.tsx | 124 + .../SettingDrawer/RegionalChange.tsx | 41 + .../components/SettingDrawer/ThemeColor.less | 25 + .../components/SettingDrawer/ThemeColor.tsx | 59 + .../components/SettingDrawer/index.less | 161 + .../layout/components/SettingDrawer/index.tsx | 419 + .../layout/components/SiderMenu/BaseMenu.tsx | 329 + .../layout/components/SiderMenu/SiderMenu.tsx | 337 + .../layout/components/SiderMenu/index.less | 206 + .../layout/components/SiderMenu/index.tsx | 80 + .../layout/components/TopNavHeader/index.less | 73 + .../layout/components/TopNavHeader/index.tsx | 89 + .../layout/components/WaterMark/index.tsx | 232 + pro-components/layout/defaultSettings.ts | 229 + pro-components/layout/locales/en-US.ts | 5 + .../layout/locales/en-US/settingDrawer.ts | 40 + pro-components/layout/locales/index.ts | 32 + pro-components/layout/locales/it-IT.ts | 5 + .../layout/locales/it-IT/settingDrawer.ts | 35 + pro-components/layout/locales/ko-KR.ts | 5 + .../layout/locales/ko-KR/settingDrawer.ts | 40 + pro-components/layout/locales/types.ts | 6 + pro-components/layout/locales/zh-CN.ts | 5 + .../layout/locales/zh-CN/settingDrawer.ts | 40 + pro-components/layout/locales/zh-TW.ts | 5 + .../layout/locales/zh-TW/settingDrawer.ts | 35 + pro-components/layout/renderTypes.ts | 55 + pro-components/layout/types.ts | 41 + pro-components/layout/utils/checkUtils.ts | 22 + pro-components/layout/utils/getFlatMenu.ts | 30 + pro-components/layout/utils/index.ts | 26 + pro-components/layout/utils/menuUtils.ts | 57 + pro-components/layout/utils/utils.ts | 50 + pro-components/provider/index.tsx | 254 + pro-components/provider/locale/ar_EG.tsx | 58 + pro-components/provider/locale/ca_ES.tsx | 51 + pro-components/provider/locale/de_DE.tsx | 59 + pro-components/provider/locale/en_GB.tsx | 70 + pro-components/provider/locale/en_US.tsx | 70 + pro-components/provider/locale/es_ES.tsx | 70 + pro-components/provider/locale/fa_IR.tsx | 66 + pro-components/provider/locale/fr_FR.tsx | 66 + pro-components/provider/locale/hr_HR.tsx | 70 + pro-components/provider/locale/id_ID.tsx | 59 + pro-components/provider/locale/it_IT.tsx | 45 + pro-components/provider/locale/ja_JP.tsx | 50 + pro-components/provider/locale/ko_KR.tsx | 66 + pro-components/provider/locale/ms_MY.tsx | 46 + pro-components/provider/locale/pl_PL.tsx | 59 + pro-components/provider/locale/pt_BR.tsx | 66 + pro-components/provider/locale/ru_RU.tsx | 66 + pro-components/provider/locale/sr_RS.tsx | 66 + pro-components/provider/locale/tr_TR.tsx | 66 + pro-components/provider/locale/vi_VN.tsx | 46 + pro-components/provider/locale/zh_CN.tsx | 65 + pro-components/provider/locale/zh_TW.tsx | 65 + pro-components/table/Table.tsx | 806 + .../table/components/Alert/index.less | 26 + .../table/components/Alert/index.tsx | 96 + .../table/components/ColumnSetting/index.less | 89 + .../table/components/ColumnSetting/index.tsx | 444 + .../table/components/Dropdown/index.less | 8 + .../table/components/Dropdown/index.tsx | 71 + .../table/components/Form/FormRender.tsx | 5 + .../components/ListToolBar/HeaderMenu.tsx | 133 + .../table/components/ListToolBar/index.less | 121 + .../table/components/ListToolBar/index.tsx | 295 + .../table/components/ToolBar/DensityIcon.tsx | 45 + .../components/ToolBar/FullscreenIcon.tsx | 29 + .../table/components/ToolBar/index.less | 76 + .../table/components/ToolBar/index.tsx | 338 + pro-components/table/container.ts | 173 + pro-components/table/index.less | 66 + pro-components/table/index.tsx | 6 + pro-components/table/renderTypes.ts | 10 + pro-components/table/typing.ts | 535 + pro-components/table/useFetchData.tsx | 261 + pro-components/table/utils/columnRender.tsx | 182 + pro-components/table/utils/columnSort.ts | 19 + .../table/utils/genProColumnToColumn.tsx | 156 + pro-components/table/utils/index.ts | 204 + pro-components/types.ts | 11 + pro-components/utils/array-move/index.ts | 19 + .../utils/components/LabelIconTip/index.less | 39 + .../utils/components/LabelIconTip/index.tsx | 57 + pro-components/utils/genCopyable/index.tsx | 57 + .../utils/hooks/useMediaQuery/index.ts | 76 + .../utils/hooks/useMergedState/index.ts | 34 + .../utils/hooks/usePrevious/index.ts | 17 + pro-components/utils/isValidElement/index.ts | 5 + pro-components/utils/omitBoolean/index.ts | 8 + pro-components/utils/omitUndefined/index.ts | 17 + .../utils/omitUndefinedAndEmptyArr/index.ts | 18 + pro-components/utils/runFunction/index.ts | 7 + pro-components/utils/types/index.ts | 152 + pro-components/utils/typing.ts | 229 + .../utils/useEditableArray/index.tsx | 23 + public/favicon.ico | Bin 0 -> 15406 bytes scripts/preinstall.js | 9 + src/App.vue | 23 + src/api/auth/captcha.ts | 36 + src/api/auth/index.ts | 73 + src/api/auth/types.ts | 51 + src/api/clueaccess/accessDetail/index.ts | 33 + src/api/clueaccess/accessDetail/types.ts | 126 + src/api/clueaccess/clueImport/index.ts | 63 + src/api/clueaccess/clueImport/types.ts | 50 + src/api/clueaccess/importDetail/index.ts | 18 + src/api/clueaccess/importDetail/types.ts | 27 + src/api/clueaccess/login-log/index.ts | 13 + src/api/clueaccess/login-log/types.ts | 26 + src/api/clueaccess/operation-log/index.ts | 13 + src/api/clueaccess/operation-log/type.ts | 30 + .../customerManagement/index.ts | 64 + .../customerManagement/types.ts | 218 + .../distributionTaskManagement/index.ts | 58 + .../distributionTaskManagement/types.ts | 198 + .../controlcenterstation/login-log/index.ts | 13 + .../controlcenterstation/login-log/types.ts | 26 + .../operation-log/index.ts | 13 + .../operation-log/type.ts | 30 + .../customermanagement/customerList/index.ts | 44 + .../customermanagement/customerList/types.ts | 202 + src/api/i18n/i18n-data.ts | 48 + src/api/i18n/types.ts | 50 + src/api/index.ts | 5 + src/api/log/access-log/index.ts | 13 + src/api/log/access-log/types.ts | 28 + src/api/log/login-log/index.ts | 13 + src/api/log/login-log/types.ts | 26 + src/api/log/operation-log/index.ts | 13 + src/api/log/operation-log/type.ts | 30 + src/api/notify/announcement/index.ts | 79 + src/api/notify/announcement/types.ts | 102 + .../salesmanagement/salespersonList/index.ts | 58 + .../salesmanagement/salespersonList/types.ts | 138 + src/api/system/config/index.ts | 37 + src/api/system/config/types.ts | 54 + src/api/system/dict/index.ts | 106 + src/api/system/dict/types.ts | 182 + src/api/system/menu/index.ts | 54 + src/api/system/menu/types.ts | 119 + src/api/system/organization/index.ts | 41 + src/api/system/organization/types.ts | 51 + src/api/system/role/index.ts | 90 + src/api/system/role/types.ts | 90 + src/api/system/user/index.ts | 95 + src/api/system/user/types.ts | 168 + src/api/types.ts | 63 + src/assets/backgroud.svg | 69 + src/assets/logo.png | Bin 0 -> 3286 bytes src/assets/sprite.1.2.4.png | Bin 0 -> 15178 bytes src/components/Button/ConfirmTextButton.vue | 16 + src/components/Button/DeleteTextButton.vue | 24 + src/components/Button/IconButton.tsx | 79 + src/components/Button/index.ts | 4 + src/components/Captcha/ConcatCaptcha.vue | 154 + src/components/Captcha/RotateCaptcha.vue | 143 + src/components/Captcha/SliderCaptcha.vue | 141 + src/components/Captcha/WordClickCaptcha.vue | 218 + src/components/Captcha/index.less | 118 + src/components/Captcha/index.ts | 4 + src/components/Captcha/types.ts | 27 + src/components/Captcha/useCaptcha.ts | 127 + src/components/CropperModal/index.vue | 244 + src/components/CropperModal/types.ts | 4 + src/components/Dict/display/DictBadge.vue | 23 + src/components/Dict/display/DictTag.vue | 18 + src/components/Dict/display/DictTagGroup.vue | 17 + src/components/Dict/display/DictText.vue | 12 + .../Dict/group/DictCheckboxGroup.vue | 40 + src/components/Dict/group/DictRadioGroup.vue | 51 + src/components/Dict/group/DictSelect.vue | 38 + src/components/Dict/index.ts | 9 + src/components/Dict/types.ts | 88 + src/components/Dict/use-dict.ts | 90 + src/components/Editor/index.vue | 107 + src/components/Editor/types.ts | 6 + src/components/Editor/view.less | 52 + src/components/Editor/wangeditor.d.ts | 14 + src/components/IconSelector/IconSelector.vue | 103 + .../IconSelector/IconSelectorModal.vue | 46 + src/components/IconSelector/icons.ts | 392 + src/components/IconSelector/index.ts | 2 + src/components/IconSelector/types.ts | 10 + src/components/Lov/Lov.vue | 219 + src/components/Lov/LovModal.vue | 333 + src/components/Lov/LovSearch.vue | 126 + src/components/Lov/index.ts | 6 + src/components/Lov/lov-options.ts | 49 + src/components/Lov/type.ts | 6 + src/components/Notify/AnnouncementModal.tsx | 29 + src/components/Notify/AnnouncementRibbon.vue | 129 + src/components/Operation/OperationGroup.vue | 16 + src/components/Operation/index.ts | 1 + src/components/Search/SearchActions.vue | 51 + src/components/SelectLanguage/index.vue | 52 + src/config/index.ts | 74 + src/hooks/form.ts | 115 + src/hooks/i18n.ts | 23 + src/hooks/mitt.ts | 16 + src/hooks/modal.ts | 16 + src/hooks/permission.ts | 45 + src/hooks/websocket.ts | 57 + src/layouts/BasicLayout.vue | 157 + src/layouts/RouterLayout.vue | 41 + .../components/Footer/BallcatFooter.vue | 19 + .../HeaderDropdown/index.module.less | 16 + .../components/HeaderDropdown/index.tsx | 44 + src/layouts/components/MultiTab/MultiTab.less | 115 + src/layouts/components/MultiTab/MultiTab.tsx | 372 + src/layouts/components/MultiTab/index.ts | 3 + src/layouts/components/MultiTab/types.ts | 7 + .../RightContent/AvatarDropdown.vue | 106 + .../components/RightContent/index.less | 87 + src/layouts/components/RightContent/index.vue | 42 + src/locales/dayjs.ts | 5 + src/locales/index.ts | 51 + src/locales/lang/en-US.ts | 20 + src/locales/lang/en-US/ballcat.json | 82 + src/locales/lang/zh-CN.ts | 19 + src/locales/lang/zh-CN/ballcat.json | 86 + src/main.ts | 28 + src/router/constant-routes.ts | 74 + src/router/dynamic-routes.ts | 149 + src/router/guards.ts | 59 + src/router/index.ts | 25 + src/router/vue-router.d.ts | 38 + src/stores/dict-store.ts | 78 + src/stores/i18n-store.ts | 24 + src/stores/multitab-store.ts | 11 + src/stores/setting-store.ts | 16 + src/stores/user-store.ts | 41 + src/styles/global.less | 82 + src/styles/nprogress.less | 83 + src/utils/axios/axios.d.ts | 7 + src/utils/axios/http-client.ts | 134 + src/utils/axios/index.ts | 126 + src/utils/axios/request.ts | 108 + src/utils/axios/types.ts | 98 + src/utils/bean-utils.ts | 12 + src/utils/dom-utils.ts | 9 + src/utils/file-utils.ts | 91 + src/utils/page-utils.ts | 27 + src/utils/password-utils.ts | 31 + src/utils/resolvers.ts | 298 + src/utils/storage-utils.ts | 5 + src/utils/str-utils.ts | 25 + src/utils/tree-utils.ts | 162 + src/views/basic/exception/index.vue | 48 + src/views/basic/iframe/index.vue | 50 + src/views/basic/redirect/index.vue | 24 + .../clueaccess/accessDetail/accessDetail.vue | 713 + .../accessDetailDistributionModal.vue | 347 + .../accessDetail/accessDetailModal.vue | 231 + .../accessDetail/accessDetailSearch.vue | 101 + src/views/clueaccess/clueImport.vue | 310 + .../clueaccess/importDetail/importDetail.vue | 615 + .../importDetailDistributionModal.vue | 429 + .../importDetail/importDetailSearch.vue | 91 + .../customerManagement/customerManagement.vue | 481 + .../customerManagementModal.vue | 488 + .../customerManagementSearch.vue | 105 + .../distributionTaskManagement.vue | 433 + .../distributionTaskManagementModal.vue | 544 + .../distributionTaskManagementSearch.vue | 102 + .../customerList/customerList.vue | 297 + .../customerList/customerListModal.vue | 234 + .../customerList/customerListSearch.vue | 117 + src/views/i18n/LanguageText.vue | 101 + .../i18n/i18n-data/I18nDataCreateModal.vue | 97 + .../i18n/i18n-data/I18nDataImportModal.vue | 114 + src/views/i18n/i18n-data/I18nDataPage.vue | 153 + .../i18n/i18n-data/I18nDataPageSearch.vue | 62 + .../i18n/i18n-data/I18nDataUpdateModal.vue | 106 + src/views/log/access-log/AccessLogPage.vue | 111 + .../log/access-log/AccessLogPageSearch.vue | 112 + src/views/log/login-log/LoginLogPage.vue | 109 + .../log/login-log/LoginLogPageSearch.vue | 114 + .../log/operation-log/OperationLogPage.vue | 124 + .../operation-log/OperationLogPageSearch.vue | 114 + .../login/components/AccountLoginForm.vue | 73 + src/views/login/components/LoginContent.vue | 180 + src/views/login/components/LoginFooter.vue | 20 + .../login/components/MobileLoginForm.vue | 33 + src/views/login/components/loginContent.less | 80 + src/views/login/components/types.ts | 11 + src/views/login/index.less | 55 + src/views/login/index.vue | 29 + .../announcement/AnnouncementFormModal.vue | 253 + .../notify/announcement/AnnouncementPage.vue | 236 + .../announcement/AnnouncementPageSearch.vue | 66 + src/views/oauth2/OAuth2Authorize.vue | 39 + src/views/oauth2/OAuth2Consent.vue | 84 + .../salesmanagement/labelRule/labelRule.vue | 361 + .../labelRule/labelRuleFormModal.vue | 346 + .../salespersonList/ChangePasswordModal.vue | 135 + .../salespersonList/salespersonList.vue | 239 + .../salespersonList/salespersonListModal.vue | 160 + .../salespersonList/salespersonListSearch.vue | 99 + .../salespersonList/salespersonListSelect.vue | 48 + .../system/config/SysConfigFormModal.vue | 123 + src/views/system/config/SysConfigPage.vue | 147 + .../system/config/SysConfigPageSearch.vue | 63 + .../system/dict/DicItemAttributesEditor.vue | 200 + src/views/system/dict/SysDictFormModal.vue | 125 + src/views/system/dict/SysDictItemForm.vue | 142 + src/views/system/dict/SysDictItemModal.vue | 200 + src/views/system/dict/SysDictPage.vue | 149 + src/views/system/dict/SysDictPageSearch.vue | 59 + src/views/system/menu/SysMenuFormModal.vue | 331 + src/views/system/menu/SysMenuPage.vue | 212 + src/views/system/menu/SysMenuPageSearch.vue | 69 + .../organization/SysOrganizationFormModal.vue | 144 + .../organization/SysOrganizationPage.vue | 221 + .../SysOrganizationSearchTree.vue | 80 + .../SysOrganizationTreeSelect.vue | 70 + src/views/system/role/SysRoleFormModal.vue | 167 + src/views/system/role/SysRoleGrantDrawer.vue | 135 + src/views/system/role/SysRolePage.vue | 170 + src/views/system/role/SysRolePageSearch.vue | 59 + src/views/system/role/SysRoleSelect.vue | 48 + src/views/system/role/SysRoleUserModal.vue | 130 + src/views/system/role/SysRoleUserSearch.vue | 69 + src/views/system/user/ChangePasswordModal.vue | 136 + src/views/system/user/SysUserFormModal.vue | 161 + src/views/system/user/SysUserPage.vue | 297 + src/views/system/user/SysUserPageSearch.vue | 95 + src/views/system/user/SysUserScopeModal.vue | 109 + tsconfig.app.json | 23 + tsconfig.json | 11 + tsconfig.node.json | 9 + types/auto-imports.d.ts | 80 + types/components.d.ts | 132 + types/env.d.ts | 15 + types/shims.d.ts | 6 + types/vue-color.d.ts | 105 + vite.config.ts | 135 + 396 files changed, 58641 insertions(+) create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.test create mode 100644 .eslintrc-auto-import.json create mode 100644 .eslintrc.cjs create mode 100644 .github/workflows/deploy-preview.yml create mode 100644 .gitignore create mode 100644 .husky/commit-msg create mode 100644 .husky/common.sh create mode 100644 .husky/pre-commit create mode 100644 .lintstagedrc.json create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 commitlint.config.js create mode 100644 guidelines/UX 规范.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pro-components/card/ProCard.tsx create mode 100644 pro-components/card/components/Actions/index.less create mode 100644 pro-components/card/components/Actions/index.tsx create mode 100644 pro-components/card/components/Card/index.less create mode 100644 pro-components/card/components/Card/index.tsx create mode 100644 pro-components/card/components/Loading/index.less create mode 100644 pro-components/card/components/Loading/index.tsx create mode 100644 pro-components/card/index.tsx create mode 100644 pro-components/card/types.ts create mode 100644 pro-components/field/index.ts create mode 100644 pro-components/form/BaseForm/LightWrapper/index.less create mode 100644 pro-components/form/BaseForm/LightWrapper/index.tsx create mode 100644 pro-components/form/layouts/QueryFilter/Actions.tsx create mode 100644 pro-components/form/layouts/QueryFilter/index.tsx create mode 100644 pro-components/layout/BasicLayout.less create mode 100644 pro-components/layout/BasicLayout.tsx create mode 100644 pro-components/layout/Footer.tsx create mode 100644 pro-components/layout/Header.less create mode 100644 pro-components/layout/Header.tsx create mode 100644 pro-components/layout/RouteContext.tsx create mode 100644 pro-components/layout/WrapContent.tsx create mode 100644 pro-components/layout/components/AntIcon/index.tsx create mode 100644 pro-components/layout/components/FooterToolbar/index.less create mode 100644 pro-components/layout/components/FooterToolbar/index.tsx create mode 100644 pro-components/layout/components/GlobalFooter/index.less create mode 100644 pro-components/layout/components/GlobalFooter/index.tsx create mode 100644 pro-components/layout/components/GlobalHeader/index.less create mode 100644 pro-components/layout/components/GlobalHeader/index.tsx create mode 100644 pro-components/layout/components/GridContent/GridContent.less create mode 100644 pro-components/layout/components/GridContent/index.tsx create mode 100644 pro-components/layout/components/PageContainer/index.less create mode 100644 pro-components/layout/components/PageContainer/index.tsx create mode 100644 pro-components/layout/components/PageLoading/index.tsx create mode 100644 pro-components/layout/components/SettingDrawer/BlockCheckbox.tsx create mode 100644 pro-components/layout/components/SettingDrawer/LayoutChange.tsx create mode 100644 pro-components/layout/components/SettingDrawer/RegionalChange.tsx create mode 100644 pro-components/layout/components/SettingDrawer/ThemeColor.less create mode 100644 pro-components/layout/components/SettingDrawer/ThemeColor.tsx create mode 100644 pro-components/layout/components/SettingDrawer/index.less create mode 100644 pro-components/layout/components/SettingDrawer/index.tsx create mode 100644 pro-components/layout/components/SiderMenu/BaseMenu.tsx create mode 100644 pro-components/layout/components/SiderMenu/SiderMenu.tsx create mode 100644 pro-components/layout/components/SiderMenu/index.less create mode 100644 pro-components/layout/components/SiderMenu/index.tsx create mode 100644 pro-components/layout/components/TopNavHeader/index.less create mode 100644 pro-components/layout/components/TopNavHeader/index.tsx create mode 100644 pro-components/layout/components/WaterMark/index.tsx create mode 100644 pro-components/layout/defaultSettings.ts create mode 100644 pro-components/layout/locales/en-US.ts create mode 100644 pro-components/layout/locales/en-US/settingDrawer.ts create mode 100644 pro-components/layout/locales/index.ts create mode 100644 pro-components/layout/locales/it-IT.ts create mode 100644 pro-components/layout/locales/it-IT/settingDrawer.ts create mode 100644 pro-components/layout/locales/ko-KR.ts create mode 100644 pro-components/layout/locales/ko-KR/settingDrawer.ts create mode 100644 pro-components/layout/locales/types.ts create mode 100644 pro-components/layout/locales/zh-CN.ts create mode 100644 pro-components/layout/locales/zh-CN/settingDrawer.ts create mode 100644 pro-components/layout/locales/zh-TW.ts create mode 100644 pro-components/layout/locales/zh-TW/settingDrawer.ts create mode 100644 pro-components/layout/renderTypes.ts create mode 100644 pro-components/layout/types.ts create mode 100644 pro-components/layout/utils/checkUtils.ts create mode 100644 pro-components/layout/utils/getFlatMenu.ts create mode 100644 pro-components/layout/utils/index.ts create mode 100644 pro-components/layout/utils/menuUtils.ts create mode 100644 pro-components/layout/utils/utils.ts create mode 100644 pro-components/provider/index.tsx create mode 100644 pro-components/provider/locale/ar_EG.tsx create mode 100644 pro-components/provider/locale/ca_ES.tsx create mode 100644 pro-components/provider/locale/de_DE.tsx create mode 100644 pro-components/provider/locale/en_GB.tsx create mode 100644 pro-components/provider/locale/en_US.tsx create mode 100644 pro-components/provider/locale/es_ES.tsx create mode 100644 pro-components/provider/locale/fa_IR.tsx create mode 100644 pro-components/provider/locale/fr_FR.tsx create mode 100644 pro-components/provider/locale/hr_HR.tsx create mode 100644 pro-components/provider/locale/id_ID.tsx create mode 100644 pro-components/provider/locale/it_IT.tsx create mode 100644 pro-components/provider/locale/ja_JP.tsx create mode 100644 pro-components/provider/locale/ko_KR.tsx create mode 100644 pro-components/provider/locale/ms_MY.tsx create mode 100644 pro-components/provider/locale/pl_PL.tsx create mode 100644 pro-components/provider/locale/pt_BR.tsx create mode 100644 pro-components/provider/locale/ru_RU.tsx create mode 100644 pro-components/provider/locale/sr_RS.tsx create mode 100644 pro-components/provider/locale/tr_TR.tsx create mode 100644 pro-components/provider/locale/vi_VN.tsx create mode 100644 pro-components/provider/locale/zh_CN.tsx create mode 100644 pro-components/provider/locale/zh_TW.tsx create mode 100644 pro-components/table/Table.tsx create mode 100644 pro-components/table/components/Alert/index.less create mode 100644 pro-components/table/components/Alert/index.tsx create mode 100644 pro-components/table/components/ColumnSetting/index.less create mode 100644 pro-components/table/components/ColumnSetting/index.tsx create mode 100644 pro-components/table/components/Dropdown/index.less create mode 100644 pro-components/table/components/Dropdown/index.tsx create mode 100644 pro-components/table/components/Form/FormRender.tsx create mode 100644 pro-components/table/components/ListToolBar/HeaderMenu.tsx create mode 100644 pro-components/table/components/ListToolBar/index.less create mode 100644 pro-components/table/components/ListToolBar/index.tsx create mode 100644 pro-components/table/components/ToolBar/DensityIcon.tsx create mode 100644 pro-components/table/components/ToolBar/FullscreenIcon.tsx create mode 100644 pro-components/table/components/ToolBar/index.less create mode 100644 pro-components/table/components/ToolBar/index.tsx create mode 100644 pro-components/table/container.ts create mode 100644 pro-components/table/index.less create mode 100644 pro-components/table/index.tsx create mode 100644 pro-components/table/renderTypes.ts create mode 100644 pro-components/table/typing.ts create mode 100644 pro-components/table/useFetchData.tsx create mode 100644 pro-components/table/utils/columnRender.tsx create mode 100644 pro-components/table/utils/columnSort.ts create mode 100644 pro-components/table/utils/genProColumnToColumn.tsx create mode 100644 pro-components/table/utils/index.ts create mode 100644 pro-components/types.ts create mode 100644 pro-components/utils/array-move/index.ts create mode 100644 pro-components/utils/components/LabelIconTip/index.less create mode 100644 pro-components/utils/components/LabelIconTip/index.tsx create mode 100644 pro-components/utils/genCopyable/index.tsx create mode 100644 pro-components/utils/hooks/useMediaQuery/index.ts create mode 100644 pro-components/utils/hooks/useMergedState/index.ts create mode 100644 pro-components/utils/hooks/usePrevious/index.ts create mode 100644 pro-components/utils/isValidElement/index.ts create mode 100644 pro-components/utils/omitBoolean/index.ts create mode 100644 pro-components/utils/omitUndefined/index.ts create mode 100644 pro-components/utils/omitUndefinedAndEmptyArr/index.ts create mode 100644 pro-components/utils/runFunction/index.ts create mode 100644 pro-components/utils/types/index.ts create mode 100644 pro-components/utils/typing.ts create mode 100644 pro-components/utils/useEditableArray/index.tsx create mode 100644 public/favicon.ico create mode 100644 scripts/preinstall.js create mode 100644 src/App.vue create mode 100644 src/api/auth/captcha.ts create mode 100644 src/api/auth/index.ts create mode 100644 src/api/auth/types.ts create mode 100644 src/api/clueaccess/accessDetail/index.ts create mode 100644 src/api/clueaccess/accessDetail/types.ts create mode 100644 src/api/clueaccess/clueImport/index.ts create mode 100644 src/api/clueaccess/clueImport/types.ts create mode 100644 src/api/clueaccess/importDetail/index.ts create mode 100644 src/api/clueaccess/importDetail/types.ts create mode 100644 src/api/clueaccess/login-log/index.ts create mode 100644 src/api/clueaccess/login-log/types.ts create mode 100644 src/api/clueaccess/operation-log/index.ts create mode 100644 src/api/clueaccess/operation-log/type.ts create mode 100644 src/api/controlcenterstation/customerManagement/index.ts create mode 100644 src/api/controlcenterstation/customerManagement/types.ts create mode 100644 src/api/controlcenterstation/distributionTaskManagement/index.ts create mode 100644 src/api/controlcenterstation/distributionTaskManagement/types.ts create mode 100644 src/api/controlcenterstation/login-log/index.ts create mode 100644 src/api/controlcenterstation/login-log/types.ts create mode 100644 src/api/controlcenterstation/operation-log/index.ts create mode 100644 src/api/controlcenterstation/operation-log/type.ts create mode 100644 src/api/customermanagement/customerList/index.ts create mode 100644 src/api/customermanagement/customerList/types.ts create mode 100644 src/api/i18n/i18n-data.ts create mode 100644 src/api/i18n/types.ts create mode 100644 src/api/index.ts create mode 100644 src/api/log/access-log/index.ts create mode 100644 src/api/log/access-log/types.ts create mode 100644 src/api/log/login-log/index.ts create mode 100644 src/api/log/login-log/types.ts create mode 100644 src/api/log/operation-log/index.ts create mode 100644 src/api/log/operation-log/type.ts create mode 100644 src/api/notify/announcement/index.ts create mode 100644 src/api/notify/announcement/types.ts create mode 100644 src/api/salesmanagement/salespersonList/index.ts create mode 100644 src/api/salesmanagement/salespersonList/types.ts create mode 100644 src/api/system/config/index.ts create mode 100644 src/api/system/config/types.ts create mode 100644 src/api/system/dict/index.ts create mode 100644 src/api/system/dict/types.ts create mode 100644 src/api/system/menu/index.ts create mode 100644 src/api/system/menu/types.ts create mode 100644 src/api/system/organization/index.ts create mode 100644 src/api/system/organization/types.ts create mode 100644 src/api/system/role/index.ts create mode 100644 src/api/system/role/types.ts create mode 100644 src/api/system/user/index.ts create mode 100644 src/api/system/user/types.ts create mode 100644 src/api/types.ts create mode 100644 src/assets/backgroud.svg create mode 100644 src/assets/logo.png create mode 100644 src/assets/sprite.1.2.4.png create mode 100644 src/components/Button/ConfirmTextButton.vue create mode 100644 src/components/Button/DeleteTextButton.vue create mode 100644 src/components/Button/IconButton.tsx create mode 100644 src/components/Button/index.ts create mode 100644 src/components/Captcha/ConcatCaptcha.vue create mode 100644 src/components/Captcha/RotateCaptcha.vue create mode 100644 src/components/Captcha/SliderCaptcha.vue create mode 100644 src/components/Captcha/WordClickCaptcha.vue create mode 100644 src/components/Captcha/index.less create mode 100644 src/components/Captcha/index.ts create mode 100644 src/components/Captcha/types.ts create mode 100644 src/components/Captcha/useCaptcha.ts create mode 100644 src/components/CropperModal/index.vue create mode 100644 src/components/CropperModal/types.ts create mode 100644 src/components/Dict/display/DictBadge.vue create mode 100644 src/components/Dict/display/DictTag.vue create mode 100644 src/components/Dict/display/DictTagGroup.vue create mode 100644 src/components/Dict/display/DictText.vue create mode 100644 src/components/Dict/group/DictCheckboxGroup.vue create mode 100644 src/components/Dict/group/DictRadioGroup.vue create mode 100644 src/components/Dict/group/DictSelect.vue create mode 100644 src/components/Dict/index.ts create mode 100644 src/components/Dict/types.ts create mode 100644 src/components/Dict/use-dict.ts create mode 100644 src/components/Editor/index.vue create mode 100644 src/components/Editor/types.ts create mode 100644 src/components/Editor/view.less create mode 100644 src/components/Editor/wangeditor.d.ts create mode 100644 src/components/IconSelector/IconSelector.vue create mode 100644 src/components/IconSelector/IconSelectorModal.vue create mode 100644 src/components/IconSelector/icons.ts create mode 100644 src/components/IconSelector/index.ts create mode 100644 src/components/IconSelector/types.ts create mode 100644 src/components/Lov/Lov.vue create mode 100644 src/components/Lov/LovModal.vue create mode 100644 src/components/Lov/LovSearch.vue create mode 100644 src/components/Lov/index.ts create mode 100644 src/components/Lov/lov-options.ts create mode 100644 src/components/Lov/type.ts create mode 100644 src/components/Notify/AnnouncementModal.tsx create mode 100644 src/components/Notify/AnnouncementRibbon.vue create mode 100644 src/components/Operation/OperationGroup.vue create mode 100644 src/components/Operation/index.ts create mode 100644 src/components/Search/SearchActions.vue create mode 100644 src/components/SelectLanguage/index.vue create mode 100644 src/config/index.ts create mode 100644 src/hooks/form.ts create mode 100644 src/hooks/i18n.ts create mode 100644 src/hooks/mitt.ts create mode 100644 src/hooks/modal.ts create mode 100644 src/hooks/permission.ts create mode 100644 src/hooks/websocket.ts create mode 100644 src/layouts/BasicLayout.vue create mode 100644 src/layouts/RouterLayout.vue create mode 100644 src/layouts/components/Footer/BallcatFooter.vue create mode 100644 src/layouts/components/HeaderDropdown/index.module.less create mode 100644 src/layouts/components/HeaderDropdown/index.tsx create mode 100644 src/layouts/components/MultiTab/MultiTab.less create mode 100644 src/layouts/components/MultiTab/MultiTab.tsx create mode 100644 src/layouts/components/MultiTab/index.ts create mode 100644 src/layouts/components/MultiTab/types.ts create mode 100644 src/layouts/components/RightContent/AvatarDropdown.vue create mode 100644 src/layouts/components/RightContent/index.less create mode 100644 src/layouts/components/RightContent/index.vue create mode 100644 src/locales/dayjs.ts create mode 100644 src/locales/index.ts create mode 100644 src/locales/lang/en-US.ts create mode 100644 src/locales/lang/en-US/ballcat.json create mode 100644 src/locales/lang/zh-CN.ts create mode 100644 src/locales/lang/zh-CN/ballcat.json create mode 100644 src/main.ts create mode 100644 src/router/constant-routes.ts create mode 100644 src/router/dynamic-routes.ts create mode 100644 src/router/guards.ts create mode 100644 src/router/index.ts create mode 100644 src/router/vue-router.d.ts create mode 100644 src/stores/dict-store.ts create mode 100644 src/stores/i18n-store.ts create mode 100644 src/stores/multitab-store.ts create mode 100644 src/stores/setting-store.ts create mode 100644 src/stores/user-store.ts create mode 100644 src/styles/global.less create mode 100644 src/styles/nprogress.less create mode 100644 src/utils/axios/axios.d.ts create mode 100644 src/utils/axios/http-client.ts create mode 100644 src/utils/axios/index.ts create mode 100644 src/utils/axios/request.ts create mode 100644 src/utils/axios/types.ts create mode 100644 src/utils/bean-utils.ts create mode 100644 src/utils/dom-utils.ts create mode 100644 src/utils/file-utils.ts create mode 100644 src/utils/page-utils.ts create mode 100644 src/utils/password-utils.ts create mode 100644 src/utils/resolvers.ts create mode 100644 src/utils/storage-utils.ts create mode 100644 src/utils/str-utils.ts create mode 100644 src/utils/tree-utils.ts create mode 100644 src/views/basic/exception/index.vue create mode 100644 src/views/basic/iframe/index.vue create mode 100644 src/views/basic/redirect/index.vue create mode 100644 src/views/clueaccess/accessDetail/accessDetail.vue create mode 100644 src/views/clueaccess/accessDetail/accessDetailDistributionModal.vue create mode 100644 src/views/clueaccess/accessDetail/accessDetailModal.vue create mode 100644 src/views/clueaccess/accessDetail/accessDetailSearch.vue create mode 100644 src/views/clueaccess/clueImport.vue create mode 100644 src/views/clueaccess/importDetail/importDetail.vue create mode 100644 src/views/clueaccess/importDetail/importDetailDistributionModal.vue create mode 100644 src/views/clueaccess/importDetail/importDetailSearch.vue create mode 100644 src/views/controlcenterstation/customerManagement/customerManagement.vue create mode 100644 src/views/controlcenterstation/customerManagement/customerManagementModal.vue create mode 100644 src/views/controlcenterstation/customerManagement/customerManagementSearch.vue create mode 100644 src/views/controlcenterstation/distributionTaskManagement/distributionTaskManagement.vue create mode 100644 src/views/controlcenterstation/distributionTaskManagement/distributionTaskManagementModal.vue create mode 100644 src/views/controlcenterstation/distributionTaskManagement/distributionTaskManagementSearch.vue create mode 100644 src/views/customermanagement/customerList/customerList.vue create mode 100644 src/views/customermanagement/customerList/customerListModal.vue create mode 100644 src/views/customermanagement/customerList/customerListSearch.vue create mode 100644 src/views/i18n/LanguageText.vue create mode 100644 src/views/i18n/i18n-data/I18nDataCreateModal.vue create mode 100644 src/views/i18n/i18n-data/I18nDataImportModal.vue create mode 100644 src/views/i18n/i18n-data/I18nDataPage.vue create mode 100644 src/views/i18n/i18n-data/I18nDataPageSearch.vue create mode 100644 src/views/i18n/i18n-data/I18nDataUpdateModal.vue create mode 100644 src/views/log/access-log/AccessLogPage.vue create mode 100644 src/views/log/access-log/AccessLogPageSearch.vue create mode 100644 src/views/log/login-log/LoginLogPage.vue create mode 100644 src/views/log/login-log/LoginLogPageSearch.vue create mode 100644 src/views/log/operation-log/OperationLogPage.vue create mode 100644 src/views/log/operation-log/OperationLogPageSearch.vue create mode 100644 src/views/login/components/AccountLoginForm.vue create mode 100644 src/views/login/components/LoginContent.vue create mode 100644 src/views/login/components/LoginFooter.vue create mode 100644 src/views/login/components/MobileLoginForm.vue create mode 100644 src/views/login/components/loginContent.less create mode 100644 src/views/login/components/types.ts create mode 100644 src/views/login/index.less create mode 100644 src/views/login/index.vue create mode 100644 src/views/notify/announcement/AnnouncementFormModal.vue create mode 100644 src/views/notify/announcement/AnnouncementPage.vue create mode 100644 src/views/notify/announcement/AnnouncementPageSearch.vue create mode 100644 src/views/oauth2/OAuth2Authorize.vue create mode 100644 src/views/oauth2/OAuth2Consent.vue create mode 100644 src/views/salesmanagement/labelRule/labelRule.vue create mode 100644 src/views/salesmanagement/labelRule/labelRuleFormModal.vue create mode 100644 src/views/salesmanagement/salespersonList/ChangePasswordModal.vue create mode 100644 src/views/salesmanagement/salespersonList/salespersonList.vue create mode 100644 src/views/salesmanagement/salespersonList/salespersonListModal.vue create mode 100644 src/views/salesmanagement/salespersonList/salespersonListSearch.vue create mode 100644 src/views/salesmanagement/salespersonList/salespersonListSelect.vue create mode 100644 src/views/system/config/SysConfigFormModal.vue create mode 100644 src/views/system/config/SysConfigPage.vue create mode 100644 src/views/system/config/SysConfigPageSearch.vue create mode 100644 src/views/system/dict/DicItemAttributesEditor.vue create mode 100644 src/views/system/dict/SysDictFormModal.vue create mode 100644 src/views/system/dict/SysDictItemForm.vue create mode 100644 src/views/system/dict/SysDictItemModal.vue create mode 100644 src/views/system/dict/SysDictPage.vue create mode 100644 src/views/system/dict/SysDictPageSearch.vue create mode 100644 src/views/system/menu/SysMenuFormModal.vue create mode 100644 src/views/system/menu/SysMenuPage.vue create mode 100644 src/views/system/menu/SysMenuPageSearch.vue create mode 100644 src/views/system/organization/SysOrganizationFormModal.vue create mode 100644 src/views/system/organization/SysOrganizationPage.vue create mode 100644 src/views/system/organization/SysOrganizationSearchTree.vue create mode 100644 src/views/system/organization/SysOrganizationTreeSelect.vue create mode 100644 src/views/system/role/SysRoleFormModal.vue create mode 100644 src/views/system/role/SysRoleGrantDrawer.vue create mode 100644 src/views/system/role/SysRolePage.vue create mode 100644 src/views/system/role/SysRolePageSearch.vue create mode 100644 src/views/system/role/SysRoleSelect.vue create mode 100644 src/views/system/role/SysRoleUserModal.vue create mode 100644 src/views/system/role/SysRoleUserSearch.vue create mode 100644 src/views/system/user/ChangePasswordModal.vue create mode 100644 src/views/system/user/SysUserFormModal.vue create mode 100644 src/views/system/user/SysUserPage.vue create mode 100644 src/views/system/user/SysUserPageSearch.vue create mode 100644 src/views/system/user/SysUserScopeModal.vue create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 types/auto-imports.d.ts create mode 100644 types/components.d.ts create mode 100644 types/env.d.ts create mode 100644 types/shims.d.ts create mode 100644 types/vue-color.d.ts create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..1acf30e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,28 @@ +# https://editorconfig.org +root = true + +[*] # 标识针对所有文件 +charset = utf-8 +indent_style = space # 缩进风格(tab | space) +indent_size = 2 # 缩进大小 +end_of_line = lf # 换行符 +insert_final_newline = true # 始终在文件末尾插入一个新行 +trim_trailing_whitespace = true # 删除文件中换行符之前的所有空白字符 + +[*.md] # 标识针对 md 文件 +insert_final_newline = false +trim_trailing_whitespace = false + + +[*.{js,ts,jsx,tsx,html}] +semicolon=false +ij_javascript_use_double_quotes = false +ij_typescript_use_double_quotes = false +ij_any_space_inside_empty_tag = true +ij_html_space_inside_empty_tag = true +ij_any_line_comment_add_space = true +ij_javascript_spaces_within_object_literal_braces = true +ij_typescript_spaces_within_object_literal_braces = true +ij_javascript_spaces_within_type_literal_braces = true +ij_typescript_spaces_within_type_literal_braces = true +ij_typescript_spaces_within_imports = true diff --git a/.env b/.env new file mode 100644 index 0000000..fb9d063 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +VITE_API_URL=/api +VITE_API_TIME_OUT=10000 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..edfc4ef --- /dev/null +++ b/.env.development @@ -0,0 +1,4 @@ +VITE_API_URL=/api +VITE_API_TIME_OUT=30000 +VITE_PASSWORD_SECRET_KEY===BallCat-Auth== +VITE_IMAGE_DOMAIN=https://hccake-img.oss-cn-shanghai.aliyuncs.com diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..f9a5cee --- /dev/null +++ b/.env.production @@ -0,0 +1,4 @@ +VITE_API_URL=/api +VITE_API_TIME_OUT=10000 +VITE_PASSWORD_SECRET_KEY===BallCat-Auth== +VITE_IMAGE_DOMAIN=https://hccake-img.oss-cn-shanghai.aliyuncs.com diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..f9a5cee --- /dev/null +++ b/.env.test @@ -0,0 +1,4 @@ +VITE_API_URL=/api +VITE_API_TIME_OUT=10000 +VITE_PASSWORD_SECRET_KEY===BallCat-Auth== +VITE_IMAGE_DOMAIN=https://hccake-img.oss-cn-shanghai.aliyuncs.com diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json new file mode 100644 index 0000000..6ac6d78 --- /dev/null +++ b/.eslintrc-auto-import.json @@ -0,0 +1,79 @@ +{ + "globals": { + "Component": true, + "ComponentPublicInstance": true, + "ComputedRef": true, + "EffectScope": true, + "InjectionKey": true, + "PropType": true, + "Ref": true, + "VNode": true, + "acceptHMRUpdate": true, + "computed": true, + "createApp": true, + "createPinia": true, + "customRef": true, + "defineAsyncComponent": true, + "defineComponent": true, + "defineStore": true, + "effectScope": true, + "getActivePinia": true, + "getCurrentInstance": true, + "getCurrentScope": true, + "h": true, + "inject": true, + "isProxy": true, + "isReactive": true, + "isReadonly": true, + "isRef": true, + "mapActions": true, + "mapGetters": true, + "mapState": true, + "mapStores": true, + "mapWritableState": true, + "markRaw": true, + "nextTick": true, + "onActivated": true, + "onBeforeMount": true, + "onBeforeRouteLeave": true, + "onBeforeRouteUpdate": true, + "onBeforeUnmount": true, + "onBeforeUpdate": true, + "onDeactivated": true, + "onErrorCaptured": true, + "onMounted": true, + "onRenderTracked": true, + "onRenderTriggered": true, + "onScopeDispose": true, + "onServerPrefetch": true, + "onUnmounted": true, + "onUpdated": true, + "provide": true, + "reactive": true, + "readonly": true, + "ref": true, + "resolveComponent": true, + "setActivePinia": true, + "setMapStoreSuffix": true, + "shallowReactive": true, + "shallowReadonly": true, + "shallowRef": true, + "storeToRefs": true, + "toRaw": true, + "toRef": true, + "toRefs": true, + "triggerRef": true, + "unref": true, + "useAttrs": true, + "useCssModule": true, + "useCssVars": true, + "useLink": true, + "useRoute": true, + "useRouter": true, + "useSlots": true, + "watch": true, + "watchEffect": true, + "watchPostEffect": true, + "watchSyncEffect": true + } +} \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..faab54e --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,28 @@ +/* eslint-env node */ +require('@rushstack/eslint-patch/modern-module-resolution') + +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:vue/vue3-recommended', + '@vue/eslint-config-typescript/recommended', + '@vue/eslint-config-prettier', + './.eslintrc-auto-import.json' // auto-imports 使用 + ], + env: { + node: true, + 'vue/setup-compiler-macros': true + }, + rules: { + // 允许使用 any + '@typescript-eslint/no-explicit-any': 'off', + // 允许使用 @ts-ignore 注释 + '@typescript-eslint/ban-ts-comment': 'off', + // 允许空方法 + '@typescript-eslint/no-empty-function': 'off', + // 允许非空断言 + '@typescript-eslint/no-non-null-assertion': 'off', + 'vue/no-template-shadow': 'off' + } +} diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml new file mode 100644 index 0000000..ad74cb8 --- /dev/null +++ b/.github/workflows/deploy-preview.yml @@ -0,0 +1,49 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + +name: Deploy to preview server + +on: + push: + branches: [ "master" ] + # 手动触发事件 + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v3 + + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install npm dependencies + run: pnpm install + + - name: Run build task + run: pnpm build-only + + - name: Deploy to Server + uses: easingthemes/ssh-deploy@main + env: + SSH_PRIVATE_KEY: ${{ secrets.PREVIEW_SERVER_SSH_PRIVATE_KEY }} + ARGS: '-avz --delete' + SOURCE: 'dist/' + REMOTE_HOST: ${{ secrets.PREVIEW_SERVER_HOST }} + REMOTE_USER: ${{ secrets.PREVIEW_SERVER_USER }} + TARGET: ${{ secrets.VUE3_TARGET }} + EXCLUDE: "/dist/, /node_modules/" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6df25ef --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.eslintcache diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..5a85000 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no -- commitlint --edit $1 diff --git a/.husky/common.sh b/.husky/common.sh new file mode 100644 index 0000000..7bf8076 --- /dev/null +++ b/.husky/common.sh @@ -0,0 +1,8 @@ +command_exists () { + command -v "$1" >/dev/null 2>&1 +} + +# Workaround for Windows 10, Git Bash and Yarn +if command_exists winpty && test -t 1; then + exec < /dev/tty +fi diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..36af219 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx lint-staged diff --git a/.lintstagedrc.json b/.lintstagedrc.json new file mode 100644 index 0000000..5194eed --- /dev/null +++ b/.lintstagedrc.json @@ -0,0 +1,5 @@ +{ + "src/**/*.{vue,js,jsx,cjs,mjs,ts,tsx,cts,mts,css}": [ + "eslint --fix" + ] +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..f7e39e6 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +/dist/* +.local +.output.js +/node_modules/** + +**/*.svg +**/*.sh + +/public/* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d9c7a9c --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +semi: false # 语句末尾是否加分号 +singleQuote: true # 使用单引号代替双引号 +printWidth: 100 # 超过多长进行换行 +trailingComma: 'none' # 多行输入的尾逗号是否添加 +arrowParens: 'avoid' # (x) => {} 箭头函数参数只有一个时是否要有小括号。avoid:省略括号 +endOfLine: 'lf' # 格式化换行符,默认值 lf +# vueIndentScriptAndStyle: true # vue script 标签的缩进开启 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a245034 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "Vue.volar", + "Vue.vscode-typescript-vue-plugin" + ] +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ff77379 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + https://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..143a381 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# ballcat-ui-vue3 + +项目开发中.... + +二开时请不要修改 pro-componets 内部文件,其对标 react 版本的 pro-componets, +如有任何需要修改的问题,或者和 react 版本不一致的现象,请提 issues, 会尽快解决。 + +目前功能还在移植中,由于工作量太大,初版本只考虑移植 pro-layout 以及 pro-table(精简掉 searchform 模块), +后续 pro-components 将独立出一个仓库进行维护,同时会发布到 npm 仓库,方便引用。 + +## 包管理工具 + +项目强制要求使用 pnpm 进行依赖管理,使用 npm 或者 yarn 下载依赖将会报错。 +```shell +npm install -g pnpm +pnpm install +``` + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin). + +## Type Support for `.vue` Imports in TS + +TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin) to make the TypeScript language service aware of `.vue` types. + +If the standalone TypeScript plugin doesn't feel fast enough to you, Volar has also implemented a [Take Over Mode](https://github.com/vuejs/language-tools/discussions/471#discussioncomment-1361669) that is more performant. You can enable it by the following steps: + +1. Disable the built-in TypeScript Extension + 1. Run `Extensions: Show Built-in Extensions` from VSCode's command palette + 2. Find `TypeScript and JavaScript Language Features`, right click and select `Disable (Workspace)` +2. Reload the VSCode window by running `Developer: Reload Window` from the command palette. + +## Customize configuration + +See [Vite Configuration Reference](https://vitejs.dev/config/). + +## Project Setup + +```sh +pnpm install +``` + +### Compile and Hot-Reload for Development + +```sh +pnpm run dev +``` + +### Type-Check, Compile and Minify for Production + +```sh +pnpm run build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +pnpm run lint +``` diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..48b4e34 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: ['./node_modules/@ballcat/commitlint-config-gitmoji'] +} diff --git a/guidelines/UX 规范.md b/guidelines/UX 规范.md new file mode 100644 index 0000000..d6152d8 --- /dev/null +++ b/guidelines/UX 规范.md @@ -0,0 +1,38 @@ +## 文本使用规范: + +### 新建:New +"New" 可以用来表示用户正在创建新的数据或对象,例如新建账户、新建文档、新建任务等。 +"New" 通常用于界面的按钮或菜单项上,用于启动新建操作。 + +### 创建:Create +"Create" 可以用于描述用户正在创建新的数据或对象,例如创建账户、创建文档、创建任务等。 +"Create" 部分情况下可以与 "NEW" 互换使用,但是 "Create" 更倾向于表述一个行为,可以作为新建表单的提交按钮。 + +### 添加: Add +“Add” 意味着在现有的集合中添加一个新的对象或元素,例如添加一个新的条目到列表中,或向现有的组织中添加新的成员。 + +### 编辑:Edit +通常用来表示用户对某个数据或信息进行修改,例如编辑文本、编辑图片等。 + +### 更新:Update +通常用来表示数据或信息的更新,例如更新软件、更新文章、更新个人资料等。 +类似于 "Create", "Update" 也更倾向于表述一个行为。 + +### 改变: Change +通常是更改一个已经存在的状态或值,例如更改颜色、更改语言、更改设置等。 + +### 删除:Delete +"Delete" 通常用于表示用户将某些数据或对象彻底删除,例如删除文件、删除账户、删除联系人等。 +"Delete" 可能会触发某些警告或确认对话框,以确保用户意识到自己正在执行的操作可能不可逆转。 + +### 移除:Remove +"Remove" 通常用于表示用户从某个列表或集合中删除某些数据或对象,例如从购物车中移除商品、从播放列表中移除歌曲等。 +"Remove" 不一定会将数据或对象从系统中彻底删除,而是可能将其移动到其他位置或状态。 + +### 提交:Submit +"Submit" 通常用于表示用户已经完成某项操作并将其提交到系统或其他人进行处理,例如提交表单、提交评论、提交订单等。 +通常情况下,提交操作可能需要验证用户输入的数据或进行其他额外的处理,例如检查表单是否完整、验证邮箱地址是否有效等。 + +### 保存:Save +"Save" 通常用于表示用户需要保存当前的操作或状态,例如保存文档、保存设置、保存账户信息等。 +通常情况下,保存操作不需要进行额外的验证或处理,只是将当前的数据或状态保存到系统中, 适用于在编辑表单中做为操作按钮。 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..737f4d3 --- /dev/null +++ b/index.html @@ -0,0 +1,222 @@ + + + + + + + + <%- title %> + + + +
+ +
+ logo +
+
+ + + + + + +
+
+
+ <%- title %> +
+
+
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d79c5e4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,15305 @@ +{ + "name": "ballcat-ui-vue3", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "ballcat-ui-vue3", + "version": "0.0.0", + "hasInstallScript": true, + "dependencies": { + "@ant-design/icons-vue": "^6.1.0", + "@ballcat/vue-cropper": "^1.0.5", + "@ckpack/vue-color": "^1.4.1", + "@vueuse/core": "^10.1.2", + "@vueuse/shared": "^10.1.2", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "ant-design-vue": "^3.2.20", + "axios": "^1.4.0", + "cropperjs": "^1.5.13", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.7", + "json-bigint": "^1.0.0", + "mitt": "^3.0.0", + "nprogress": "^0.2.0", + "pinia": "^2.1.3", + "qs": "^6.11.2", + "vue": "^3.3.4", + "vue-i18n": "^9.2.2", + "vue-router": "^4.2.1" + }, + "devDependencies": { + "@ballcat/commitlint-config-gitmoji": "^1.1.0", + "@commitlint/cli": "^17.6.3", + "@intlify/unplugin-vue-i18n": "^0.10.0", + "@rushstack/eslint-patch": "^1.2.0", + "@tsconfig/node18": "^2.0.1", + "@types/crypto-js": "^4.1.1", + "@types/json-bigint": "^1.0.1", + "@types/node": "^18.16.8", + "@types/nprogress": "^0.2.0", + "@types/qs": "^6.9.7", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue/eslint-config-prettier": "^7.1.0", + "@vue/eslint-config-typescript": "^11.0.3", + "@vue/tsconfig": "^0.4.0", + "@wangeditor/core": "^1.1.19", + "eslint": "^8.41.0", + "eslint-plugin-vue": "^9.13.0", + "husky": "^8.0.3", + "less": "^4.1.3", + "lint-staged": "^13.2.2", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.8", + "typescript": "~5.0.4", + "unplugin-auto-import": "^0.16.0", + "unplugin-vue-components": "^0.24.1", + "vite": "^4.3.8", + "vite-plugin-html": "^3.2.0", + "vue-tsc": "~1.6.5" + }, + "engines": { + "node": ">=16.11.0", + "pnpm": ">=8" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz", + "integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.5.tgz", + "integrity": "sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ballcat/commitlint-config-gitmoji": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@ballcat/commitlint-config-gitmoji/-/commitlint-config-gitmoji-1.1.0.tgz", + "integrity": "sha512-bb9EuwKGItogf68b84KxnHYZIceVNgMaA23lUDrWVFyu2Q4q4HtDpmFw8Gh6NdJTnGx1lgoVKowHl1o6Wb66yw==", + "dev": true, + "dependencies": { + "gitmojis": "^3.12.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@ballcat/vue-cropper": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@ballcat/vue-cropper/-/vue-cropper-1.0.5.tgz", + "integrity": "sha512-1rgufxZSAy+X427RZeiOXvGdiwHk1FbantHjv0vq4SZADta0mxrznz6fd7TTHG4/pmKdUxnXF6vR4kB7aPwkDA==", + "dependencies": { + "cropperjs": "^1.5.13" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/@ckpack/vue-color": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@ckpack/vue-color/-/vue-color-1.5.0.tgz", + "integrity": "sha512-dj1zXVyay2m4LdlLJCQSdIS2FYwUl77BZqyKmUXiehyqjCP0bGYnPcL38lrShzYUc2FdkYQX8ANZZjRahd4PQw==", + "dependencies": { + "@ctrl/tinycolor": "^3.6.0", + "material-colors": "^1.2.6" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/cli/-/cli-17.6.7.tgz", + "integrity": "sha512-nzZmfO5KIOupYppn1MsnYX/80I+KDlxiwkks3CJT0XT+t34UgqGi3eSyEuzgcIjPlORk5/GMaAEiys78iLfGMg==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.6.7", + "@commitlint/load": "^17.6.7", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-17.6.7.tgz", + "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/ensure": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/ensure/-/ensure-17.6.7.tgz", + "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmmirror.com/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/is-ignored/-/is-ignored-17.6.7.tgz", + "integrity": "sha512-vqyNRqtbq72P2JadaoWiuoLtXIs9SaAWDqdtef6G2zsoXqKFc7vqj1f+thzVgosXG3X/5K9jNp+iYijmvOfc/g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "semver": "7.5.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/lint/-/lint-17.6.7.tgz", + "integrity": "sha512-TW+AozfuOFMrHn+jdwtz0IWu8REKFp0eryOvoBp2r8IXNc4KihKB1spAiUB6SFyHD6hVVeolz12aHnJ3Mb+xVQ==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.6.7", + "@commitlint/parse": "^17.6.7", + "@commitlint/rules": "^17.6.7", + "@commitlint/types": "^17.4.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/load/-/load-17.6.7.tgz", + "integrity": "sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.6.7", + "@commitlint/types": "^17.4.4", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmmirror.com/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/parse/-/parse-17.6.7.tgz", + "integrity": "sha512-ibO03BgEns+JJpohpBZYD49mCdSNMg6fTv7vA5yqzEFWkBQk5NWhEBw2yG+Z1UClStIRkMkAYyI2HzoQG9tCQQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmmirror.com/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", + "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/rules/-/rules-17.6.7.tgz", + "integrity": "sha512-x/SDwDTN3w3Gr5xkhrIORu96rlKCc8ZLYEMXRqi9+MB33st2mKcGvKa5uJuigHlbl3xm75bAAubATrodVrjguQ==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.6.7", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmmirror.com/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@intlify/bundle-utils": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/@intlify/bundle-utils/-/bundle-utils-5.5.0.tgz", + "integrity": "sha512-k5xe8oAoPXiH6unXvyyyCRbq+LtLn1tSi/6r5f6mF+MsX7mcOMtgYbyAQINsjFrf7EDu5Pg4BY00VWSt8bI9XQ==", + "dev": true, + "dependencies": { + "@intlify/message-compiler": "9.3.0-beta.17", + "@intlify/shared": "9.3.0-beta.17", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^1.0.1", + "magic-string": "^0.30.0", + "source-map": "0.6.1", + "yaml-eslint-parser": "^0.3.2" + }, + "engines": { + "node": ">= 12" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "dependencies": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/core-base/node_modules/@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "dependencies": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/core-base/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "dependencies": { + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/devtools-if/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.3.0-beta.17", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.3.0-beta.17.tgz", + "integrity": "sha512-i7hvVIRk1Ax2uKa9xLRJCT57to08OhFMhFXXjWN07rmx5pWQYQ23MfX1xgggv9drnWTNhqEiD+u4EJeHoS5+Ww==", + "dev": true, + "dependencies": { + "@intlify/shared": "9.3.0-beta.17", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/shared": { + "version": "9.3.0-beta.17", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.3.0-beta.17.tgz", + "integrity": "sha512-mscf7RQsUTOil35jTij4KGW1RC9SWQjYScwLxP53Ns6g24iEd5HN7ksbt9O6FvTmlQuX77u+MXpBdfJsGqizLQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "0.10.1", + "resolved": "https://registry.npmmirror.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.10.1.tgz", + "integrity": "sha512-9ZzE0ddlDO06Xzg25JPiNbx6PJPDho5k/Np+uL9fJRZEKq2TxT3c+ZK+Pec6j0ybhhVXeda8/yE3tPUf4SOXZQ==", + "dev": true, + "dependencies": { + "@intlify/bundle-utils": "^5.4.0", + "@intlify/shared": "9.3.0-beta.17", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map": "0.6.1", + "unplugin": "^1.1.0" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vue-i18n": "*", + "vue-i18n-bridge": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } + } + }, + "node_modules/@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", + "dependencies": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/vue-devtools/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==", + "dev": true + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@transloadit/prettier-bytes": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", + "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tsconfig/node18": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@tsconfig/node18/-/node18-2.0.1.tgz", + "integrity": "sha512-UqdfvuJK0SArA2CxhKWwwAWfnVSXiYe63bVpMutc27vpngCntGUZQETO24pEJ46zU6XM+7SpqYoMgcO3bM11Ew==", + "dev": true + }, + "node_modules/@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "node_modules/@types/event-emitter": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.3.tgz", + "integrity": "sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==" + }, + "node_modules/@types/json-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.17.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.17.1.tgz", + "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", + "dev": true + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@uppy/companion-client": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz", + "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==", + "dependencies": { + "@uppy/utils": "^4.1.2", + "namespace-emitter": "^2.0.1" + } + }, + "node_modules/@uppy/core": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz", + "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", + "dependencies": { + "@transloadit/prettier-bytes": "0.0.7", + "@uppy/store-default": "^2.1.1", + "@uppy/utils": "^4.1.3", + "lodash.throttle": "^4.1.1", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^3.1.25", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/store-default": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz", + "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==" + }, + "node_modules/@uppy/utils": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz", + "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==", + "dependencies": { + "lodash.throttle": "^4.1.1" + } + }, + "node_modules/@uppy/xhr-upload": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", + "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", + "dependencies": { + "@uppy/companion-client": "^2.2.2", + "@uppy/utils": "^4.1.2", + "nanoid": "^3.1.25" + }, + "peerDependencies": { + "@uppy/core": "^2.3.3" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz", + "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.7", + "@babel/plugin-transform-typescript": "^7.20.7", + "@vue/babel-plugin-jsx": "^1.1.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.4.1.tgz", + "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.4.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.4.1.tgz", + "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", + "dev": true, + "dependencies": { + "muggle-string": "^0.2.2" + } + }, + "node_modules/@volar/typescript": { + "version": "1.4.1-patch.2", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.4.1-patch.2.tgz", + "integrity": "sha512-lPFYaGt8OdMEzNGJJChF40uYqMO4Z/7Q9fHPQC/NRVtht43KotSXLrkPandVVMf9aPbiJ059eAT+fwHGX16k4w==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.4.1" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/vue-language-core": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.6.5.tgz", + "integrity": "sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.4.1", + "@volar/source-map": "1.4.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/compiler-sfc": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + } + }, + "node_modules/@volar/vue-language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@volar/vue-language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@volar/vue-typescript": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.6.5.tgz", + "integrity": "sha512-er9rVClS4PHztMUmtPMDTl+7c7JyrxweKSAEe/o/Noeq2bQx6v3/jZHVHBe8ZNUti5ubJL/+Tg8L3bzmlalV8A==", + "deprecated": "WARNING: This project has been renamed to @vue/typescript. Install using @vue/typescript instead.", + "dev": true, + "dependencies": { + "@volar/typescript": "1.4.1-patch.2", + "@volar/vue-language-core": "1.6.5" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz", + "integrity": "sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0" + }, + "peerDependencies": { + "eslint": ">= 7.28.0", + "prettier": ">= 2.0.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.2.1.tgz", + "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==", + "dependencies": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.2.1.tgz", + "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==" + }, + "node_modules/@vueuse/shared": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.2.1.tgz", + "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==", + "dependencies": { + "vue-demi": ">=0.14.5" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@wangeditor/basic-modules": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", + "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", + "dependencies": { + "is-url": "^1.2.4" + }, + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.throttle": "^4.1.1", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/code-highlight": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz", + "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==", + "dependencies": { + "prismjs": "^1.23.0" + }, + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/core": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz", + "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", + "dependencies": { + "@types/event-emitter": "^0.3.3", + "event-emitter": "^0.3.5", + "html-void-elements": "^2.0.0", + "i18next": "^20.4.0", + "scroll-into-view-if-needed": "^2.2.28", + "slate-history": "^0.66.0" + }, + "peerDependencies": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/editor": { + "version": "5.1.23", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz", + "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", + "dependencies": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "^1.1.7", + "@wangeditor/code-highlight": "^1.0.3", + "@wangeditor/core": "^1.1.19", + "@wangeditor/list-module": "^1.0.5", + "@wangeditor/table-module": "^1.1.4", + "@wangeditor/upload-image-module": "^1.0.2", + "@wangeditor/video-module": "^1.1.4", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/editor-for-vue": { + "version": "5.1.12", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz", + "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==", + "peerDependencies": { + "@wangeditor/editor": ">=5.1.0", + "vue": "^3.0.5" + } + }, + "node_modules/@wangeditor/list-module": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz", + "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==", + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/table-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz", + "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==", + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/upload-image-module": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz", + "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==", + "peerDependencies": { + "@uppy/core": "^2.0.3", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "1.x", + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.foreach": "^4.5.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/video-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz", + "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==", + "peerDependencies": { + "@uppy/core": "^2.1.4", + "@uppy/xhr-upload": "^2.0.7", + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ant-design-vue": { + "version": "3.2.20", + "resolved": "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-3.2.20.tgz", + "integrity": "sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^6.1.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.4.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmmirror.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "dependencies": { + "is-what": "^3.14.1" + } + }, + "node_modules/core-js": { + "version": "3.32.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", + "hasInstallScript": true + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", + "dev": true, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cropperjs": { + "version": "1.5.13", + "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.5.13.tgz", + "integrity": "sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/dom7": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz", + "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", + "dependencies": { + "ssr-window": "^3.0.0-alpha.1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.475", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.475.tgz", + "integrity": "sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.9.0", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz", + "integrity": "sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.15.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz", + "integrity": "sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.3.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.3.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gitmojis": { + "version": "3.13.5", + "resolved": "https://registry.npmmirror.com/gitmojis/-/gitmojis-3.13.5.tgz", + "integrity": "sha512-MLM88QAaWpYWlvtBjHBxshI9AGRH+LLluD6NbhymeWp0EQ1Sew8SgC0BpiQuQ4DCYGKs9LcX4zRL3lDlwOPA5g==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true, + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/i18next": { + "version": "20.6.1", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz", + "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==", + "dependencies": { + "@babel/runtime": "^7.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz", + "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==", + "dev": true, + "dependencies": { + "acorn": "^7.4.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^6.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/less": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/lint-staged": { + "version": "13.2.3", + "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "dev": true, + "dependencies": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmmirror.com/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "dependencies": { + "wildcard": "^1.1.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.2.2.tgz", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/nanopop/-/nanopop-2.3.0.tgz", + "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm-run-all/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/npm-run-all/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/npm-run-all/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/npm-run-all/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/npm-run-all/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/npm-run-all/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npm-run-all/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-all/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-all/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/preact": { + "version": "10.16.0", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.16.0.tgz", + "integrity": "sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/scule": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slate": { + "version": "0.72.8", + "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz", + "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", + "dependencies": { + "immer": "^9.0.6", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-history": { + "version": "0.66.0", + "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz", + "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/snabbdom": { + "version": "3.5.1", + "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz", + "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==", + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/ssr-window": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz", + "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "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" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/unimport": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.1.0.tgz", + "integrity": "sha512-ybK3NVWh30MdiqSyqakrrQOeiXyu5507tDA0tUf7VJHrsq4DM6S43gR7oAsZaFojM32hzX982Lqw02D3yf2aiA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.0.0", + "strip-literal": "^1.0.1", + "unplugin": "^1.4.0" + } + }, + "node_modules/unimport/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "0.16.6", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.16.6.tgz", + "integrity": "sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.2", + "unimport": "^3.0.14", + "unplugin": "^1.3.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-auto-import/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-auto-import/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.24.1", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.24.1.tgz", + "integrity": "sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.2", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.0", + "minimatch": "^7.4.2", + "resolve": "^1.22.1", + "unplugin": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vite": { + "version": "4.4.7", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-html": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz", + "integrity": "sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-html/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/vite-plugin-html/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vite-plugin-html/node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.1", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/vue-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz", + "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", + "dependencies": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2", + "@vue/devtools-api": "^6.2.1" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-i18n/node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.6.5.tgz", + "integrity": "sha512-Wtw3J7CC+JM2OR56huRd5iKlvFWpvDiU+fO1+rqyu4V2nMTotShz4zbOZpW5g9fUOcjnyZYfBo5q5q+D/q27JA==", + "dev": true, + "dependencies": { + "@volar/vue-language-core": "1.6.5", + "@volar/vue-typescript": "1.6.5", + "semver": "^7.3.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-types/node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz", + "integrity": "sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.3.0", + "lodash": "^4.17.20", + "yaml": "^1.10.0" + } + }, + "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/yaml-eslint-parser/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "requires": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "@ant-design/icons-vue": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz", + "integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + } + }, + "@antfu/utils": { + "version": "0.7.5", + "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.5.tgz", + "integrity": "sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true + }, + "@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz", + "integrity": "sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.22.9", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz", + "integrity": "sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + } + }, + "@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@ballcat/commitlint-config-gitmoji": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@ballcat/commitlint-config-gitmoji/-/commitlint-config-gitmoji-1.1.0.tgz", + "integrity": "sha512-bb9EuwKGItogf68b84KxnHYZIceVNgMaA23lUDrWVFyu2Q4q4HtDpmFw8Gh6NdJTnGx1lgoVKowHl1o6Wb66yw==", + "dev": true, + "requires": { + "gitmojis": "^3.12.0" + } + }, + "@ballcat/vue-cropper": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@ballcat/vue-cropper/-/vue-cropper-1.0.5.tgz", + "integrity": "sha512-1rgufxZSAy+X427RZeiOXvGdiwHk1FbantHjv0vq4SZADta0mxrznz6fd7TTHG4/pmKdUxnXF6vR4kB7aPwkDA==", + "requires": { + "cropperjs": "^1.5.13" + } + }, + "@ckpack/vue-color": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@ckpack/vue-color/-/vue-color-1.5.0.tgz", + "integrity": "sha512-dj1zXVyay2m4LdlLJCQSdIS2FYwUl77BZqyKmUXiehyqjCP0bGYnPcL38lrShzYUc2FdkYQX8ANZZjRahd4PQw==", + "requires": { + "@ctrl/tinycolor": "^3.6.0", + "material-colors": "^1.2.6" + } + }, + "@commitlint/cli": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/cli/-/cli-17.6.7.tgz", + "integrity": "sha512-nzZmfO5KIOupYppn1MsnYX/80I+KDlxiwkks3CJT0XT+t34UgqGi3eSyEuzgcIjPlORk5/GMaAEiys78iLfGMg==", + "dev": true, + "requires": { + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.6.7", + "@commitlint/load": "^17.6.7", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + } + }, + "@commitlint/config-validator": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-17.6.7.tgz", + "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", + "dev": true, + "requires": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + } + }, + "@commitlint/ensure": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/ensure/-/ensure-17.6.7.tgz", + "integrity": "sha512-mfDJOd1/O/eIb/h4qwXzUxkmskXDL9vNPnZ4AKYKiZALz4vHzwMxBSYtyL2mUIDeU9DRSpEUins8SeKtFkYHSw==", + "dev": true, + "requires": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + } + }, + "@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true + }, + "@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmmirror.com/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "dev": true, + "requires": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + } + }, + "@commitlint/is-ignored": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/is-ignored/-/is-ignored-17.6.7.tgz", + "integrity": "sha512-vqyNRqtbq72P2JadaoWiuoLtXIs9SaAWDqdtef6G2zsoXqKFc7vqj1f+thzVgosXG3X/5K9jNp+iYijmvOfc/g==", + "dev": true, + "requires": { + "@commitlint/types": "^17.4.4", + "semver": "7.5.2" + } + }, + "@commitlint/lint": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/lint/-/lint-17.6.7.tgz", + "integrity": "sha512-TW+AozfuOFMrHn+jdwtz0IWu8REKFp0eryOvoBp2r8IXNc4KihKB1spAiUB6SFyHD6hVVeolz12aHnJ3Mb+xVQ==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^17.6.7", + "@commitlint/parse": "^17.6.7", + "@commitlint/rules": "^17.6.7", + "@commitlint/types": "^17.4.4" + } + }, + "@commitlint/load": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/load/-/load-17.6.7.tgz", + "integrity": "sha512-QZ2rJTbX55BQdYrCm/p6+hh/pFBgC9nTJxfsrK6xRPe2thiQzHN0AQDBqBwAirn6gIkHrjIbCbtAE6kiDYLjrw==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.6.7", + "@commitlint/types": "^17.4.4", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + } + }, + "@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmmirror.com/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "dev": true + }, + "@commitlint/parse": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/parse/-/parse-17.6.7.tgz", + "integrity": "sha512-ibO03BgEns+JJpohpBZYD49mCdSNMg6fTv7vA5yqzEFWkBQk5NWhEBw2yG+Z1UClStIRkMkAYyI2HzoQG9tCQQ==", + "dev": true, + "requires": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + } + }, + "@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmmirror.com/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "dev": true, + "requires": { + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + } + }, + "@commitlint/resolve-extends": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", + "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^17.6.7", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + } + }, + "@commitlint/rules": { + "version": "17.6.7", + "resolved": "https://registry.npmmirror.com/@commitlint/rules/-/rules-17.6.7.tgz", + "integrity": "sha512-x/SDwDTN3w3Gr5xkhrIORu96rlKCc8ZLYEMXRqi9+MB33st2mKcGvKa5uJuigHlbl3xm75bAAubATrodVrjguQ==", + "dev": true, + "requires": { + "@commitlint/ensure": "^17.6.7", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + } + }, + "@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true + }, + "@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmmirror.com/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, + "requires": { + "find-up": "^5.0.0" + } + }, + "@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmmirror.com/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==" + }, + "@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@intlify/bundle-utils": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/@intlify/bundle-utils/-/bundle-utils-5.5.0.tgz", + "integrity": "sha512-k5xe8oAoPXiH6unXvyyyCRbq+LtLn1tSi/6r5f6mF+MsX7mcOMtgYbyAQINsjFrf7EDu5Pg4BY00VWSt8bI9XQ==", + "dev": true, + "requires": { + "@intlify/message-compiler": "9.3.0-beta.17", + "@intlify/shared": "9.3.0-beta.17", + "acorn": "^8.8.2", + "escodegen": "^2.0.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^1.0.1", + "magic-string": "^0.30.0", + "source-map": "0.6.1", + "yaml-eslint-parser": "^0.3.2" + } + }, + "@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "requires": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "dependencies": { + "@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "requires": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + } + }, + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "requires": { + "@intlify/shared": "9.2.2" + }, + "dependencies": { + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "@intlify/message-compiler": { + "version": "9.3.0-beta.17", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.3.0-beta.17.tgz", + "integrity": "sha512-i7hvVIRk1Ax2uKa9xLRJCT57to08OhFMhFXXjWN07rmx5pWQYQ23MfX1xgggv9drnWTNhqEiD+u4EJeHoS5+Ww==", + "dev": true, + "requires": { + "@intlify/shared": "9.3.0-beta.17", + "source-map": "0.6.1" + } + }, + "@intlify/shared": { + "version": "9.3.0-beta.17", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.3.0-beta.17.tgz", + "integrity": "sha512-mscf7RQsUTOil35jTij4KGW1RC9SWQjYScwLxP53Ns6g24iEd5HN7ksbt9O6FvTmlQuX77u+MXpBdfJsGqizLQ==", + "dev": true + }, + "@intlify/unplugin-vue-i18n": { + "version": "0.10.1", + "resolved": "https://registry.npmmirror.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.10.1.tgz", + "integrity": "sha512-9ZzE0ddlDO06Xzg25JPiNbx6PJPDho5k/Np+uL9fJRZEKq2TxT3c+ZK+Pec6j0ybhhVXeda8/yE3tPUf4SOXZQ==", + "dev": true, + "requires": { + "@intlify/bundle-utils": "^5.4.0", + "@intlify/shared": "9.3.0-beta.17", + "@rollup/pluginutils": "^5.0.2", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map": "0.6.1", + "unplugin": "^1.1.0" + } + }, + "@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", + "requires": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + }, + "dependencies": { + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + } + }, + "@rushstack/eslint-patch": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==", + "dev": true + }, + "@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "requires": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "@transloadit/prettier-bytes": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", + "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@tsconfig/node18": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@tsconfig/node18/-/node18-2.0.1.tgz", + "integrity": "sha512-UqdfvuJK0SArA2CxhKWwwAWfnVSXiYe63bVpMutc27vpngCntGUZQETO24pEJ46zU6XM+7SpqYoMgcO3bM11Ew==", + "dev": true + }, + "@types/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==", + "dev": true + }, + "@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true + }, + "@types/event-emitter": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.3.tgz", + "integrity": "sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==" + }, + "@types/json-bigint": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@types/json-bigint/-/json-bigint-1.0.1.tgz", + "integrity": "sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "18.17.1", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.17.1.tgz", + "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "@uppy/companion-client": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz", + "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==", + "requires": { + "@uppy/utils": "^4.1.2", + "namespace-emitter": "^2.0.1" + } + }, + "@uppy/core": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz", + "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", + "requires": { + "@transloadit/prettier-bytes": "0.0.7", + "@uppy/store-default": "^2.1.1", + "@uppy/utils": "^4.1.3", + "lodash.throttle": "^4.1.1", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^3.1.25", + "preact": "^10.5.13" + } + }, + "@uppy/store-default": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz", + "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==" + }, + "@uppy/utils": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz", + "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==", + "requires": { + "lodash.throttle": "^4.1.1" + } + }, + "@uppy/xhr-upload": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", + "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", + "requires": { + "@uppy/companion-client": "^2.2.2", + "@uppy/utils": "^4.1.2", + "nanoid": "^3.1.25" + } + }, + "@vitejs/plugin-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", + "dev": true, + "requires": {} + }, + "@vitejs/plugin-vue-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.1.tgz", + "integrity": "sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==", + "dev": true, + "requires": { + "@babel/core": "^7.20.7", + "@babel/plugin-transform-typescript": "^7.20.7", + "@vue/babel-plugin-jsx": "^1.1.1" + } + }, + "@volar/language-core": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.4.1.tgz", + "integrity": "sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==", + "dev": true, + "requires": { + "@volar/source-map": "1.4.1" + } + }, + "@volar/source-map": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.4.1.tgz", + "integrity": "sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==", + "dev": true, + "requires": { + "muggle-string": "^0.2.2" + } + }, + "@volar/typescript": { + "version": "1.4.1-patch.2", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.4.1-patch.2.tgz", + "integrity": "sha512-lPFYaGt8OdMEzNGJJChF40uYqMO4Z/7Q9fHPQC/NRVtht43KotSXLrkPandVVMf9aPbiJ059eAT+fwHGX16k4w==", + "dev": true, + "requires": { + "@volar/language-core": "1.4.1" + } + }, + "@volar/vue-language-core": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.6.5.tgz", + "integrity": "sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==", + "dev": true, + "requires": { + "@volar/language-core": "1.4.1", + "@volar/source-map": "1.4.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/compiler-sfc": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.2.2", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@volar/vue-typescript": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.6.5.tgz", + "integrity": "sha512-er9rVClS4PHztMUmtPMDTl+7c7JyrxweKSAEe/o/Noeq2bQx6v3/jZHVHBe8ZNUti5ubJL/+Tg8L3bzmlalV8A==", + "dev": true, + "requires": { + "@volar/typescript": "1.4.1-patch.2", + "@volar/vue-language-core": "1.6.5" + } + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "requires": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "requires": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "@vue/eslint-config-prettier": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz", + "integrity": "sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==", + "dev": true, + "requires": { + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0" + } + }, + "@vue/eslint-config-typescript": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-11.0.3.tgz", + "integrity": "sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^5.59.1", + "@typescript-eslint/parser": "^5.59.1", + "vue-eslint-parser": "^9.1.1" + } + }, + "@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "requires": { + "@vue/shared": "3.3.4" + } + }, + "@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "requires": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "requires": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "requires": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "requires": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "@vue/tsconfig": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz", + "integrity": "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==", + "dev": true + }, + "@vueuse/core": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.2.1.tgz", + "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==", + "requires": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "requires": {} + } + } + }, + "@vueuse/metadata": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.2.1.tgz", + "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==" + }, + "@vueuse/shared": { + "version": "10.2.1", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.2.1.tgz", + "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==", + "requires": { + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "requires": {} + } + } + }, + "@wangeditor/basic-modules": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", + "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", + "requires": { + "is-url": "^1.2.4" + } + }, + "@wangeditor/code-highlight": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz", + "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==", + "requires": { + "prismjs": "^1.23.0" + } + }, + "@wangeditor/core": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz", + "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", + "requires": { + "@types/event-emitter": "^0.3.3", + "event-emitter": "^0.3.5", + "html-void-elements": "^2.0.0", + "i18next": "^20.4.0", + "scroll-into-view-if-needed": "^2.2.28", + "slate-history": "^0.66.0" + } + }, + "@wangeditor/editor": { + "version": "5.1.23", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz", + "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", + "requires": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "^1.1.7", + "@wangeditor/code-highlight": "^1.0.3", + "@wangeditor/core": "^1.1.19", + "@wangeditor/list-module": "^1.0.5", + "@wangeditor/table-module": "^1.1.4", + "@wangeditor/upload-image-module": "^1.0.2", + "@wangeditor/video-module": "^1.1.4", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "@wangeditor/editor-for-vue": { + "version": "5.1.12", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz", + "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==", + "requires": {} + }, + "@wangeditor/list-module": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz", + "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==", + "requires": {} + }, + "@wangeditor/table-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz", + "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==", + "requires": {} + }, + "@wangeditor/upload-image-module": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz", + "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==", + "requires": {} + }, + "@wangeditor/video-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz", + "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==", + "requires": {} + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "ant-design-vue": { + "version": "3.2.20", + "resolved": "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-3.2.20.tgz", + "integrity": "sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg==", + "requires": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^6.1.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.4.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bignumber.js": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.1.1.tgz", + "integrity": "sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30001517", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "requires": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true + }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmmirror.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + } + }, + "conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "requires": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "dev": true, + "requires": { + "is-what": "^3.14.1" + } + }, + "core-js": { + "version": "3.32.0", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.32.0.tgz", + "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==" + }, + "cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + } + }, + "cosmiconfig-typescript-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", + "dev": true, + "requires": {} + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cropperjs": { + "version": "1.5.13", + "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.5.13.tgz", + "integrity": "sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true + }, + "dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "dom7": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz", + "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", + "requires": { + "ssr-window": "^3.0.0-alpha.1" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "dev": true + }, + "dotenv-expand": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz", + "integrity": "sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==", + "dev": true + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, + "electron-to-chromium": { + "version": "1.4.475", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.475.tgz", + "integrity": "sha512-mTye5u5P98kSJO2n7zYALhpJDmoSQejIGya0iR01GpoRady8eK3bw7YHHnjA1Rfi4ZSLdpuzlAC7Zw+1Zu7Z6A==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + } + }, + "eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.9.0", + "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz", + "integrity": "sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-vue": { + "version": "9.15.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.15.1.tgz", + "integrity": "sha512-CJE/oZOslvmAR9hf8SClTdQ9JLweghT6JCBQNrT2Iel1uVw0W0OLJxzvPd6CxmABKCvLrtyDnqGV37O7KQv6+A==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.3.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.3.0", + "xml-name-validator": "^4.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "requires": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + } + }, + "gitmojis": { + "version": "3.13.5", + "resolved": "https://registry.npmmirror.com/gitmojis/-/gitmojis-3.13.5.tgz", + "integrity": "sha512-MLM88QAaWpYWlvtBjHBxshI9AGRH+LLluD6NbhymeWp0EQ1Sew8SgC0BpiQuQ4DCYGKs9LcX4zRL3lDlwOPA5g==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dev": true, + "requires": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } + } + }, + "html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true + }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "husky": { + "version": "8.0.3", + "resolved": "https://registry.npmmirror.com/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", + "dev": true + }, + "i18next": { + "version": "20.6.1", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz", + "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==", + "requires": { + "@babel/runtime": "^7.12.0" + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "optional": true + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + }, + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-eslint-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz", + "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==", + "dev": true, + "requires": { + "acorn": "^7.4.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^1.3.0", + "espree": "^6.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "less": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/less/-/less-4.1.3.tgz", + "integrity": "sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "lint-staged": { + "version": "13.2.3", + "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-13.2.3.tgz", + "integrity": "sha512-zVVEXLuQIhr1Y7R7YAWx4TZLdvuzk7DnmrsTNL0fax6Z3jrpFcas+vKbzxhhvp6TA55m1SQuWkpzI1qbfDZbAg==", + "dev": true, + "requires": { + "chalk": "5.2.0", + "cli-truncate": "^3.1.0", + "commander": "^10.0.0", + "debug": "^4.3.4", + "execa": "^7.0.0", + "lilconfig": "2.1.0", + "listr2": "^5.0.7", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-inspect": "^1.12.3", + "pidtree": "^0.6.0", + "string-argv": "^0.3.1", + "yaml": "^2.2.2" + }, + "dependencies": { + "chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true + }, + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "listr2": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.19", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.8.0", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmmirror.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "magic-string": { + "version": "0.30.2", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.2.tgz", + "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true + }, + "material-colors": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/material-colors/-/material-colors-1.2.6.tgz", + "integrity": "sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==" + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true + }, + "meow": { + "version": "8.1.2", + "resolved": "https://registry.npmmirror.com/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "requires": { + "wildcard": "^1.1.0" + } + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + }, + "mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "muggle-string": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.2.2.tgz", + "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==", + "dev": true + }, + "namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "nanopop": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/nanopop/-/nanopop-2.3.0.tgz", + "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "needle": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-html-parser": { + "version": "5.4.2", + "resolved": "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.2.tgz", + "integrity": "sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==", + "dev": true, + "requires": { + "css-select": "^4.2.1", + "he": "1.2.0" + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "requires": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "dependencies": { + "vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "requires": {} + } + } + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "preact": { + "version": "10.16.0", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.16.0.tgz", + "integrity": "sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==" + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "optional": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "requires": { + "global-dirs": "^0.1.1" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "optional": true + }, + "scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "requires": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "scule": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.0.0.tgz", + "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", + "dev": true + }, + "semver": { + "version": "7.5.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slate": { + "version": "0.72.8", + "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz", + "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", + "requires": { + "immer": "^9.0.6", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "slate-history": { + "version": "0.66.0", + "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz", + "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==", + "requires": { + "is-plain-object": "^5.0.0" + } + }, + "slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + } + } + }, + "snabbdom": { + "version": "3.5.1", + "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz", + "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "requires": { + "readable-stream": "^3.0.0" + } + }, + "ssr-window": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz", + "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "string.prototype.padend": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.4.tgz", + "integrity": "sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "requires": { + "acorn": "^8.8.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "terser": { + "version": "5.19.2", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "requires": { + "readable-stream": "3" + } + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "devOptional": true + }, + "ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unimport": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.1.0.tgz", + "integrity": "sha512-ybK3NVWh30MdiqSyqakrrQOeiXyu5507tDA0tUf7VJHrsq4DM6S43gR7oAsZaFojM32hzX982Lqw02D3yf2aiA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.2", + "escape-string-regexp": "^5.0.0", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "scule": "^1.0.0", + "strip-literal": "^1.0.1", + "unplugin": "^1.4.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + } + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unplugin": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.4.0.tgz", + "integrity": "sha512-5x4eIEL6WgbzqGtF9UV8VEC/ehKptPXDS6L2b0mv4FRMkJxRtjaJfOWDd6a8+kYbqsjklix7yWP0N3SUepjXcg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.5.0" + } + }, + "unplugin-auto-import": { + "version": "0.16.6", + "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.16.6.tgz", + "integrity": "sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.5", + "@rollup/pluginutils": "^5.0.2", + "fast-glob": "^3.3.0", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "minimatch": "^9.0.2", + "unimport": "^3.0.14", + "unplugin": "^1.3.2" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "unplugin-vue-components": { + "version": "0.24.1", + "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.24.1.tgz", + "integrity": "sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==", + "dev": true, + "requires": { + "@antfu/utils": "^0.7.2", + "@rollup/pluginutils": "^5.0.2", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.0", + "minimatch": "^7.4.2", + "resolve": "^1.22.1", + "unplugin": "^1.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "7.4.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vite": { + "version": "4.4.7", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.26", + "rollup": "^3.25.2" + } + }, + "vite-plugin-html": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz", + "integrity": "sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^4.2.0", + "colorette": "^2.0.16", + "connect-history-api-fallback": "^1.6.0", + "consola": "^2.15.3", + "dotenv": "^16.0.0", + "dotenv-expand": "^8.0.2", + "ejs": "^3.1.6", + "fast-glob": "^3.2.11", + "fs-extra": "^10.0.1", + "html-minifier-terser": "^6.1.0", + "node-html-parser": "^5.3.3", + "pathe": "^0.2.0" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + } + } + }, + "vue": { + "version": "3.3.4", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "requires": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "vue-eslint-parser": { + "version": "9.3.1", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + } + } + }, + "vue-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz", + "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", + "requires": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2", + "@vue/devtools-api": "^6.2.1" + }, + "dependencies": { + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==" + } + } + }, + "vue-router": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.2.4.tgz", + "integrity": "sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==", + "requires": { + "@vue/devtools-api": "^6.5.0" + } + }, + "vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.6.5.tgz", + "integrity": "sha512-Wtw3J7CC+JM2OR56huRd5iKlvFWpvDiU+fO1+rqyu4V2nMTotShz4zbOZpW5g9fUOcjnyZYfBo5q5q+D/q27JA==", + "dev": true, + "requires": { + "@volar/vue-language-core": "1.6.5", + "@volar/vue-typescript": "1.6.5", + "semver": "^7.3.8" + } + }, + "vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "requires": { + "is-plain-object": "3.0.1" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==" + } + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-virtual-modules": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", + "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "dev": true + }, + "yaml-eslint-parser": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz", + "integrity": "sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.3.0", + "lodash": "^4.17.20", + "yaml": "^1.10.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..5f402c4 --- /dev/null +++ b/package.json @@ -0,0 +1,75 @@ +{ + "name": "ballcat-ui-vue3", + "version": "0.0.0", + "packageManager": "pnpm@8.2.0", + "scripts": { + "dev": "vite --host", + "build": "run-p type-check build-only", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit", + "build:test": "vue-tsc --noEmit && vite build --mode test", + "preview": "vite preview --port 5050", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", + "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "preinstall": "node ./scripts/preinstall.js" + }, + "engines": { + "node": ">=16.11.0", + "pnpm": ">=8" + }, + "dependencies": { + "@ant-design/icons-vue": "^6.1.0", + "@ballcat/vue-cropper": "^1.0.5", + "@ckpack/vue-color": "^1.4.1", + "@vueuse/core": "^10.1.2", + "@vueuse/shared": "^10.1.2", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "ant-design-vue": "^3.2.20", + "axios": "^1.4.0", + "cropperjs": "^1.5.13", + "crypto-js": "^4.1.1", + "dayjs": "^1.11.7", + "json-bigint": "^1.0.0", + "mitt": "^3.0.0", + "nprogress": "^0.2.0", + "pinia": "^2.1.3", + "qs": "^6.11.2", + "vue": "^3.3.4", + "vue-clipboard3": "^2.0.0", + "vue-i18n": "^9.2.2", + "vue-router": "^4.2.1" + }, + "devDependencies": { + "@ballcat/commitlint-config-gitmoji": "^1.1.0", + "@commitlint/cli": "^17.6.3", + "@intlify/unplugin-vue-i18n": "^0.10.0", + "@rushstack/eslint-patch": "^1.2.0", + "@tsconfig/node18": "^2.0.1", + "@types/crypto-js": "^4.1.1", + "@types/json-bigint": "^1.0.1", + "@types/lodash-es": "^4.17.8", + "@types/node": "^18.16.8", + "@types/nprogress": "^0.2.0", + "@types/qs": "^6.9.7", + "@vitejs/plugin-vue": "^4.2.3", + "@vitejs/plugin-vue-jsx": "^3.0.1", + "@vue/eslint-config-prettier": "^7.1.0", + "@vue/eslint-config-typescript": "^11.0.3", + "@vue/tsconfig": "^0.4.0", + "@wangeditor/core": "^1.1.19", + "eslint": "^8.41.0", + "eslint-plugin-vue": "^9.13.0", + "husky": "^8.0.3", + "less": "^4.1.3", + "lint-staged": "^13.2.2", + "npm-run-all": "^4.1.5", + "prettier": "^2.8.8", + "typescript": "~5.0.4", + "unplugin-auto-import": "^0.16.0", + "unplugin-vue-components": "^0.24.1", + "vite": "^4.3.8", + "vite-plugin-html": "^3.2.0", + "vue-tsc": "~1.6.5" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..2b64aff --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5766 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@ant-design/icons-vue': + specifier: ^6.1.0 + version: 6.1.0(vue@3.3.4) + '@ballcat/vue-cropper': + specifier: ^1.0.5 + version: 1.0.5(vue@3.3.4) + '@ckpack/vue-color': + specifier: ^1.4.1 + version: 1.4.1(vue@3.3.4) + '@vueuse/core': + specifier: ^10.1.2 + version: 10.1.2(vue@3.3.4) + '@vueuse/shared': + specifier: ^10.1.2 + version: 10.1.2(vue@3.3.4) + '@wangeditor/editor': + specifier: ^5.1.23 + version: 5.1.23 + '@wangeditor/editor-for-vue': + specifier: ^5.1.12 + version: 5.1.12(@wangeditor/editor@5.1.23)(vue@3.3.4) + ant-design-vue: + specifier: ^3.2.20 + version: 3.2.20(vue@3.3.4) + axios: + specifier: ^1.4.0 + version: 1.4.0 + cropperjs: + specifier: ^1.5.13 + version: 1.5.13 + crypto-js: + specifier: ^4.1.1 + version: 4.1.1 + dayjs: + specifier: ^1.11.7 + version: 1.11.7 + json-bigint: + specifier: ^1.0.0 + version: 1.0.0 + mitt: + specifier: ^3.0.0 + version: 3.0.0 + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^2.1.3 + version: 2.1.3(typescript@5.0.4)(vue@3.3.4) + qs: + specifier: ^6.11.2 + version: 6.11.2 + vue: + specifier: ^3.3.4 + version: 3.3.4 + vue-clipboard3: + specifier: ^2.0.0 + version: 2.0.0 + vue-i18n: + specifier: ^9.2.2 + version: 9.2.2(vue@3.3.4) + vue-router: + specifier: ^4.2.1 + version: 4.2.1(vue@3.3.4) + +devDependencies: + '@ballcat/commitlint-config-gitmoji': + specifier: ^1.1.0 + version: 1.1.0 + '@commitlint/cli': + specifier: ^17.6.3 + version: 17.6.3 + '@intlify/unplugin-vue-i18n': + specifier: ^0.10.0 + version: 0.10.0(vue-i18n@9.2.2) + '@rushstack/eslint-patch': + specifier: ^1.2.0 + version: 1.2.0 + '@tsconfig/node18': + specifier: ^2.0.1 + version: 2.0.1 + '@types/crypto-js': + specifier: ^4.1.1 + version: 4.1.1 + '@types/json-bigint': + specifier: ^1.0.1 + version: 1.0.1 + '@types/lodash-es': + specifier: ^4.17.8 + version: 4.17.8 + '@types/node': + specifier: ^18.16.8 + version: 18.16.8 + '@types/nprogress': + specifier: ^0.2.0 + version: 0.2.0 + '@types/qs': + specifier: ^6.9.7 + version: 6.9.7 + '@vitejs/plugin-vue': + specifier: ^4.2.3 + version: 4.2.3(vite@4.3.8)(vue@3.3.4) + '@vitejs/plugin-vue-jsx': + specifier: ^3.0.1 + version: 3.0.1(vite@4.3.8)(vue@3.3.4) + '@vue/eslint-config-prettier': + specifier: ^7.1.0 + version: 7.1.0(eslint@8.41.0)(prettier@2.8.8) + '@vue/eslint-config-typescript': + specifier: ^11.0.3 + version: 11.0.3(eslint-plugin-vue@9.13.0)(eslint@8.41.0)(typescript@5.0.4) + '@vue/tsconfig': + specifier: ^0.4.0 + version: 0.4.0 + '@wangeditor/core': + specifier: ^1.1.19 + version: 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1) + eslint: + specifier: ^8.41.0 + version: 8.41.0 + eslint-plugin-vue: + specifier: ^9.13.0 + version: 9.13.0(eslint@8.41.0) + husky: + specifier: ^8.0.3 + version: 8.0.3 + less: + specifier: ^4.1.3 + version: 4.1.3 + lint-staged: + specifier: ^13.2.2 + version: 13.2.2 + npm-run-all: + specifier: ^4.1.5 + version: 4.1.5 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + typescript: + specifier: ~5.0.4 + version: 5.0.4 + unplugin-auto-import: + specifier: ^0.16.0 + version: 0.16.0(@vueuse/core@10.1.2) + unplugin-vue-components: + specifier: ^0.24.1 + version: 0.24.1(vue@3.3.4) + vite: + specifier: ^4.3.8 + version: 4.3.8(@types/node@18.16.8)(less@4.1.3) + vite-plugin-html: + specifier: ^3.2.0 + version: 3.2.0(vite@4.3.8) + vue-tsc: + specifier: ~1.6.5 + version: 1.6.5(typescript@5.0.4) + +packages: + + /@ampproject/remapping@2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@ant-design/colors@6.0.0: + resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==} + dependencies: + '@ctrl/tinycolor': 3.6.0 + dev: false + + /@ant-design/icons-svg@4.2.1: + resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==} + dev: false + + /@ant-design/icons-vue@6.1.0(vue@3.3.4): + resolution: {integrity: sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==} + peerDependencies: + vue: '>=3.0.3' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-svg': 4.2.1 + vue: 3.3.4 + dev: false + + /@antfu/utils@0.7.2: + resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} + dev: true + + /@babel/code-frame@7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data@7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.21.3: + resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7(@babel/core@7.21.3) + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.21.3: + resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + dev: true + + /@babel/helper-annotate-as-pure@7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-compilation-targets@7.20.7(@babel/core@7.21.3): + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.21.0 + browserslist: 4.21.5 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: true + + /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.21.3): + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-environment-visitor@7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-hoist-variables@7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-member-expression-to-functions@7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-module-imports@7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-module-transforms@7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-plugin-utils@7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-replace-supers@7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-simple-access@7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-split-export-declaration@7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + dev: true + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.21.0: + resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.21.3: + resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.3 + + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.21.3): + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.21.3): + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typescript@7.21.3(@babel/core@7.21.3): + resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.21.3) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.21.3) + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/runtime@7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + + /@babel/template@7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + dev: true + + /@babel/traverse@7.21.3: + resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.21.3: + resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + + /@ballcat/commitlint-config-gitmoji@1.1.0: + resolution: {integrity: sha512-bb9EuwKGItogf68b84KxnHYZIceVNgMaA23lUDrWVFyu2Q4q4HtDpmFw8Gh6NdJTnGx1lgoVKowHl1o6Wb66yw==} + engines: {node: '>=v14'} + dependencies: + gitmojis: 3.13.4 + dev: true + + /@ballcat/vue-cropper@1.0.5(vue@3.3.4): + resolution: {integrity: sha512-1rgufxZSAy+X427RZeiOXvGdiwHk1FbantHjv0vq4SZADta0mxrznz6fd7TTHG4/pmKdUxnXF6vR4kB7aPwkDA==} + engines: {node: '>=12.0.0'} + peerDependencies: + vue: '>=3.2.0' + dependencies: + cropperjs: 1.5.13 + vue: 3.3.4 + dev: false + + /@ckpack/vue-color@1.4.1(vue@3.3.4): + resolution: {integrity: sha512-PPon4lIyKWgwexN4Gf8iRzqWVPWTa1nMoW37cKQbMakY/iBPiPzOtgGinNhD44STbv6GUnPLBCg6yfkXsPuFpw==} + engines: {node: '>=12'} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@ctrl/tinycolor': 3.6.0 + material-colors: 1.2.6 + vue: 3.3.4 + dev: false + + /@commitlint/cli@17.6.3: + resolution: {integrity: sha512-ItSz2fd4F+CujgIbQOfNNerDF1eFlsBGEfp9QcCb1kxTYMuKTYZzA6Nu1YRRrIaaWwe2E7awUGpIMrPoZkOG3A==} + engines: {node: '>=v14'} + hasBin: true + dependencies: + '@commitlint/format': 17.4.4 + '@commitlint/lint': 17.6.3 + '@commitlint/load': 17.5.0 + '@commitlint/read': 17.5.1 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + lodash.isfunction: 3.0.9 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + yargs: 17.7.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/config-validator@17.4.4: + resolution: {integrity: sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + ajv: 8.12.0 + dev: true + + /@commitlint/ensure@17.4.4: + resolution: {integrity: sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + dev: true + + /@commitlint/execute-rule@17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/format@17.4.4: + resolution: {integrity: sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + chalk: 4.1.2 + dev: true + + /@commitlint/is-ignored@17.6.3: + resolution: {integrity: sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + semver: 7.5.0 + dev: true + + /@commitlint/lint@17.6.3: + resolution: {integrity: sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/is-ignored': 17.6.3 + '@commitlint/parse': 17.4.4 + '@commitlint/rules': 17.6.1 + '@commitlint/types': 17.4.4 + dev: true + + /@commitlint/load@17.5.0: + resolution: {integrity: sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.4.4 + '@commitlint/types': 17.4.4 + '@types/node': 18.16.8 + chalk: 4.1.2 + cosmiconfig: 8.1.3 + cosmiconfig-typescript-loader: 4.3.0(@types/node@18.16.8)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + resolve-from: 5.0.0 + ts-node: 10.9.1(@types/node@18.16.8)(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + dev: true + + /@commitlint/message@17.4.2: + resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/parse@17.4.4: + resolution: {integrity: sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/types': 17.4.4 + conventional-changelog-angular: 5.0.13 + conventional-commits-parser: 3.2.4 + dev: true + + /@commitlint/read@17.5.1: + resolution: {integrity: sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.4 + fs-extra: 11.1.1 + git-raw-commits: 2.0.11 + minimist: 1.2.8 + dev: true + + /@commitlint/resolve-extends@17.4.4: + resolution: {integrity: sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/config-validator': 17.4.4 + '@commitlint/types': 17.4.4 + import-fresh: 3.3.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + resolve-global: 1.0.0 + dev: true + + /@commitlint/rules@17.6.1: + resolution: {integrity: sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==} + engines: {node: '>=v14'} + dependencies: + '@commitlint/ensure': 17.4.4 + '@commitlint/message': 17.4.2 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.4 + execa: 5.1.1 + dev: true + + /@commitlint/to-lines@17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} + engines: {node: '>=v14'} + dev: true + + /@commitlint/top-level@17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} + engines: {node: '>=v14'} + dependencies: + find-up: 5.0.0 + dev: true + + /@commitlint/types@17.4.4: + resolution: {integrity: sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==} + engines: {node: '>=v14'} + dependencies: + chalk: 4.1.2 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@ctrl/tinycolor@3.6.0: + resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==} + engines: {node: '>=10'} + dev: false + + /@esbuild/android-arm64@0.17.12: + resolution: {integrity: sha512-WQ9p5oiXXYJ33F2EkE3r0FRDFVpEdcDiwNX3u7Xaibxfx6vQE0Sb8ytrfQsA5WO6kDn6mDfKLh6KrPBjvkk7xA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.12: + resolution: {integrity: sha512-E/sgkvwoIfj4aMAPL2e35VnUJspzVYl7+M1B2cqeubdBhADV4uPon0KCc8p2G+LqSJ6i8ocYPCqY3A4GGq0zkQ==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.12: + resolution: {integrity: sha512-m4OsaCr5gT+se25rFPHKQXARMyAehHTQAz4XX1Vk3d27VtqiX0ALMBPoXZsGaB6JYryCLfgGwUslMqTfqeLU0w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.12: + resolution: {integrity: sha512-O3GCZghRIx+RAN0NDPhyyhRgwa19MoKlzGonIb5hgTj78krqp9XZbYCvFr9N1eUxg0ZQEpiiZ4QvsOQwBpP+lg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.12: + resolution: {integrity: sha512-5D48jM3tW27h1qjaD9UNRuN+4v0zvksqZSPZqeSWggfMlsVdAhH3pwSfQIFJwcs9QJ9BRibPS4ViZgs3d2wsCA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.12: + resolution: {integrity: sha512-OWvHzmLNTdF1erSvrfoEBGlN94IE6vCEaGEkEH29uo/VoONqPnoDFfShi41Ew+yKimx4vrmmAJEGNoyyP+OgOQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.12: + resolution: {integrity: sha512-A0Xg5CZv8MU9xh4a+7NUpi5VHBKh1RaGJKqjxe4KG87X+mTjDE6ZvlJqpWoeJxgfXHT7IMP9tDFu7IZ03OtJAw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.12: + resolution: {integrity: sha512-cK3AjkEc+8v8YG02hYLQIQlOznW+v9N+OI9BAFuyqkfQFR+DnDLhEM5N8QRxAUz99cJTo1rLNXqRrvY15gbQUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.12: + resolution: {integrity: sha512-WsHyJ7b7vzHdJ1fv67Yf++2dz3D726oO3QCu8iNYik4fb5YuuReOI9OtA+n7Mk0xyQivNTPbl181s+5oZ38gyA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.12: + resolution: {integrity: sha512-jdOBXJqcgHlah/nYHnj3Hrnl9l63RjtQ4vn9+bohjQPI2QafASB5MtHAoEv0JQHVb/xYQTFOeuHnNYE1zF7tYw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.12: + resolution: {integrity: sha512-GTOEtj8h9qPKXCyiBBnHconSCV9LwFyx/gv3Phw0pa25qPYjVuuGZ4Dk14bGCfGX3qKF0+ceeQvwmtI+aYBbVA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.12: + resolution: {integrity: sha512-o8CIhfBwKcxmEENOH9RwmUejs5jFiNoDw7YgS0EJTF6kgPgcqLFjgoc5kDey5cMHRVCIWc6kK2ShUePOcc7RbA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.12: + resolution: {integrity: sha512-biMLH6NR/GR4z+ap0oJYb877LdBpGac8KfZoEnDiBKd7MD/xt8eaw1SFfYRUeMVx519kVkAOL2GExdFmYnZx3A==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.12: + resolution: {integrity: sha512-jkphYUiO38wZGeWlfIBMB72auOllNA2sLfiZPGDtOBb1ELN8lmqBrlMiucgL8awBw1zBXN69PmZM6g4yTX84TA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.12: + resolution: {integrity: sha512-j3ucLdeY9HBcvODhCY4b+Ds3hWGO8t+SAidtmWu/ukfLLG/oYDMaA+dnugTVAg5fnUOGNbIYL9TOjhWgQB8W5g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.12: + resolution: {integrity: sha512-uo5JL3cgaEGotaqSaJdRfFNSCUJOIliKLnDGWaVCgIKkHxwhYMm95pfMbWZ9l7GeW9kDg0tSxcy9NYdEtjwwmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.12: + resolution: {integrity: sha512-DNdoRg8JX+gGsbqt2gPgkgb00mqOgOO27KnrWZtdABl6yWTST30aibGJ6geBq3WM2TIeW6COs5AScnC7GwtGPg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.12: + resolution: {integrity: sha512-aVsENlr7B64w8I1lhHShND5o8cW6sB9n9MUtLumFlPhG3elhNWtE7M1TFpj3m7lT3sKQUMkGFjTQBrvDDO1YWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.12: + resolution: {integrity: sha512-qbHGVQdKSwi0JQJuZznS4SyY27tYXYF0mrgthbxXrZI3AHKuRvU+Eqbg/F0rmLDpW/jkIZBlCO1XfHUBMNJ1pg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.12: + resolution: {integrity: sha512-zsCp8Ql+96xXTVTmm6ffvoTSZSV2B/LzzkUXAY33F/76EajNw1m+jZ9zPfNJlJ3Rh4EzOszNDHsmG/fZOhtqDg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.12: + resolution: {integrity: sha512-FfrFjR4id7wcFYOdqbDfDET3tjxCozUgbqdkOABsSFzoZGFC92UK7mg4JKRc/B3NNEf1s2WHxJ7VfTdVDPN3ng==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.12: + resolution: {integrity: sha512-JOOxw49BVZx2/5tW3FqkdjSD/5gXYeVGPDcB0lvap0gLQshkh1Nyel1QazC+wNxus3xPlsYAgqU1BUmrmCvWtw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.41.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@eslint-community/regexpp@4.4.1: + resolution: {integrity: sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.0.3: + resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.2 + globals: 13.20.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.41.0: + resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@intlify/bundle-utils@5.5.0(vue-i18n@9.2.2): + resolution: {integrity: sha512-k5xe8oAoPXiH6unXvyyyCRbq+LtLn1tSi/6r5f6mF+MsX7mcOMtgYbyAQINsjFrf7EDu5Pg4BY00VWSt8bI9XQ==} + engines: {node: '>= 12'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + dependencies: + '@intlify/message-compiler': 9.3.0-beta.17 + '@intlify/shared': 9.3.0-beta.17 + acorn: 8.8.2 + escodegen: 2.0.0 + estree-walker: 2.0.2 + jsonc-eslint-parser: 1.4.1 + magic-string: 0.30.0 + source-map: 0.6.1 + vue-i18n: 9.2.2(vue@3.3.4) + yaml-eslint-parser: 0.3.2 + dev: true + + /@intlify/core-base@9.2.2: + resolution: {integrity: sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==} + engines: {node: '>= 14'} + dependencies: + '@intlify/devtools-if': 9.2.2 + '@intlify/message-compiler': 9.2.2 + '@intlify/shared': 9.2.2 + '@intlify/vue-devtools': 9.2.2 + + /@intlify/devtools-if@9.2.2: + resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.2.2 + + /@intlify/message-compiler@9.2.2: + resolution: {integrity: sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.2.2 + source-map: 0.6.1 + + /@intlify/message-compiler@9.3.0-beta.17: + resolution: {integrity: sha512-i7hvVIRk1Ax2uKa9xLRJCT57to08OhFMhFXXjWN07rmx5pWQYQ23MfX1xgggv9drnWTNhqEiD+u4EJeHoS5+Ww==} + engines: {node: '>= 14'} + dependencies: + '@intlify/shared': 9.3.0-beta.17 + source-map: 0.6.1 + dev: true + + /@intlify/shared@9.2.2: + resolution: {integrity: sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==} + engines: {node: '>= 14'} + + /@intlify/shared@9.3.0-beta.17: + resolution: {integrity: sha512-mscf7RQsUTOil35jTij4KGW1RC9SWQjYScwLxP53Ns6g24iEd5HN7ksbt9O6FvTmlQuX77u+MXpBdfJsGqizLQ==} + engines: {node: '>= 14'} + dev: true + + /@intlify/unplugin-vue-i18n@0.10.0(vue-i18n@9.2.2): + resolution: {integrity: sha512-Sf8fe26/d8rBNcg+zBSb7RA1uyhrG9zhIM+CRX6lqcznMDjLRr/1tuVaJ9E6xqJkzjfPgRzNcCqwMt6rpNkL7Q==} + engines: {node: '>= 14.16'} + peerDependencies: + petite-vue-i18n: '*' + vue-i18n: '*' + vue-i18n-bridge: '*' + peerDependenciesMeta: + petite-vue-i18n: + optional: true + vue-i18n: + optional: true + vue-i18n-bridge: + optional: true + dependencies: + '@intlify/bundle-utils': 5.5.0(vue-i18n@9.2.2) + '@intlify/shared': 9.3.0-beta.17 + '@rollup/pluginutils': 5.0.2 + '@vue/compiler-sfc': 3.2.47 + debug: 4.3.4 + fast-glob: 3.2.12 + js-yaml: 4.1.0 + json5: 2.2.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + unplugin: 1.3.1 + vue-i18n: 9.2.2(vue@3.3.4) + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /@intlify/vue-devtools@9.2.2: + resolution: {integrity: sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==} + engines: {node: '>= 14'} + dependencies: + '@intlify/core-base': 9.2.2 + '@intlify/shared': 9.2.2 + + /@jridgewell/gen-mapping@0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.2: + resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rollup/pluginutils@5.0.2: + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.0 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rushstack/eslint-patch@1.2.0: + resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} + dev: true + + /@simonwep/pickr@1.8.2: + resolution: {integrity: sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==} + dependencies: + core-js: 3.29.1 + nanopop: 2.2.0 + dev: false + + /@transloadit/prettier-bytes@0.0.7: + resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==, tarball: https://registry.npm.taobao.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz} + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@tsconfig/node18@2.0.1: + resolution: {integrity: sha512-UqdfvuJK0SArA2CxhKWwwAWfnVSXiYe63bVpMutc27vpngCntGUZQETO24pEJ46zU6XM+7SpqYoMgcO3bM11Ew==} + dev: true + + /@types/crypto-js@4.1.1: + resolution: {integrity: sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==} + dev: true + + /@types/estree@1.0.0: + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + dev: true + + /@types/event-emitter@0.3.3: + resolution: {integrity: sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==} + + /@types/json-bigint@1.0.1: + resolution: {integrity: sha512-zpchZLNsNuzJHi6v64UBoFWAvQlPhch7XAi36FkH6tL1bbbmimIF+cS7vwkzY4u5RaSWMoflQfu+TshMPPw8uw==} + dev: true + + /@types/json-schema@7.0.11: + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + dev: true + + /@types/lodash-es@4.17.8: + resolution: {integrity: sha512-euY3XQcZmIzSy7YH5+Unb3b2X12Wtk54YWINBvvGQ5SmMvwb11JQskGsfkH/5HXK77Kr8GF0wkVDIxzAisWtog==} + dependencies: + '@types/lodash': 4.14.196 + dev: true + + /@types/lodash@4.14.196: + resolution: {integrity: sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node@18.16.8: + resolution: {integrity: sha512-p0iAXcfWCOTCBbsExHIDFCfwsqFwBTgETJveKMT+Ci3LY9YqQCI91F5S+TB20+aRCXpcWfvx5Qr5EccnwCm2NA==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/nprogress@0.2.0: + resolution: {integrity: sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==} + dev: true + + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/semver@7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} + dev: true + + /@types/web-bluetooth@0.0.17: + resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} + + /@typescript-eslint/eslint-plugin@5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.41.0)(typescript@5.0.4): + resolution: {integrity: sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.4.1 + '@typescript-eslint/parser': 5.59.5(eslint@8.41.0)(typescript@5.0.4) + '@typescript-eslint/scope-manager': 5.59.5 + '@typescript-eslint/type-utils': 5.59.5(eslint@8.41.0)(typescript@5.0.4) + '@typescript-eslint/utils': 5.59.5(eslint@8.41.0)(typescript@5.0.4) + debug: 4.3.4 + eslint: 8.41.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.0 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.59.5(eslint@8.41.0)(typescript@5.0.4): + resolution: {integrity: sha512-NJXQC4MRnF9N9yWqQE2/KLRSOLvrrlZb48NGVfBa+RuPMN6B7ZcK5jZOvhuygv4D64fRKnZI4L4p8+M+rfeQuw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.59.5 + '@typescript-eslint/types': 5.59.5 + '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) + debug: 4.3.4 + eslint: 8.41.0 + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.59.5: + resolution: {integrity: sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.5 + '@typescript-eslint/visitor-keys': 5.59.5 + dev: true + + /@typescript-eslint/type-utils@5.59.5(eslint@8.41.0)(typescript@5.0.4): + resolution: {integrity: sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) + '@typescript-eslint/utils': 5.59.5(eslint@8.41.0)(typescript@5.0.4) + debug: 4.3.4 + eslint: 8.41.0 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.59.5: + resolution: {integrity: sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.59.5(typescript@5.0.4): + resolution: {integrity: sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.59.5 + '@typescript-eslint/visitor-keys': 5.59.5 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.0 + tsutils: 3.21.0(typescript@5.0.4) + typescript: 5.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.59.5(eslint@8.41.0)(typescript@5.0.4): + resolution: {integrity: sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + '@types/json-schema': 7.0.11 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.59.5 + '@typescript-eslint/types': 5.59.5 + '@typescript-eslint/typescript-estree': 5.59.5(typescript@5.0.4) + eslint: 8.41.0 + eslint-scope: 5.1.1 + semver: 7.5.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.59.5: + resolution: {integrity: sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.59.5 + eslint-visitor-keys: 3.4.1 + dev: true + + /@uppy/companion-client@2.2.2: + resolution: {integrity: sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==, tarball: https://registry.npm.taobao.org/@uppy/companion-client/-/companion-client-2.2.2.tgz} + dependencies: + '@uppy/utils': 4.1.3 + namespace-emitter: 2.0.1 + + /@uppy/core@2.3.4: + resolution: {integrity: sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==, tarball: https://registry.npm.taobao.org/@uppy/core/-/core-2.3.4.tgz} + dependencies: + '@transloadit/prettier-bytes': 0.0.7 + '@uppy/store-default': 2.1.1 + '@uppy/utils': 4.1.3 + lodash.throttle: 4.1.1 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 3.3.6 + preact: 10.13.2 + + /@uppy/store-default@2.1.1: + resolution: {integrity: sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==, tarball: https://registry.npm.taobao.org/@uppy/store-default/-/store-default-2.1.1.tgz} + + /@uppy/utils@4.1.3: + resolution: {integrity: sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==, tarball: https://registry.npm.taobao.org/@uppy/utils/-/utils-4.1.3.tgz} + dependencies: + lodash.throttle: 4.1.1 + + /@uppy/xhr-upload@2.1.3(@uppy/core@2.3.4): + resolution: {integrity: sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==, tarball: https://registry.npm.taobao.org/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz} + peerDependencies: + '@uppy/core': ^2.3.3 + dependencies: + '@uppy/companion-client': 2.2.2 + '@uppy/core': 2.3.4 + '@uppy/utils': 4.1.3 + nanoid: 3.3.6 + + /@vitejs/plugin-vue-jsx@3.0.1(vite@4.3.8)(vue@3.3.4): + resolution: {integrity: sha512-+Jb7ggL48FSPS1uhPnJbJwWa9Sr90vQ+d0InW+AhBM22n+cfuYqJZDckBc+W3QSHe1WDvewMZfa4wZOtk5pRgw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-transform-typescript': 7.21.3(@babel/core@7.21.3) + '@vue/babel-plugin-jsx': 1.1.1(@babel/core@7.21.3) + vite: 4.3.8(@types/node@18.16.8)(less@4.1.3) + vue: 3.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@vitejs/plugin-vue@4.2.3(vite@4.3.8)(vue@3.3.4): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.3.8(@types/node@18.16.8)(less@4.1.3) + vue: 3.3.4 + dev: true + + /@volar/language-core@1.4.1: + resolution: {integrity: sha512-EIY+Swv+TjsWpxOxujjMf1ZXqOjg9MT2VMXZ+1dKva0wD8W0L6EtptFFcCJdBbcKmGMFkr57Qzz9VNMWhs3jXQ==} + dependencies: + '@volar/source-map': 1.4.1 + dev: true + + /@volar/source-map@1.4.1: + resolution: {integrity: sha512-bZ46ad72dsbzuOWPUtJjBXkzSQzzSejuR3CT81+GvTEI2E994D8JPXzM3tl98zyCNnjgs4OkRyliImL1dvJ5BA==} + dependencies: + muggle-string: 0.2.2 + dev: true + + /@volar/typescript@1.4.1-patch.2(typescript@5.0.4): + resolution: {integrity: sha512-lPFYaGt8OdMEzNGJJChF40uYqMO4Z/7Q9fHPQC/NRVtht43KotSXLrkPandVVMf9aPbiJ059eAT+fwHGX16k4w==} + peerDependencies: + typescript: '*' + dependencies: + '@volar/language-core': 1.4.1 + typescript: 5.0.4 + dev: true + + /@volar/vue-language-core@1.6.5: + resolution: {integrity: sha512-IF2b6hW4QAxfsLd5mePmLgtkXzNi+YnH6ltCd80gb7+cbdpFMjM1I+w+nSg2kfBTyfu+W8useCZvW89kPTBpzg==} + dependencies: + '@volar/language-core': 1.4.1 + '@volar/source-map': 1.4.1 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/reactivity': 3.3.2 + '@vue/shared': 3.3.4 + minimatch: 9.0.0 + muggle-string: 0.2.2 + vue-template-compiler: 2.7.14 + dev: true + + /@volar/vue-typescript@1.6.5(typescript@5.0.4): + resolution: {integrity: sha512-er9rVClS4PHztMUmtPMDTl+7c7JyrxweKSAEe/o/Noeq2bQx6v3/jZHVHBe8ZNUti5ubJL/+Tg8L3bzmlalV8A==} + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.4.1-patch.2(typescript@5.0.4) + '@volar/vue-language-core': 1.6.5 + typescript: 5.0.4 + dev: true + + /@vue/babel-helper-vue-transform-on@1.0.2: + resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} + dev: true + + /@vue/babel-plugin-jsx@1.1.1(@babel/core@7.21.3): + resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} + dependencies: + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.21.3) + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + '@vue/babel-helper-vue-transform-on': 1.0.2 + camelcase: 6.3.0 + html-tags: 3.2.0 + svg-tags: 1.0.0 + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + + /@vue/compiler-core@3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + source-map: 0.6.1 + dev: true + + /@vue/compiler-core@3.3.4: + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + + /@vue/compiler-dom@3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + dependencies: + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + dev: true + + /@vue/compiler-dom@3.3.4: + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + + /@vue/compiler-sfc@3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/compiler-core': 3.2.47 + '@vue/compiler-dom': 3.2.47 + '@vue/compiler-ssr': 3.2.47 + '@vue/reactivity-transform': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + postcss: 8.4.23 + source-map: 0.6.1 + dev: true + + /@vue/compiler-sfc@3.3.4: + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.0 + postcss: 8.4.23 + source-map-js: 1.0.2 + + /@vue/compiler-ssr@3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + dependencies: + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 + dev: true + + /@vue/compiler-ssr@3.3.4: + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + + /@vue/devtools-api@6.5.0: + resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + + /@vue/eslint-config-prettier@7.1.0(eslint@8.41.0)(prettier@2.8.8): + resolution: {integrity: sha512-Pv/lVr0bAzSIHLd9iz0KnvAr4GKyCEl+h52bc4e5yWuDVtLgFwycF7nrbWTAQAS+FU6q1geVd07lc6EWfJiWKQ==} + peerDependencies: + eslint: '>= 7.28.0' + prettier: '>= 2.0.0' + dependencies: + eslint: 8.41.0 + eslint-config-prettier: 8.8.0(eslint@8.41.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.8.0)(eslint@8.41.0)(prettier@2.8.8) + prettier: 2.8.8 + dev: true + + /@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@9.13.0)(eslint@8.41.0)(typescript@5.0.4): + resolution: {integrity: sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue: ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.59.5(@typescript-eslint/parser@5.59.5)(eslint@8.41.0)(typescript@5.0.4) + '@typescript-eslint/parser': 5.59.5(eslint@8.41.0)(typescript@5.0.4) + eslint: 8.41.0 + eslint-plugin-vue: 9.13.0(eslint@8.41.0) + typescript: 5.0.4 + vue-eslint-parser: 9.3.0(eslint@8.41.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@vue/reactivity-transform@3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 + estree-walker: 2.0.2 + magic-string: 0.25.9 + dev: true + + /@vue/reactivity-transform@3.3.4: + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + dependencies: + '@babel/parser': 7.21.3 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.0 + + /@vue/reactivity@3.3.2: + resolution: {integrity: sha512-yX8C4uTgg2Tdj+512EEMnMKbLveoITl7YdQX35AYgx8vBvQGszKiiCN46g4RY6/deeo/5DLbeUUGxCq1qWMf5g==} + dependencies: + '@vue/shared': 3.3.2 + dev: true + + /@vue/reactivity@3.3.4: + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + dependencies: + '@vue/shared': 3.3.4 + + /@vue/runtime-core@3.3.4: + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + + /@vue/runtime-dom@3.3.4: + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.2 + + /@vue/server-renderer@3.3.4(vue@3.3.4): + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + + /@vue/shared@3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + dev: true + + /@vue/shared@3.3.2: + resolution: {integrity: sha512-0rFu3h8JbclbnvvKrs7Fe5FNGV9/5X2rPD7KmOzhLSUAiQH5//Hq437Gv0fR5Mev3u/nbtvmLl8XgwCU20/ZfQ==} + dev: true + + /@vue/shared@3.3.4: + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + /@vue/tsconfig@0.4.0: + resolution: {integrity: sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg==} + dev: true + + /@vueuse/core@10.1.2(vue@3.3.4): + resolution: {integrity: sha512-roNn8WuerI56A5uiTyF/TEYX0Y+VKlhZAF94unUfdhbDUI+NfwQMn4FUnUscIRUhv3344qvAghopU4bzLPNFlA==} + dependencies: + '@types/web-bluetooth': 0.0.17 + '@vueuse/metadata': 10.1.2 + '@vueuse/shared': 10.1.2(vue@3.3.4) + vue-demi: 0.14.0(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + /@vueuse/metadata@10.1.2: + resolution: {integrity: sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==} + + /@vueuse/shared@10.1.2(vue@3.3.4): + resolution: {integrity: sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==} + dependencies: + vue-demi: 0.14.0(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + /@wangeditor/basic-modules@1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==, tarball: https://registry.npm.taobao.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + is-url: 1.2.4 + lodash.throttle: 4.1.1 + nanoid: 3.3.6 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /@wangeditor/code-highlight@1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==, tarball: https://registry.npm.taobao.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + prismjs: 1.29.0 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@types/event-emitter': 0.3.3 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.4 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.5.1 + dev: false + + /@wangeditor/core@1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==} + peerDependencies: + '@uppy/core': ^2.1.1 + '@uppy/xhr-upload': ^2.0.3 + dom7: ^3.0.0 + is-hotkey: ^0.2.0 + lodash.camelcase: ^4.3.0 + lodash.clonedeep: ^4.5.0 + lodash.debounce: ^4.0.8 + lodash.foreach: ^4.5.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + lodash.toarray: ^4.4.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@types/event-emitter': 0.3.3 + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + dom7: 3.0.0 + event-emitter: 0.3.5 + html-void-elements: 2.0.1 + i18next: 20.6.1 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.6 + scroll-into-view-if-needed: 2.2.31 + slate: 0.72.8 + slate-history: 0.66.0(slate@0.72.8) + snabbdom: 3.5.1 + + /@wangeditor/editor-for-vue@5.1.12(@wangeditor/editor@5.1.23)(vue@3.3.4): + resolution: {integrity: sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==, tarball: https://registry.npm.taobao.org/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz} + peerDependencies: + '@wangeditor/editor': '>=5.1.0' + vue: ^3.0.5 + dependencies: + '@wangeditor/editor': 5.1.23 + vue: 3.3.4 + dev: false + + /@wangeditor/editor@5.1.23: + resolution: {integrity: sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==, tarball: https://registry.npm.taobao.org/@wangeditor/editor/-/editor-5.1.23.tgz} + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/code-highlight': 1.0.3(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/list-module': 1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/table-module': 1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/upload-image-module': 1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/video-module': 1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + is-hotkey: 0.2.0 + lodash.camelcase: 4.3.0 + lodash.clonedeep: 4.5.0 + lodash.debounce: 4.0.8 + lodash.foreach: 4.5.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + lodash.toarray: 4.4.0 + nanoid: 3.3.4 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /@wangeditor/list-module@1.0.5(@wangeditor/core@1.1.19)(dom7@3.0.0)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==, tarball: https://registry.npm.taobao.org/@wangeditor/list-module/-/list-module-1.0.5.tgz} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /@wangeditor/table-module@1.1.4(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==, tarball: https://registry.npm.taobao.org/@wangeditor/table-module/-/table-module-1.1.4.tgz} + peerDependencies: + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.isequal: ^4.5.0 + lodash.throttle: ^4.1.1 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + lodash.isequal: 4.5.0 + lodash.throttle: 4.1.1 + nanoid: 3.3.4 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /@wangeditor/upload-image-module@1.0.2(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/basic-modules@1.1.7)(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.foreach@4.5.0)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==, tarball: https://registry.npm.taobao.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz} + peerDependencies: + '@uppy/core': ^2.0.3 + '@uppy/xhr-upload': ^2.0.3 + '@wangeditor/basic-modules': 1.x + '@wangeditor/core': 1.x + dom7: ^3.0.0 + lodash.foreach: ^4.5.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/basic-modules': 1.1.7(@wangeditor/core@1.1.19)(dom7@3.0.0)(lodash.throttle@4.1.1)(nanoid@3.3.6)(slate@0.72.8)(snabbdom@3.5.1) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + lodash.foreach: 4.5.0 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /@wangeditor/video-module@1.1.4(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(@wangeditor/core@1.1.19)(dom7@3.0.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1): + resolution: {integrity: sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==, tarball: https://registry.npm.taobao.org/@wangeditor/video-module/-/video-module-1.1.4.tgz} + peerDependencies: + '@uppy/core': ^2.1.4 + '@uppy/xhr-upload': ^2.0.7 + '@wangeditor/core': 1.x + dom7: ^3.0.0 + nanoid: ^3.2.0 + slate: ^0.72.0 + snabbdom: ^3.1.0 + dependencies: + '@uppy/core': 2.3.4 + '@uppy/xhr-upload': 2.1.3(@uppy/core@2.3.4) + '@wangeditor/core': 1.1.19(@uppy/core@2.3.4)(@uppy/xhr-upload@2.1.3)(dom7@3.0.0)(is-hotkey@0.2.0)(lodash.camelcase@4.3.0)(lodash.clonedeep@4.5.0)(lodash.debounce@4.0.8)(lodash.foreach@4.5.0)(lodash.isequal@4.5.0)(lodash.throttle@4.1.1)(lodash.toarray@4.4.0)(nanoid@3.3.4)(slate@0.72.8)(snabbdom@3.5.1) + dom7: 3.0.0 + nanoid: 3.3.4 + slate: 0.72.8 + snabbdom: 3.5.1 + dev: false + + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + dev: true + + /acorn-jsx@5.3.2(acorn@7.4.1): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 7.4.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.8.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /ant-design-vue@3.2.20(vue@3.3.4): + resolution: {integrity: sha512-YWpMfGaGoRastIXEYfCoJiaRiDHk4chqtYhlKQM5GqPt6NfvrM1Vg2e60yHtjxlZjed91wCMm0rAmyUr7Hwzdg==} + engines: {node: '>=12.22.0'} + peerDependencies: + vue: '>=3.2.0' + dependencies: + '@ant-design/colors': 6.0.0 + '@ant-design/icons-vue': 6.1.0(vue@3.3.4) + '@babel/runtime': 7.21.0 + '@ctrl/tinycolor': 3.6.0 + '@simonwep/pickr': 1.8.2 + array-tree-filter: 2.1.0 + async-validator: 4.2.5 + dayjs: 1.11.7 + dom-align: 1.12.4 + dom-scroll-into-view: 2.0.1 + lodash: 4.17.21 + lodash-es: 4.17.21 + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallow-equal: 1.2.1 + vue: 3.3.4 + vue-types: 3.0.2(vue@3.3.4) + warning: 4.0.3 + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true + + /array-tree-filter@2.1.0: + resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + dev: false + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + dev: true + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /bignumber.js@9.1.1: + resolution: {integrity: sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.21.5: + resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001469 + electron-to-chromium: 1.4.339 + node-releases: 2.0.10 + update-browserslist-db: 1.0.10(browserslist@4.21.5) + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.5.0 + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001469: + resolution: {integrity: sha512-Rcp7221ScNqQPP3W+lVOYDyjdR6dC+neEQCttoNr5bAyz54AboB4iwpnWgyi8P4YUsPybVzT4LgWiBbI3drL4g==} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /clipboard@2.0.11: + resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} + dependencies: + good-listener: 1.2.2 + select: 1.1.2 + tiny-emitter: 2.1.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@10.0.0: + resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + dev: true + + /compute-scroll-into-view@1.0.20: + resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /connect-history-api-fallback@1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + dev: true + + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + dev: true + + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + dependencies: + is-what: 3.14.1 + dev: true + + /core-js@3.29.1: + resolution: {integrity: sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==} + requiresBuild: true + dev: false + + /cosmiconfig-typescript-loader@4.3.0(@types/node@18.16.8)(cosmiconfig@8.1.3)(ts-node@10.9.1)(typescript@5.0.4): + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} + engines: {node: '>=12', npm: '>=6'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=7' + ts-node: '>=10' + typescript: '>=3' + dependencies: + '@types/node': 18.16.8 + cosmiconfig: 8.1.3 + ts-node: 10.9.1(@types/node@18.16.8)(typescript@5.0.4) + typescript: 5.0.4 + dev: true + + /cosmiconfig@8.1.3: + resolution: {integrity: sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cropperjs@1.5.13: + resolution: {integrity: sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==} + dev: false + + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.1 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-js@4.1.1: + resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + dev: false + + /css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true + + /dayjs@1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} + dev: false + + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + requiresBuild: true + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + optional: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dom-align@1.12.4: + resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==} + dev: false + + /dom-scroll-into-view@2.0.1: + resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} + dev: false + + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /dom7@3.0.0: + resolution: {integrity: sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==, tarball: https://registry.npm.taobao.org/dom7/-/dom7-3.0.0.tgz} + dependencies: + ssr-window: 3.0.0 + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + dev: true + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + dev: true + + /dotenv-expand@8.0.3: + resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} + engines: {node: '>=12'} + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /ejs@3.1.9: + resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.8.5 + dev: true + + /electron-to-chromium@1.4.339: + resolution: {integrity: sha512-MSXHBJGcbBydq/DQDlpBeUKnJ6C7aTiNCTRpfDV5Iz0sNr/Ng6RJFloq82AAicp/SrmDq4zF6XsKG0B8Xwn1UQ==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + requiresBuild: true + dependencies: + prr: 1.0.1 + dev: true + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + + /esbuild@0.17.12: + resolution: {integrity: sha512-bX/zHl7Gn2CpQwcMtRogTTBf9l1nl+H6R8nUbjk+RuKqAE3+8FDulLA+pHvX7aA7Xe07Iwa+CWvy9I8Y2qqPKQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.12 + '@esbuild/android-arm64': 0.17.12 + '@esbuild/android-x64': 0.17.12 + '@esbuild/darwin-arm64': 0.17.12 + '@esbuild/darwin-x64': 0.17.12 + '@esbuild/freebsd-arm64': 0.17.12 + '@esbuild/freebsd-x64': 0.17.12 + '@esbuild/linux-arm': 0.17.12 + '@esbuild/linux-arm64': 0.17.12 + '@esbuild/linux-ia32': 0.17.12 + '@esbuild/linux-loong64': 0.17.12 + '@esbuild/linux-mips64el': 0.17.12 + '@esbuild/linux-ppc64': 0.17.12 + '@esbuild/linux-riscv64': 0.17.12 + '@esbuild/linux-s390x': 0.17.12 + '@esbuild/linux-x64': 0.17.12 + '@esbuild/netbsd-x64': 0.17.12 + '@esbuild/openbsd-x64': 0.17.12 + '@esbuild/sunos-x64': 0.17.12 + '@esbuild/win32-arm64': 0.17.12 + '@esbuild/win32-ia32': 0.17.12 + '@esbuild/win32-x64': 0.17.12 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /escodegen@2.0.0: + resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-prettier@8.8.0(eslint@8.41.0): + resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.41.0 + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.41.0)(prettier@2.8.8): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.41.0 + eslint-config-prettier: 8.8.0(eslint@8.41.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-plugin-vue@9.13.0(eslint@8.41.0): + resolution: {integrity: sha512-aBz9A8WB4wmpnVv0pYUt86cmH9EkcwWzgEwecBxMoRNhQjTL5i4sqadnwShv/hOdr8Hbl8XANGV7dtX9UQIAyA==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + eslint: 8.41.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.0.11 + semver: 7.5.0 + vue-eslint-parser: 9.3.0(eslint@8.41.0) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.41.0: + resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0) + '@eslint-community/regexpp': 4.4.1 + '@eslint/eslintrc': 2.0.3 + '@eslint/js': 8.41.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + graphemer: 1.4.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@6.2.1: + resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} + engines: {node: '>=6.0.0'} + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + dev: true + + /espree@9.5.2: + resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.2 + acorn-jsx: 5.3.2(acorn@8.8.2) + eslint-visitor-keys: 3.4.1 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.1.1: + resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.0.4 + dev: true + + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + dev: true + + /gitmojis@3.13.4: + resolution: {integrity: sha512-TRYhqnD36Xs9GHuATVRmo7hzBb+6wXYC0zxBFvLs3nma7N1WQGWW2vPTQ0+3GsGcPwSp0XVGfe3Besn4a6ip5Q==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.0 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /good-listener@1.2.2: + resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} + dependencies: + delegate: 3.2.0 + dev: false + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.0 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-minifier-terser@6.1.0: + resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} + engines: {node: '>=12'} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.2 + commander: 8.3.0 + he: 1.2.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.16.6 + dev: true + + /html-tags@3.2.0: + resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} + engines: {node: '>=8'} + dev: true + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /i18next@20.6.1: + resolution: {integrity: sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==} + dependencies: + '@babel/runtime': 7.21.0 + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /immer@9.0.21: + resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==, tarball: https://registry.npm.taobao.org/immer/-/immer-9.0.21.tgz} + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.0 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-hotkey@0.2.0: + resolution: {integrity: sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==, tarball: https://registry.npm.taobao.org/is-hotkey/-/is-hotkey-0.2.0.tgz} + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: false + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + dependencies: + text-extensions: 1.9.0 + dev: true + + /is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + + /is-url@1.2.4: + resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==, tarball: https://registry.npm.taobao.org/is-url/-/is-url-1.2.4.tgz} + dev: false + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /jake@10.8.5: + resolution: {integrity: sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.4 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-bigint@1.0.0: + resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} + dependencies: + bignumber.js: 9.1.1 + dev: false + + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-eslint-parser@1.4.1: + resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==} + engines: {node: '>=8.10.0'} + dependencies: + acorn: 7.4.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 1.3.0 + espree: 6.2.1 + semver: 6.3.0 + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /less@4.1.3: + resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.5.0 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@13.2.2: + resolution: {integrity: sha512-71gSwXKy649VrSU09s10uAT0rWCcY3aewhMaHyl2N84oBk4Xs9HgxvUp3AYu+bNsK4NrOYYxvSgg7FyGJ+jGcA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + chalk: 5.2.0 + cli-truncate: 3.1.0 + commander: 10.0.0 + debug: 4.3.4 + execa: 7.1.1 + lilconfig: 2.1.0 + listr2: 5.0.8 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-inspect: 1.12.3 + pidtree: 0.6.0 + string-argv: 0.3.1 + yaml: 2.2.2 + transitivePeerDependencies: + - enquirer + - supports-color + dev: true + + /listr2@5.0.8: + resolution: {integrity: sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==} + engines: {node: ^14.13.1 || >=16.0.0} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.19 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.0 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==, tarball: https://registry.npm.taobao.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz} + + /lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==, tarball: https://registry.npm.taobao.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz} + + /lodash.foreach@4.5.0: + resolution: {integrity: sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==, tarball: https://registry.npm.taobao.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz} + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==, tarball: https://registry.npm.taobao.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz} + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true + + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash.throttle@4.1.1: + resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==, tarball: https://registry.npm.taobao.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz} + + /lodash.toarray@4.4.0: + resolution: {integrity: sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==, tarball: https://registry.npm.taobao.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz} + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.5.0 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.25.9: + resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + + /make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + pify: 4.0.1 + semver: 5.7.1 + dev: true + optional: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /material-colors@1.2.6: + resolution: {integrity: sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg==} + dev: false + + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + dev: true + + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==, tarball: https://registry.npm.taobao.org/mime-match/-/mime-match-1.0.2.tgz} + dependencies: + wildcard: 1.1.2 + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@7.4.3: + resolution: {integrity: sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.0: + resolution: {integrity: sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mitt@3.0.0: + resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==, tarball: https://registry.npm.taobao.org/mitt/-/mitt-3.0.0.tgz} + dev: false + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + requiresBuild: true + dev: true + optional: true + + /muggle-string@0.2.2: + resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==} + dev: true + + /namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==, tarball: https://registry.npm.taobao.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz} + + /nanoid@3.3.4: + resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /nanopop@2.2.0: + resolution: {integrity: sha512-E9JaHcxh3ere8/BEZHAcnuD10RluTSPyTToBvoFWS9/7DcCx6gyKjbn7M7Bx7E1veCxCuY1iO6h4+gdAf1j73Q==} + dev: false + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /needle@3.2.0: + resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + requiresBuild: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.6.3 + sax: 1.2.4 + transitivePeerDependencies: + - supports-color + dev: true + optional: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + dev: true + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.5.0 + dev: true + + /node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} + dependencies: + css-select: 4.3.0 + he: 1.2.0 + dev: true + + /node-releases@2.0.10: + resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.11.0 + semver: 7.5.0 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + dependencies: + ansi-styles: 3.2.1 + chalk: 2.4.2 + cross-spawn: 6.0.5 + memorystream: 0.3.1 + minimatch: 3.1.2 + pidtree: 0.3.1 + read-pkg: 3.0.0 + shell-quote: 1.8.0 + string.prototype.padend: 3.1.4 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.3 + dev: true + + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.5.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.5.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@0.2.0: + resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + requiresBuild: true + dev: true + optional: true + + /pinia@2.1.3(typescript@5.0.4)(vue@3.3.4): + resolution: {integrity: sha512-XNA/z/ye4P5rU1pieVmh0g/hSuDO98/a5UC8oSP0DNdvt6YtetJNHTrXwpwsQuflkGT34qKxAEcp7lSxXNjf/A==} + peerDependencies: + '@vue/composition-api': ^1.4.0 + typescript: '>=4.4.4' + vue: ^2.6.14 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + typescript: + optional: true + dependencies: + '@vue/devtools-api': 6.5.0 + typescript: 5.0.4 + vue: 3.3.4 + vue-demi: 0.14.5(vue@3.3.4) + dev: false + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /postcss-selector-parser@6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /preact@10.13.2: + resolution: {integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==, tarball: https://registry.npm.taobao.org/preact/-/preact-10.13.2.tgz} + + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.2.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, tarball: https://registry.npm.taobao.org/prismjs/-/prismjs-1.29.0.tgz} + engines: {node: '>=6'} + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + requiresBuild: true + dev: true + optional: true + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + /regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /resize-observer-polyfill@1.5.1: + resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + dependencies: + global-dirs: 0.1.1 + dev: true + + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.21.7: + resolution: {integrity: sha512-KXPaEuR8FfUoK2uHwNjxTmJ18ApyvD6zJpYv9FOJSqLStmt6xOY84l1IjK2dSolQmoXknrhEFRaPRgOPdqCT5w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} + dependencies: + tslib: 2.5.0 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + requiresBuild: true + dev: true + optional: true + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + requiresBuild: true + dev: true + optional: true + + /scroll-into-view-if-needed@2.2.31: + resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==} + dependencies: + compute-scroll-into-view: 1.0.20 + + /scule@1.0.0: + resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} + dev: true + + /select@1.1.2: + resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} + dev: false + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shallow-equal@1.2.1: + resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} + dev: false + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-quote@1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slate-history@0.66.0(slate@0.72.8): + resolution: {integrity: sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==} + peerDependencies: + slate: '>=0.65.3' + dependencies: + is-plain-object: 5.0.0 + slate: 0.72.8 + + /slate@0.72.8: + resolution: {integrity: sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==, tarball: https://registry.npm.taobao.org/slate/-/slate-0.72.8.tgz} + dependencies: + immer: 9.0.21 + is-plain-object: 5.0.0 + tiny-warning: 1.0.3 + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /snabbdom@3.5.1: + resolution: {integrity: sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==, tarball: https://registry.npm.taobao.org/snabbdom/-/snabbdom-3.5.1.tgz} + engines: {node: '>=8.3.0'} + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /ssr-window@3.0.0: + resolution: {integrity: sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==, tarball: https://registry.npm.taobao.org/ssr-window/-/ssr-window-3.0.0.tgz} + + /string-argv@0.3.1: + resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.0.1 + dev: true + + /string.prototype.padend@3.1.4: + resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svg-tags@1.0.0: + resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} + dev: true + + /terser@5.16.6: + resolution: {integrity: sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /tiny-emitter@2.1.0: + resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} + dev: false + + /tiny-warning@1.0.3: + resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==, tarball: https://registry.npm.taobao.org/tiny-warning/-/tiny-warning-1.0.3.tgz} + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-node@10.9.1(@types/node@18.16.8)(typescript@5.0.4): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 18.16.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: true + + /tsutils@3.21.0(typescript@5.0.4): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + 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' + dependencies: + tslib: 1.14.1 + typescript: 5.0.4 + dev: true + + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.1.2 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.10 + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unimport@3.0.6: + resolution: {integrity: sha512-GYxGJ1Bri1oqx8VFDjdgooGzeK7jBk3bvhXmamTIpu3nONOcUMGwZbX7X0L5RA7OWMXpR4vzpSQP7pXUzJg1/Q==} + dependencies: + '@rollup/pluginutils': 5.0.2 + escape-string-regexp: 5.0.0 + fast-glob: 3.2.12 + local-pkg: 0.4.3 + magic-string: 0.30.0 + mlly: 1.2.0 + pathe: 1.1.0 + pkg-types: 1.0.2 + scule: 1.0.0 + strip-literal: 1.0.1 + unplugin: 1.3.1 + transitivePeerDependencies: + - rollup + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unplugin-auto-import@0.16.0(@vueuse/core@10.1.2): + resolution: {integrity: sha512-AbeGl3kzoGyqh2uWwwSVYCXy2ouvSbHfBc2u7xmNBpOosWa7SIAz+nQx3f1JpMXunEZ9TTChXkor4WcGrpkc7Q==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + dependencies: + '@antfu/utils': 0.7.2 + '@rollup/pluginutils': 5.0.2 + '@vueuse/core': 10.1.2(vue@3.3.4) + local-pkg: 0.4.3 + magic-string: 0.30.0 + minimatch: 9.0.0 + unimport: 3.0.6 + unplugin: 1.3.1 + transitivePeerDependencies: + - rollup + dev: true + + /unplugin-vue-components@0.24.1(vue@3.3.4): + resolution: {integrity: sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + dependencies: + '@antfu/utils': 0.7.2 + '@rollup/pluginutils': 5.0.2 + chokidar: 3.5.3 + debug: 4.3.4 + fast-glob: 3.2.12 + local-pkg: 0.4.3 + magic-string: 0.30.0 + minimatch: 7.4.3 + resolve: 1.22.1 + unplugin: 1.3.1 + vue: 3.3.4 + transitivePeerDependencies: + - rollup + - supports-color + dev: true + + /unplugin@1.3.1: + resolution: {integrity: sha512-h4uUTIvFBQRxUKS2Wjys6ivoeofGhxzTe2sRWlooyjHXVttcVfV/JiavNd3d4+jty0SVV0dxGw9AkY9MwiaCEw==} + dependencies: + acorn: 8.8.2 + chokidar: 3.5.3 + webpack-sources: 3.2.3 + webpack-virtual-modules: 0.5.0 + dev: true + + /update-browserslist-db@1.0.10(browserslist@4.21.5): + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.5 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /vite-plugin-html@3.2.0(vite@4.3.8): + resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + '@rollup/pluginutils': 4.2.1 + colorette: 2.0.19 + connect-history-api-fallback: 1.6.0 + consola: 2.15.3 + dotenv: 16.0.3 + dotenv-expand: 8.0.3 + ejs: 3.1.9 + fast-glob: 3.2.12 + fs-extra: 10.1.0 + html-minifier-terser: 6.1.0 + node-html-parser: 5.4.2 + pathe: 0.2.0 + vite: 4.3.8(@types/node@18.16.8)(less@4.1.3) + dev: true + + /vite@4.3.8(@types/node@18.16.8)(less@4.1.3): + resolution: {integrity: sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.16.8 + esbuild: 0.17.12 + less: 4.1.3 + postcss: 8.4.23 + rollup: 3.21.7 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vue-clipboard3@2.0.0: + resolution: {integrity: sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==} + dependencies: + clipboard: 2.0.11 + dev: false + + /vue-demi@0.14.0(vue@3.3.4): + resolution: {integrity: sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.3.4 + + /vue-demi@0.14.5(vue@3.3.4): + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + dependencies: + vue: 3.3.4 + dev: false + + /vue-eslint-parser@9.3.0(eslint@8.41.0): + resolution: {integrity: sha512-48IxT9d0+wArT1+3wNIy0tascRoywqSUe2E1YalIC1L8jsUGe5aJQItWfRok7DVFGz3UYvzEI7n5wiTXsCMAcQ==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + debug: 4.3.4 + eslint: 8.41.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.5.0 + lodash: 4.17.21 + semver: 7.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + /vue-i18n@9.2.2(vue@3.3.4): + resolution: {integrity: sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==} + engines: {node: '>= 14'} + peerDependencies: + vue: ^3.0.0 + dependencies: + '@intlify/core-base': 9.2.2 + '@intlify/shared': 9.2.2 + '@intlify/vue-devtools': 9.2.2 + '@vue/devtools-api': 6.5.0 + vue: 3.3.4 + + /vue-router@4.2.1(vue@3.3.4): + resolution: {integrity: sha512-nW28EeifEp8Abc5AfmAShy5ZKGsGzjcnZ3L1yc2DYUo+MqbBClrRP9yda3dIekM4I50/KnEwo1wkBLf7kHH5Cw==} + peerDependencies: + vue: ^3.2.0 + dependencies: + '@vue/devtools-api': 6.5.0 + vue: 3.3.4 + dev: false + + /vue-template-compiler@2.7.14: + resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.6.5(typescript@5.0.4): + resolution: {integrity: sha512-Wtw3J7CC+JM2OR56huRd5iKlvFWpvDiU+fO1+rqyu4V2nMTotShz4zbOZpW5g9fUOcjnyZYfBo5q5q+D/q27JA==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/vue-language-core': 1.6.5 + '@volar/vue-typescript': 1.6.5(typescript@5.0.4) + semver: 7.3.8 + typescript: 5.0.4 + dev: true + + /vue-types@3.0.2(vue@3.3.4): + resolution: {integrity: sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==} + engines: {node: '>=10.15.0'} + peerDependencies: + vue: ^3.0.0 + dependencies: + is-plain-object: 3.0.1 + vue: 3.3.4 + dev: false + + /vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + + /warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + is-typed-array: 1.1.10 + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==, tarball: https://registry.npm.taobao.org/wildcard/-/wildcard-1.1.2.tgz} + + /word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yaml-eslint-parser@0.3.2: + resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==} + dependencies: + eslint-visitor-keys: 1.3.0 + lodash: 4.17.21 + yaml: 1.10.2 + dev: true + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true + + /yaml@2.2.2: + resolution: {integrity: sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==} + engines: {node: '>= 14'} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/pro-components/card/ProCard.tsx b/pro-components/card/ProCard.tsx new file mode 100644 index 0000000..8542826 --- /dev/null +++ b/pro-components/card/ProCard.tsx @@ -0,0 +1,20 @@ +import Card from './components/Card' +import type { CardType, CardProps } from './types' + +export type ProCardProps = CardProps + +export type ProCardType = CardType & { + isProCard: boolean + Group: typeof Group +} + +const Group = (props: CardProps) => + +// 当前不对底层 Card 做封装,仅挂载子组件,直接导出 +// @ts-ignore +const ProCard: ProCardType = Card + +ProCard.isProCard = true +ProCard.Group = Group + +export default ProCard diff --git a/pro-components/card/components/Actions/index.less b/pro-components/card/components/Actions/index.less new file mode 100644 index 0000000..526bb24 --- /dev/null +++ b/pro-components/card/components/Actions/index.less @@ -0,0 +1,75 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@import (reference) 'ant-design-vue/es/style/mixins/index.less'; + +@pro-card-prefix-cls: ~'@{ant-prefix}-pro-card'; +@card-action-icon-size: 16px; + +.@{pro-card-prefix-cls} { + &-actions { + margin: 0; + padding: 0; + list-style: none; + background: @card-actions-background; + border-top: @border-width-base @border-style-base @border-color-split; + .clearfix; + + .@{ant-prefix}-space { + gap: 0 !important; + width: 100%; + } + + & > li, + .@{ant-prefix}-space-item { + flex: 1; + float: left; + margin: @card-actions-li-margin; + color: @text-color-secondary; + text-align: center; + + > a { + color: @text-color-secondary; + transition: color 0.3s; + &:hover { + color: @primary-color-hover; + } + } + + > span { + position: relative; + display: block; + min-width: 32px; + font-size: @font-size-base; + line-height: @line-height-base; + cursor: pointer; + + &:hover { + color: @primary-color-hover; + transition: color 0.3s; + } + + a:not(.@{ant-prefix}-btn), + > .anticon { + display: inline-block; + width: 100%; + color: @text-color-secondary; + line-height: 22px; + transition: color 0.3s; + + &:hover { + color: @primary-color-hover; + } + } + + > .anticon { + font-size: @card-action-icon-size; + line-height: 22px; + } + } + + &:not(:last-child) { + border-right: @border-width-base @border-style-base @border-color-split; + } + } + } +} diff --git a/pro-components/card/components/Actions/index.tsx b/pro-components/card/components/Actions/index.tsx new file mode 100644 index 0000000..bb1d733 --- /dev/null +++ b/pro-components/card/components/Actions/index.tsx @@ -0,0 +1,33 @@ +import './index.less' +import type { FunctionalComponent } from 'vue' +import type { VueNode } from '../../../types' + +export type ProCardActionsProps = { + /** + * 自定义前缀 + * + * @ignore + */ + prefixCls?: string + /** 操作按钮 */ + actions?: VueNode +} + +const ProCardActions: FunctionalComponent = props => { + const { actions, prefixCls } = props + if (Array.isArray(actions) && actions?.length) { + return ( + + ) + } + if (actions) return + return null +} + +export default ProCardActions diff --git a/pro-components/card/components/Card/index.less b/pro-components/card/components/Card/index.less new file mode 100644 index 0000000..7699569 --- /dev/null +++ b/pro-components/card/components/Card/index.less @@ -0,0 +1,216 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-card-prefix-cls: ~'@{ant-prefix}-pro-card'; +@card-hoverable-hover-border: transparent; +@pro-card-default-border: @border-width-base @border-style-base @border-color-split; + +// == when focus or actived +.pro-card-active() { + background-color: @item-active-bg; + border-color: @outline-color; +} + +.@{pro-card-prefix-cls} { + position: relative; + display: flex; + flex-direction: column; + box-sizing: border-box; + width: 100%; + margin: 0; + padding: 0; + background-color: @component-background; + border-radius: @card-radius; + + &-col { + width: 100%; + } + + &-border { + border: @pro-card-default-border; + } + + &-hoverable { + cursor: pointer; + transition: box-shadow 0.3s, border-color 0.3s; + + &:hover { + border-color: @card-hoverable-hover-border; + box-shadow: @card-shadow; + } + + &.@{pro-card-prefix-cls}-checked:hover { + border-color: @outline-color; + } + } + + &-checked { + .pro-card-active(); + &::after { + position: absolute; + top: 2px; + right: 2px; + width: 0; + height: 0; + border: 6px solid @primary-color; + border-bottom: 6px solid transparent; + border-left: 6px solid transparent; + border-top-right-radius: 2px; + content: ''; + } + } + + &:focus { + .pro-card-active(); + } + + &-size-small { + .@{pro-card-prefix-cls} { + &-header { + padding: @card-head-padding-sm @card-padding-base-sm; + padding-bottom: 0; + + &-border { + & { + padding-bottom: @card-head-padding-sm; + } + } + } + + &-title { + font-size: @card-head-font-size-sm; + } + + &-body { + padding: @card-padding-base-sm; + } + } + } + + &-ghost { + background-color: transparent; + + > .@{pro-card-prefix-cls} { + &-header { + padding-right: 0; + padding-bottom: @card-head-padding; + padding-left: 0; + } + + &-body { + padding: 0; + background-color: transparent; + } + } + } + + &-split > &-body { + padding: 0; + } + + &-split-vertical { + border-right: @border-width-base @border-style-base @border-color-split; + } + + &-split-horizontal { + border-bottom: @border-width-base @border-style-base @border-color-split; + } + + &-contain-card > &-body { + display: flex; + } + + &-body-direction-column { + flex-direction: column; + } + + &-body-wrap { + flex-wrap: wrap; + } + + &-collapse { + > .@{pro-card-prefix-cls} { + &-header { + padding-bottom: @card-head-padding; + border-bottom: 0; + } + + &-body { + display: none; + } + } + } + + &-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: @card-head-padding @card-padding-base; + padding-bottom: 0; + &-border { + & { + padding-bottom: @card-head-padding; + } + border-bottom: @border-width-base @border-style-base @border-color-split; + } + + &-collapsible { + cursor: pointer; + } + } + + &-title { + color: @card-head-color; + font-weight: 500; + font-size: @card-head-font-size; + } + + &-extra { + color: @card-head-extra-color; + } + + &-type-inner { + .@{pro-card-prefix-cls}-header { + background-color: @background-color-light; + } + } + + &-collapsible-icon { + margin-right: 8px; + color: @icon-color-hover; + :hover { + color: @primary-color-hover; + } + + & svg { + transition: transform @animation-duration-base; + } + } + + &-body { + display: block; + box-sizing: border-box; + height: 100%; + padding: @card-padding-base; + + &-center { + display: flex; + align-items: center; + justify-content: center; + } + } +} + +.loop-grid-columns(@index) when (@index > 0) { + .@{pro-card-prefix-cls}-col-@{index} { + flex-shrink: 0; + width: percentage((@index / @grid-columns)); + } + .loop-grid-columns((@index - 1)); +} + +.@{pro-card-prefix-cls}-col-0 { + display: none; +} + +.loop-grid-columns(@grid-columns); diff --git a/pro-components/card/components/Card/index.tsx b/pro-components/card/components/Card/index.tsx new file mode 100644 index 0000000..8fc9846 --- /dev/null +++ b/pro-components/card/components/Card/index.tsx @@ -0,0 +1,263 @@ +import './index.less' + +import { Grid, Tabs } from 'ant-design-vue' +import 'ant-design-vue/es/grid/style/index.less' +import 'ant-design-vue/es/tabs/style/index.less' + +import { RightOutlined } from '@ant-design/icons-vue' + +import type { Breakpoint, Gutter } from '../../types' + +import Loading from '../Loading' +import Actions from '../Actions' +import { getPrefixCls } from '#/layout/RouteContext' +import { defineComponent, watchEffect } from 'vue' +import type { CSSProperties } from 'vue' + +const { useBreakpoint } = Grid + +import { useToggle } from '@vueuse/core' +import { cardProps } from '../../types' +import LabelIconTip from '../../../utils/components/LabelIconTip' + +const Card = defineComponent({ + // eslint-disable-next-line vue/multi-word-component-names + name: 'Card', + slots: ['loading'], + props: cardProps(), + setup(props, { attrs, slots }) { + const screens = useBreakpoint() + + const [collapsed, setCollapsed] = useToggle(false) + watchEffect(() => { + props.collapsed && (collapsed.value = props.collapsed) + }) + + // 顺序决定如何进行响应式取值,按最大响应值依次取值,请勿修改。 + const responsiveArray: Breakpoint[] = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs'] + + /** + * 根据响应式获取 gutter, 参考 antd 实现 + * + * @param gut + */ + const getNormalizedGutter = (gut: Gutter | Gutter[]) => { + const results: [number, number] = [0, 0] + const normalizedGutter = Array.isArray(gut) ? gut : [gut, 0] + normalizedGutter.forEach((g, index) => { + if (typeof g === 'object') { + for (let i = 0; i < responsiveArray.length; i += 1) { + const breakpoint: Breakpoint = responsiveArray[i] + if (screens.value[breakpoint] && g[breakpoint] !== undefined) { + results[index] = g[breakpoint] as number + break + } + } + } else { + results[index] = g || 0 + } + }) + return results + } + + /** + * 根据条件返回 style,负责返回空对象 + * + * @param withStyle 是否符合条件 + * @param appendStyle 如果符合条件要返回的 style 属性 + */ + const getStyle = (withStyle: boolean, appendStyle: CSSProperties) => { + return withStyle ? appendStyle : {} + } + + // const getColSpanStyle = (colSpan: CardProps['colSpan']) => { + // let span = colSpan + // + // // colSpan 响应式 + // if (typeof colSpan === 'object') { + // for (let i = 0; i < responsiveArray.length; i += 1) { + // const breakpoint: Breakpoint = responsiveArray[i] + // if (screens.value[breakpoint] && colSpan[breakpoint] !== undefined) { + // span = colSpan[breakpoint] + // break + // } + // } + // } + // + // // 当 colSpan 为 30% 或 300px 时 + // const colSpanStyle = getStyle(typeof span === 'string' && /\d%|\dpx/i.test(span), { + // width: span as string, + // flexShrink: 0 + // }) + // + // return { span, colSpanStyle } + // } + + const prefixCls = getPrefixCls('pro-card') + + const [horizonalGutter, verticalGutter] = getNormalizedGutter(props.gutter) + + // 判断是否套了卡片,如果套了的话将自身卡片内部内容的 padding 设置为0 + const containProCard = false + // const childrenArray = React.Children.toArray(children) as ProCardChildType[] + // + // const childrenModified = childrenArray.map((element, index) => { + // if (element?.type?.isProCard) { + // containProCard = true + // + // // 宽度 + // const { colSpan } = element.props + // const { span, colSpanStyle } = getColSpanStyle(colSpan) + // + // const columnClassName = [ + // [`${prefixCls}-col`], + // { + // [`${prefixCls}-split-vertical`]: + // split === 'vertical' && index !== childrenArray.length - 1, + // [`${prefixCls}-split-horizontal`]: + // split === 'horizontal' && index !== childrenArray.length - 1, + // [`${prefixCls}-col-${span}`]: typeof span === 'number' && span >= 0 && span <= 24 + // } + // ] + // + // return ( + //
0, { + // paddingRight: horizonalGutter / 2, + // paddingLeft: horizonalGutter / 2 + // }), + // ...getStyle(verticalGutter! > 0, { + // paddingTop: verticalGutter / 2, + // paddingBottom: verticalGutter / 2 + // }) + // }} + // key={`pro-card-col-${element?.key || index}`} + // class={columnClassName} + // > + // {React.cloneElement(element)} + //
+ // ) + // } + // return element + // }) + + const cardCls = [ + `${prefixCls}`, + attrs.class, + { + [`${prefixCls}-border`]: props.bordered, + [`${prefixCls}-contain-card`]: containProCard, + [`${prefixCls}-loading`]: props.loading, + [`${prefixCls}-split`]: props.split === 'vertical' || props.split === 'horizontal', + [`${prefixCls}-ghost`]: props.ghost, + [`${prefixCls}-hoverable`]: props.hoverable, + [`${prefixCls}-size-${props.size}`]: props.size, + [`${prefixCls}-type-${props.type}`]: props.type, + [`${prefixCls}-collapse`]: collapsed.value, + [`${prefixCls}-checked`]: props.checked + } + ] + + const bodyCls = [ + `${prefixCls}-body`, + { + [`${prefixCls}-body-center`]: props.layout === 'center', + [`${prefixCls}-body-direction-column`]: + props.split === 'horizontal' || props.direction === 'column', + [`${prefixCls}-body-wrap`]: props.wrap && containProCard + } + ] + + const cardBodyStyle = { + ...getStyle(horizonalGutter! > 0, { + marginRight: -horizonalGutter / 2, + marginLeft: -horizonalGutter / 2 + }), + ...getStyle(verticalGutter! > 0, { + marginTop: -verticalGutter / 2, + marginBottom: -verticalGutter / 2 + }), + ...props.bodyStyle + } + + const loadingDOM = slots.loading ? ( + slots.loading() + ) : ( + + ) + + // 非受控情况下展示 + const collapsibleButton = + props.collapsible && + props.collapsed === undefined && + (props.collapsibleIconRender ? ( + props.collapsibleIconRender({ collapsed: collapsed.value }) + ) : ( + + )) + + return () => ( +
{ + props.onChecked?.(e) + props?.onClick?.(e) + }} + > + {(props.title || props.extra || collapsibleButton) && ( +
{ + if (collapsibleButton) setCollapsed(!collapsed) + }} + > +
+ {collapsibleButton} + +
+ {props.extra &&
{props.extra}
} +
+ )} + {props.tabs ? ( +
+ + {props.loading ? loadingDOM : slots.default?.()} + +
+ ) : ( +
+ {props.loading ? loadingDOM : slots.default?.()} +
+ )} + {} +
+ ) + } +}) + +export default Card diff --git a/pro-components/card/components/Loading/index.less b/pro-components/card/components/Loading/index.less new file mode 100644 index 0000000..45bdb65 --- /dev/null +++ b/pro-components/card/components/Loading/index.less @@ -0,0 +1,42 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@pro-card-prefix-cls: ~'@{ant-prefix}-pro-card'; + +@gradient-min: fade(@card-skeleton-bg, 20%); +@gradient-max: fade(@card-skeleton-bg, 40%); + +.@{pro-card-prefix-cls} { + &-loading { + overflow: hidden; + } + + &-loading &-body { + user-select: none; + } + + &-loading-content { + width: 100%; + p { + margin: 0; + } + } + + &-loading-block { + height: 14px; + margin: 4px 0; + background: linear-gradient(90deg, @gradient-min, @gradient-max, @gradient-min); + background-size: 600% 600%; + border-radius: @card-radius; + animation: card-loading 1.4s ease infinite; + } +} + +@keyframes card-loading { + 0%, + 100% { + background-position: 0 50%; + } + 50% { + background-position: 100% 50%; + } +} diff --git a/pro-components/card/components/Loading/index.tsx b/pro-components/card/components/Loading/index.tsx new file mode 100644 index 0000000..1763d1c --- /dev/null +++ b/pro-components/card/components/Loading/index.tsx @@ -0,0 +1,62 @@ +import './index.less' + +import { Row, Col } from 'ant-design-vue' +import 'ant-design-vue/es/grid/style/index.less' + +import type { CSSProperties, FunctionalComponent } from 'vue' + +type LoadingProps = { + /** Prefix */ + prefix?: string +} + +const Loading: FunctionalComponent = (props, { attrs }) => { + const { prefix } = props + + return ( +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + + + +
+ + +
+ + +
+ + +
+ ) +} + +export default Loading diff --git a/pro-components/card/index.tsx b/pro-components/card/index.tsx new file mode 100644 index 0000000..2ff3425 --- /dev/null +++ b/pro-components/card/index.tsx @@ -0,0 +1,8 @@ +import ProCard from './ProCard' +import type { ProCardProps } from './ProCard' + +import type { ProCardTabsProps } from './types' + +export type { ProCardTabsProps, ProCardProps } + +export default ProCard diff --git a/pro-components/card/types.ts b/pro-components/card/types.ts new file mode 100644 index 0000000..b944e16 --- /dev/null +++ b/pro-components/card/types.ts @@ -0,0 +1,98 @@ +import type { TabsProps, TooltipProps } from 'ant-design-vue' +import type { TabPaneProps } from 'ant-design-vue' +import type { CSSProperties, ExtractPropTypes, PropType } from 'vue' +import type { VueNode } from '../types' +import { VueNodePropType } from '../types' + +export type Breakpoint = 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs' +export type Gutter = number | Partial> +// eslint-disable-next-line @typescript-eslint/ban-types +export type ProCardTabsProps = {} & TabsProps + +export type ColSpanType = number | string + +export const cardProps = () => ({ + /** 标题样式 */ + headStyle: { type: Object as PropType, default: () => ({}) }, + /** 内容样式 */ + bodyStyle: { type: Object as PropType, default: () => ({}) }, + /** 页头是否有分割线 */ + headerBordered: { type: Boolean, default: false }, + /** 卡片标题 */ + title: VueNodePropType as PropType, + /** 副标题 */ + subTitle: VueNodePropType as PropType, + + /** 标题说明 */ + tooltip: [Object, String] as PropType, + /** @deprecated 你可以使用 tooltip,这个更改是为了与 antd 统一 */ + tip: String, + /** 右上角自定义区域 */ + extra: VueNodePropType as PropType, + /** 布局,center 代表垂直居中 */ + layout: String as PropType<'default' | 'center'>, + /** 卡片类型 */ + type: String as PropType<'default' | 'inner'>, + /** 指定 Flex 方向,仅在嵌套子卡片时有效 */ + direction: String as PropType<'column' | 'row'>, + /** 是否自动换行,仅在嵌套子卡片时有效 */ + wrap: { type: Boolean, default: false }, + /** 尺寸 */ + size: String as PropType<'default' | 'small'>, + /** 加载中 */ + loading: [Boolean, Object, String] as PropType, + /** 栅格布局宽度,24 栅格,支持指定宽度或百分,需要支持响应式 colSpan={{ xs: 12, sm: 6 }} */ + colSpan: [Number, String, Object] as PropType< + ColSpanType | Partial> + >, + /** 栅格间距 */ + gutter: { + type: [Number, Object] as PropType, + default: 0 + }, + /** 操作按钮 */ + actions: Array as PropType, + /** 拆分卡片方式 */ + split: String as PropType<'vertical' | 'horizontal'>, + /** 是否有边框 */ + bordered: { type: Boolean, default: false }, + /** + * 鼠标移过时可浮起 + * + * @default false + */ + hoverable: { type: Boolean, default: false }, + /** 幽灵模式,即是否取消卡片内容区域的 padding 和 背景颜色。 */ + ghost: { type: Boolean, default: false }, + /** 是否可折叠 */ + collapsible: { type: Boolean, default: false }, + /** 受控 collapsed 属性 */ + collapsed: { type: Boolean, default: false }, + /** 折叠按钮自定义节点 */ + collapsibleIconRender: Function as PropType<({ collapsed }: { collapsed: boolean }) => VueNode>, + /** 收起卡片的事件 */ + onCollapse: Function as PropType<(collapsed: boolean) => void>, + /** 标签栏配置 */ + tabs: Object as PropType, + /** 前缀 */ + prefixCls: String, + /** ProCard 的 ref */ + // ref: React.Ref + /** 是否展示选中样式 */ + checked: { type: Boolean, default: false }, + /** 选中改变 */ + onChecked: Function as PropType<(e: MouseEvent) => void>, + /** 点击事件 */ + onClick: Function as PropType<(e: MouseEvent) => void> +}) + +export type CardProps = Partial>> + +export type ProCardTabPaneProps = { + /** Key */ + key?: string + /** ProCard 相关属性透传 */ + cardProps?: CardProps +} & TabPaneProps + +export type CardType = CardProps diff --git a/pro-components/field/index.ts b/pro-components/field/index.ts new file mode 100644 index 0000000..be673e9 --- /dev/null +++ b/pro-components/field/index.ts @@ -0,0 +1 @@ +export type ProFieldEmptyText = string | false diff --git a/pro-components/form/BaseForm/LightWrapper/index.less b/pro-components/form/BaseForm/LightWrapper/index.less new file mode 100644 index 0000000..462a21c --- /dev/null +++ b/pro-components/form/BaseForm/LightWrapper/index.less @@ -0,0 +1,14 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-field-light-wrapper: ~'@{ant-prefix}-pro-field-light-wrapper'; + +.@{pro-field-light-wrapper}-collapse-label { + padding: 1px; +} + +.@{pro-field-light-wrapper}-container { + .@{ant-prefix}-form-item { + margin-bottom: 0; + } +} diff --git a/pro-components/form/BaseForm/LightWrapper/index.tsx b/pro-components/form/BaseForm/LightWrapper/index.tsx new file mode 100644 index 0000000..6648041 --- /dev/null +++ b/pro-components/form/BaseForm/LightWrapper/index.tsx @@ -0,0 +1,44 @@ +import './index.less' +import type { VueNode } from '../../../types' +import type { Placement } from 'ant-design-vue/es/vc-select/BaseSelect' + +export type SizeType = 'small' | 'middle' | 'large' | undefined + +export type LightWrapperProps = { + label?: VueNode + disabled?: boolean + placeholder?: VueNode + size?: SizeType + value?: any + onChange?: (value?: any) => void + onBlur?: (value?: any) => void + valuePropName?: string + customLightMode?: boolean + light?: boolean + /** + * @name 自定义label的值 + * + * @example 自定义数组的转化 + * labelFormatter={(value) =>value.join('-')} } + */ + labelFormatter?: (value: any) => string + bordered?: boolean + otherFieldProps?: any + valueType?: string + allowClear?: boolean + footerRender?: LightFilterFooterRender + placement?: Placement +} + +export type LightFilterFooterRender = + | (( + /** + * 确认选择的值 + */ + onConfirm?: (e?: MouseEvent) => void, + /** + * 清除选择 + */ + onClear?: (e?: MouseEvent) => void + ) => JSX.Element | false) + | false diff --git a/pro-components/form/layouts/QueryFilter/Actions.tsx b/pro-components/form/layouts/QueryFilter/Actions.tsx new file mode 100644 index 0000000..e47b0e0 --- /dev/null +++ b/pro-components/form/layouts/QueryFilter/Actions.tsx @@ -0,0 +1,89 @@ +import { Space } from 'ant-design-vue' +import { DownOutlined } from '@ant-design/icons-vue' +import type { IntlType } from '../../../provider' +import type { CSSProperties, FunctionalComponent } from 'vue' +import type { VueNode } from '../../../types' +import { useIntl } from '../../../provider' +import omitBoolean from '../../../utils/omitBoolean' +import { getPrefixCls } from '../../../layout/RouteContext' + +export type ActionsProps = { + submitter: VueNode + /** 是否收起 */ + collapsed?: boolean + /** 收起按钮的事件 */ + onCollapse?: (collapsed: boolean) => void + + setCollapsed: (collapse: boolean) => void + isForm?: boolean + style?: CSSProperties + /** 收起按钮的 render */ + collapseRender?: + | (( + collapsed: boolean, + /** 是否应该展示,有两种情况 列只有三列,不需要收起 form 模式 不需要收起 */ + props: ActionsProps, + intl: IntlType, + hiddenNum?: false | number + ) => VueNode) + | false + /** 隐藏个数 */ + hiddenNum?: false | number +} + +const defaultCollapseRender: ActionsProps['collapseRender'] = (collapsed, _, intl, hiddenNum) => { + if (collapsed) { + return ( + <> + {intl.getMessage('tableForm.collapsed', '展开')} + {hiddenNum && `(${hiddenNum})`} + + + ) + } + return ( + <> + {intl.getMessage('tableForm.expand', '收起')} + + + ) +} + +/** + * FormFooter 的组件,可以自动进行一些配置 + * + * @param props + */ +const Actions: FunctionalComponent = props => { + const { setCollapsed, collapsed = false, submitter, style, hiddenNum } = props + const intl = useIntl() + + const collapseRender = omitBoolean(props.collapseRender) || defaultCollapseRender + return ( + + {submitter} + {props.collapseRender !== false && ( + setCollapsed(!collapsed)} + > + {collapseRender?.(collapsed, props, intl, hiddenNum)} + + )} + + ) +} + +export default Actions diff --git a/pro-components/form/layouts/QueryFilter/index.tsx b/pro-components/form/layouts/QueryFilter/index.tsx new file mode 100644 index 0000000..ba82f8a --- /dev/null +++ b/pro-components/form/layouts/QueryFilter/index.tsx @@ -0,0 +1,106 @@ +/* eslint-disable no-param-reassign */ +import type { RowProps } from 'ant-design-vue' +import type { FormProps } from 'ant-design-vue/es/form/Form' + +import type { ActionsProps } from './Actions' +import type { VueNode } from '../../../types' + +export type SpanConfig = + | number + | { + xs: number + sm: number + md: number + lg: number + xl: number + xxl: number + } + +export type BaseQueryFilterProps = Omit & { + className?: string + defaultCollapsed?: boolean + /** + * @name layout 的布局设置 + * @type 'horizontal' | 'inline' | 'vertical'; + */ + layout?: FormProps['layout'] + defaultColsNumber?: number + /** + * @name 文字标签的宽度 + * + * @example 文字标签宽 80 ,一般用于只有两个字 + * labelWidth={80} + * @example 文字标签宽 140 ,一般用于有四个字 + * labelWidth={140} + * @example 自动计算,会导致不整齐 + * labelWidth="auto" + */ + labelWidth?: number | 'auto' + /** + * @name 每一行之前要不要有分割线 + * @description 只有在 `layout` 为 `vertical` 时生效 + */ + split?: boolean + /** + * @name 配置列数,一般而言是 8 的倍数 + * + * @example 配置一行4个 + * span={6} + * + * @example 配置一行3个 + * span={6} + * + * @example 根据屏幕宽度配置 + * span={xs: 24, sm: 12, md: 8, lg: 6, xl: 6, xxl: 6} + * */ + span?: SpanConfig + + /** + * @name 查询按钮的文本 + * */ + searchText?: string + /** + * @name 重置按钮的文本 + */ + resetText?: string + /** + * @name 查询表单栅格间隔 + * + * @example searchGutter={24} + * */ + searchGutter?: RowProps['gutter'] + /** + * @param searchConfig 基础的配置 + * @param props 更加详细的配置 { + * type?: 'form' | 'list' | 'table' | 'cardList' | undefined; + * form: FormInstance; + * submit: () => void; + * collapse: boolean; + * setCollapse: (collapse: boolean) => void; + * showCollapseButton: boolean; } + * @name 底部操作栏的 render + * + * + * @example 增加一个清空按钮 + * optionRender={(searchConfig, props, dom) =>[ 清空,...dom]} + * + * @example 增自定义提交 + * + * optionRender={(searchConfig) => [ searchConfig?.form?.submit()}>提交]} + */ + optionRender?: + | (( + searchConfig: Omit, + props: Omit, + dom: VueNode[] + ) => VueNode[]) + | false + /** + * @name 忽略 Form.Item rule规则配置 + */ + ignoreRules?: boolean + /** + * @name 是否显示 collapse 隐藏个数 + */ + showHiddenNum?: boolean +} diff --git a/pro-components/layout/BasicLayout.less b/pro-components/layout/BasicLayout.less new file mode 100644 index 0000000..6d0d293 --- /dev/null +++ b/pro-components/layout/BasicLayout.less @@ -0,0 +1,68 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@basicLayout-prefix-cls: ~'@{ant-prefix}-pro-basicLayout'; +@pro-layout-header-height: 48px; + +.@{basicLayout-prefix-cls} { + // BFC + display: flex; + flex-direction: column; + width: 100%; + min-height: 100%; + + .@{ant-prefix}-layout-header { + &.@{ant-prefix}-pro-fixed-header { + position: fixed; + top: 0; + } + &.@{ant-prefix}-pro-header-light { + background: @component-background; + } + } + + &-content { + position: relative; + margin: 16px; + + .@{ant-prefix}-pro-page-container { + margin: -16px -16px 0; + } + + &-disable-margin { + margin: 0; + + .@{ant-prefix}-pro-page-container { + margin: 0; + } + } + > .@{ant-prefix}-layout { + max-height: 100%; + } + } + + // children should support fixed + .@{basicLayout-prefix-cls}-is-children.@{basicLayout-prefix-cls}-fix-siderbar { + height: 100vh; + overflow: hidden; + transform: rotate(0); + } + + .@{basicLayout-prefix-cls}-has-header { + // tech-page-container + .tech-page-container { + height: calc(100vh - @pro-layout-header-height); + } + .@{basicLayout-prefix-cls}-is-children.@{basicLayout-prefix-cls}-has-header { + .tech-page-container { + height: calc(100vh - @pro-layout-header-height - @pro-layout-header-height); + } + .@{basicLayout-prefix-cls}-is-children { + min-height: calc(100vh - @pro-layout-header-height); + &.@{basicLayout-prefix-cls}-fix-siderbar { + height: calc(100vh - @pro-layout-header-height); + } + } + } + } +} diff --git a/pro-components/layout/BasicLayout.tsx b/pro-components/layout/BasicLayout.tsx new file mode 100644 index 0000000..35f256e --- /dev/null +++ b/pro-components/layout/BasicLayout.tsx @@ -0,0 +1,383 @@ +import './BasicLayout.less' + +import { Layout } from 'ant-design-vue' +import 'ant-design-vue/es/layout/style/index.less' + +import HeaderView, { headerViewProps } from './Header' +import useMediaQuery from '../utils/hooks/useMediaQuery' +import WrapContent from './WrapContent' +import PageLoading from './components/PageLoading' +import { getRender } from './utils' +import SiderMenuWrapper from './components/SiderMenu' +import { clearMenuItem } from './utils/utils' +import { privateSiderMenuProps, siderMenuProps } from './components/SiderMenu/SiderMenu' +import { transformRouteToMenuItem } from './utils/menuUtils' +import { toRefs } from '@vueuse/core' + +import type { CSSProperties, PropType, Slots, VNode, ExtractPropTypes } from 'vue' +import type { MenuDataItem, MessageDescriptor, WithFalse } from './types' +import type { LocaleType } from './locales/types' +import type { WaterMarkProps } from './components/WaterMark' +import type { FooterRender, MenuRender, MultiTabRender } from './renderTypes' +import type { VueNode, VueNodeOrRender } from '#/types' +import { VueNodeOrRenderPropType } from '#/types' + +import type { RouteRecordRaw } from 'vue-router' + +import { getPrefixCls, routeContextInjectKey } from './RouteContext' +import FooterView from './Footer' + +export type LayoutBreadcrumbProps = { + minLength?: number +} + +const basicLayoutProps = () => ({ + ...privateSiderMenuProps(), + // 侧边菜单属性 + ...siderMenuProps(), + // 头部相关属性 + ...headerViewProps(), + + /** + * 路由信息,用来渲染菜单面包屑 + */ + routes: Array as PropType, + + /** + * 简约模式,设置了之后不渲染的任何 layout 的东西,但是会有 context,可以获取到当前菜单。 + * + * @example pure={true} + */ + pure: { type: Boolean, default: false }, + + /** + * logo 的配置,可以配置url,React 组件 和 false + * + * @example 设置 logo 为网络地址 logo="https://avatars1.githubusercontent.com/u/8186664?s=460&v=4" + * @example 设置 logo 为组件 logo={} + * @example 设置 logo 为 false 不显示 logo logo={false} + * @example 设置 logo 为 方法 logo={()=> } + * */ + logo: { + type: VueNodeOrRenderPropType as PropType>, + default: undefined + }, + + /** + * layout 的 loading 效果,设置完成之后只展示一个 loading + */ + loading: { type: Boolean, default: false }, + + /** + * 当前语言 + * + * @description "zh-CN" | "zh-TW" | "en-US" | "it-IT" | "ko-KR" + * @example 中文 layout="zh-CN" + * @example 英文 layout="en-US" + */ + locale: { type: String as PropType, default: 'zh-CN' }, + + /** + * @name layout 是严格受控的,可以 设置为 true,一直收起 + * + * @example collapsed={true} + */ + collapsed: { type: Boolean, default: undefined }, + + /** + * 收起和展开的时候触发事件 + * + * @example onCollapse=(collapsed)=>{ setCollapsed(collapsed) }; + */ + onCollapse: Function as PropType<(collapsed: boolean) => void>, + + /** + * 页脚的配置, 支持插槽 + * + * @example 不展示dom footerRender={false} + * @example 使用 layout 的 DefaultFooter footerRender={() => (} + */ + footerRender: { + type: VueNodeOrRenderPropType as PropType>, + default: undefined + }, + + /** + * 处理 menuData 的数据,可以动态的控制数据 + * @see 尽量不要用异步数据来处理,否则可能造成更新不及时,如果异步数据推荐使用 menu.request 和 params。 + * + * @example 删除一些菜单 menuDataRender=((menuData) => { return menuData.filter(item => item.name !== 'test') }) + * @example 增加一些菜单 menuDataRender={(menuData) => { return menuData.concat({ path: '/test', name: '测试', icon: 'smile' }) }} + * @example 修改菜单 menuDataRender={(menuData) => { return menuData.map(item => { if (item.name === 'test') { item.name = '测试' } return item }) }} + * @example 打平数据 menuDataRender={(menuData) => { return menuData.reduce((pre, item) => { return pre.concat(item.children || []) }, []) }} + */ + menuDataRender: Function as PropType<(menuData: MenuDataItem[]) => MenuDataItem[]>, + + /** + * 国际化消息处理 + */ + formatMessage: Function as PropType<(message: MessageDescriptor) => string>, + + /** + * 是否禁用移动端模式 + * + * @see 有的管理系统不需要移动端模式,此属性设置为true即可 + * @example disableMobile={true} + */ + disableMobile: { type: Boolean, default: false }, + + /** + * content 的样式 + * + * @example 背景颜色为红色 contentStyle={{ backgroundColor: 'red '}} + */ + contentStyle: Object as PropType, + + /** + * 取消 content的 margin + * + * @example 取消内容的 margin disableContentMargin={true} + */ + disableContentMargin: { type: Boolean, default: false }, + + /** 水印的相关配置 */ + waterMarkProps: Object as PropType, + + /** 是否是子布局 */ + isChildrenLayout: { type: Boolean, default: false } +}) + +export type BasicLayoutProps = Partial>> + +const headerRender = ( + props: BasicLayoutProps & { hasSiderMenu: boolean }, + slots: Slots, + matchMenuKeys: string[] = [] +): VNode | null => { + if (props.headerRender === false || props.pure) { + return null + } + return ( + // @ts-ignore TODO + + {slots} + + ) +} + +const footerRender = (props: BasicLayoutProps, slots: Slots): VueNode => { + if (props.footerRender === false || props.pure) { + return null + } + + const render = getRender(props, slots, 'footerRender') + if (render) { + return render({ ...props }, {slots}) + } + return null +} + +const renderSiderMenu = ( + props: BasicLayoutProps, + slots: Slots, + matchMenuKeys: string[] = [] +): VueNodeOrRender => { + // 指定了不渲染或者精简模式直接返回 null + if (props.menuRender === false || props.pure) { + return null + } + + // 如果是顶部导航,且不是手机模式不渲染 + if (props.layout === 'top' && !props.isMobile) { + return null + } + + let { menuData } = props + + /** 如果是分割菜单模式,需要专门实现一下 */ + if (props.splitMenus && (props.openKeys !== false || props.layout === 'mix') && !props.isMobile) { + const [key] = matchMenuKeys + if (key) { + menuData = props.menuData?.find(item => item.key === key)?.children || [] + } else { + menuData = [] + } + } + // 这里走了可以少一次循环 + const clearMenuData = clearMenuItem(menuData || []) + + if (clearMenuData && clearMenuData?.length < 1 && props.splitMenus) { + return null + } + + const defaultDom = ( + + {slots} + + ) + + const menuRender = getRender(props, slots, 'menuRender') + return menuRender ? menuRender(props, defaultDom) : defaultDom +} + +export default defineComponent({ + name: 'BasicLayout', + props: basicLayoutProps(), + slots: ['default', 'logo', 'menuHeaderRender', 'menuFooterRender'], + setup(props, { slots, attrs }) { + const prefixCls = props.prefixCls ?? getPrefixCls('pro') + + const baseClassName = `${prefixCls}-basicLayout` + // gen className + const className = computed(() => [ + 'ant-design-pro', + baseClassName, + { + [`screen-${colSize.value}`]: colSize.value, + [`${baseClassName}-top-menu`]: props.layout === 'top', + [`${baseClassName}-fix-siderbar`]: props.fixSiderbar, + [`${baseClassName}-${props.layout}`]: props.layout + } + ]) + + const contentClassName = computed(() => ({ + [`${baseClassName}-content`]: true, + [`${baseClassName}-has-header`]: !!headerDom.value, + [`${baseClassName}-content-disable-margin`]: props.disableContentMargin + })) + + // TODO,这里处理数据转换为题 + const menuInfoData = computed(() => transformRouteToMenuItem(props.routes || [])) + + const colSize = useMediaQuery() + + const isMobile = computed(() => colSize.value === 'sm' || colSize.value === 'xs') + + // ToDo collapsed 的双向绑定 + + // siderMenuDom 为空的时候,不需要 padding + const genLayoutStyle: CSSProperties = { + position: 'relative' + } + + // if is some layout children, don't need min height + watchEffect(() => { + if (props.isChildrenLayout || (props.contentStyle && props.contentStyle.minHeight)) { + genLayoutStyle.minHeight = '0px' + } + }) + + // If it is a fix menu, calculate padding + // don't need padding in phone mode + const leftSiderWidth = computed(() => { + const hasLeftPadding = props.layout !== 'top' && !isMobile.value + if (hasLeftPadding) { + return props.collapsed ? 48 : props.siderWidth + } + return 0 + }) + + // render sider dom + const siderMenuDom = computed(() => + renderSiderMenu( + { + ...props, + menuData: menuInfoData.value, + isMobile: isMobile.value, + theme: props.navTheme === 'dark' ? 'dark' : 'light', + prefixCls: prefixCls + }, + slots, + props.matchMenuKeys + ) + ) + + // render header dom + const headerViewProps = computed(() => ({ + ...props, + hasSiderMenu: !!siderMenuDom.value, + menuData: menuInfoData.value, + isMobile: isMobile.value, + theme: props.navTheme === 'dark' ? 'dark' : 'light', + prefixCls: prefixCls, + siderWidth: leftSiderWidth.value + })) + const headerDom = computed(() => + headerRender(headerViewProps.value, slots, props.matchMenuKeys) + ) + + // render footer dom + const footerDom = computed(() => + footerRender( + { + ...props, + isMobile: isMobile.value, + collapsed: props.collapsed + }, + slots + ) + ) + + const hasFooterToolbar = ref(false) + const setHasFooterToolbar = (has: boolean) => { + hasFooterToolbar.value = has + } + + // TODO pick 属性,防止传递太多无效数据下去 + const routeContext = reactive({ + ...toRefs(props), + // breadcrumb: breadcrumbProps, + // @ts-ignore + menuDa: menuInfoData.value!, + isMobile: isMobile.value, + collapsed: props.collapsed, + isChildrenLayout: true, + // title: pageTitleInfo.pageName, + hasSiderMenu: !!siderMenuDom.value, + hasHeader: !!headerDom.value, + siderWidth: leftSiderWidth.value, + hasFooter: !!footerDom.value, + hasFooterToolbar: hasFooterToolbar.value, + setHasFooterToolbar + // matchMenus, + // matchMenuKeys, + // currentMenu, + }) + + provide(routeContextInjectKey, routeContext) + + return () => { + const multiTabRender = getRender(props, slots, 'multiTabRender') + const multiTabDom = multiTabRender && multiTabRender(headerViewProps.value) + + return ( +
+ + {siderMenuDom.value} +
+ {headerDom.value} + {multiTabDom} + {/*@ts-ignore*/} + + {props.loading ? : slots.default?.()} + + {footerDom.value} +
+
+
+ ) + } + } +}) diff --git a/pro-components/layout/Footer.tsx b/pro-components/layout/Footer.tsx new file mode 100644 index 0000000..f596c07 --- /dev/null +++ b/pro-components/layout/Footer.tsx @@ -0,0 +1,54 @@ +import { Layout } from 'ant-design-vue' +import GlobalFooter from './components/GlobalFooter' + +import type { CSSProperties, PropType } from 'vue' +import type { WithFalse } from './types' +import type { VueNodeOrRender } from '#/types' + +export type FooterProps = { + links?: WithFalse< + { + key?: string + title: VueNodeOrRender + href: string + blankTarget?: boolean + }[] + > + copyright?: WithFalse + prefixCls?: string + footerStyle?: CSSProperties +} + +const footerViewProps = { + links: { + type: [Object, Boolean] as PropType, + default: undefined + }, + copyright: { + type: [String, Boolean] as PropType, + default: undefined + }, + prefixCls: String as PropType, + footerStyle: Object as PropType +} + +const FooterView = defineComponent({ + name: 'FooterView', + props: footerViewProps, + setup(props, { slots, attrs }) { + return () => ( + + + {slots} + + + ) + } +}) + +export default FooterView diff --git a/pro-components/layout/Header.less b/pro-components/layout/Header.less new file mode 100644 index 0000000..4010b48 --- /dev/null +++ b/pro-components/layout/Header.less @@ -0,0 +1,20 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-layout-fixed-header-prefix-cls: ~'@{ant-prefix}-pro-fixed-header'; +@pro-layout-header-prefix-cls: ~'@{ant-prefix}-pro-header'; + +.@{pro-layout-fixed-header-prefix-cls} { + z-index: 9; + width: 100%; + + &-action { + transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + } +} + +.@{pro-layout-header-prefix-cls} { + &-realDark { + box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 65%); + } +} diff --git a/pro-components/layout/Header.tsx b/pro-components/layout/Header.tsx new file mode 100644 index 0000000..3be064d --- /dev/null +++ b/pro-components/layout/Header.tsx @@ -0,0 +1,146 @@ +import './Header.less' + +import { Layout } from 'ant-design-vue' + +import GlobalHeader, { globalHeaderProps } from './components/GlobalHeader' + +import TopNavHeader from './components/TopNavHeader' +import { clearMenuItem } from './utils/utils' +import { getRender } from './utils' + +import { VueNodeOrRenderPropType, WithFalseVueNodeOrRenderPropType } from '#/types' +import type { VueNodeOrRender } from '#/types' +import type { HeaderContentRender, HeaderRender, HeaderTitleRender } from './renderTypes' + +import type { WithFalse } from './types' +import type { PropType, CSSProperties, Slots, ExtractPropTypes } from 'vue' +import type { PrivateSiderMenuProps } from './components/SiderMenu/SiderMenu' + +export const headerViewProps = () => ({ + // 集成 + ...globalHeaderProps(), + + isMobile: { + type: Boolean, + default: undefined + }, + logo: { + type: VueNodeOrRenderPropType as PropType, + default: () => undefined + }, + headerRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: () => undefined + }, + headerTitleRender: { + type: [Function, Boolean] as PropType>, + default: () => undefined + }, + headerContentRender: { + type: [Function, Boolean] as PropType>, + default: () => undefined + }, + siderWidth: { + type: Number, + default: 208 + }, + hasSiderMenu: Boolean, + visible: Boolean +}) + +export type HeaderViewProps = Partial>> + +// TODO slots 支持 +const renderContent = (props: HeaderViewProps & PrivateSiderMenuProps, slots: Slots) => { + const clearMenuData = clearMenuItem(props.menuData || []) + + const headerContentRender = getRender(props, slots, 'headerContentRender') + + let defaultDom + if (props.layout === 'top' && !props.isMobile) { + defaultDom = ( + + {slots} + + ) + } else { + defaultDom = ( + + {{ + ...slots, + default: () => headerContentRender && headerContentRender(props, null) + }} + + ) + } + + const headerRender = getRender(props, slots, 'headerRender') + if (headerRender && typeof headerRender === 'function') { + return headerRender(props, defaultDom) + } + return defaultDom +} + +export default defineComponent({ + name: 'BasicHeader', + props: headerViewProps(), + setup(props, { slots, attrs }) { + const needFixedHeader = computed(() => props.fixedHeader || props.layout === 'mix') + const isTop = computed(() => props.layout === 'top') + + const className = computed(() => [ + attrs.class, + { + [`${props.prefixCls}-fixed-header`]: needFixedHeader.value, + [`${props.prefixCls}-fixed-header-action`]: !props.collapsed, + [`${props.prefixCls}-top-menu`]: isTop.value, + [`${props.prefixCls}-header-${props.navTheme}`]: props.navTheme && props.layout !== 'mix' + } + ]) + + /** 计算侧边栏的宽度,不然导致左边的样式会出问题 */ + const width = computed(() => { + const needSettingWidth = + needFixedHeader.value && props.hasSiderMenu && !isTop.value && !props.isMobile + return props.layout !== 'mix' && needSettingWidth + ? `calc(100% - ${props.collapsed ? 48 : props.siderWidth}px)` + : '100%' + }) + + const right = computed(() => (needFixedHeader.value ? 0 : undefined)) + + return () => ( + <> + {needFixedHeader.value && ( + + )} + + {renderContent(props as any, slots)} + + + ) + } +}) diff --git a/pro-components/layout/RouteContext.tsx b/pro-components/layout/RouteContext.tsx new file mode 100644 index 0000000..80aea71 --- /dev/null +++ b/pro-components/layout/RouteContext.tsx @@ -0,0 +1,43 @@ +import type { BreadcrumbProps } from 'ant-design-vue' +// import type { BreadcrumbListReturn } from './utils/getBreadcrumbProps' +import type { PureSettings } from './defaultSettings' +import type { MenuDataItem } from './types' +import type { WaterMarkProps } from './components/WaterMark' +import type { InjectionKey } from 'vue' + +export type RouteContextType = { + // breadcrumb?: BreadcrumbListReturn + menuData?: MenuDataItem[] + isMobile?: boolean + prefixCls?: string + collapsed?: boolean + hasSiderMenu?: boolean + hasHeader?: boolean + siderWidth?: number + isChildrenLayout?: boolean + hasFooterToolbar?: boolean + hasFooter?: boolean + setHasFooterToolbar?: (hasFooterToolbar: boolean) => void + pageTitleInfo?: { + title: string + id: string + pageName: string + } + matchMenus?: MenuDataItem[] + matchMenuKeys?: string[] + currentMenu?: PureSettings & MenuDataItem + /** PageHeader 的 BreadcrumbProps 配置,会透传下去 */ + breadcrumbProps?: BreadcrumbProps + waterMarkProps?: WaterMarkProps +} & Partial + +export const routeContextInjectKey = Symbol( + 'routeContextInjectKey' +) as InjectionKey + +const defaultPrefixCls = 'ant' + +export const getPrefixCls = (suffixCls?: string, customizePrefixCls?: string) => { + if (customizePrefixCls) return customizePrefixCls + return suffixCls ? `${defaultPrefixCls}-${suffixCls}` : defaultPrefixCls +} diff --git a/pro-components/layout/WrapContent.tsx b/pro-components/layout/WrapContent.tsx new file mode 100644 index 0000000..80b3d9b --- /dev/null +++ b/pro-components/layout/WrapContent.tsx @@ -0,0 +1,32 @@ +import type { FunctionalComponent } from 'vue' +import { Layout } from 'ant-design-vue' + +export interface WrapContentProps { + isChildrenLayout?: boolean + location?: any + contentHeight?: number | string + ErrorBoundary?: any +} + +// TODO 异常处理 +const WrapContent: FunctionalComponent = (props, { slots, attrs }) => { + // const ErrorComponent = props.ErrorBoundary || ErrorBoundary + return ( + // {props.ErrorBoundary === false ? ( + // + // {slots.default} + // + // ) : ( + // + // + // {children} + // + // + // )} + + {slots.default?.()} + + ) +} + +export default WrapContent diff --git a/pro-components/layout/components/AntIcon/index.tsx b/pro-components/layout/components/AntIcon/index.tsx new file mode 100644 index 0000000..7ce2678 --- /dev/null +++ b/pro-components/layout/components/AntIcon/index.tsx @@ -0,0 +1,30 @@ +// TODO 图标按需加载 +import * as AntIcons from '@ant-design/icons-vue' +import { createVNode, defineComponent } from 'vue' + +const AntIcon = defineComponent({ + name: 'AntIcon', + props: { + type: { + type: String, + required: true + } + }, + setup(props) { + const iconDom = computed(() => { + let iconType = props.type + .replace(/-([a-z])/g, (p, m) => m.toUpperCase()) + .replace(/^\S/, s => s.toUpperCase()) + + if (!iconType.endsWith('Outlined')) { + iconType = iconType + 'Outlined' + } + // @ts-ignore + const antIcon = AntIcons[iconType] + return antIcon ? createVNode(antIcon) : props.type + }) + return () => iconDom.value + } +}) + +export default AntIcon diff --git a/pro-components/layout/components/FooterToolbar/index.less b/pro-components/layout/components/FooterToolbar/index.less new file mode 100644 index 0000000..628f4be --- /dev/null +++ b/pro-components/layout/components/FooterToolbar/index.less @@ -0,0 +1,33 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-footer-bar-prefix-cls: ~'@{ant-prefix}-pro-footer-bar'; + +.@{pro-footer-bar-prefix-cls} { + position: fixed; + right: 0; + bottom: 0; + z-index: 99; + display: flex; + align-items: center; + width: 100%; + padding: 0 24px; + line-height: 44px; + background: @component-background; + border-top: 1px solid @border-color-split; + box-shadow: @shadow-1-up; + transition: width 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + + &-left { + flex: 1; + } + + &-right { + > * { + margin-right: 8px; + &:last-child { + margin: 0; + } + } + } +} diff --git a/pro-components/layout/components/FooterToolbar/index.tsx b/pro-components/layout/components/FooterToolbar/index.tsx new file mode 100644 index 0000000..b9a1c1f --- /dev/null +++ b/pro-components/layout/components/FooterToolbar/index.tsx @@ -0,0 +1,80 @@ +import './index.less' + +import { reactiveOmit } from '@vueuse/core' + +import type { VueNodeOrRender } from '#/types' +import type { RouteContextType } from '../../RouteContext' +import type { CSSProperties, PropType, VNode } from 'vue' +import { VueNodeOrRenderPropType } from '#/types' +import { getPrefixCls, routeContextInjectKey } from '../../RouteContext' + +export type FooterToolbarProps = { + extra?: VueNodeOrRender + renderContent?: ( + props: FooterToolbarProps & RouteContextType & { leftWidth?: string }, + dom: JSX.Element + ) => VNode + prefixCls?: string +} + +const FooterToolbar = defineComponent({ + props: { + extra: VueNodeOrRenderPropType as PropType, + renderContent: { + type: Function as PropType, + default: undefined + }, + prefixCls: { type: String, default: undefined } + }, + setup(props, { slots, attrs }) { + const routeContext = inject(routeContextInjectKey, {}) + const prefixCls = props.prefixCls || getPrefixCls('pro') + const baseClassName = `${prefixCls}-footer-bar` + + const width = computed(() => { + if (!routeContext.hasSiderMenu) { + return undefined + } + // 0 or undefined + if (!routeContext.siderWidth) { + return '100%' + } + return routeContext.isMobile ? '100%' : `calc(100% - ${routeContext.siderWidth}px)` + }) + + /** 告诉 props 是否存在 footerBar */ + onMounted(() => routeContext?.setHasFooterToolbar?.(true)) + onUnmounted(() => routeContext?.setHasFooterToolbar?.(false)) + + return () => { + const dom = ( + <> +
{props.extra}
+
{slots.default?.()}
+ + ) + + return ( +
+ {props.renderContent + ? props.renderContent( + { + ...props, + ...routeContext, + leftWidth: width.value + }, + dom + ) + : dom} +
+ ) + } + } +}) + +export default FooterToolbar diff --git a/pro-components/layout/components/GlobalFooter/index.less b/pro-components/layout/components/GlobalFooter/index.less new file mode 100644 index 0000000..40005a1 --- /dev/null +++ b/pro-components/layout/components/GlobalFooter/index.less @@ -0,0 +1,32 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-global-footer-prefix-cls: ~'@{ant-prefix}-pro-global-footer'; + +.@{pro-global-footer-prefix-cls} { + margin: 48px 0 24px 0; + padding: 0 16px; + text-align: center; + + &-links { + margin-bottom: 8px; + + a { + color: @text-color-secondary; + transition: all 0.3s; + + &:not(:last-child) { + margin-right: 40px; + } + + &:hover { + color: @text-color; + } + } + } + + &-copyright { + color: @text-color-secondary; + font-size: @font-size-base; + } +} diff --git a/pro-components/layout/components/GlobalFooter/index.tsx b/pro-components/layout/components/GlobalFooter/index.tsx new file mode 100644 index 0000000..8c48785 --- /dev/null +++ b/pro-components/layout/components/GlobalFooter/index.tsx @@ -0,0 +1,84 @@ +import './index.less' +import { getVueNode } from '../../utils' + +import type { WithFalse } from '../../types' +import type { CSSProperties, PropType, Slot } from 'vue' +import type { VueNodeOrRender } from '#/types' +import { getPrefixCls } from '#/layout/RouteContext' + +type LinkInfo = { + key?: string + title: VueNodeOrRender + href: string + blankTarget?: boolean +} + +export type Link = WithFalse + +export interface GlobalFooterProps { + links: Link + copyright?: WithFalse + prefixCls?: string +} + +function renderLinks(links: Link, linksSlot?: Slot) { + if (Array.isArray(links)) { + if (links.length === 0) { + return null + } + return (links as LinkInfo[]).map(link => ( + + {link.title} + + )) + } + return getVueNode(links as WithFalse, linksSlot) +} + +export default defineComponent({ + name: 'GlobalFooter', + props: { + links: { + type: [Object, Function, String, Boolean, Array] as PropType, + default: () => { + return undefined + } + }, + copyright: { + type: [Object, Function, String, Boolean] as PropType>, + default: () => { + return undefined + } + }, + prefixCls: { + type: String, + default: 'pro-global-footer' + } + }, + setup(props, { slots, attrs }) { + return () => { + const linksDom = renderLinks(props.links, slots.links) + const copyrightDom = getVueNode(props.copyright, slots.copyright) + if (linksDom && copyrightDom == null) { + return null + } + + const globalPrefixCls = getPrefixCls() + const baseClassName = `${globalPrefixCls}-${props.prefixCls}` + const clsString = [baseClassName, attrs.class] + + return ( +
+ {linksDom &&
{linksDom}
} + {copyrightDom &&
{copyrightDom}
} +
+ ) + } + } +}) diff --git a/pro-components/layout/components/GlobalHeader/index.less b/pro-components/layout/components/GlobalHeader/index.less new file mode 100644 index 0000000..bc7dc65 --- /dev/null +++ b/pro-components/layout/components/GlobalHeader/index.less @@ -0,0 +1,98 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@import (reference) '../../BasicLayout.less'; + +@pro-layout-global-header-prefix-cls: ~'@{ant-prefix}-pro-global-header'; + +@pro-layout-header-bg: @component-background; +@pro-layout-header-hover-bg: @component-background; +@pro-layout-header-box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); + +.@{pro-layout-global-header-prefix-cls} { + position: relative; + display: flex; + align-items: center; + height: 100%; + padding: 0 16px; + background: @pro-layout-header-bg; + box-shadow: @pro-layout-header-box-shadow; + > * { + height: 100%; + } + + &-collapsed-button { + display: flex; + align-items: center; + margin-left: 16px; + font-size: 20px; + } + + &-layout { + &-mix { + background-color: @layout-sider-background; + .@{pro-layout-global-header-prefix-cls}-logo { + h1 { + color: @btn-primary-color; + } + } + .anticon { + color: @btn-primary-color; + } + } + } + + &-logo { + position: relative; + overflow: hidden; + a { + display: flex; + align-items: center; + height: 100%; + img { + height: 28px; + } + h1 { + height: 32px; + margin: 0 0 0 12px; + color: @primary-color; + font-weight: 600; + font-size: 18px; + line-height: 32px; + } + } + } + + &-logo-rtl { + a { + h1 { + margin: 0 12px 0 0; + } + } + } + + &-menu { + .anticon { + margin-right: 8px; + } + .@{ant-prefix}-dropdown-menu-item { + min-width: 160px; + } + } + + .dark { + height: @pro-layout-header-height; + .action { + color: rgba(255, 255, 255, 0.85); + > i { + color: rgba(255, 255, 255, 0.85); + } + &:hover, + &.opened { + background: @primary-color; + } + .@{ant-prefix}-badge { + color: rgba(255, 255, 255, 0.85); + } + } + } +} diff --git a/pro-components/layout/components/GlobalHeader/index.tsx b/pro-components/layout/components/GlobalHeader/index.tsx new file mode 100644 index 0000000..9f428ba --- /dev/null +++ b/pro-components/layout/components/GlobalHeader/index.tsx @@ -0,0 +1,188 @@ +import './index.less' + +import { getRender } from '../../utils' +import { + defaultRenderCollapsedButton, + defaultRenderLogo, + defaultRenderLogoAndTitle, + privateSiderMenuProps +} from '../SiderMenu/SiderMenu' +import { pureSettingsProps } from '../../defaultSettings' + +import type { MenuDataItem, WithFalse } from '../../types' +import type { PureSettings } from '../../defaultSettings' +import type { HeaderViewProps } from '../../Header' +import type { CSSProperties, PropType, ExtractPropTypes } from 'vue' +import type { SiderMenuProps } from '../SiderMenu/SiderMenu' +import type { HeaderContentRender, MenuRender, RightContentRender } from '../../renderTypes' +import { VueNodeOrRenderPropType } from '#/types' +import type { VueNodeOrRender } from '#/types' +import TopNavHeader from '#/layout/components/TopNavHeader' +import { clearMenuItem } from '#/layout/utils/utils' + +export const globalHeaderProps = () => ({ + ...privateSiderMenuProps(), + ...pureSettingsProps, + // 覆盖下默认值 + headerTheme: { + type: String as PropType, + default: 'dark' + }, + + // 自有属性 + collapsed: { type: Boolean, default: undefined }, + onCollapse: { + type: Function as PropType<(collapsed: boolean) => void>, + default: undefined + }, + isMobile: { type: Boolean, default: undefined }, + logo: { + type: VueNodeOrRenderPropType as PropType, + default: () => undefined + }, + /** + * 虽然叫menuRender,但是其实是整个 SiderMenu 面板的渲染函数 + * + * @example 收起时完成不展示菜单 menuRender={(props,defaultDom)=> props.collapsed ? null : defaultDom} + * @example 不展示菜单 menuRender={false} + */ + menuRender: { + type: [Function, Boolean] as PropType>, + default: () => undefined + }, + /** + * 右侧顶部操作区域的渲染逻辑,一般会展示一个头像和一些操作 + * + * @example 展示一个头像: rightRender={(props) => } />} + * @example 展示一些操作: rightRender={(props) => [,]} + */ + rightContentRender: { + type: [Function, Boolean] as PropType>, + default: () => undefined + }, + prefixCls: { type: String, default: undefined }, + menuData: { + type: Array as PropType, + default: () => undefined + }, + onMenuHeaderClick: Function as PropType<(e: MouseEvent) => void>, + + menuHeaderRender: { + type: [Function, Boolean] as PropType, + default: undefined + }, + + /** + *顶部区域的渲染,包含内部的 menu + * + * @example headerContentRender={(props) =>
管理控制台
} + */ + headerContentRender: { + type: [Function, Boolean] as PropType>, + default: undefined + }, + collapsedButtonRender: { + type: [Function, Boolean] as PropType, + default: () => defaultRenderCollapsedButton + }, + splitMenus: { type: Boolean, default: undefined } +}) + +export type GlobalHeaderProps = Partial>> + +const renderLogo = ( + props: SiderMenuProps, + menuHeaderRender: SiderMenuProps['menuHeaderRender'], + logoDom: VueNodeOrRender +) => { + if (menuHeaderRender === false) { + return null + } + if (menuHeaderRender) { + return menuHeaderRender(props, logoDom, null) + } + return logoDom +} + +export default defineComponent({ + name: 'GlobalHeader', + props: globalHeaderProps(), + setup(props, { slots, attrs }) { + // TODO 布局方向支持 + const direction = undefined + + const baseClassName = `${props.prefixCls}-global-header` + const className = computed(() => [ + attrs.class, + baseClassName, + { [`${baseClassName}-layout-${props.layout}`]: props.layout && props.headerTheme === 'dark' } + ]) + + return () => { + if (props.layout === 'mix' && !props.isMobile && props.splitMenus) { + const noChildrenMenuData = (props.menuData || []).map(item => ({ + ...item, + children: undefined + })) + const clearMenuData = clearMenuItem(noChildrenMenuData) + return ( + + {slots} + + ) + } + + const logoClassNames = [ + `${baseClassName}-logo`, + { [`${baseClassName}-logo-rtl`]: direction === 'rtl' } + ] + + // 添加 slots 支持 + const logoRender = getRender(props, slots, 'logo') + const logoDom = ( + + {defaultRenderLogo(logoRender)} + + ) + + const rightContentRender = getRender(props, slots, 'rightContentRender') + + return ( +
+ {props.isMobile && renderLogo(props, props.menuHeaderRender, logoDom)} + {props.isMobile && props.collapsedButtonRender && ( + { + if (props.onCollapse) { + props.onCollapse(!props.collapsed) + } + }} + > + {props.collapsedButtonRender(props.collapsed)} + + )} + {props.layout === 'mix' && !props.isMobile && ( + <> +
+ {defaultRenderLogoAndTitle( + { ...props, collapsed: false }, + slots, + 'headerTitleRender' + )} +
+ + )} +
{slots.default?.()}
+ {rightContentRender && rightContentRender(props as HeaderViewProps)} +
+ ) + } + } +}) diff --git a/pro-components/layout/components/GridContent/GridContent.less b/pro-components/layout/components/GridContent/GridContent.less new file mode 100644 index 0000000..ad39c6d --- /dev/null +++ b/pro-components/layout/components/GridContent/GridContent.less @@ -0,0 +1,11 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@pro-layout-grid-content-prefix-cls: ~'@{ant-prefix}-pro-grid-content'; + +.@{pro-layout-grid-content-prefix-cls} { + width: 100%; + &.wide { + max-width: 1200px; + margin: 0 auto; + } +} diff --git a/pro-components/layout/components/GridContent/index.tsx b/pro-components/layout/components/GridContent/index.tsx new file mode 100644 index 0000000..2b020b2 --- /dev/null +++ b/pro-components/layout/components/GridContent/index.tsx @@ -0,0 +1,36 @@ +import './GridContent.less' + +import type { PureSettings } from '../../defaultSettings' +import type { CSSProperties, FunctionalComponent } from 'vue' +import { getPrefixCls, routeContextInjectKey } from '#/layout/RouteContext' + +type GridContentProps = { + contentWidth?: PureSettings['contentWidth'] + prefixCls?: string +} + +/** + * This component can support contentWidth so you don't need to calculate the width + * contentWidth=Fixed, width will is 1200 + * + * @param props + * @param attrs + * @param slots + */ +const GridContent: FunctionalComponent = (props, { attrs, slots }) => { + const routeContext = inject(routeContextInjectKey, {}) + const prefixCls = props.prefixCls || getPrefixCls('pro') + const contentWidth = props.contentWidth || routeContext.contentWidth + const className = `${prefixCls}-grid-content` + + return ( +
+
{slots.default?.()}
+
+ ) +} + +export default GridContent diff --git a/pro-components/layout/components/PageContainer/index.less b/pro-components/layout/components/PageContainer/index.less new file mode 100644 index 0000000..8f94b94 --- /dev/null +++ b/pro-components/layout/components/PageContainer/index.less @@ -0,0 +1,116 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-layout-page-container: ~'@{ant-prefix}-pro-page-container'; + +@pro-layout-page-container-content-margin: 24px 24px 0; +@pro-layout-page-container-content-padding: inherit; +@pro-layout-page-container-bg-color: inherit; +@pro-layout-page-container-warp-bg-color: @component-background; + +.@{pro-layout-page-container}-children-content { + margin: @pro-layout-page-container-content-margin; + padding: @pro-layout-page-container-content-padding; +} + +.@{pro-layout-page-container} { + background-color: @pro-layout-page-container-bg-color; + &-warp { + background-color: @pro-layout-page-container-warp-bg-color; + .@{ant-prefix}-tabs-nav { + margin: 0; + } + } + &-ghost { + .@{pro-layout-page-container}-warp { + background-color: transparent; + } + + .@{pro-layout-page-container}-children-content { + margin-top: 0; + } + } +} + +.@{pro-layout-page-container}-main { + .@{pro-layout-page-container}-detail { + display: flex; + } + + .@{pro-layout-page-container}-row { + display: flex; + width: 100%; + } + + .@{pro-layout-page-container}-title-content { + margin-bottom: 16px; + } + + .@{pro-layout-page-container}-title, + .@{pro-layout-page-container}-content { + flex: auto; + width: 100%; + } + + .@{pro-layout-page-container}-extraContent, + .@{pro-layout-page-container}-main { + flex: 0 1 auto; + } + + .@{pro-layout-page-container}-main { + width: 100%; + } + + .@{pro-layout-page-container}-title { + margin-bottom: 16px; + } + + .@{pro-layout-page-container}-logo { + margin-bottom: 16px; + } + + .@{pro-layout-page-container}-extraContent { + min-width: 242px; + margin-left: 88px; + text-align: right; + } +} + +@media screen and (max-width: @screen-xl) { + .@{pro-layout-page-container}-main { + .@{pro-layout-page-container}-extraContent { + margin-left: 44px; + } + } +} + +@media screen and (max-width: @screen-lg) { + .@{pro-layout-page-container}-main { + .@{pro-layout-page-container}-extraContent { + margin-left: 20px; + } + } +} + +@media screen and (max-width: @screen-md) { + .@{pro-layout-page-container}-main { + .@{pro-layout-page-container}-row { + display: block; + } + + .@{pro-layout-page-container}-action, + .@{pro-layout-page-container}-extraContent { + margin-left: 0; + text-align: left; + } + } +} + +@media screen and (max-width: @screen-sm) { + .@{pro-layout-page-container}-detail { + display: block; + } + .@{pro-layout-page-container}-extraContent { + margin-left: 0; + } +} diff --git a/pro-components/layout/components/PageContainer/index.tsx b/pro-components/layout/components/PageContainer/index.tsx new file mode 100644 index 0000000..c00c1bd --- /dev/null +++ b/pro-components/layout/components/PageContainer/index.tsx @@ -0,0 +1,385 @@ +import './index.less' + +import { PageHeader, Tabs, Affix, Breadcrumb } from 'ant-design-vue' +import 'ant-design-vue/es/page-header/style/index.less' +import 'ant-design-vue/es/tabs/style/index.less' +import 'ant-design-vue/es/affix/style/index.less' +import 'ant-design-vue/es/breadcrumb/style/index.less' + +import type { + TabsProps, + AffixProps, + PageHeaderProps, + TabPaneProps, + SpinProps, + BreadcrumbProps +} from 'ant-design-vue' + +import GridContent from '../GridContent' +import FooterToolbar from '../FooterToolbar' + +import PageLoading from '../PageLoading' +import type { WithFalse } from '../../types' +import type { WaterMarkProps } from '../WaterMark' +import WaterMark from '../WaterMark' +import type { CSSProperties, ExtractPropTypes, FunctionalComponent, PropType } from 'vue' +import type { VueNode } from 'ant-design-vue/es/_util/type' +import { getPrefixCls, routeContextInjectKey } from '../../RouteContext' +import { reactiveOmit, reactivePick } from '@vueuse/core' + +import type { VueNodeOrRender } from '#/types' +import { VueNodeOrRenderPropType, WithFalseVueNodeOrRenderPropType } from '#/types' +import { pageHeaderProps } from 'ant-design-vue/es/page-header' +import omit from 'ant-design-vue/es/_util/omit' + +const antvPageHeaderPropsKeys = Object.keys(pageHeaderProps()) + +export const pageHeaderTabConfig = () => ({ + /** tabs 的列表 */ + tabList: Array as PropType<(TabPaneProps & { key?: string | number })[]>, + + /** 当前选中 tab 的 key */ + tabActiveKey: [String, Number] as PropType, + + /** tab 修改时触发 */ + onTabChange: Function as PropType, + + /** tab 上额外的区域 */ + tabBarExtraContent: VueNodeOrRenderPropType as PropType, + + /** tabs 的其他配置 */ + tabProps: Object as PropType, + + /** 固定 PageHeader 到页面顶部 */ + fixedHeader: { type: Boolean, default: undefined } +}) + +export type PageHeaderTabConfig = Partial>> + +type PageHeaderRender = (props: PageContainerProps) => VueNodeOrRender + +export const pageContainerProps = () => ({ + ...pageHeaderTabConfig(), + ...omit(pageHeaderProps(), ['title', 'footer', 'breadcrumb']), + + title: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: undefined + }, + content: VueNodeOrRenderPropType as PropType, + extraContent: VueNodeOrRenderPropType as PropType, + prefixCls: String, + footer: VueNodeOrRenderPropType as PropType, + + /** 是否显示背景色 */ + ghost: { type: Boolean, default: undefined }, + + /** + * PageHeader 的配置(与 antd 完全相同 ) + */ + header: Object as PropType>, + + /** pageHeader */ + pageHeaderRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: undefined + }, + + /** 固钉的配置 (与 antd 完全相同) */ + affixProps: Object as PropType, + + /** 内容是否加载中 (只加载内容区域) */ + loading: { + type: [Object, Function, Boolean] as PropType, + default: false + }, + + // TODO 由于 ant-design-vue 暂时不支持这个属性,所以先注释 + /** 自定义 breadcrumb,返回false不展示 */ + // breadcrumbRender: { + // type: WithFalseCustomRenderPropType as PropType>, + // default: undefined + // }, + + /** 水印的配置 */ + waterMarkProps: Object as PropType, + + /** 配置面包屑 */ + breadcrumb: Object as PropType +}) + +export type PageContainerProps = Partial>> + +function genLoading(spinProps: boolean | SpinProps) { + if (typeof spinProps === 'object') { + return spinProps + } + return { spinning: spinProps } +} + +/** + * Render Footer tabList In order to be compatible with the old version of the PageHeader basically + * all the functions are implemented. + */ +const renderFooter = (props: Omit) => { + if (Array.isArray(props.tabList) || props.tabBarExtraContent) { + return ( + { + if (props.onTabChange) { + props.onTabChange(key) + } + }} + tabBarExtraContent={props.tabBarExtraContent} + {...props.tabProps} + > + {props.tabList?.map((item, index) => ( + + ))} + + ) + } + return null +} + +const renderPageHeader = ( + content: VueNodeOrRender, + extraContent: VueNodeOrRender, + prefixedClassName: string +): VueNode => { + if (!content && !extraContent) { + return null + } + return ( +
+
+
+ {content &&
{content}
} + {extraContent &&
{extraContent}
} +
+
+
+ ) +} + +/** + * 配置与面包屑相同,只是增加了自动根据路由计算面包屑的功能。此功能必须要在 ProLayout 中使用。 + * + * @param props + * @returns + */ +const ProBreadcrumb: FunctionalComponent = props => { + const routeContext = inject(routeContextInjectKey) + return ( +
+ {/* @ts-ignore TODO 面包屑透传处理 */} + +
+ ) +} + +// eslint-disable-next-line vue/one-component-per-file +const ProPageHeader = defineComponent({ + name: 'ProPageHeader', + inheritAttrs: false, + props: { + ...pageContainerProps(), + prefixedClassName: { type: String, default: '' } + }, + setup(props, { slots }) { + const routeContext = inject(routeContextInjectKey, {}) + + const restProps = reactiveOmit( + props, + 'title', + 'content', + 'pageHeaderRender', + 'header', + 'prefixedClassName', + 'extraContent', + 'prefixCls' + ) + + if (props.pageHeaderRender === false) { + return null + } + if (props.pageHeaderRender) { + return <> {props.pageHeaderRender({ ...props, ...routeContext })} + } + + const pageHeaderTitle = computed(() => { + if (!props.title && props.title !== false) { + return routeContext.title + } else { + return props.title + } + }) + + // @ts-ignore + const antdPageHeaderProps = reactivePick(restProps, antvPageHeaderPropsKeys) + // @ts-ignore + const localPageHeaderProps: PageHeaderProps = { + ...antdPageHeaderProps, + footer: renderFooter({ + ...restProps, + prefixedClassName: props.prefixedClassName + }), + ...props.header, + title: pageHeaderTitle.value + } + + const { breadcrumb } = localPageHeaderProps as { + breadcrumb: BreadcrumbProps + } + + const noHasBreadCrumb = !breadcrumb || (!breadcrumb?.itemRender && !breadcrumb?.routes?.length) + + if ( + ['title', 'subTitle', 'extra', 'tags', 'footer', 'avatar', 'backIcon'].every( + // @ts-ignore + item => !localPageHeaderProps[item] + ) && + noHasBreadCrumb && + !props.content && + !props.extraContent + ) { + return null + } + + return () => ( +
+ + {{ + ...slots, + default: () => + slots.headerContent?.(props) || + renderPageHeader(props.content, props.extraContent, props.prefixedClassName) + }} + +
+ ) + } +}) + +const pageHeaderSlot = [ + 'backIcon', + 'avatar', + 'breadcrumb', + 'title', + 'subTitle', + 'tags', + 'extra', + 'footer' +] + +// eslint-disable-next-line vue/one-component-per-file +const PageContainer = defineComponent({ + name: 'PageContainer', + inheritAttrs: false, + props: pageContainerProps(), + slots: [...pageHeaderSlot, 'loading', 'pageHeaderRender', 'headerContent', 'extraContent'], + setup(props, { attrs, slots }) { + const restProps = reactiveOmit(props, 'loading', 'footer', 'affixProps', 'ghost', 'fixedHeader') + + const value = inject(routeContextInjectKey, {}) + const prefixCls = props.prefixCls || getPrefixCls('pro') + + const prefixedClassName = computed(() => `${prefixCls}-page-container`) + + const containerClassName = computed(() => [ + prefixedClassName.value, + attrs.class, + { + [`${prefixCls}-page-container-ghost`]: props.ghost, + [`${prefixCls}-page-container-with-footer`]: props.footer + } + ]) + + const renderLoading = (): VueNode => { + // 当loading时一个合法的ReactNode时,说明用户使用了自定义loading,直接返回改自定义loading + if (slots.loading) { + return slots.loading() + } + // 当传递过来的是布尔值,并且为false时,说明不需要显示loading,返回null + if (typeof props.loading === 'boolean' && !props.loading) { + return null + } + // 如非上述两种情况,那么要么用户传了一个true,要么用户传了loading配置,使用genLoading生成loading配置后返回PageLoading + const spinProps = genLoading(props.loading as boolean | SpinProps) + // 如果传的是loading配置,但spinning传的是false,也不需要显示loading + return spinProps.spinning ? : null + } + + function renderContent(loadingDom: VueNode, content: VueNode): VueNode { + // 只要loadingDom非空我们就渲染loadingDom,否则渲染内容 + const dom = loadingDom || content + if (props.waterMarkProps || value.waterMarkProps) { + const waterMarkProps = { + ...value.waterMarkProps, + ...props.waterMarkProps + } + return {dom} + } + return dom + } + + return () => { + const pageHeaderDom = ( + + {reactiveOmit(slots, 'default', 'loading')} + + ) + + const content = slots.default ? ( + <> +
{slots.default()}
+ {value.hasFooterToolbar &&
} + + ) : null + + const loadingDom = renderLoading() + + const renderContentDom = renderContent(loadingDom, content) + + return ( +
+ {props.fixedHeader && pageHeaderDom ? ( + // 在 hasHeader 且 fixedHeader 的情况下,才需要设置高度 + // @ts-ignore + + {pageHeaderDom} + + ) : ( + pageHeaderDom + )} + {renderContentDom && {renderContentDom}} + {props.footer && {props.footer}} +
+ ) + } + } +}) + +export { ProPageHeader, ProBreadcrumb } + +export default PageContainer diff --git a/pro-components/layout/components/PageLoading/index.tsx b/pro-components/layout/components/PageLoading/index.tsx new file mode 100644 index 0000000..3598d64 --- /dev/null +++ b/pro-components/layout/components/PageLoading/index.tsx @@ -0,0 +1,13 @@ +import { Spin } from 'ant-design-vue' +import 'ant-design-vue/es/spin/style/index.less' + +import type { SpinProps } from 'ant-design-vue' +import type { FunctionalComponent } from 'vue' + +const PageLoading: FunctionalComponent = (props: SpinProps) => ( +
+ +
+) + +export default PageLoading diff --git a/pro-components/layout/components/SettingDrawer/BlockCheckbox.tsx b/pro-components/layout/components/SettingDrawer/BlockCheckbox.tsx new file mode 100644 index 0000000..a69206b --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/BlockCheckbox.tsx @@ -0,0 +1,49 @@ +import { Tooltip } from 'ant-design-vue' +import { CheckOutlined } from '@ant-design/icons-vue' +import type { FunctionalComponent } from 'vue' + +export type BlockCheckboxProps = { + value: string + onChange: (key: string) => void + list?: { + title: string + key: string + }[] + configType: string + prefixCls: string +} + +const BlockCheckbox: FunctionalComponent = props => { + const baseClassName = `${props.prefixCls}-drawer-block-checkbox` + const domList = (props.list || []).map(item => ( + +
props.onChange(item.key)} + > + +
+
+ )) + return ( +
+ {domList} +
+ ) +} + +export default BlockCheckbox diff --git a/pro-components/layout/components/SettingDrawer/LayoutChange.tsx b/pro-components/layout/components/SettingDrawer/LayoutChange.tsx new file mode 100644 index 0000000..9d55c9c --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/LayoutChange.tsx @@ -0,0 +1,124 @@ +import { List, Tooltip, Select, Switch } from 'ant-design-vue' +import { defaultSettings } from '../../defaultSettings' +import { getFormatMessage } from './index' + +import type { ProSettings } from '../../defaultSettings' +import type { SettingItemProps } from './index' +import type { FunctionalComponent } from 'vue' + +export const renderLayoutSettingItem = ({ item }: { item: SettingItemProps; index: number }) => { + const action = item.action + // const action = React.cloneElement(item.action, { + // disabled: item.disabled + // }) + return ( + + + {item.title} + + + ) +} +const LayoutSetting: FunctionalComponent<{ + settings: Partial + changeSetting: (key: string, value: any, hideLoading?: boolean) => void +}> = props => { + const formatMessage = getFormatMessage() + const { contentWidth, splitMenus, fixedHeader, layout, fixSiderbar } = + props.settings || defaultSettings + + return ( + { + props.changeSetting('contentWidth', value) + }} + style={{ width: '80px' }} + > + {layout === 'side' ? null : ( + + {formatMessage({ + id: 'app.setting.content-width.fixed', + defaultMessage: 'Fixed' + })} + + )} + + {formatMessage({ + id: 'app.setting.content-width.fluid', + defaultMessage: 'Fluid' + })} + + + ) + }, + { + title: formatMessage({ + id: 'app.setting.fixedheader', + defaultMessage: 'Fixed Header' + }), + action: ( + { + props.changeSetting('fixedHeader', checked) + }} + /> + ) + }, + { + title: formatMessage({ + id: 'app.setting.fixedsidebar', + defaultMessage: 'Fixed Sidebar' + }), + disabled: layout === 'top', + disabledReason: formatMessage({ + id: 'app.setting.fixedsidebar.hint', + defaultMessage: 'Works on Side Menu Layout' + }), + action: ( + props.changeSetting('fixSiderbar', checked)} + /> + ) + }, + { + title: formatMessage({ id: 'app.setting.splitMenus' }), + disabled: layout !== 'mix', + action: ( + { + props.changeSetting('splitMenus', checked) + }} + /> + ) + } + ]} + renderItem={renderLayoutSettingItem} + /> + ) +} + +export default LayoutSetting diff --git a/pro-components/layout/components/SettingDrawer/RegionalChange.tsx b/pro-components/layout/components/SettingDrawer/RegionalChange.tsx new file mode 100644 index 0000000..70bbd6f --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/RegionalChange.tsx @@ -0,0 +1,41 @@ +import { Switch, List } from 'ant-design-vue' +import { getFormatMessage } from './index' +import { renderLayoutSettingItem } from './LayoutChange' + +import type { ProSettings } from '../../defaultSettings' +import type { FunctionalComponent } from 'vue' + +const RegionalSetting: FunctionalComponent<{ + settings: Partial + changeSetting: (key: string, value: any, hideLoading?: boolean) => void +}> = props => { + const formatMessage = getFormatMessage() + const regionalSetting = ['header', 'footer', 'menu', 'menuHeader'] + return ( + { + return { + title: formatMessage({ id: `app.setting.regionalsettings.${key}` }), + action: ( + + props.changeSetting(`${key}Render`, checked === true ? undefined : false) + } + /> + ) + } + })} + /> + ) +} + +export default RegionalSetting diff --git a/pro-components/layout/components/SettingDrawer/ThemeColor.less b/pro-components/layout/components/SettingDrawer/ThemeColor.less new file mode 100644 index 0000000..198b652 --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/ThemeColor.less @@ -0,0 +1,25 @@ +@import (reference) 'index.less'; + +.@{ant-pro-setting-drawer}-content { + .theme-color { + margin-top: 16px; + overflow: hidden; + .theme-color-title { + margin-bottom: 12px; + font-size: 14px; + line-height: 22px; + } + .theme-color-block { + float: left; + width: 20px; + height: 20px; + margin-top: 8px; + margin-right: 8px; + color: #fff; + font-weight: bold; + text-align: center; + border-radius: 2px; + cursor: pointer; + } + } +} diff --git a/pro-components/layout/components/SettingDrawer/ThemeColor.tsx b/pro-components/layout/components/SettingDrawer/ThemeColor.tsx new file mode 100644 index 0000000..a608330 --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/ThemeColor.tsx @@ -0,0 +1,59 @@ +import './ThemeColor.less' + +import { CheckOutlined } from '@ant-design/icons-vue' + +import { Tooltip } from 'ant-design-vue' +import type { FunctionalComponent, HtmlHTMLAttributes } from 'vue' + +export type TagProps = { + color: string + check: boolean +} & HtmlHTMLAttributes + +const Tag: FunctionalComponent = props => ( +
+ {props.check ? : ''} +
+) + +export type ThemeColorProps = { + colorList?: { + key: string + color: string + }[] + value: string + onChange: (color: string) => void + formatMessage: (data: { id: any; defaultMessage?: string }) => string +} + +const ThemeColor: FunctionalComponent = props => { + if (!props.colorList || props.colorList?.length < 1) { + return null + } + return ( +
+
+ {props.colorList?.map(({ key, color }) => { + if (!key) return + return ( + + props.onChange && props.onChange(color)} + /> + + ) + })} +
+
+ ) +} + +export default ThemeColor diff --git a/pro-components/layout/components/SettingDrawer/index.less b/pro-components/layout/components/SettingDrawer/index.less new file mode 100644 index 0000000..258b9f0 --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/index.less @@ -0,0 +1,161 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@ant-pro-setting-drawer: ~'@{ant-prefix}-pro-setting-drawer'; + +.@{ant-pro-setting-drawer} { + &-content { + position: relative; + min-height: 100%; + .@{ant-prefix}-list-item { + span { + flex: 1; + } + } + } + + &-block-checkbox { + display: flex; + &-item { + position: relative; + width: 44px; + height: 36px; + margin-right: 16px; + overflow: hidden; + background-color: #f0f2f5; + border-radius: 4px; + box-shadow: 0 1px 2.5px 0 rgba(0, 0, 0, 0.18); + cursor: pointer; + + &::before { + position: absolute; + top: 0; + left: 0; + width: 33%; + height: 100%; + background-color: #fff; + content: ''; + } + &::after { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 25%; + background-color: #fff; + content: ''; + } + + &-realDark { + background-color: fade(@menu-dark-bg, 85%); + &::before { + background-color: fade(@menu-dark-bg, 65%); + content: ''; + } + &::after { + background-color: fade(@menu-dark-bg, 85%); + } + } + + // 亮色主题 + &-light { + &::before { + background-color: @white; + content: ''; + } + &::after { + background-color: @white; + } + } + + // 暗色主题 + &-dark, + // 侧边菜单布局 + &-side { + &::before { + z-index: 1; + background-color: @menu-dark-bg; + content: ''; + } + &::after { + background-color: @white; + } + } + + // 顶部菜单布局 + &-top { + &::before { + background-color: transparent; + content: ''; + } + &::after { + background-color: @menu-dark-bg; + } + } + + // 顶部菜单布局 + &-mix { + &::before { + background-color: @white; + content: ''; + } + &::after { + background-color: @menu-dark-bg; + } + } + } + &-selectIcon { + position: absolute; + right: 6px; + bottom: 4px; + color: @primary-color; + font-weight: bold; + font-size: 14px; + pointer-events: none; + .action { + color: @primary-color; + } + } + } + + &-color_block { + display: inline-block; + width: 38px; + height: 22px; + margin: 4px; + margin-right: 12px; + vertical-align: middle; + border-radius: 4px; + cursor: pointer; + } + + &-title { + margin-bottom: 12px; + color: @heading-color; + font-size: 14px; + line-height: 22px; + } + + &-handle { + position: absolute; + top: 240px; + right: 300px; + z-index: 0; + display: flex; + align-items: center; + justify-content: center; + width: 48px; + height: 48px; + font-size: 16px; + text-align: center; + background-color: @primary-color; + border-radius: 4px 0 0 4px; + cursor: pointer; + pointer-events: auto; + } + + &-production-hint { + margin-top: 16px; + font-size: 12px; + } +} diff --git a/pro-components/layout/components/SettingDrawer/index.tsx b/pro-components/layout/components/SettingDrawer/index.tsx new file mode 100644 index 0000000..85de756 --- /dev/null +++ b/pro-components/layout/components/SettingDrawer/index.tsx @@ -0,0 +1,419 @@ +import './index.less' + +import { + CloseOutlined, + CopyOutlined, + NotificationOutlined, + SettingOutlined +} from '@ant-design/icons-vue' + +import { + Alert, + Button, + ConfigProvider, + Divider, + Drawer, + List, + message, + Switch +} from 'ant-design-vue' +import 'ant-design-vue/es/alert/style' +import 'ant-design-vue/es/button/style' +import 'ant-design-vue/es/divider/style' +import 'ant-design-vue/es/drawer/style' +import 'ant-design-vue/es/list/style' +import 'ant-design-vue/es/message/style' +import 'ant-design-vue/es/switch/style' +import 'ant-design-vue/es/tooltip/style' +import 'ant-design-vue/es/select/style' + +import type { ProSettings } from '../../defaultSettings' +import { defaultSettings } from '../../defaultSettings' + +import BlockCheckbox from './BlockCheckbox' +import ThemeColor from './ThemeColor' +import { gLocaleObject } from '../../locales' +import LayoutSetting, { renderLayoutSettingItem } from './LayoutChange' +import RegionalSetting from './RegionalChange' +import { genStringToTheme } from '../../utils/utils' +import type { VueNodeOrRender } from '#/types' +import type { PropType, FunctionalComponent } from 'vue' + +type BodyProps = { + title: string + prefixCls: string +} + +const Body: FunctionalComponent = (props, { slots }) => ( +
+

{props.title}

+ {slots.default?.()} +
+) + +export type SettingItemProps = { + title: VueNodeOrRender + action: VueNodeOrRender + disabled?: boolean + disabledReason?: VueNodeOrRender +} + +export type SettingDrawerProps = { + settings?: ProSettings + collapse?: boolean + getContainer?: any + hideHintAlert?: boolean + hideCopyButton?: boolean + /** 使用实验性质的黑色主题 */ + enableDarkTheme?: boolean + prefixCls?: string + colorList?: false | { key: string; color: string }[] + onSettingChange?: (settings: ProSettings) => void + pathname?: string + disableUrlParams?: boolean + themeOnly?: boolean +} + +const settingDrawerProps = { + defaultSettings: { + type: Object as PropType, + default: () => defaultSettings + }, + settings: { + type: Object as PropType, + default: () => defaultSettings + }, + collapse: Boolean, + getContainer: [Function, Object] as PropType, + hideHintAlert: Boolean, + hideCopyButton: Boolean, + /** 使用实验性质的黑色主题 */ + enableDarkTheme: Boolean, + prefixCls: { + type: String, + default: 'ant-pro' + }, + colorList: { + type: [Boolean, Array] as PropType, + default: () => [ + { key: 'daybreak', color: '#1890ff' }, + { key: 'dust', color: '#F5222D' }, + { key: 'volcano', color: '#FA541C' }, + { key: 'sunset', color: '#FAAD14' }, + { key: 'cyan', color: '#13C2C2' }, + { key: 'green', color: '#52C41A' }, + { key: 'geekblue', color: '#2F54EB' }, + { key: 'purple', color: '#722ED1' } + ] + }, + onSettingChange: Function as PropType, + pathname: { type: String, default: window.location.pathname }, + disableUrlParams: { type: Boolean, default: true }, + themeOnly: Boolean +} + +type FormatMessageFunc = (data: { id: string; defaultMessage?: string }) => string +export const getFormatMessage = (): FormatMessageFunc => { + return ({ id }: { id: string; defaultMessage?: string }): string => { + const locales = gLocaleObject() + return locales[id] + } +} + +const updateTheme = async (dark: boolean, color?: string) => { + if (typeof window === 'undefined') return + if (typeof window.MutationObserver === 'undefined') return + + if (!ConfigProvider.config) return + ConfigProvider.config({ + theme: { + primaryColor: genStringToTheme(color) || '#1890ff' + } + }) + + // if (dark) { + // const defaultTheme = { + // brightness: 100, + // contrast: 90, + // sepia: 10 + // } + // + // const defaultFixes = { + // invert: [], + // css: '', + // ignoreInlineStyle: ['.react-switch-handle'], + // ignoreImageAnalysis: [], + // disableStyleSheetsProxy: true + // } + // if (window.MutationObserver && window.fetch) { + // setFetch(window.fetch) + // darkreaderEnable(defaultTheme, defaultFixes) + // } + // } else { + // if (window.MutationObserver) darkreaderDisable() + // } +} + +const genCopySettingJson = (settingState: ProSettings) => + JSON.stringify({ ...settingState }, null, 2) + +/** + * 可视化配置组件 + * + * @param props + */ +const SettingDrawer = defineComponent({ + props: settingDrawerProps, + emits: ['update:collapse', 'update:settings'], + setup(props, { emit }) { + // const firstRender = ref(true) + + // 隐藏显示,支持 双向绑定 + const show = ref(false) + const setShow = (isShow: boolean) => { + show.value = isShow + emit('update:collapse', show.value) + } + watchEffect(() => { + show.value = props.collapse + }) + + const settingState = reactive({}) + watchEffect(() => { + Object.assign(settingState, props.settings) + }) + + // TODO 语言切换 + + // 监听更新主题色 + const changeTheme = () => + updateTheme(settingState.navTheme === 'realDark', settingState.primaryColor) + watch(() => settingState.primaryColor, changeTheme, { immediate: true }) + watch(() => settingState.navTheme, changeTheme) + + /** + * 修改设置 + * + * @param key + * @param value + */ + const changeSetting = (key: string, value: string | boolean | number) => { + // @ts-ignore + settingState[key] = value + + if (key === 'layout') { + settingState.contentWidth = value === 'top' ? 'Fixed' : 'Fluid' + } + if (key === 'layout' && value !== 'mix') { + settingState.splitMenus = false + } + if (key === 'layout' && value === 'mix') { + settingState.navTheme = 'light' + } + if (key === 'colorWeak' && value === true) { + const dom = document.querySelector('body') + if (dom) { + dom.dataset.prosettingdrawer = dom.style.filter + dom.style.filter = 'invert(80%)' + } + } + if (key === 'colorWeak' && value === false) { + const dom = document.querySelector('body') + if (dom) { + dom.style.filter = dom.dataset.prosettingdrawer || 'none' + delete dom.dataset.prosettingdrawer + } + } + + emit('update:settings', toRaw(settingState)) + } + + const formatMessage = getFormatMessage() + + return () => { + const baseClassName = `${props.prefixCls}-setting` + return ( + setShow(false)} + placement="right" + getContainer={props.getContainer} + handle={ +
setShow(!show.value)}> + {show.value ? ( + + ) : ( + + )} +
+ } + style={{ + zIndex: 999 + }} + > +
+ + { + if (item.key === 'dark' && settingState.layout === 'mix') return false + return !(item.key === 'realDark' && !props.enableDarkTheme) + })} + value={settingState.navTheme!} + configType="theme" + key="navTheme" + onChange={value => changeSetting('navTheme', value)} + /> + + {props.colorList !== false && ( + + changeSetting('primaryColor', color)} + /> + + )} + {!props.themeOnly && ( + <> + + + changeSetting('layout', value)} + /> + + + + + + + + + + + + { + changeSetting('colorWeak', checked) + }} + /> + ) + } + ]} + /> + + {props.hideHintAlert && props.hideCopyButton ? null : } + + {props.hideHintAlert ? null : ( + } + showIcon + style={{ marginBottom: '16px' }} + /> + )} + + {props.hideCopyButton ? null : ( + + )} + + )} +
+
+ ) + } + } +}) + +export default SettingDrawer diff --git a/pro-components/layout/components/SiderMenu/BaseMenu.tsx b/pro-components/layout/components/SiderMenu/BaseMenu.tsx new file mode 100644 index 0000000..92a46de --- /dev/null +++ b/pro-components/layout/components/SiderMenu/BaseMenu.tsx @@ -0,0 +1,329 @@ +import './index.less' + +import { menuProps } from 'ant-design-vue/es/menu/src/Menu' +import { pureSettingsProps, defaultSettings } from '../../defaultSettings' +import { isImg, isUrl } from '../../utils/checkUtils' +import { Menu, Skeleton } from 'ant-design-vue' +import Icon, { createFromIconfontCN } from '@ant-design/icons-vue' + +import type { MenuDataItem, MessageDescriptor, WithFalse } from '../../types' +import type { MenuProps, MenuTheme } from 'ant-design-vue' +import type { MenuItemRender, SubMenuItemRender } from '../../renderTypes' +import type { PropType, ExtractPropTypes } from 'vue' +import type { SelectEventHandler, SelectInfo } from 'ant-design-vue/es/menu/src/interface' +import type { Key } from 'ant-design-vue/es/_util/type' +import type { RouteLocationNormalizedLoaded } from 'vue-router' +import omit from 'ant-design-vue/es/_util/omit' +import { WithFalseVueNodeOrRenderPropType } from '#/types' +import type { VueNodeOrRender } from '#/types' +import { redirectPath } from '@/config' +import AntIcon from '#/layout/components/AntIcon/index' + +export const baseMenuProps = () => ({ + ...omit(menuProps(), ['openKeys', 'onOpenChange']), + ...pureSettingsProps, + + /** 默认的是否展开,会受到 breakpoint 的影响 */ + defaultCollapsed: { type: Boolean, default: undefined }, + collapsed: { type: Boolean, default: undefined }, + splitMenus: { type: Boolean, default: undefined }, + isMobile: { type: Boolean, default: undefined }, + menuData: Array as PropType, + onCollapse: Function as PropType<(collapsed: boolean) => void>, + openKeys: [Array, Boolean] as PropType | undefined>, + handleOpenChange: Function as PropType<(openKeys: Key[]) => void>, + iconPrefixes: String, + /** 要给菜单的props, 参考antd-menu的属性。https://ant.design/components/menu-cn/ */ + menuProps: Object as PropType, + theme: String as PropType, + formatMessage: Function as PropType<(message: MessageDescriptor) => string>, + + /** + * 处理父级菜单的 props,可以复写菜单的点击功能,一般用于埋点 + * @see 子级的菜单要使用 menuItemRender 来处理 + * + * @example 使用 a 标签跳转到特殊的地址 subMenuItemRender={(item, defaultDom) => { return history.push(item.path) }>{defaultDom} }} + * @example 增加埋点 subMenuItemRender={(item, defaultDom) => { return log.click(item.name) }>{defaultDom} }} + */ + subMenuItemRender: WithFalseVueNodeOrRenderPropType as PropType, + + /** + * 处理菜单的 props,可以复写菜单的点击功能,一般结合 Router 框架使用 + * @see 非子级的菜单要使用 subMenuItemRender 来处理 + * + * @example 使用 a 标签 menuItemRender={(item, defaultDom) => { return history.push(item.path) }>{defaultDom} }} + * @example 使用 Link 标签 menuItemRender={(item, defaultDom) => { return {defaultDom} }} + */ + menuItemRender: WithFalseVueNodeOrRenderPropType as PropType, + + /** + * 处理 menuData 的方法,与 menuDataRender 不同,postMenuData处理完成后会直接渲染,不再进行国际化和拼接处理 + * + * @example 增加菜单图标 postMenuData={(menuData) => { return menuData.map(item => { return { ...item, icon: } }) }} + */ + postMenuData: { + type: Function as PropType<(menusData?: MenuDataItem[]) => MenuDataItem[]>, + default: (data?: MenuDataItem[]) => data || [] + } +}) + +export type BaseMenuProps = Partial>> + +let IconFont = createFromIconfontCN({ + scriptUrl: defaultSettings.iconfontUrl +}) + +// Allow menu.js config icon as string or ReactNode +// icon: 'setting', +// icon: 'icon-geren' #For Iconfont , +// icon: 'http://demo.com/icon.png', +// icon: '/favicon.png', +// icon: , +const getIcon = (icon?: string | VueNodeOrRender, iconPrefixes = 'icon-'): VueNodeOrRender => { + if (typeof icon === 'string' && icon !== '') { + if (isUrl(icon) || isImg(icon)) { + return ( + icon} /> + ) + } + if (icon.startsWith(iconPrefixes)) { + return + } + // @ts-ignore + return + } + return icon +} + +class MenuUtil { + constructor(props: BaseMenuProps) { + this.props = props + } + + props: BaseMenuProps + + getNavMenuItems = (menusData: MenuDataItem[] = [], isChildren: boolean) => + menusData.map(item => this.getSubMenuOrItem(item, isChildren)).filter(item => item) + + /** Get SubMenu or Item */ + getSubMenuOrItem = (item: MenuDataItem, isChildren: boolean): any => { + const children = item?.children || item?.routes + if (Array.isArray(children) && children.length > 0) { + const name = this.getIntlName(item) + const { subMenuItemRender, prefixCls, menu, iconPrefixes } = this.props + // get defaultTitle by menuItemRender + const defaultTitle = item.icon ? ( + + {getIcon(item.icon, iconPrefixes)} + {name} + + ) : ( + + {name} + + ) + + // subMenu only title render + const title = subMenuItemRender + ? subMenuItemRender({ ...item, isUrl: false }, defaultTitle, this.props) + : defaultTitle + + const MenuParent = menu?.type === 'group' ? Menu.ItemGroup : Menu.SubMenu + return ( + + {this.getNavMenuItems(children, true)} + + ) + } + + return ( + { + if (isUrl(item?.path)) { + window.open(item.path, '_blank') + } + item.onTitleClick?.(e) + }} + > + {{ + default: () => this.getMenuItemPath(item), + icon: () => getIcon(item.icon, this.props.iconPrefixes) + }} + + ) + } + + getIntlName = (item: MenuDataItem) => { + const { name, locale } = item + const { menu, formatMessage } = this.props + if (locale && menu?.locale !== false) { + return formatMessage?.({ + id: locale, + defaultMessage: name + }) + } + return name + } + + /** + * 判断是否是http链接.返回 Link 或 a Judge whether it is http link.return a or Link + * + * @memberof SiderMenu + */ + getMenuItemPath = (item: MenuDataItem): VueNodeOrRender => { + const itemPath = this.conversionPath(item.path || '/') + + // TODO 这个 location 的传递问题 + //const { location = { pathname: '/' } } = this.props + const location = { pathname: '/' } + // if local is true formatMessage all name。 + const name = this.getIntlName(item) + const { prefixCls } = this.props + const isHttpUrl = isUrl(itemPath) + const defaultItem = ( + + {name} + + ) + + if (this.props.menuItemRender) { + const renderItemProps = { + ...item, + isUrl: isHttpUrl, + itemPath, + isMobile: this.props.isMobile, + replace: itemPath === location.pathname, + onClick: () => { + if (isHttpUrl) window.open(itemPath) + if (this.props.onCollapse) this.props.onCollapse(true) + }, + children: undefined + } + return this.props.menuItemRender(renderItemProps, defaultItem, this.props) + } + return defaultItem + } + + conversionPath = (path: string) => { + if (path && path.indexOf('http') === 0) { + return path + } + return `/${path || ''}`.replace(/\/+/g, '/') + } +} + +function getOpenKeys(props: BaseMenuProps, route: RouteLocationNormalizedLoaded) { + // 折叠的时候,或者 top 菜单模式的时候,openKeys 需要置空 + if (!props.collapsed && ['side', 'mix'].includes(props.layout || 'mix')) { + return route.matched.filter(r => r.path !== route.path && r.path !== '/').map(r => r.path) + } + + return [] +} + +export default defineComponent({ + name: 'BaseMenu', + inheritAttrs: false, + props: baseMenuProps(), + setup(props, { attrs }) { + // TODO defaultOpenAll 支持,目前 react 版本的示例中是无效果的,所以这里暂时不处理 + // const initOpenKeys = () => { + // if (props.menu?.defaultOpenAll) { + // return getOpenKeysFromMenuData(props.menuData) || [] + // } + // return props.openKeys || [] + // } + // 根据路由赋值当前选中和打开的菜单 + const route = useRoute() + const localOpenKeys = ref([]) + const localSelectedKeys = ref([]) + watchEffect(() => { + // 进行 redirect 的时候不处理,如果要把高级组件剥离,这个前缀不能写死需要透传过来 + if (route.path.startsWith(redirectPath)) return + localOpenKeys.value = getOpenKeys(props, route) + localSelectedKeys.value = route.matched.filter(x => x.path !== '/').map(x => x.path) + }) + + console.log(props.menuData) + + // 选中菜单的时候进行路由切换 + const router = useRouter() + const handleSelect: SelectEventHandler = (args: SelectInfo): void => { + // 忽略外链类型 + if (isUrl(args.key as string)) { + return + } + router.push(args.key as string) + localSelectedKeys.value = args.selectedKeys as string[] + // emit('update:selectedKeys', args.selectedKeys) + } + + // 打开菜单时候的触发事件 TODO 支持排他展开 + const defaultHandleOpenChange = (openKeys: Key[]) => { + localOpenKeys.value = openKeys + } + const handleOpenChange = props.handleOpenChange ?? defaultHandleOpenChange + + watchEffect(() => { + // reset IconFont + if (props.iconfontUrl) { + IconFont = createFromIconfontCN({ + scriptUrl: props.iconfontUrl + }) + } + }) + + const cls = computed(() => [attrs.class, { 'top-nav-menu': props.mode === 'horizontal' }]) + + // sync props + const menuUtils = new MenuUtil(props) + + return () => { + if (props.menu?.loading) { + return ( +
+ +
+ ) + } + + const finallyData = props.postMenuData ? props.postMenuData(props.menuData) : props.menuData + if (finallyData && finallyData?.length < 1) { + return null + } + return ( + + {menuUtils.getNavMenuItems(finallyData, false)} + + ) + } + } +}) diff --git a/pro-components/layout/components/SiderMenu/SiderMenu.tsx b/pro-components/layout/components/SiderMenu/SiderMenu.tsx new file mode 100644 index 0000000..0197e6a --- /dev/null +++ b/pro-components/layout/components/SiderMenu/SiderMenu.tsx @@ -0,0 +1,337 @@ +import './index.less' + +import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue' +import { VueNodeOrRenderPropType, WithFalseVueNodeOrRenderPropType } from '#/types' +import { Layout, Menu, MenuItem } from 'ant-design-vue' +import BaseMenu, { baseMenuProps } from './BaseMenu' + +import type { VueNodeOrRender } from '#/types' +import type { WithFalse } from '../../types' +import type { CSSProperties, ExtractPropTypes, FunctionalComponent, PropType, Slots } from 'vue' +import type { SiderProps } from 'ant-design-vue' +import type { + CollapsedButtonRender, + MenuContentRender, + MenuExtraReander, + MenuFootRender, + MenuHeaderRender +} from '../../renderTypes' +import { getVueNode, getRender } from '../../utils' + +export const siderMenuProps = () => ({ + ...baseMenuProps(), + + logo: { + type: VueNodeOrRenderPropType as PropType, + default: undefined + }, + siderWidth: { type: Number, default: 208 }, + + /** + * 菜单 logo 和 title 区域的渲染 + * + * @example 不要logo : menuHeaderRender={(logo,title)=> title} + * @example 不要title : menuHeaderRender={(logo,title)=> logo} + * @example 展开的时候显示title,收起显示 logo: menuHeaderRender={(logo,title,props)=> props.collapsed ? logo : title} + * @example 不要这个区域了 : menuHeaderRender={false} + */ + menuHeaderRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: undefined + }, + + /** + * 侧边菜单底部的配置,可以增加一些底部操作 + * + * @example 底部增加超链接 menuFooterRender={()=>pro.ant.design} + * @example 根据收起展开配置不同的 dom menuFooterRender={()=>collapsed? null :pro.ant.design} + */ + menuFooterRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: undefined + }, + + /** + * 侧边菜单,菜单区域的处理,可以单独处理菜单的dom + * + * @example 增加菜单区域的背景颜色 menuContentRender={(props,defaultDom)=>
{defaultDom}
} + * @example 某些情况下不显示菜单 menuContentRender={(props)=> return
不显示菜单
} + */ + menuContentRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: undefined + }, + /** + * 侧边菜单 title 和 logo 下面区域的渲染,一般会增加个搜索框 + * + * @example 增加一个搜索框 menuExtraRender={()=>()} + * @example 根据收起展开配置不同的 dom: menuExtraRender={()=>collapsed? null : } + */ + menuExtraRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: false + }, + + /** + * 自定义展开收起按钮的渲染 + * + * @example 使用文字渲染 collapsedButtonRender={(collapsed)=>collapsed?"展开":"收起"})} + * @example 使用icon渲染 collapsedButtonRender={(collapsed)=>collapsed?:} + * @example 不渲染按钮 collapsedButtonRender={false} + */ + collapsedButtonRender: { + type: WithFalseVueNodeOrRenderPropType as PropType>, + default: undefined + }, + + /** + * 菜单是否收起的断点,设置成false 可以禁用 + * + * @example 禁用断点 breakpoint={false} + * @example 最小的屏幕再收起 breakpoint={'xs'} + */ + breakpoint: { + type: [String, Boolean] as PropType, + default: 'lg' + }, + + /** + * 菜单顶部logo 和 title 区域的点击事件 + * + * @example 点击跳转到首页 onMenuHeaderClick={()=>{ history.push('/') }} + */ + onMenuHeaderClick: { + type: Function as PropType<(e: MouseEvent) => void>, + default: undefined + }, + + /** + * 侧边菜单底部的一些快捷链接 + * + * @example links={[ 访问官网 , 帮助 ]} + */ + links: { + type: VueNodeOrRenderPropType as PropType, + default: undefined + }, + + // TODO 这个放到事件里面 + onOpenChange: { + type: Function as PropType<(openKeys: WithFalse) => void>, + default: undefined + }, + getContainer: { type: Boolean, default: false }, + logoStyle: { + type: Object as PropType, + default: () => undefined + }, + hide: { type: Boolean, default: undefined } +}) + +export type SiderMenuProps = Partial>> + +export const privateSiderMenuProps = () => ({ + matchMenuKeys: Array as PropType +}) + +export type PrivateSiderMenuProps = Partial< + ExtractPropTypes> +> + +export const defaultRenderLogo = ( + logo: VueNodeOrRender | (() => VueNodeOrRender) +): VueNodeOrRender => { + if (typeof logo === 'string') { + return logo + } + if (typeof logo === 'function') { + return logo() + } + return logo +} + +export const defaultRenderLogoAndTitle = ( + props: SiderMenuProps, + slots: Slots, + renderKey = 'menuHeaderRender' +): VueNodeOrRender => { + if (props.layout === 'mix' && renderKey === 'menuHeaderRender') { + return null + } + + const renderFunction = getRender(props, slots, renderKey) + if (renderFunction === false) { + return null + } + + const logRender = getRender(props, slots, 'logo') + const logoDom = defaultRenderLogo(logRender) + + const titleRender = getVueNode(props.title, slots.title) + const titleDom =

{titleRender ?? 'Ball Cat'}

+ + if (renderFunction) { + // when collapsed, no render title + return renderFunction(props, logoDom, props.collapsed ? null : titleDom) + } + + return ( + + {logoDom} + {props.collapsed ? null : titleDom} + + ) +} + +export const defaultRenderCollapsedButton = (collapsed?: boolean) => + collapsed ? : + +function getCollapsedButtonRender(props: SiderMenuProps & PrivateSiderMenuProps, slots: Slots) { + if (props.collapsedButtonRender == false) { + return false + } + const render = getRender(props, slots, 'collapsedButtonRender') + return render || defaultRenderCollapsedButton +} + +const SiderMenu: FunctionalComponent = ( + props, + { slots, attrs } +) => { + const baseClassName = `${props.prefixCls}-sider` + const siderClassName = { + [`${baseClassName}`]: true, + [`${baseClassName}-fixed`]: props.fixSiderbar, + [`${baseClassName}-layout-${props.layout}`]: props.layout && !props.isMobile, + [`${baseClassName}-light`]: props.theme !== 'dark' + } + + const headerDom = defaultRenderLogoAndTitle(props, slots) + + // const { flatMenuKeys } = MenuCounter.useContainer() + const flatMenuKeys: string[] = [] + const extraDom = props.menuExtraRender && props.menuExtraRender(props) + const menuDom = props.menuContentRender !== false && flatMenuKeys && ( + + ) + + const menuRenderDom = props.menuContentRender ? props.menuContentRender(props, menuDom) : menuDom + + const collapsedButtonRender = getCollapsedButtonRender(props, slots) + + const menuFooterRender = getRender(props, slots, 'menuFooterRender') + + return ( + <> + {props.fixSiderbar && ( +
+ )} + { + if (props.isMobile) return + props.onCollapse?.(collapse) + }} + collapsedWidth={48} + style={{ + overflow: 'hidden', + paddingTop: + props.layout === 'mix' && !props.isMobile ? `${props.headerHeight}px` : undefined, + ...(attrs.style as CSSProperties) + }} + width={props.siderWidth} + theme={props.theme} + class={siderClassName} + > + {headerDom && ( + + )} + {extraDom && ( +
+ {extraDom} +
+ )} +
+ {menuRenderDom} +
+
+ {collapsedButtonRender !== false && ( + + { + if (props.onCollapse) { + props.onCollapse(!props.collapsed) + } + }} + > + {collapsedButtonRender(props.collapsed)} + + + )} +
+ {menuFooterRender && ( +
+ {menuFooterRender(props)} +
+ )} +
+ + ) +} + +export default SiderMenu diff --git a/pro-components/layout/components/SiderMenu/index.less b/pro-components/layout/components/SiderMenu/index.less new file mode 100644 index 0000000..9a795e6 --- /dev/null +++ b/pro-components/layout/components/SiderMenu/index.less @@ -0,0 +1,206 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@import (reference) '../../BasicLayout.less'; + +@import 'ant-design-vue/es/menu/style/index.less'; + +@pro-layout-sider-menu-prefix-cls: ~'@{ant-prefix}-pro-sider'; + +@nav-header-height: @pro-layout-header-height; + +.@{pro-layout-sider-menu-prefix-cls} { + position: relative; + background-color: @layout-sider-background; + border-right: 0; + + // 这里关掉了动画,不然使用无法兼容 + .@{ant-prefix}-menu { + background: transparent; + } + + &.@{ant-prefix}-layout-sider-light { + .@{ant-prefix}-menu-item a { + color: @heading-color; + } + .@{ant-prefix}-menu-item-selected a, + .@{ant-prefix}-menu-item a:hover { + color: @primary-color; + } + } + + &-logo { + position: relative; + display: flex; + align-items: center; + padding: 16px 16px; + cursor: pointer; + transition: padding 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); + + > a { + display: flex; + align-items: center; + justify-content: center; + min-height: 32px; + } + + img { + display: inline-block; + height: 32px; + vertical-align: middle; + } + + h1 { + display: inline-block; + height: 32px; + margin: 0 0 0 12px; + color: white; + font-weight: 600; + font-size: 18px; + line-height: 32px; + vertical-align: middle; + animation: pro-layout-title-hide 0.3s; + } + } + + &-extra { + margin-bottom: 16px; + padding: 0 16px; + &-no-logo { + margin-top: 16px; + } + } + + &-menu { + position: relative; + z-index: 10; + min-height: 100%; + box-shadow: 2px 0 6px rgba(0, 21, 41, 0.35); + } + + .@{ant-prefix}-layout-sider-children { + display: flex; + flex-direction: column; + height: 100%; + + ::-webkit-scrollbar { + width: 6px; + height: 6px; + } + + ::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.15); + border-radius: 3px; + box-shadow: inset 0 0 5px rgba(37, 37, 37, 0.05); + } + + /* 滚动条滑块 */ + ::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2); + border-radius: 3px; + box-shadow: inset 0 0 5px rgba(255, 255, 255, 0.05); + } + } + + &.@{ant-prefix}-layout-sider-collapsed { + .@{ant-prefix}-menu-inline-collapsed { + width: 48px; + } + .@{pro-layout-sider-menu-prefix-cls} { + &-logo { + padding: 16px 8px; + } + } + } + + &.@{ant-prefix}-layout-sider.@{pro-layout-sider-menu-prefix-cls}-fixed { + position: fixed; + top: 0; + left: 0; + z-index: 100; + height: 100%; + overflow: auto; + overflow-x: hidden; + box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); + > .@{ant-prefix}-menu-root { + :not(.@{pro-layout-sider-menu-prefix-cls}-link-menu) { + height: ~'calc(100vh - @{nav-header-height})'; + overflow-y: auto; + } + } + } + + &-light { + background-color: @component-background; + box-shadow: 2px 0 8px 0 rgba(29, 35, 41, 0.05); + + .@{ant-prefix}-layout-sider-children { + ::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.06); + border-radius: 3px; + box-shadow: inset 0 0 5px rgba(0, 21, 41, 0.05); + } + + /* 滚动条滑块 */ + ::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.12); + border-radius: 3px; + box-shadow: inset 0 0 5px rgba(0, 21, 41, 0.05); + } + } + + .@{pro-layout-sider-menu-prefix-cls}-logo { + h1 { + color: @primary-color; + } + } + .@{ant-prefix}-menu-light { + border-right-color: transparent; + } + + .@{pro-layout-sider-menu-prefix-cls}-collapsed-button { + border-top: @border-width-base @border-style-base @border-color-split; + } + } + + &-icon { + width: 14px; + vertical-align: baseline; + } + + &-links { + width: 100%; + ul.@{ant-prefix}-menu-root { + height: auto; + } + } + + &-collapsed-button { + border-top: @border-width-base @border-style-base rgba(0, 0, 0, 0.25); + .anticon { + font-size: 16px; + } + } + + .top-nav-menu li.@{ant-prefix}-menu-item { + height: 100%; + line-height: 1; + } + .drawer .drawer-content { + background: @layout-sider-background; + } +} + +@keyframes pro-layout-title-hide { + 0% { + display: none; + opacity: 0; + } + 80% { + display: none; + opacity: 0; + } + 100% { + display: unset; + opacity: 1; + } +} diff --git a/pro-components/layout/components/SiderMenu/index.tsx b/pro-components/layout/components/SiderMenu/index.tsx new file mode 100644 index 0000000..d1abbaf --- /dev/null +++ b/pro-components/layout/components/SiderMenu/index.tsx @@ -0,0 +1,80 @@ +import { Drawer } from 'ant-design-vue' + +import SiderMenu, { privateSiderMenuProps, siderMenuProps } from './SiderMenu' + +import type { CSSProperties } from 'vue' + +const SiderMenuWrapper = defineComponent({ + name: 'SiderMenuWrapper', + props: { + ...siderMenuProps(), + ...privateSiderMenuProps() + }, + setup(props, { slots, attrs }) { + // TODO 计算 flatMenuKeys + + // 当切换设备为手机时,会自动折叠菜单 + watch( + () => props.isMobile, + () => { + if (props.isMobile == true) { + props.onCollapse?.(true) + } + }, + { immediate: true } + ) + + if (props.hide) { + return null + } + + const drawerVisible = ref(false) + watchEffect(() => { + // @ts-ignore + drawerVisible.value = !props.collapsed + }) + + // @ts-ignore + return () => + props.isMobile ? ( + <> + props.onCollapse?.(true)} + style={{ + padding: 0, + height: '100vh', + ...(attrs.style as CSSProperties) + }} + closable={false} + getContainer={props.getContainer} + width={props.siderWidth} + bodyStyle={{ height: '100vh', padding: 0, display: 'flex', flexDirection: 'row' }} + > + + {slots} + + + + ) : ( + + {slots} + + ) + } +}) + +export default SiderMenuWrapper diff --git a/pro-components/layout/components/TopNavHeader/index.less b/pro-components/layout/components/TopNavHeader/index.less new file mode 100644 index 0000000..095936e --- /dev/null +++ b/pro-components/layout/components/TopNavHeader/index.less @@ -0,0 +1,73 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@import (reference) '../../BasicLayout.less'; + +@top-nav-header-prefix-cls: ~'@{ant-prefix}-pro-top-nav-header'; + +.@{top-nav-header-prefix-cls} { + position: relative; + width: 100%; + height: 100%; + box-shadow: 0 1px 4px 0 rgba(0, 21, 41, 0.12); + transition: background 0.3s, width 0.2s; + + .@{ant-prefix}-menu { + background: transparent; + } + + &.light { + background-color: @component-background; + .@{top-nav-header-prefix-cls}-logo { + h1 { + color: @heading-color; + } + } + .anticon { + color: inherit; + } + } + + &-main { + display: flex; + height: 100%; + padding-left: 16px; + &-left { + display: flex; + min-width: 192px; + } + } + + .anticon { + color: @btn-primary-color; + } + + &-logo { + position: relative; + min-width: 165px; + height: 100%; + overflow: hidden; + + img, + a > svg { + display: inline-block; + height: 32px; + vertical-align: middle; + } + + h1 { + display: inline-block; + margin: 0 0 0 12px; + color: @btn-primary-color; + font-size: 16px; + vertical-align: top; + } + } + + &-menu { + min-width: 0; + .@{ant-prefix}-menu.@{ant-prefix}-menu-horizontal { + height: 100%; + border: none; + } + } +} diff --git a/pro-components/layout/components/TopNavHeader/index.tsx b/pro-components/layout/components/TopNavHeader/index.tsx new file mode 100644 index 0000000..4796ffa --- /dev/null +++ b/pro-components/layout/components/TopNavHeader/index.tsx @@ -0,0 +1,89 @@ +import './index.less' + +import { useDebounceFn } from '@vueuse/core' +import { default as ResizeObserver } from 'ant-design-vue/es/vc-resize-observer' +import type { SiderMenuProps } from '../SiderMenu/SiderMenu' +import type { GlobalHeaderProps } from '../GlobalHeader' +import type { CSSProperties, FunctionalComponent } from 'vue' +import type { HeaderViewProps } from '../../Header' +import { defaultRenderLogoAndTitle } from '../SiderMenu/SiderMenu' +import { ref } from 'vue' +import BaseMenu from '../SiderMenu/BaseMenu' +import { getRender } from '#/layout/utils' +import type { RightContentRender } from '#/layout/renderTypes' + +export type TopNavHeaderProps = SiderMenuProps & GlobalHeaderProps + +/** + * 抽离出来是为了防止 rightSize 经常改变导致菜单 render + * + * @param param0 + * @param props + */ +export const RightContent: FunctionalComponent = props => { + const rightSize = ref('auto') + + /** 减少一下渲染的次数 */ + const setRightSizeDebounceFn = useDebounceFn((width: number) => { + rightSize.value = `${width}px` + }, 160) + + return ( +
+
+ { + setRightSizeDebounceFn(width) + }} + > + {props.rightContentRender && ( +
+ {props.rightContentRender({ ...props } as HeaderViewProps)} +
+ )} +
+
+
+ ) +} + +export const TopNavHeader: FunctionalComponent = (props, { slots, attrs }) => { + const prefixCls = `${props.prefixCls || 'ant-pro'}-top-nav-header` + + const headerDom = defaultRenderLogoAndTitle( + { ...props, collapsed: false }, + slots, + props.layout === 'mix' ? 'headerTitleRender' : undefined + ) + + const className = computed(() => [prefixCls, attrs.class, { light: props.theme === 'light' }]) + + // @ts-ignore + const defaultDom = + + const headerContentDom = props.headerContentRender + ? props.headerContentRender?.(props as HeaderViewProps, defaultDom) + : defaultDom + + const rightContentRender = getRender(props, slots, 'rightContentRender') + + return ( +
+
+
+ +
+
+ {headerContentDom} +
+ {rightContentRender && ( + + )} +
+
+ ) +} + +export default TopNavHeader diff --git a/pro-components/layout/components/WaterMark/index.tsx b/pro-components/layout/components/WaterMark/index.tsx new file mode 100644 index 0000000..68e81d1 --- /dev/null +++ b/pro-components/layout/components/WaterMark/index.tsx @@ -0,0 +1,232 @@ +import type { CSSProperties, PropType } from 'vue' +import { getPrefixCls } from '../../RouteContext' + +export type WaterMarkProps = { + /** 水印样式 */ + markStyle?: CSSProperties + /** 水印类名 */ + markClassName?: string + /** 水印之间的水平间距 */ + gapX?: number + /** 水印之间的垂直间距 */ + gapY?: number + /** 追加的水印元素的z-index */ + zIndex?: number + /** 水印的宽度 */ + width?: number + /** 水印的高度 */ + height?: number + /** 水印在canvas 画布上绘制的垂直偏移量,正常情况下,水印绘制在中间位置, 即 offsetTop = gapY / 2 */ + offsetTop?: number // 水印图片距离绘制 canvas 单元的顶部距离 + /** 水印在canvas 画布上绘制的水平偏移量, 正常情况下,水印绘制在中间位置, 即 offsetTop = gapX / 2 */ + offsetLeft?: number + /** 水印绘制时,旋转的角度,单位 ° */ + rotate?: number + /** ClassName 前缀 */ + prefixCls?: string + /** 高清印图片源, 为了高清屏幕显示,建议使用 2倍或3倍图,优先使用图片渲染水印。 */ + image?: string + /** 水印文字内容 */ + content?: string | string[] + /** 文字颜色 */ + fontColor?: string + /** 文字样式 */ + fontStyle?: 'none' | 'normal' | 'italic' | 'oblique' + /** 文字族 */ + fontFamily?: string + /** 文字粗细 */ + fontWeight?: 'normal' | 'light' | 'weight' | number + /** 文字大小 */ + fontSize?: number | string +} + +const waterMarkProps = { + markStyle: { + type: Object as PropType, + default: () => undefined + }, + markClassName: { + type: String as PropType, + default: '' + }, + gapX: { + type: Number, + default: 212 + }, + gapY: { + type: Number, + default: 222 + }, + // antd 内容层 zIndex 基本上在 10 以下 https://github.com/ant-design/ant-design/blob/6192403b2ce517c017f9e58a32d58774921c10cd/components/style/themes/default.less#L335 + zIndex: { + type: Number, + default: 9 + }, + width: { + type: Number, + default: 120 + }, + height: { + type: Number, + default: 64 + }, + offsetTop: { + type: Number, + default: undefined + }, + offsetLeft: { + type: Number, + default: undefined + }, + // 默认旋转 -22 度 + rotate: { + type: Number, + default: -22 + }, + prefixCls: { + type: String, + default: '' + }, + image: { + type: String, + default: '' + }, + content: { + type: [String, Array] as PropType, + default: '' + }, + fontColor: { + type: String, + default: 'rgba(0,0,0,.15)' + }, + fontStyle: { + type: String, + default: 'normal' + }, + fontFamily: { + type: String, + default: 'sans-serif' + }, + fontWeight: { + type: [Number, String] as PropType, + default: 'normal' + }, + fontSize: { + type: [Number, String] as PropType, + default: 16 + } +} + +/** + * 返回当前显示设备的物理像素分辨率与CSS像素分辨率之比 + * + * @param context + * @see api 有些废弃了,其实类型 CanvasRenderingContext2D + */ +const getPixelRatio = (context: any) => { + if (!context) { + return 1 + } + const backingStore = + context.backingStorePixelRatio || + context.webkitBackingStorePixelRatio || + context.mozBackingStorePixelRatio || + context.msBackingStorePixelRatio || + context.oBackingStorePixelRatio || + context.backingStorePixelRatio || + 1 + return (window.devicePixelRatio || 1) / backingStore +} + +const WaterMark = defineComponent({ + name: 'WaterMark', + props: waterMarkProps, + setup(props, { slots, attrs }) { + const prefixCls = getPrefixCls('pro-layout-watermark', props.prefixCls) + const wrapperCls = [`${prefixCls}-wrapper`, attrs.class] + const waterMakrCls = [prefixCls, props.markClassName] + const base64Url = ref('') + + watchEffect(() => { + const canvas = document.createElement('canvas') + const ctx = canvas.getContext('2d') + const ratio = getPixelRatio(ctx) + + const canvasWidth = `${(props.gapX + props.width) * ratio}px` + const canvasHeight = `${(props.gapY + props.height) * ratio}px` + const canvasOffsetLeft = props.offsetLeft || props.gapX / 2 + const canvasOffsetTop = props.offsetTop || props.gapY / 2 + + canvas.setAttribute('width', canvasWidth) + canvas.setAttribute('height', canvasHeight) + + if (ctx) { + // 旋转字符 rotate + ctx.translate(canvasOffsetLeft * ratio, canvasOffsetTop * ratio) + ctx.rotate((Math.PI / 180) * Number(props.rotate)) + const markWidth = props.width * ratio + const markHeight = props.height * ratio + + if (props.image) { + const img = new Image() + img.crossOrigin = 'anonymous' + img.referrerPolicy = 'no-referrer' + img.src = props.image + img.onload = () => { + ctx.drawImage(img, 0, 0, markWidth, markHeight) + base64Url.value = canvas.toDataURL() + } + } else if (props.content) { + const markSize = Number(props.fontSize) * ratio + ctx.font = `${props.fontStyle} normal ${props.fontWeight} ${markSize}px/${markHeight}px ${props.fontFamily}` + ctx.fillStyle = props.fontColor + if (Array.isArray(props.content)) { + props.content?.forEach((item: string, index: number) => + ctx.fillText(item, 0, index * 50) + ) + } else { + ctx.fillText(props.content, 0, 0) + } + base64Url.value = canvas.toDataURL() + } + } else { + // eslint-disable-next-line no-console + console.error('当前环境不支持Canvas') + } + }) + + return () => ( +
+ {slots.default?.()} +
+
+ ) + } +}) + +export default WaterMark diff --git a/pro-components/layout/defaultSettings.ts b/pro-components/layout/defaultSettings.ts new file mode 100644 index 0000000..635a331 --- /dev/null +++ b/pro-components/layout/defaultSettings.ts @@ -0,0 +1,229 @@ +import type { MenuTheme } from 'ant-design-vue/es/menu' +import type { PropType } from 'vue' + +export interface MenuDataItem { + children?: MenuDataItem[] + hideChildrenInMenu?: boolean + hideInMenu?: boolean + icon?: any + locale?: string | false + name?: string + key?: string + pro_layout_parentKeys?: string[] + path?: string + parentKeys?: string[] + + [key: string]: any +} + +/** + * 内容宽度 + * @type 'Fluid' | 'Fixed' + */ +export type ContentWidth = 'Fluid' | 'Fixed' + +/** + * layout 的布局方式 + * @type 'side' | 'top' | 'mix' + */ +export type LayoutMode = 'side' | 'top' | 'mix' + +export type RenderSetting = { + headerRender?: false + footerRender?: false + menuRender?: false + menuHeaderRender?: false +} + +export type PureSettings = { + /** + * theme for nav menu + * + * @type "light" | "dark" | "realDark" + */ + navTheme?: MenuTheme | 'realDark' | undefined + + /** + * 顶部菜单的颜色,mix 模式下生效 + * @type "light" | "dark" + */ + headerTheme?: MenuTheme + /** + * customize header height + * @example 顶栏高度修改为64 headerHeight={64} + */ + headerHeight?: number + /** + * layout 的布局方式 + * @type 'side' | 'top' | 'mix' + * + * @example 顶部菜单 layout="top" + * @example 侧边菜单 layout="side" + * @example 混合布局 既有顶部也有侧边 layout="mix" + */ + layout?: LayoutMode + /** layout of content: `Fluid` or `Fixed`, only works when layout is top */ + contentWidth?: ContentWidth + /** sticky header */ + fixedHeader?: boolean + /** sticky siderbar */ + fixSiderbar?: boolean + /** + * menu 相关的一些配置,可以配置菜单的行为 + * + * @example 关闭菜单国际化 menu={{ locale: false }} + * @example 默认打开所有的菜单 menu={{ defaultOpenAll:true }} + * @example 让菜单处于loading 状态 menu={{ loading: true }} + * @example 异步加载菜单数据 menu={{params:{ pathname } request: async (params) => { return [{name:"主页",path=params.pathname}]} }} + * @example 使用 MenuGroup 来聚合菜单 menu={{ mode: 'group' }} + * @example 取消自动关闭菜单 menu={{ autoClose: false }} + * @example 忽略收起时自动关闭菜单 menu={{ ignoreFlatMenu: true }} + */ + menu?: { + /** + * 菜单国际化的配置 + */ + locale?: boolean + /** + * 默认打开所有的菜单 + */ + defaultOpenAll?: boolean + /** + * 是否忽略用户手动折叠过的菜单状态,如选择忽略,折叠按钮切换之后也可实现展开所有菜单 + */ + ignoreFlatMenu?: boolean + + /** + * 菜单的 loading 配置 + */ + loading?: boolean + /** + * 菜单的 loading 发生改变 + */ + onLoadingChange?: (loading?: boolean) => void + + /** + * 菜单远程请求时用的参数,只有 params 变化才会重新触发 request + * + */ + params?: Record + + /** + * 菜单远程请求的方法,只有 params 变化才会重新触发 request + */ + request?: ( + params: Record, + defaultMenuData: MenuDataItem[] + ) => Promise + + /** + * 菜单聚合的模式 + */ + type?: 'sub' | 'group' + /** + * 取消自动关闭菜单 + */ + autoClose?: false + } + /** + * 设置为 false,在 layout 中只展示 pageName,而不是 pageName - title + * + * Layout 的 title,也会显示在浏览器标签上 + */ + title?: string | false + /** + * Your custom iconfont Symbol script Url eg://at.alicdn.com/t/font_1039637_btcrd5co4w.js + * 注意:如果需要图标多色,Iconfont 图标项目里要进行批量去色处理 Usage: https://github.com/ant-design/ant-design-pro/pull/3517 + */ + iconfontUrl?: string + /** 主色,需要配合 umi 使用 */ + primaryColor?: string + /** 全局增加滤镜 */ + colorWeak?: boolean + /** + * 只在 mix 模式下生效 + * + * 切割菜单 + */ + splitMenus?: boolean +} + +export type ProSettings = PureSettings & RenderSetting + +export const defaultSettings: ProSettings = { + navTheme: 'dark', + headerTheme: 'dark', + layout: 'side', + contentWidth: 'Fluid', + fixedHeader: false, + fixSiderbar: false, + headerHeight: 48, + iconfontUrl: '', + primaryColor: '#1890ff', + splitMenus: false, + + // 布局内容默认都渲染 + headerRender: undefined, + footerRender: undefined, + menuRender: undefined, + menuHeaderRender: undefined +} + +export const pureSettingsProps = { + navTheme: { + type: String as PropType, + default: defaultSettings.navTheme + }, + headerTheme: { + type: String as PropType, + default: defaultSettings.headerTheme + }, + headerHeight: { + type: Number as PropType, + default: defaultSettings.headerHeight + }, + layout: { + type: String as PropType, + default: defaultSettings.layout + }, + contentWidth: { + type: String as PropType, + default: defaultSettings.contentWidth + }, + fixedHeader: { + type: Boolean as PropType, + default: defaultSettings.fixedHeader + }, + fixSiderbar: { + type: Boolean as PropType, + default: defaultSettings.fixSiderbar + }, + menu: { + type: Object as PropType, + default: () => { + return { + locale: false + } + } + }, + title: { + type: String as PropType, + default: () => defaultSettings.title + }, + iconfontUrl: { + type: String as PropType, + default: () => defaultSettings.iconfontUrl + }, + primaryColor: { + type: String as PropType, + default: () => defaultSettings.primaryColor + }, + colorWeak: { + type: Boolean as PropType, + default: () => defaultSettings.colorWeak + }, + splitMenus: { + type: Boolean, + default: false + } +} diff --git a/pro-components/layout/locales/en-US.ts b/pro-components/layout/locales/en-US.ts new file mode 100644 index 0000000..9c06d71 --- /dev/null +++ b/pro-components/layout/locales/en-US.ts @@ -0,0 +1,5 @@ +import settingDrawer from './en-US/settingDrawer' + +export default { + ...settingDrawer +} diff --git a/pro-components/layout/locales/en-US/settingDrawer.ts b/pro-components/layout/locales/en-US/settingDrawer.ts new file mode 100644 index 0000000..c2166e1 --- /dev/null +++ b/pro-components/layout/locales/en-US/settingDrawer.ts @@ -0,0 +1,40 @@ +export default { + 'app.setting.pagestyle': 'Page style setting', + 'app.setting.pagestyle.dark': 'Dark Menu style', + 'app.setting.pagestyle.light': 'Light Menu style', + 'app.setting.pagestyle.realdark': 'Dark style (Beta)', + 'app.setting.content-width': 'Content Width', + 'app.setting.content-width.fixed': 'Fixed', + 'app.setting.content-width.fluid': 'Fluid', + 'app.setting.themecolor': 'Theme Color', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Blue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': 'Navigation Mode', + 'app.setting.regionalsettings': 'Regional Settings', + 'app.setting.regionalsettings.header': 'Header', + 'app.setting.regionalsettings.menu': 'Menu', + 'app.setting.regionalsettings.footer': 'Footer', + 'app.setting.regionalsettings.menuHeader': 'Menu Header', + 'app.setting.sidemenu': 'Side Menu Layout', + 'app.setting.topmenu': 'Top Menu Layout', + 'app.setting.mixmenu': 'Mix Menu Layout', + 'app.setting.splitMenus': 'Split Menus', + 'app.setting.fixedheader': 'Fixed Header', + 'app.setting.fixedsidebar': 'Fixed Sidebar', + 'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout', + 'app.setting.hideheader': 'Hidden Header when scrolling', + 'app.setting.hideheader.hint': 'Works when Hidden Header is enabled', + 'app.setting.othersettings': 'Other Settings', + 'app.setting.weakmode': 'Weak Mode', + 'app.setting.copy': 'Copy Setting', + 'app.setting.loading': 'Loading theme', + 'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/models/setting.js', + 'app.setting.production.hint': + 'Setting panel shows in development environment only, please manually modify' +} diff --git a/pro-components/layout/locales/index.ts b/pro-components/layout/locales/index.ts new file mode 100644 index 0000000..0b11999 --- /dev/null +++ b/pro-components/layout/locales/index.ts @@ -0,0 +1,32 @@ +import zhLocal from './zh-CN' +import zhTWLocal from './zh-TW' +import enUSLocal from './en-US' +import itITLocal from './it-IT' +import koKRLocal from './ko-KR' + +const locales = { + 'zh-CN': zhLocal, + 'zh-TW': zhTWLocal, + 'en-US': enUSLocal, + 'it-IT': itITLocal, + 'ko-KR': koKRLocal +} + +type GLocaleWindow = { + g_locale: keyof typeof locales +} + +export type LocaleType = keyof typeof locales + +export const getLanguage = (): string => { + // support ssr + // if (!isBrowser()) return 'zh-CN' + const lang = window.localStorage.getItem('umi_locale') + return lang || (window as unknown as GLocaleWindow).g_locale || navigator.language +} + +export const gLocaleObject = (): Record => { + const gLocale = getLanguage() + // @ts-ignore + return locales[gLocale] || locales['zh-CN'] +} diff --git a/pro-components/layout/locales/it-IT.ts b/pro-components/layout/locales/it-IT.ts new file mode 100644 index 0000000..8d090c8 --- /dev/null +++ b/pro-components/layout/locales/it-IT.ts @@ -0,0 +1,5 @@ +import settingDrawer from './it-IT/settingDrawer' + +export default { + ...settingDrawer +} diff --git a/pro-components/layout/locales/it-IT/settingDrawer.ts b/pro-components/layout/locales/it-IT/settingDrawer.ts new file mode 100644 index 0000000..b2f9d29 --- /dev/null +++ b/pro-components/layout/locales/it-IT/settingDrawer.ts @@ -0,0 +1,35 @@ +export default { + 'app.setting.pagestyle': 'Impostazioni di stile', + 'app.setting.pagestyle.dark': 'Tema scuro', + 'app.setting.pagestyle.light': 'Tema chiaro', + 'app.setting.content-width': 'Largezza contenuto', + 'app.setting.content-width.fixed': 'Fissa', + 'app.setting.content-width.fluid': 'Fluida', + 'app.setting.themecolor': 'Colore del tema', + 'app.setting.themecolor.dust': 'Rosso polvere', + 'app.setting.themecolor.volcano': 'Vulcano', + 'app.setting.themecolor.sunset': 'Arancione tramonto', + 'app.setting.themecolor.cyan': 'Ciano', + 'app.setting.themecolor.green': 'Verde polare', + 'app.setting.themecolor.daybreak': 'Blu cielo mattutino (default)', + 'app.setting.themecolor.geekblue': 'Blu geek', + 'app.setting.themecolor.purple': 'Viola dorato', + 'app.setting.navigationmode': 'Modalità di navigazione', + 'app.setting.sidemenu': 'Menu laterale', + 'app.setting.topmenu': 'Menu in testata', + 'app.setting.mixmenu': 'Menu misto', + 'app.setting.splitMenus': 'Menu divisi', + 'app.setting.fixedheader': 'Testata fissa', + 'app.setting.fixedsidebar': 'Menu laterale fisso', + 'app.setting.fixedsidebar.hint': 'Solo se selezionato Menu laterale', + 'app.setting.hideheader': 'Nascondi testata durante lo scorrimento', + 'app.setting.hideheader.hint': 'Solo se abilitato Nascondi testata durante lo scorrimento', + 'app.setting.othersettings': 'Altre impostazioni', + 'app.setting.weakmode': 'Inverti colori', + 'app.setting.copy': 'Copia impostazioni', + 'app.setting.loading': 'Carico tema...', + 'app.setting.copyinfo': + 'Impostazioni copiate con successo! Incolla il contenuto in config/defaultSettings.js', + 'app.setting.production.hint': + 'Questo pannello è visibile solo durante lo sviluppo. Le impostazioni devono poi essere modificate manulamente' +} diff --git a/pro-components/layout/locales/ko-KR.ts b/pro-components/layout/locales/ko-KR.ts new file mode 100644 index 0000000..ea216c4 --- /dev/null +++ b/pro-components/layout/locales/ko-KR.ts @@ -0,0 +1,5 @@ +import settingDrawer from './ko-KR/settingDrawer' + +export default { + ...settingDrawer +} diff --git a/pro-components/layout/locales/ko-KR/settingDrawer.ts b/pro-components/layout/locales/ko-KR/settingDrawer.ts new file mode 100644 index 0000000..fe88484 --- /dev/null +++ b/pro-components/layout/locales/ko-KR/settingDrawer.ts @@ -0,0 +1,40 @@ +export default { + 'app.setting.pagestyle': '스타일 설정', + 'app.setting.pagestyle.dark': '다크 모드', + 'app.setting.pagestyle.light': '라이트 모드', + 'app.setting.content-width': '컨텐츠 너비', + 'app.setting.content-width.fixed': '고정', + 'app.setting.content-width.fluid': '흐름', + 'app.setting.themecolor': '테마 색상', + 'app.setting.themecolor.dust': 'Dust Red', + 'app.setting.themecolor.volcano': 'Volcano', + 'app.setting.themecolor.sunset': 'Sunset Orange', + 'app.setting.themecolor.cyan': 'Cyan', + 'app.setting.themecolor.green': 'Polar Green', + 'app.setting.themecolor.daybreak': 'Daybreak Blue (default)', + 'app.setting.themecolor.geekblue': 'Geek Blue', + 'app.setting.themecolor.purple': 'Golden Purple', + 'app.setting.navigationmode': '네비게이션 모드', + 'app.setting.regionalsettings': '영역별 설정', + 'app.setting.regionalsettings.header': '헤더', + 'app.setting.regionalsettings.menu': '메뉴', + 'app.setting.regionalsettings.footer': '바닥글', + 'app.setting.regionalsettings.menuHeader': '메뉴 헤더', + 'app.setting.sidemenu': '메뉴 사이드 배치', + 'app.setting.topmenu': '메뉴 상단 배치', + 'app.setting.mixmenu': '혼합형 배치', + 'app.setting.splitMenus': '메뉴 분리', + 'app.setting.fixedheader': '헤더 고정', + 'app.setting.fixedsidebar': '사이드바 고정', + 'app.setting.fixedsidebar.hint': "'메뉴 사이드 배치'를 선택했을 때 동작함", + 'app.setting.hideheader': '스크롤 중 헤더 감추기', + 'app.setting.hideheader.hint': "'헤더 감추기 옵션'을 선택했을 때 동작함", + 'app.setting.othersettings': '다른 설정', + 'app.setting.weakmode': '고대비 모드', + 'app.setting.copy': '설정값 복사', + 'app.setting.loading': '테마 로딩 중', + 'app.setting.copyinfo': + '복사 성공. src/models/settings.js에 있는 defaultSettings를 교체해 주세요.', + 'app.setting.production.hint': + '설정 판넬은 개발 환경에서만 보여집니다. 직접 수동으로 변경바랍니다.' +} diff --git a/pro-components/layout/locales/types.ts b/pro-components/layout/locales/types.ts new file mode 100644 index 0000000..7486909 --- /dev/null +++ b/pro-components/layout/locales/types.ts @@ -0,0 +1,6 @@ +const locales = { + 'zh-CN': null, + 'en-US': null +} + +export type LocaleType = keyof typeof locales diff --git a/pro-components/layout/locales/zh-CN.ts b/pro-components/layout/locales/zh-CN.ts new file mode 100644 index 0000000..bb03d75 --- /dev/null +++ b/pro-components/layout/locales/zh-CN.ts @@ -0,0 +1,5 @@ +import settingDrawer from './zh-CN/settingDrawer' + +export default { + ...settingDrawer +} diff --git a/pro-components/layout/locales/zh-CN/settingDrawer.ts b/pro-components/layout/locales/zh-CN/settingDrawer.ts new file mode 100644 index 0000000..b997ddb --- /dev/null +++ b/pro-components/layout/locales/zh-CN/settingDrawer.ts @@ -0,0 +1,40 @@ +export default { + 'app.setting.pagestyle': '整体风格设置', + 'app.setting.pagestyle.dark': '暗色菜单风格', + 'app.setting.pagestyle.light': '亮色菜单风格', + 'app.setting.pagestyle.realdark': '暗色风格(实验功能)', + 'app.setting.content-width': '内容区域宽度', + 'app.setting.content-width.fixed': '定宽', + 'app.setting.content-width.fluid': '流式', + 'app.setting.themecolor': '主题色', + 'app.setting.themecolor.dust': '薄暮', + 'app.setting.themecolor.volcano': '火山', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明青', + 'app.setting.themecolor.green': '极光绿', + 'app.setting.themecolor.daybreak': '拂晓蓝(默认)', + 'app.setting.themecolor.geekblue': '极客蓝', + 'app.setting.themecolor.purple': '酱紫', + 'app.setting.navigationmode': '导航模式', + 'app.setting.regionalsettings': '内容区域', + 'app.setting.regionalsettings.header': '顶栏', + 'app.setting.regionalsettings.menu': '菜单', + 'app.setting.regionalsettings.footer': '页脚', + 'app.setting.regionalsettings.menuHeader': '菜单头', + 'app.setting.sidemenu': '侧边菜单布局', + 'app.setting.topmenu': '顶部菜单布局', + 'app.setting.mixmenu': '混合菜单布局', + 'app.setting.splitMenus': '自动分割菜单', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定侧边菜单', + 'app.setting.fixedsidebar.hint': '侧边菜单布局时可配置', + 'app.setting.hideheader': '下滑时隐藏 Header', + 'app.setting.hideheader.hint': '固定 Header 时可配置', + 'app.setting.othersettings': '其他设置', + 'app.setting.weakmode': '色弱模式', + 'app.setting.copy': '拷贝设置', + 'app.setting.loading': '正在加载主题', + 'app.setting.copyinfo': '拷贝成功,请到 src/defaultSettings.js 中替换默认配置', + 'app.setting.production.hint': + '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件' +} diff --git a/pro-components/layout/locales/zh-TW.ts b/pro-components/layout/locales/zh-TW.ts new file mode 100644 index 0000000..85b9d0c --- /dev/null +++ b/pro-components/layout/locales/zh-TW.ts @@ -0,0 +1,5 @@ +import settingDrawer from './zh-TW/settingDrawer' + +export default { + ...settingDrawer +} diff --git a/pro-components/layout/locales/zh-TW/settingDrawer.ts b/pro-components/layout/locales/zh-TW/settingDrawer.ts new file mode 100644 index 0000000..c0ca154 --- /dev/null +++ b/pro-components/layout/locales/zh-TW/settingDrawer.ts @@ -0,0 +1,35 @@ +export default { + 'app.setting.pagestyle': '整體風格設置', + 'app.setting.pagestyle.dark': '暗色菜單風格', + 'app.setting.pagestyle.realdark': '暗色風格(实验功能)', + 'app.setting.pagestyle.light': '亮色菜單風格', + 'app.setting.content-width': '內容區域寬度', + 'app.setting.content-width.fixed': '定寬', + 'app.setting.content-width.fluid': '流式', + 'app.setting.themecolor': '主題色', + 'app.setting.themecolor.dust': '薄暮', + 'app.setting.themecolor.volcano': '火山', + 'app.setting.themecolor.sunset': '日暮', + 'app.setting.themecolor.cyan': '明青', + 'app.setting.themecolor.green': '極光綠', + 'app.setting.themecolor.daybreak': '拂曉藍(默認)', + 'app.setting.themecolor.geekblue': '極客藍', + 'app.setting.themecolor.purple': '醬紫', + 'app.setting.navigationmode': '導航模式', + 'app.setting.sidemenu': '側邊菜單布局', + 'app.setting.topmenu': '頂部菜單布局', + 'app.setting.mixmenu': '混合菜單布局', + 'app.setting.splitMenus': '自动分割菜单', + 'app.setting.fixedheader': '固定 Header', + 'app.setting.fixedsidebar': '固定側邊菜單', + 'app.setting.fixedsidebar.hint': '側邊菜單布局時可配置', + 'app.setting.hideheader': '下滑時隱藏 Header', + 'app.setting.hideheader.hint': '固定 Header 時可配置', + 'app.setting.othersettings': '其他設置', + 'app.setting.weakmode': '色弱模式', + 'app.setting.copy': '拷貝設置', + 'app.setting.loading': '正在加載主題', + 'app.setting.copyinfo': '拷貝成功,請到 src/defaultSettings.js 中替換默認配置', + 'app.setting.production.hint': + '配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件' +} diff --git a/pro-components/layout/renderTypes.ts b/pro-components/layout/renderTypes.ts new file mode 100644 index 0000000..c002ca9 --- /dev/null +++ b/pro-components/layout/renderTypes.ts @@ -0,0 +1,55 @@ +import type { VNode } from 'vue' +import type { PrivateSiderMenuProps, SiderMenuProps } from './components/SiderMenu/SiderMenu' +import type { HeaderViewProps } from './Header' +import type { MenuDataItem } from './types' +import type { BaseMenuProps } from './components/SiderMenu/BaseMenu' +import type { VueNode, VueNodeOrRender } from '#/types' + +// 多页签的渲染 +export type MultiTabRender = (props: HeaderViewProps) => VueNode + +// 头部渲染器 +export type HeaderRender = (props: HeaderViewProps, defaultDom: VueNodeOrRender) => VueNode +// 头部标题渲染器 +export type HeaderTitleRender = ( + props: HeaderViewProps, + logo?: VueNodeOrRender, + title?: VueNodeOrRender +) => VueNode +// 头部内容渲染器 +export type HeaderContentRender = (props: HeaderViewProps, defaultDom?: VueNodeOrRender) => VueNode +// 头部右侧内容渲染器 +export type RightContentRender = (props: HeaderViewProps) => VueNode + +// 处理父级菜单的 props,可以复写菜单的点击功能,一般用于埋点 +export type SubMenuItemRender = ( + item: MenuDataItem & { isUrl: boolean }, + defaultDom: VueNodeOrRender, + menuProps: BaseMenuProps +) => VueNode +// 子菜单的渲染器 +export type MenuItemRender = ( + item: MenuDataItem & { isUrl: boolean; onClick: () => void }, + defaultDom: VueNodeOrRender, + menuProps: BaseMenuProps & Partial +) => VueNode + +// 菜单渲染器 +export type MenuRender = (props: HeaderViewProps, defaultDom: VueNodeOrRender) => VueNode +// 菜单头部渲染器 +export type MenuHeaderRender = ( + props: SiderMenuProps, + logo: VueNodeOrRender, + title: VueNodeOrRender +) => VueNode +// 菜单底部渲染器 +export type MenuFootRender = (props?: SiderMenuProps) => VueNode +// 菜单内容渲染器 +export type MenuContentRender = (props: SiderMenuProps, defaultDom: VueNodeOrRender) => VueNode +// 菜单在 logo 和 content 之间的扩展区域渲染器,一般用来放搜索框 +export type MenuExtraReander = (props: SiderMenuProps) => VueNode +// 菜单折叠按钮的渲染器 +export type CollapsedButtonRender = (collapsed?: boolean) => VueNode + +// 整体布局的底部渲染器 +export type FooterRender = (props: HeaderViewProps, defaultDom: VNode) => VueNode diff --git a/pro-components/layout/types.ts b/pro-components/layout/types.ts new file mode 100644 index 0000000..cd7710e --- /dev/null +++ b/pro-components/layout/types.ts @@ -0,0 +1,41 @@ +import type { VueNodeOrRender } from '#/types' + +export type WithFalse = T | false + +export type MenuDataItem = { + /** 子菜单 */ + children?: MenuDataItem[] + /** 在菜单中隐藏子节点 */ + hideChildrenInMenu?: boolean + /** 在菜单中隐藏自己和子节点 */ + hideInMenu?: boolean + /** 菜单的icon */ + icon?: VueNodeOrRender + /** 自定义菜单的国际化 key */ + locale?: string | false + /** 菜单的名字 */ + name?: string + /** 用于标定选中的值,默认是 path */ + key?: string + /** disable 菜单选项 */ + disabled?: boolean + /** 路径,可以设定为网页链接 */ + path?: string + /** + * 当此节点被选中的时候也会选中 parentKeys 的节点 + * + * 自定义父节点 + */ + parentKeys?: string[] + /** 隐藏自己,并且将子节点提升到与自己平级 */ + flatMenu?: boolean + /** 指定外链打开形式,同a标签 */ + target?: string + [key: string]: any +} + +export type MessageDescriptor = { + id: any + description?: string + defaultMessage?: string +} diff --git a/pro-components/layout/utils/checkUtils.ts b/pro-components/layout/utils/checkUtils.ts new file mode 100644 index 0000000..7122f38 --- /dev/null +++ b/pro-components/layout/utils/checkUtils.ts @@ -0,0 +1,22 @@ +/** 判断是否是图片链接 */ +export function isImg(path: string): boolean { + return /\w.(png|jpg|jpeg|svg|webp|gif|bmp)$/i.test(path) +} + +export const isNil = (value: any) => value === null || value === undefined + +export const isUrl = (path: string | undefined): boolean => { + if (!path) return false + if (!path.startsWith('http')) { + return false + } + try { + const url = new URL(path) + return !!url + } catch (error) { + return false + } +} + +/** 校验是否不是数组且不为空 **/ +export const notNullArray = (value: any) => Array.isArray(value) && value.length > 0 diff --git a/pro-components/layout/utils/getFlatMenu.ts b/pro-components/layout/utils/getFlatMenu.ts new file mode 100644 index 0000000..b5b119b --- /dev/null +++ b/pro-components/layout/utils/getFlatMenu.ts @@ -0,0 +1,30 @@ +import type { MenuDataItem } from '../types' + +const childrenPropsName = 'routes' +function stripQueryStringAndHashFromPath(url: string) { + return url.split('?')[0].split('#')[0] +} +/** + * 获取打平的 menuData + * 以 path 为 key + * @param menuData + */ +export const getFlatMenus = (menuData: MenuDataItem[] = []) => { + let menus: MenuDataItem = {} + menuData.forEach(item => { + if (!item || !item.key) { + return + } + const routerChildren = item.children || item[childrenPropsName] + menus[stripQueryStringAndHashFromPath(item.path || item.key || '/')] = { + ...item + } + menus[item.key || item.path || '/'] = { ...item } + if (routerChildren) { + menus = { ...menus, ...getFlatMenus(routerChildren) } + } + }) + return menus +} + +export default getFlatMenus diff --git a/pro-components/layout/utils/index.ts b/pro-components/layout/utils/index.ts new file mode 100644 index 0000000..a19a847 --- /dev/null +++ b/pro-components/layout/utils/index.ts @@ -0,0 +1,26 @@ +import type { Slot, Slots } from 'vue' +import type { VueNode, VueNodeOrRender } from '#/types' + +export function getVueNode(customRender: VueNodeOrRender, slot?: Slot, props?: any[]): VueNode { + if (customRender === false) { + return null + } + if (customRender === true || customRender == null) { + return slot ? slot(props) : null + } + if (typeof customRender === 'function') { + return customRender(props) + } + return customRender +} + +export function getRender( + props: Record, + slots: Slots, + key = 'default' +): T | false { + if (props[key] === false) { + return false + } + return (props[key] || slots[key]) as T +} diff --git a/pro-components/layout/utils/menuUtils.ts b/pro-components/layout/utils/menuUtils.ts new file mode 100644 index 0000000..9824c0f --- /dev/null +++ b/pro-components/layout/utils/menuUtils.ts @@ -0,0 +1,57 @@ +import type { RouteRecordRaw } from 'vue-router' +import type { MenuDataItem } from '../types' +import { isUrl, notNullArray } from './checkUtils' + +/** + * 如果不是 / 开头的和父节点做一下合并 + * 如果是 / 开头的不作任何处理 + * 如果是 url 也直接返回 + * @param path + * @param parentPath + */ +const mergePath = (path = '', parentPath = '/') => { + if ((path || parentPath).startsWith('/')) { + return path + } + if (isUrl(path)) { + return path + } + return `/${parentPath}/${path}`.replace(/\/\//g, '/').replace(/\/\//g, '/') +} + +function toMenuItem(routeList?: RouteRecordRaw[], parentPath?: string) { + if (routeList == null || !Array.isArray(routeList) || routeList.length === 0) { + return + } + return routeList.map(route => { + const path = mergePath(route.path, parentPath) + const menuDataItem: MenuDataItem = { + ...route.meta, + key: path, + path: path + } + + if (notNullArray(route.children)) { + menuDataItem.children = toMenuItem(route.children, path) + } + return menuDataItem + }) +} + +export function transformRouteToMenuItem(routes: RouteRecordRaw[], parentPath = '/') { + const parentRoute = routes.find(route => route.path === parentPath) + return toMenuItem(parentRoute?.children) +} + +export const getOpenKeysFromMenuData = (menuData?: MenuDataItem[]) => { + return (menuData || []).reduce((pre, item) => { + if (item.key) { + pre.push(item.key) + } + if (item.children) { + const newArray: string[] = pre.concat(getOpenKeysFromMenuData(item.children) || []) + return newArray + } + return pre + }, [] as string[]) +} diff --git a/pro-components/layout/utils/utils.ts b/pro-components/layout/utils/utils.ts new file mode 100644 index 0000000..475d1a3 --- /dev/null +++ b/pro-components/layout/utils/utils.ts @@ -0,0 +1,50 @@ +import type { MenuDataItem } from '../types' + +const themeConfig = { + daybreak: '#1890ff', + dust: '#F5222D', + volcano: '#FA541C', + sunset: '#FAAD14', + cyan: '#13C2C2', + green: '#52C41A', + geekblue: '#2F54EB', + purple: '#722ED1' +} + +/** + * Daybreak-> #1890ff + * + * @param val + */ +export function genStringToTheme(val?: string): string { + // @ts-ignore + return val && themeConfig[val] ? themeConfig[val] : val +} + +export function clearMenuItem(menusData: MenuDataItem[]): MenuDataItem[] { + return menusData + .map(item => { + const children: MenuDataItem[] = item.children || [] + const finalItem = { ...item } + + if (!finalItem.name || finalItem.hideInMenu) { + return null + } + + if (finalItem && finalItem?.children) { + if ( + !finalItem.hideChildrenInMenu && + children.some(child => child && child.name && !child.hideInMenu) + ) { + return { + ...item, + children: clearMenuItem(children) + } + } + // children 为空就直接删掉 + delete finalItem.children + } + return finalItem + }) + .filter(item => item) as MenuDataItem[] +} diff --git a/pro-components/provider/index.tsx b/pro-components/provider/index.tsx new file mode 100644 index 0000000..c9a3cb9 --- /dev/null +++ b/pro-components/provider/index.tsx @@ -0,0 +1,254 @@ +import arEG from './locale/ar_EG' +import zhCN from './locale/zh_CN' +import enUS from './locale/en_US' +import enGB from './locale/en_GB' +import viVN from './locale/vi_VN' +import itIT from './locale/it_IT' +import esES from './locale/es_ES' +import caES from './locale/ca_ES' +import jaJP from './locale/ja_JP' +import ruRU from './locale/ru_RU' +import srRS from './locale/sr_RS' +import msMY from './locale/ms_MY' +import zhTW from './locale/zh_TW' +import frFR from './locale/fr_FR' +import ptBR from './locale/pt_BR' +import koKR from './locale/ko_KR' +import idID from './locale/id_ID' +import deDE from './locale/de_DE' +import faIR from './locale/fa_IR' +import trTR from './locale/tr_TR' +import plPL from './locale/pl_PL' +import hrHR from './locale/hr_HR' + +import type { VueKey, VueNode } from '#/types' + +export type ProSchemaValueEnumType = { + /** @name 演示的文案 */ + text: VueNode + + /** @name 预定的颜色 */ + status?: string + /** @name 自定义的颜色 */ + color?: string + /** @name 是否禁用 */ + disabled?: boolean +} + +/** + * 支持 Map 和 Object + * + * @name ValueEnum 的类型 + */ +export type ProSchemaValueEnumMap = Map + +export type ProSchemaValueEnumObj = Record + +export type BaseProFieldFC = { + /** 值的类型 */ + text: VueNode + /** 放置到组件上 props */ + fieldProps?: any + /** 模式类型 */ + mode: ProFieldFCMode + /** 简约模式 */ + plain?: boolean + /** 轻量模式 */ + light?: boolean + /** Label */ + label?: VueNode + /** 映射值的类型 */ + valueEnum?: ProSchemaValueEnumObj | ProSchemaValueEnumMap + /** 唯一的key,用于网络请求 */ + proFieldKey?: VueKey +} + +export type ProFieldFCMode = 'read' | 'edit' | 'update' + +/** Render 第二个参数,里面包含了一些常用的参数 */ +export type ProFieldFCRenderProps = { + mode?: ProFieldFCMode + readonly?: boolean + placeholder?: string | string[] + value?: any + onChange?: (...rest: any[]) => void +} & BaseProFieldFC + +export type ProRenderFieldPropsType = { + render?: + | (( + text: any, + props: Omit, + dom: JSX.Element + ) => JSX.Element) + | undefined + renderFormItem?: + | ((text: any, props: ProFieldFCRenderProps, dom: JSX.Element) => JSX.Element) + | undefined +} + +export type IntlType = { + locale: string + getMessage: (id: string, defaultMessage: string) => string +} + +function get( + source: Record, + path: string, + defaultValue?: string +): string | undefined { + // a[3].b -> a.3.b + const paths = path.replace(/\[(\d+)\]/g, '.$1').split('.') + let result = source + let message = defaultValue + // eslint-disable-next-line no-restricted-syntax + for (const p of paths) { + message = Object(result)[p] + result = Object(result)[p] + if (message === undefined) { + return defaultValue + } + } + return message +} + +/** + * 创建一个操作函数 + * + * @param locale + * @param localeMap + */ +export const createIntl = (locale: string, localeMap: Record): IntlType => ({ + getMessage: (id: string, defaultMessage: string) => + get(localeMap, id, defaultMessage) || defaultMessage, + locale +}) + +const arEGIntl = createIntl('ar_EG', arEG) +const zhCNIntl = createIntl('zh_CN', zhCN) +const enUSIntl = createIntl('en_US', enUS) +const enGBIntl = createIntl('en_GB', enGB) +const viVNIntl = createIntl('vi_VN', viVN) +const itITIntl = createIntl('it_IT', itIT) +const jaJPIntl = createIntl('ja_JP', jaJP) +const esESIntl = createIntl('es_ES', esES) +const caESIntl = createIntl('ca_ES', caES) +const ruRUIntl = createIntl('ru_RU', ruRU) +const srRSIntl = createIntl('sr_RS', srRS) +const msMYIntl = createIntl('ms_MY', msMY) +const zhTWIntl = createIntl('zh_TW', zhTW) +const frFRIntl = createIntl('fr_FR', frFR) +const ptBRIntl = createIntl('pt_BR', ptBR) +const koKRIntl = createIntl('ko_KR', koKR) +const idIDIntl = createIntl('id_ID', idID) +const deDEIntl = createIntl('de_DE', deDE) +const faIRIntl = createIntl('fa_IR', faIR) +const trTRIntl = createIntl('tr_TR', trTR) +const plPLIntl = createIntl('pl_PL', plPL) +const hrHRIntl = createIntl('hr_', hrHR) + +const intlMap = { + 'ar-EG': arEGIntl, + 'zh-CN': zhCNIntl, + 'en-US': enUSIntl, + 'en-GB': enGBIntl, + 'vi-VN': viVNIntl, + 'it-IT': itITIntl, + 'ja-JP': jaJPIntl, + 'es-ES': esESIntl, + 'ca-ES': caESIntl, + 'ru-RU': ruRUIntl, + 'sr-RS': srRSIntl, + 'ms-MY': msMYIntl, + 'zh-TW': zhTWIntl, + 'fr-FR': frFRIntl, + 'pt-BR': ptBRIntl, + 'ko-KR': koKRIntl, + 'id-ID': idIDIntl, + 'de-DE': deDEIntl, + 'fa-IR': faIRIntl, + 'tr-TR': trTRIntl, + 'pl-PL': plPLIntl, + 'hr-HR': hrHRIntl +} + +const intlMapKeys = Object.keys(intlMap) + +export type ParamsType = Record + +export { + arEGIntl, + enUSIntl, + enGBIntl, + zhCNIntl, + viVNIntl, + itITIntl, + jaJPIntl, + esESIntl, + caESIntl, + ruRUIntl, + srRSIntl, + msMYIntl, + zhTWIntl, + frFRIntl, + ptBRIntl, + koKRIntl, + idIDIntl, + deDEIntl, + faIRIntl, + trTRIntl, + plPLIntl, + hrHRIntl, + intlMap, + intlMapKeys +} + +export type ConfigContextPropsType = { + intl: IntlType + valueTypeMap: Record +} + +// const ConfigContext = React.createContext({ +// intl: { +// ...zhCNIntl, +// locale: 'default' +// }, +// valueTypeMap: {} +// }) +// +// const { Consumer: ConfigConsumer, Provider: ConfigProvider } = ConfigContext + +/** + * 根据 antd 的 key 来找到的 locale 插件的 key + * + * @param localeKey + */ +// const findIntlKeyByAntdLocaleKey = (localeKey: T) => { +// if (!localeKey) { +// return 'zh-CN' as T +// } +// const localeName = localeKey.toLocaleLowerCase() +// return intlMapKeys.find(intlKey => { +// const LowerCaseKey = intlKey.toLocaleLowerCase() +// return LowerCaseKey.includes(localeName) +// }) as T +// } + +// export { ConfigConsumer, ConfigProvider, createIntl } + +export function useIntl(): IntlType { + // const { locale } = useContext(AntdConfigProvider.ConfigContext) + // const { intl } = useContext(ConfigContext) + // + // if (intl && intl.locale !== 'default') { + // return intl + // } + // + // if (locale?.locale) { + // return intlMap[findIntlKeyByAntdLocaleKey(locale.locale)] + // } + + return zhCNIntl +} + +// export default ConfigContext diff --git a/pro-components/provider/locale/ar_EG.tsx b/pro-components/provider/locale/ar_EG.tsx new file mode 100644 index 0000000..9f7b6bd --- /dev/null +++ b/pro-components/provider/locale/ar_EG.tsx @@ -0,0 +1,58 @@ +export default { + moneySymbol: '$', + form: { + lightFilter: { + more: 'المزيد', + clear: 'نظف', + confirm: 'تأكيد', + itemUnit: 'عناصر' + } + }, + tableForm: { + search: 'ابحث', + reset: 'إعادة تعيين', + submit: 'ارسال', + collapsed: 'مُقلص', + expand: 'مُوسع', + inputPlaceholder: 'الرجاء الإدخال', + selectPlaceholder: 'الرجاء الإختيار' + }, + alert: { + clear: 'نظف', + selected: 'محدد', + item: 'عنصر' + }, + pagination: { + total: { + range: ' ', + total: 'من', + item: 'عناصر' + } + }, + tableToolBar: { + leftPin: 'ثبت على اليسار', + rightPin: 'ثبت على اليمين', + noPin: 'الغاء التثبيت', + leftFixedTitle: 'لصق على اليسار', + rightFixedTitle: 'لصق على اليمين', + noFixedTitle: 'إلغاء الإلصاق', + reset: 'إعادة تعيين', + columnDisplay: 'الأعمدة المعروضة', + columnSetting: 'الإعدادات', + fullScreen: 'وضع كامل الشاشة', + exitFullScreen: 'الخروج من وضع كامل الشاشة', + reload: 'تحديث', + density: 'الكثافة', + densityDefault: 'افتراضي', + densityLarger: 'أكبر', + densityMiddle: 'وسط', + densitySmall: 'مدمج' + }, + stepsForm: { + next: 'التالي', + prev: 'السابق' + }, + loginForm: { + submitText: 'تسجيل الدخول' + } +} diff --git a/pro-components/provider/locale/ca_ES.tsx b/pro-components/provider/locale/ca_ES.tsx new file mode 100644 index 0000000..f474240 --- /dev/null +++ b/pro-components/provider/locale/ca_ES.tsx @@ -0,0 +1,51 @@ +export default { + moneySymbol: '€', + tableForm: { + search: 'Cercar', + reset: 'Netejar', + submit: 'Enviar', + collapsed: 'Expandir', + expand: 'Col·lapsar', + inputPlaceholder: 'Introduïu valor', + selectPlaceholder: 'Seleccioneu valor' + }, + alert: { + clear: 'Netejar', + selected: 'Seleccionat', + item: 'Article' + }, + pagination: { + total: { + range: ' ', + total: 'de', + item: 'articles' + } + }, + tableToolBar: { + leftPin: "Pin a l'esquerra", + rightPin: 'Pin a la dreta', + noPin: 'Sense Pin', + leftFixedTitle: "Fixat a l'esquerra", + rightFixedTitle: 'Fixat a la dreta', + noFixedTitle: 'Sense fixar', + reset: 'Reiniciar', + columnDisplay: 'Mostrar Columna', + columnSetting: 'Configuració', + fullScreen: 'Pantalla Completa', + exitFullScreen: 'Sortir Pantalla Completa', + reload: 'Refrescar', + density: 'Densitat', + densityDefault: 'Per Defecte', + densityLarger: 'Llarg', + densityMiddle: 'Mitjà', + densitySmall: 'Compacte' + }, + stepsForm: { + next: 'Següent', + prev: 'Anterior', + submit: 'Finalizar' + }, + loginForm: { + submitText: 'Entrar' + } +} diff --git a/pro-components/provider/locale/de_DE.tsx b/pro-components/provider/locale/de_DE.tsx new file mode 100644 index 0000000..88f26a7 --- /dev/null +++ b/pro-components/provider/locale/de_DE.tsx @@ -0,0 +1,59 @@ +export default { + moneySymbol: '€', + form: { + lightFilter: { + more: 'Mehr', + clear: 'Zurücksetzen', + confirm: 'Bestätigen', + itemUnit: 'Einträge' + } + }, + tableForm: { + search: 'Suchen', + reset: 'Zurücksetzen', + submit: 'Absenden', + collapsed: 'Zeige mehr', + expand: 'Zeige weniger', + inputPlaceholder: 'Bitte eingeben', + selectPlaceholder: 'Bitte auswählen' + }, + alert: { + clear: 'Zurücksetzen', + selected: 'Ausgewählt', + item: 'Eintrag' + }, + pagination: { + total: { + range: ' ', + total: 'von', + item: 'Einträgen' + } + }, + tableToolBar: { + leftPin: 'Links anheften', + rightPin: 'Rechts anheften', + noPin: 'Nicht angeheftet', + leftFixedTitle: 'Links fixiert', + rightFixedTitle: 'Rechts fixiert', + noFixedTitle: 'Nicht fixiert', + reset: 'Zurücksetzen', + columnDisplay: 'Angezeigte Reihen', + columnSetting: 'Einstellungen', + fullScreen: 'Vollbild', + exitFullScreen: 'Vollbild verlassen', + reload: 'Aktualisieren', + density: 'Abstand', + densityDefault: 'Standard', + densityLarger: 'Größer', + densityMiddle: 'Mittel', + densitySmall: 'Kompakt' + }, + stepsForm: { + next: 'Weiter', + prev: 'Zurück', + submit: 'Abschließen' + }, + loginForm: { + submitText: 'Anmelden' + } +} diff --git a/pro-components/provider/locale/en_GB.tsx b/pro-components/provider/locale/en_GB.tsx new file mode 100644 index 0000000..ef108d4 --- /dev/null +++ b/pro-components/provider/locale/en_GB.tsx @@ -0,0 +1,70 @@ +export default { + moneySymbol: '£', + form: { + lightFilter: { + more: 'More', + clear: 'Clear', + confirm: 'Confirm', + itemUnit: 'Items' + } + }, + tableForm: { + search: 'Query', + reset: 'Reset', + submit: 'Submit', + collapsed: 'Expand', + expand: 'Collapse', + inputPlaceholder: 'Please enter', + selectPlaceholder: 'Please select' + }, + alert: { + clear: 'Clear', + selected: 'Selected', + item: 'Item' + }, + pagination: { + total: { + range: ' ', + total: 'of', + item: 'items' + } + }, + tableToolBar: { + leftPin: 'Pin to left', + rightPin: 'Pin to right', + noPin: 'Unpinned', + leftFixedTitle: 'Fixed the left', + rightFixedTitle: 'Fixed the right', + noFixedTitle: 'Not Fixed', + reset: 'Reset', + columnDisplay: 'Column Display', + columnSetting: 'Settings', + fullScreen: 'Full Screen', + exitFullScreen: 'Exit Full Screen', + reload: 'Refresh', + density: 'Density', + densityDefault: 'Default', + densityLarger: 'Larger', + densityMiddle: 'Middle', + densitySmall: 'Compact' + }, + stepsForm: { + next: 'Next', + prev: 'Previous', + submit: 'Finish' + }, + loginForm: { + submitText: 'Login' + }, + editableTable: { + action: { + save: 'Save', + cancel: 'Cancel', + delete: 'Delete' + } + }, + switch: { + open: 'open', + close: 'close' + } +} diff --git a/pro-components/provider/locale/en_US.tsx b/pro-components/provider/locale/en_US.tsx new file mode 100644 index 0000000..61abbe9 --- /dev/null +++ b/pro-components/provider/locale/en_US.tsx @@ -0,0 +1,70 @@ +export default { + moneySymbol: '$', + form: { + lightFilter: { + more: 'More', + clear: 'Clear', + confirm: 'Confirm', + itemUnit: 'Items' + } + }, + tableForm: { + search: 'Query', + reset: 'Reset', + submit: 'Submit', + collapsed: 'Expand', + expand: 'Collapse', + inputPlaceholder: 'Please enter', + selectPlaceholder: 'Please select' + }, + alert: { + clear: 'Clear', + selected: 'Selected', + item: 'Item' + }, + pagination: { + total: { + range: ' ', + total: 'of', + item: 'items' + } + }, + tableToolBar: { + leftPin: 'Pin to left', + rightPin: 'Pin to right', + noPin: 'Unpinned', + leftFixedTitle: 'Fixed the left', + rightFixedTitle: 'Fixed the right', + noFixedTitle: 'Not Fixed', + reset: 'Reset', + columnDisplay: 'Column Display', + columnSetting: 'Settings', + fullScreen: 'Full Screen', + exitFullScreen: 'Exit Full Screen', + reload: 'Refresh', + density: 'Density', + densityDefault: 'Default', + densityLarger: 'Larger', + densityMiddle: 'Middle', + densitySmall: 'Compact' + }, + stepsForm: { + next: 'Next', + prev: 'Previous', + submit: 'Finish' + }, + loginForm: { + submitText: 'Login' + }, + editableTable: { + action: { + save: 'Save', + cancel: 'Cancel', + delete: 'Delete' + } + }, + switch: { + open: 'open', + close: 'close' + } +} diff --git a/pro-components/provider/locale/es_ES.tsx b/pro-components/provider/locale/es_ES.tsx new file mode 100644 index 0000000..647dc78 --- /dev/null +++ b/pro-components/provider/locale/es_ES.tsx @@ -0,0 +1,70 @@ +export default { + moneySymbol: '€', + form: { + lightFilter: { + more: 'Más', + clear: 'Limpiar', + confirm: 'Confirmar', + itemsUnits: 'Objetos' + } + }, + tableForm: { + search: 'Buscar', + reset: 'Limpiar', + submit: 'Submit', + collapsed: 'Expandir', + expand: 'Colapsar', + inputPlaceholder: 'Ingrese valor', + selectPlaceholder: 'Seleccione valor' + }, + alert: { + clear: 'Limpiar', + selected: 'Seleccionado', + item: 'Articulo' + }, + pagination: { + total: { + range: ' ', + total: 'de', + item: 'artículos' + } + }, + tableToolBar: { + leftPin: 'Pin a la izquierda', + rightPin: 'Pin a la derecha', + noPin: 'Sin Pin', + leftFixedTitle: 'Fijado a la izquierda', + rightFixedTitle: 'Fijado a la derecha', + noFixedTitle: 'Sin Fijar', + reset: 'Reiniciar', + columnDisplay: 'Mostrar Columna', + columnSetting: 'Configuración', + fullScreen: 'Pantalla Completa', + exitFullScreen: 'Salir Pantalla Completa', + reload: 'Refrescar', + density: 'Densidad', + densityDefault: 'Por Defecto', + densityLarger: 'Largo', + densityMiddle: 'Medio', + densitySmall: 'Compacto' + }, + stepsForm: { + next: 'Siguiente', + prev: 'Anterior', + submit: 'Finalizar' + }, + loginForm: { + submitText: 'Entrar' + }, + editableTable: { + action: { + save: 'Guardar', + cancel: 'Descartar', + delete: 'Borrar' + } + }, + switch: { + open: 'abrir', + close: 'cerrar' + } +} diff --git a/pro-components/provider/locale/fa_IR.tsx b/pro-components/provider/locale/fa_IR.tsx new file mode 100644 index 0000000..42f6e97 --- /dev/null +++ b/pro-components/provider/locale/fa_IR.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: 'تومان', + form: { + lightFilter: { + more: 'بیشتر', + clear: 'پاک کردن', + confirm: 'تایید', + itemUnit: 'مورد' + } + }, + tableForm: { + search: 'جستجو', + reset: 'بازنشانی', + submit: 'تایید', + collapsed: 'نمایش بیشتر', + expand: 'نمایش کمتر', + inputPlaceholder: 'پیدا کنید', + selectPlaceholder: 'انتخاب کنید' + }, + alert: { + clear: 'پاک سازی', + selected: 'انتخاب', + item: 'مورد' + }, + pagination: { + total: { + range: ' ', + total: 'از', + item: 'مورد' + } + }, + tableToolBar: { + leftPin: 'سنجاق به چپ', + rightPin: 'سنجاق به راست', + noPin: 'سنجاق نشده', + leftFixedTitle: 'ثابت شده در چپ', + rightFixedTitle: 'ثابت شده در راست', + noFixedTitle: 'شناور', + reset: 'بازنشانی', + columnDisplay: 'نمایش همه', + columnSetting: 'تنظیمات', + fullScreen: 'تمام صفحه', + exitFullScreen: 'خروج از حالت تمام صفحه', + reload: 'تازه سازی', + density: 'تراکم', + densityDefault: 'پیش فرض', + densityLarger: 'بزرگ', + densityMiddle: 'متوسط', + densitySmall: 'کوچک' + }, + stepsForm: { + next: 'بعدی', + prev: 'قبلی', + submit: 'اتمام' + }, + loginForm: { + submitText: 'ورود' + }, + editableTable: { + action: { + save: 'ذخیره', + cancel: 'لغو', + delete: 'حذف' + } + } +} diff --git a/pro-components/provider/locale/fr_FR.tsx b/pro-components/provider/locale/fr_FR.tsx new file mode 100644 index 0000000..9f2bbce --- /dev/null +++ b/pro-components/provider/locale/fr_FR.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: '€', + form: { + lightFilter: { + more: 'Plus', + clear: 'Effacer', + confirm: 'Confirmer', + itemUnit: 'Items' + } + }, + tableForm: { + search: 'Rechercher', + reset: 'Réinitialiser', + submit: 'Envoyer', + collapsed: 'Agrandir', + expand: 'Réduire', + inputPlaceholder: 'Entrer une valeur', + selectPlaceholder: 'Sélectionner une valeur' + }, + alert: { + clear: 'Réinitialiser', + selected: 'Sélectionné', + item: 'Item' + }, + pagination: { + total: { + range: ' ', + total: 'sur', + item: 'éléments' + } + }, + tableToolBar: { + leftPin: 'Épingler à gauche', + rightPin: 'Épingler à gauche', + noPin: 'Sans épingle', + leftFixedTitle: 'Fixer à gauche', + rightFixedTitle: 'Fixer à droite', + noFixedTitle: 'Non fixé', + reset: 'Réinitialiser', + columnDisplay: 'Affichage colonne', + columnSetting: 'Réglages', + fullScreen: 'Plein écran', + exitFullScreen: 'Quitter Plein écran', + reload: 'Rafraichir', + density: 'Densité', + densityDefault: 'Par défaut', + densityLarger: 'Larger', + densityMiddle: 'Moyenne', + densitySmall: 'Compacte' + }, + stepsForm: { + next: 'Suivante', + prev: 'Précédente', + submit: 'Finaliser' + }, + loginForm: { + submitText: 'Se connecter' + }, + editableTable: { + action: { + save: 'Sauvegarder', + cancel: 'Annuler', + delete: 'Supprimer' + } + } +} diff --git a/pro-components/provider/locale/hr_HR.tsx b/pro-components/provider/locale/hr_HR.tsx new file mode 100644 index 0000000..baef3b6 --- /dev/null +++ b/pro-components/provider/locale/hr_HR.tsx @@ -0,0 +1,70 @@ +export default { + moneySymbol: 'kn', + form: { + lightFilter: { + more: 'Više', + clear: 'Očisti', + confirm: 'Potvrdi', + itemUnit: 'Stavke' + } + }, + tableForm: { + search: 'Pretraži', + reset: 'Poništi', + submit: 'Potvrdi', + collapsed: 'Raširi', + expand: 'Skupi', + inputPlaceholder: 'Unesite', + selectPlaceholder: 'Odaberite' + }, + alert: { + clear: 'Očisti', + selected: 'Odaberi', + item: 'stavke' + }, + pagination: { + total: { + range: ' ', + total: 'od', + item: 'stavke' + } + }, + tableToolBar: { + leftPin: 'Prikači lijevo', + rightPin: 'Prikači desno', + noPin: 'Bez prikačenja', + leftFixedTitle: 'Fiksiraj lijevo', + rightFixedTitle: 'Fiksiraj desno', + noFixedTitle: 'Bez fiksiranja', + reset: 'Resetiraj', + columnDisplay: 'Prikaz stupaca', + columnSetting: 'Postavke', + fullScreen: 'Puni zaslon', + exitFullScreen: 'Izađi iz punog zaslona', + reload: 'Ponovno učitaj', + density: 'Veličina', + densityDefault: 'Zadano', + densityLarger: 'Veliko', + densityMiddle: 'Srednje', + densitySmall: 'Malo' + }, + stepsForm: { + next: 'Sljedeći', + prev: 'Prethodni', + submit: 'Kraj' + }, + loginForm: { + submitText: 'Prijava' + }, + editableTable: { + action: { + save: 'Spremi', + cancel: 'Odustani', + delete: 'Obriši' + } + }, + switch: { + open: 'otvori', + close: 'zatvori' + } +} diff --git a/pro-components/provider/locale/id_ID.tsx b/pro-components/provider/locale/id_ID.tsx new file mode 100644 index 0000000..1038faa --- /dev/null +++ b/pro-components/provider/locale/id_ID.tsx @@ -0,0 +1,59 @@ +export default { + moneySymbol: 'RP', + form: { + lightFilter: { + more: 'Lebih', + clear: 'Hapus', + confirm: 'Konfirmasi', + itemUnit: 'Unit' + } + }, + tableForm: { + search: 'Cari', + reset: 'Atur ulang', + submit: 'Kirim', + collapsed: 'Lebih sedikit', + expand: 'Lebih banyak', + inputPlaceholder: 'Masukkan pencarian', + selectPlaceholder: 'Pilih' + }, + alert: { + clear: 'Hapus', + selected: 'Dipilih', + item: 'Butir' + }, + pagination: { + total: { + range: ' ', + total: 'Dari', + item: 'Butir' + } + }, + tableToolBar: { + leftPin: 'Pin kiri', + rightPin: 'Pin kanan', + noPin: 'Tidak ada pin', + leftFixedTitle: 'Rata kiri', + rightFixedTitle: 'Rata kanan', + noFixedTitle: 'Tidak tetap', + reset: 'Atur ulang', + columnDisplay: 'Tampilan kolom', + columnSetting: 'Pengaturan', + fullScreen: 'Layar penuh', + exitFullScreen: 'Keluar layar penuh', + reload: 'Atur ulang', + density: 'Kerapatan', + densityDefault: 'Standar', + densityLarger: 'Lebih besar', + densityMiddle: 'Sedang', + densitySmall: 'Rapat' + }, + stepsForm: { + next: 'Selanjutnya', + prev: 'Sebelumnya', + submit: 'Selesai' + }, + loginForm: { + submitText: 'Login' + } +} diff --git a/pro-components/provider/locale/it_IT.tsx b/pro-components/provider/locale/it_IT.tsx new file mode 100644 index 0000000..a8cabde --- /dev/null +++ b/pro-components/provider/locale/it_IT.tsx @@ -0,0 +1,45 @@ +export default { + moneySymbol: '€', + tableForm: { + search: 'Filtra', + reset: 'Pulisci', + submit: 'Invia', + collapsed: 'Espandi', + expand: 'Contrai', + inputPlaceholder: 'Digita', + selectPlaceholder: 'Seleziona' + }, + alert: { + clear: 'Rimuovi', + selected: 'Selezionati', + item: 'elementi' + }, + pagination: { + total: { + range: ' ', + total: 'di', + item: 'elementi' + } + }, + tableToolBar: { + leftPin: 'Fissa a sinistra', + rightPin: 'Fissa a destra', + noPin: 'Ripristina posizione', + leftFixedTitle: 'Fissato a sinistra', + rightFixedTitle: 'Fissato a destra', + noFixedTitle: 'Non fissato', + reset: 'Ripristina', + columnDisplay: 'Disposizione colonne', + columnSetting: 'Impostazioni', + fullScreen: 'Modalità schermo intero', + exitFullScreen: 'Esci da modalità schermo intero', + reload: 'Ricarica', + density: 'Grandezza tabella', + densityLarger: 'Grande', + densityMiddle: 'Media', + densitySmall: 'Compatta' + }, + loginForm: { + submitText: 'Accedi' + } +} diff --git a/pro-components/provider/locale/ja_JP.tsx b/pro-components/provider/locale/ja_JP.tsx new file mode 100644 index 0000000..2c006b4 --- /dev/null +++ b/pro-components/provider/locale/ja_JP.tsx @@ -0,0 +1,50 @@ +export default { + moneySymbol: '¥', + tableForm: { + search: '検索', + reset: 'リセット', + submit: '提交', + collapsed: '展開', + expand: '収納', + inputPlaceholder: '入力してください', + selectPlaceholder: '選択してください' + }, + alert: { + clear: 'クリア', + selected: '選択した', + item: '項目' + }, + pagination: { + total: { + range: '記事', + total: '/合計', + item: ' ' + } + }, + tableToolBar: { + leftPin: '左に固定', + rightPin: '右に固定', + noPin: 'キャンセル', + leftFixedTitle: '左に固定された項目', + rightFixedTitle: '右に固定された項目', + noFixedTitle: '固定されてない項目', + reset: 'リセット', + columnDisplay: '表示列', + columnSetting: '列表示設定', + fullScreen: 'フルスクリーン', + exitFullScreen: '終了', + reload: '更新', + density: '行高', + densityLarger: '默认', + densityMiddle: '中', + densitySmall: '小' + }, + stepsForm: { + next: '次のステップ', + pre: '前へ', + submit: '送信' + }, + loginForm: { + submitText: 'ログイン' + } +} diff --git a/pro-components/provider/locale/ko_KR.tsx b/pro-components/provider/locale/ko_KR.tsx new file mode 100644 index 0000000..1ef0d87 --- /dev/null +++ b/pro-components/provider/locale/ko_KR.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: '₩', + form: { + lightFilter: { + more: '더보기', + clear: '취소', + confirm: '확인', + itemUnit: '건수' + } + }, + tableForm: { + search: '조회', + reset: '초기화', + submit: '제출', + collapsed: '확장', + expand: '닫기', + inputPlaceholder: '입력해 주세요', + selectPlaceholder: '선택해 주세요' + }, + alert: { + clear: '취소', + selected: '선택', + item: '건' + }, + pagination: { + total: { + range: ' ', + total: '/ 총', + item: '건' + } + }, + tableToolBar: { + leftPin: '왼쪽으로 핀', + rightPin: '오른쪽으로 핀', + noPin: '핀 제거', + leftFixedTitle: '왼쪽으로 고정', + rightFixedTitle: '오른쪽으로 고정', + noFixedTitle: '비고정', + reset: '초기화', + columnDisplay: '컬럼 표시', + columnSetting: '설정', + fullScreen: '전체 화면', + exitFullScreen: '전체 화면 취소', + reload: '다시 읽기', + density: '여백', + densityDefault: '기본', + densityLarger: '많은 여백', + densityMiddle: '중간 여백', + densitySmall: '좁은 여백' + }, + stepsForm: { + next: '다음', + prev: '이전', + submit: '종료' + }, + loginForm: { + submitText: '로그인' + }, + editableTable: { + action: { + save: '저장', + cancel: '취소', + delete: '삭제' + } + } +} diff --git a/pro-components/provider/locale/ms_MY.tsx b/pro-components/provider/locale/ms_MY.tsx new file mode 100644 index 0000000..94140c6 --- /dev/null +++ b/pro-components/provider/locale/ms_MY.tsx @@ -0,0 +1,46 @@ +export default { + moneySymbol: 'RM', + tableForm: { + search: 'Cari', + reset: 'Menetapkan semula', + submit: 'Hantar', + collapsed: 'Kembang', + expand: 'Kuncup', + inputPlaceholder: 'Sila masuk', + selectPlaceholder: 'Sila pilih' + }, + alert: { + clear: 'Padam', + selected: 'Dipilih', + item: 'Item' + }, + pagination: { + total: { + range: ' ', + total: 'daripada', + item: 'item' + } + }, + tableToolBar: { + leftPin: 'Pin ke kiri', + rightPin: 'Pin ke kanan', + noPin: 'Tidak pin', + leftFixedTitle: 'Tetap ke kiri', + rightFixedTitle: 'Tetap ke kanan', + noFixedTitle: 'Tidak Tetap', + reset: 'Menetapkan semula', + columnDisplay: 'Lajur', + columnSetting: 'Settings', + fullScreen: 'Full Screen', + exitFullScreen: 'Keluar Full Screen', + reload: 'Muat Semula', + density: 'Densiti', + densityDefault: 'Biasa', + densityLarger: 'Besar', + densityMiddle: 'Tengah', + densitySmall: 'Kecil' + }, + loginForm: { + submitText: 'Log Masuk' + } +} diff --git a/pro-components/provider/locale/pl_PL.tsx b/pro-components/provider/locale/pl_PL.tsx new file mode 100644 index 0000000..22aea63 --- /dev/null +++ b/pro-components/provider/locale/pl_PL.tsx @@ -0,0 +1,59 @@ +export default { + moneySymbol: 'zł', + form: { + lightFilter: { + more: 'Więcej', + clear: 'Wyczyść', + confirm: 'Potwierdź', + itemUnit: 'Ilość' + } + }, + tableForm: { + search: 'Szukaj', + reset: 'Reset', + submit: 'Zatwierdź', + collapsed: 'Pokaż wiecej', + expand: 'Pokaż mniej', + inputPlaceholder: 'Proszę podać', + selectPlaceholder: 'Proszę wybrać' + }, + alert: { + clear: 'Wyczyść', + selected: 'Wybrane', + item: 'Wpis' + }, + pagination: { + total: { + range: ' ', + total: 'z', + item: 'Wpisów' + } + }, + tableToolBar: { + leftPin: 'Przypnij do lewej', + rightPin: 'Przypnij do prawej', + noPin: 'Odepnij', + leftFixedTitle: 'Przypięte do lewej', + rightFixedTitle: 'Przypięte do prawej', + noFixedTitle: 'Nieprzypięte', + reset: 'Reset', + columnDisplay: 'Wyświetlane wiersze', + columnSetting: 'Ustawienia', + fullScreen: 'Pełen ekran', + exitFullScreen: 'Zamknij pełen ekran', + reload: 'Odśwież', + density: 'Odstęp', + densityDefault: 'Standard', + densityLarger: 'Wiekszy', + densityMiddle: 'Sredni', + densitySmall: 'Kompaktowy' + }, + stepsForm: { + next: 'Weiter', + prev: 'Zurück', + submit: 'Abschließen' + }, + loginForm: { + submitText: 'Zaloguj się' + } +} diff --git a/pro-components/provider/locale/pt_BR.tsx b/pro-components/provider/locale/pt_BR.tsx new file mode 100644 index 0000000..c242493 --- /dev/null +++ b/pro-components/provider/locale/pt_BR.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: 'R$', + form: { + lightFilter: { + more: 'Mais', + clear: 'Limpar', + confirm: 'Confirmar', + itemUnit: 'Itens' + } + }, + tableForm: { + search: 'Filtrar', + reset: 'Limpar', + submit: 'Confirmar', + collapsed: 'Expandir', + expand: 'Colapsar', + inputPlaceholder: 'Por favor insira', + selectPlaceholder: 'Por favor selecione' + }, + alert: { + clear: 'Limpar', + selected: 'Selecionado(s)', + item: 'Item(s)' + }, + pagination: { + total: { + range: ' ', + total: 'de', + item: 'itens' + } + }, + tableToolBar: { + leftPin: 'Fixar à esquerda', + rightPin: 'Fixar à direita', + noPin: 'Desfixado', + leftFixedTitle: 'Fixado à esquerda', + rightFixedTitle: 'Fixado à direita', + noFixedTitle: 'Não fixado', + reset: 'Limpar', + columnDisplay: 'Mostrar Coluna', + columnSetting: 'Configurações', + fullScreen: 'Tela Cheia', + exitFullScreen: 'Sair da Tela Cheia', + reload: 'Atualizar', + density: 'Densidade', + densityDefault: 'Padrão', + densityLarger: 'Largo', + densityMiddle: 'Médio', + densitySmall: 'Compacto' + }, + stepsForm: { + next: 'Próximo', + prev: 'Anterior', + submit: 'Enviar' + }, + loginForm: { + submitText: 'Entrar' + }, + editableTable: { + action: { + save: 'Salvar', + cancel: 'Cancelar', + delete: 'Apagar' + } + } +} diff --git a/pro-components/provider/locale/ru_RU.tsx b/pro-components/provider/locale/ru_RU.tsx new file mode 100644 index 0000000..4fb754a --- /dev/null +++ b/pro-components/provider/locale/ru_RU.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: '₽', + form: { + lightFilter: { + more: 'Еще', + clear: 'Очистить', + confirm: 'ОК', + itemUnit: 'Позиции' + } + }, + tableForm: { + search: 'Найти', + reset: 'Сброс', + submit: 'Отправить', + collapsed: 'Развернуть', + expand: 'Свернуть', + inputPlaceholder: 'Введите значение', + selectPlaceholder: 'Выберите значение' + }, + alert: { + clear: 'Очистить', + selected: 'Выбрано', + item: 'элементов' + }, + pagination: { + total: { + range: ' ', + total: 'из', + item: 'элементов' + } + }, + tableToolBar: { + leftPin: 'Закрепить слева', + rightPin: 'Закрепить справа', + noPin: 'Открепить', + leftFixedTitle: 'Закреплено слева', + rightFixedTitle: 'Закреплено справа', + noFixedTitle: 'Не закреплено', + reset: 'Сброс', + columnDisplay: 'Отображение столбца', + columnSetting: 'Настройки', + fullScreen: 'Полный экран', + exitFullScreen: 'Выйти из полноэкранного режима', + reload: 'Обновить', + density: 'Размер', + densityDefault: 'По умолчанию', + densityLarger: 'Большой', + densityMiddle: 'Средний', + densitySmall: 'Сжатый' + }, + stepsForm: { + next: 'Следующий', + prev: 'Предыдущий', + submit: 'Завершить' + }, + loginForm: { + submitText: 'Вход' + }, + editableTable: { + action: { + save: 'Сохранить', + cancel: 'Отменить', + delete: 'Удалить' + } + } +} diff --git a/pro-components/provider/locale/sr_RS.tsx b/pro-components/provider/locale/sr_RS.tsx new file mode 100644 index 0000000..52c3c7d --- /dev/null +++ b/pro-components/provider/locale/sr_RS.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: 'RSD', + form: { + lightFilter: { + more: 'Više', + clear: 'Očisti', + confirm: 'Potvrdi', + itemUnit: 'Stavke' + } + }, + tableForm: { + search: 'Pronađi', + reset: 'Resetuj', + submit: 'Pošalji', + collapsed: 'Proširi', + expand: 'Skupi', + inputPlaceholder: 'Molimo unesite', + selectPlaceholder: 'Molimo odaberite' + }, + alert: { + clear: 'Očisti', + selected: 'Odabrano', + item: 'Stavka' + }, + pagination: { + total: { + range: ' ', + total: 'od', + item: 'stavki' + } + }, + tableToolBar: { + leftPin: 'Zakači levo', + rightPin: 'Zakači desno', + noPin: 'Nije zakačeno', + leftFixedTitle: 'Fiksirano levo', + rightFixedTitle: 'Fiksirano desno', + noFixedTitle: 'Nije fiksirano', + reset: 'Resetuj', + columnDisplay: 'Prikaz kolona', + columnSetting: 'Podešavanja', + fullScreen: 'Pun ekran', + exitFullScreen: 'Zatvori pun ekran', + reload: 'Osveži', + density: 'Veličina', + densityDefault: 'Podrazumevana', + densityLarger: 'Veća', + densityMiddle: 'Srednja', + densitySmall: 'Kompaktna' + }, + stepsForm: { + next: 'Dalje', + prev: 'Nazad', + submit: 'Gotovo' + }, + loginForm: { + submitText: 'Prijavi se' + }, + editableTable: { + action: { + save: 'Sačuvaj', + cancel: 'Poništi', + delete: 'Obriši' + } + } +} diff --git a/pro-components/provider/locale/tr_TR.tsx b/pro-components/provider/locale/tr_TR.tsx new file mode 100644 index 0000000..fa69eff --- /dev/null +++ b/pro-components/provider/locale/tr_TR.tsx @@ -0,0 +1,66 @@ +export default { + moneySymbol: '₺', + form: { + lightFilter: { + more: 'Daha Fazla', + clear: 'Temizle', + confirm: 'Onayla', + itemUnit: 'Öğeler' + } + }, + tableForm: { + search: 'Filtrele', + reset: 'Sıfırla', + submit: 'Gönder', + collapsed: 'Daha fazla', + expand: 'Daha az', + inputPlaceholder: 'Filtrelemek için bir değer girin', + selectPlaceholder: 'Filtrelemek için bir değer seçin' + }, + alert: { + clear: 'Temizle', + selected: 'Seçili', + item: 'Öğe' + }, + pagination: { + total: { + range: ' ', + total: 'Toplam', + item: 'Öğe' + } + }, + tableToolBar: { + leftPin: 'Sola sabitle', + rightPin: 'Sağa sabitle', + noPin: 'Sabitlemeyi kaldır', + leftFixedTitle: 'Sola sabitlendi', + rightFixedTitle: 'Sağa sabitlendi', + noFixedTitle: 'Sabitlenmedi', + reset: 'Sıfırla', + columnDisplay: 'Kolon Görünümü', + columnSetting: 'Ayarlar', + fullScreen: 'Tam Ekran', + exitFullScreen: 'Tam Ekrandan Çık', + reload: 'Yenile', + density: 'Kalınlık', + densityDefault: 'Varsayılan', + densityLarger: 'Büyük', + densityMiddle: 'Orta', + densitySmall: 'Küçük' + }, + stepsForm: { + next: 'Sıradaki', + prev: 'Önceki', + submit: 'Gönder' + }, + loginForm: { + submitText: 'Giriş Yap' + }, + editableTable: { + action: { + save: 'Kaydet', + cancel: 'Vazgeç', + delete: 'Sil' + } + } +} diff --git a/pro-components/provider/locale/vi_VN.tsx b/pro-components/provider/locale/vi_VN.tsx new file mode 100644 index 0000000..c8e9c29 --- /dev/null +++ b/pro-components/provider/locale/vi_VN.tsx @@ -0,0 +1,46 @@ +export default { + moneySymbol: '₫', + tableForm: { + search: 'Tìm kiếm', + reset: 'Làm lại', + submit: 'Gửi đi', + collapsed: 'Mở rộng', + expand: 'Thu gọn', + inputPlaceholder: 'nhập dữ liệu', + selectPlaceholder: 'Vui lòng chọn' + }, + alert: { + clear: 'Xóa', + selected: 'đã chọn', + item: 'mục' + }, + pagination: { + total: { + range: ' ', + total: 'trên', + item: 'mặt hàng' + } + }, + tableToolBar: { + leftPin: 'Ghim trái', + rightPin: 'Ghim phải', + noPin: 'Bỏ ghim', + leftFixedTitle: 'Cố định trái', + rightFixedTitle: 'Cố định phải', + noFixedTitle: 'Chưa cố định', + reset: 'Làm lại', + columnDisplay: 'Cột hiển thị', + columnSetting: 'Cấu hình', + fullScreen: 'Chế độ toàn màn hình', + exitFullScreen: 'Thoát chế độ toàn màn hình', + reload: 'Làm mới', + density: 'Mật độ hiển thị', + densityDefault: 'Mặc định', + densityLarger: 'Mặc định', + densityMiddle: 'Trung bình', + densitySmall: 'Chật' + }, + loginForm: { + submitText: 'Đăng nhập' + } +} diff --git a/pro-components/provider/locale/zh_CN.tsx b/pro-components/provider/locale/zh_CN.tsx new file mode 100644 index 0000000..589cbac --- /dev/null +++ b/pro-components/provider/locale/zh_CN.tsx @@ -0,0 +1,65 @@ +export default { + moneySymbol: '¥', + form: { + lightFilter: { + more: '更多筛选', + clear: '清除', + confirm: '确认', + itemUnit: '项' + } + }, + tableForm: { + search: '查询', + reset: '重置', + submit: '提交', + collapsed: '展开', + expand: '收起', + inputPlaceholder: '请输入', + selectPlaceholder: '请选择' + }, + alert: { + clear: '取消选择', + selected: '已选择', + item: '项' + }, + pagination: { + total: { + range: '第', + total: '条/总共', + item: '条' + } + }, + tableToolBar: { + leftPin: '固定在列首', + rightPin: '固定在列尾', + noPin: '不固定', + leftFixedTitle: '固定在左侧', + rightFixedTitle: '固定在右侧', + noFixedTitle: '不固定', + reset: '重置', + columnDisplay: '列展示', + columnSetting: '列设置', + fullScreen: '全屏', + exitFullScreen: '退出全屏', + reload: '刷新', + density: '密度', + densityDefault: '正常', + densityLarger: '默认', + densityMiddle: '中等', + densitySmall: '紧凑' + }, + editableTable: { + action: { + save: '保存', + cancel: '取消', + delete: '删除' + } + }, + switch: { + open: '打开', + close: '关闭' + }, + loginForm: { + submitText: '登录' + } +} diff --git a/pro-components/provider/locale/zh_TW.tsx b/pro-components/provider/locale/zh_TW.tsx new file mode 100644 index 0000000..02dc567 --- /dev/null +++ b/pro-components/provider/locale/zh_TW.tsx @@ -0,0 +1,65 @@ +export default { + moneySymbol: 'NT$', + form: { + lightFilter: { + more: '更多篩選', + clear: '清除', + confirm: '確認', + itemUnit: '項' + } + }, + tableForm: { + search: '查詢', + reset: '重置', + submit: '提交', + collapsed: '展開', + expand: '收起', + inputPlaceholder: '請輸入', + selectPlaceholder: '請選擇' + }, + alert: { + clear: '取消選擇', + selected: '已選擇', + item: '項' + }, + pagination: { + total: { + range: '第', + total: '條/總共', + item: '條' + } + }, + tableToolBar: { + leftPin: '固定到左邊', + rightPin: '固定到右邊', + noPin: '不固定', + leftFixedTitle: '固定在左側', + rightFixedTitle: '固定在右側', + noFixedTitle: '不固定', + reset: '重置', + columnDisplay: '列展示', + columnSetting: '列設置', + fullScreen: '全屏', + exitFullScreen: '退出全屏', + reload: '刷新', + density: '密度', + densityDefault: '正常', + densityLarger: '默認', + densityMiddle: '中等', + densitySmall: '緊湊' + }, + editableTable: { + action: { + save: '保存', + cancel: '取消', + delete: '刪除' + } + }, + switch: { + open: '打開', + close: '關閉' + }, + loginForm: { + submitText: '登入' + } +} diff --git a/pro-components/table/Table.tsx b/pro-components/table/Table.tsx new file mode 100644 index 0000000..39e8119 --- /dev/null +++ b/pro-components/table/Table.tsx @@ -0,0 +1,806 @@ +import type { TablePaginationConfig, TableProps } from 'ant-design-vue' +import { Table } from 'ant-design-vue' +import 'ant-design-vue/es/table/style/index.less' +import 'ant-design-vue/es/pagination/style/index.less' + +import ProCard from '#/card' + +import type { + TableCurrentDataSource, + SortOrder, + GetRowKey +} from 'ant-design-vue/es/table/interface' + +import useFetchData from './useFetchData' +import Toolbar from './components/ToolBar' +import TableAlert from './components/Alert' + +import { + genColumnKey, + mergePagination, + useActionType, + isBordered, + parseDefaultColumnConfig +} from './utils' +import { genProColumnToColumn } from './utils/genProColumnToColumn' + +import './index.less' +import type { + ActionType, + PageInfo, + RequestData, + TableRowSelection, + UseFetchDataAction +} from './typing' +import { columnSort } from './utils/columnSort' +import { getPrefixCls } from '#/layout/RouteContext' +import type { VueKey, VueText } from '#/types' +import { computed, ref, defineComponent, watchEffect } from 'vue' +import type { CSSProperties, PropType } from 'vue' + +import omitUndefined from '../utils/omitUndefined' +import { proTableProps } from './typing' +import { useVModel } from '@vueuse/core' +import { useIntl } from '#/provider' +import { useContainer, useProvideContainer } from '#/table/container' +import { tableProps } from 'ant-design-vue/es/table' +import type { ProSchemaComponentTypes } from '#/utils/typing' +import type { Key } from 'ant-design-vue/es/_util/type' +import { getRender } from '#/layout/utils' +import type { VueNodeOrRender } from '#/types' + +const tablePropsInstance = tableProps() +const tablePropKeys = Object.keys(tablePropsInstance) as unknown as [keyof TableProps] + +export type ProTableInstanceExpose = { + loading: boolean + actionRef: ActionType +} + +// eslint-disable-next-line vue/one-component-per-file +const TableRender = defineComponent({ + name: 'TableRender', + props: { + ...proTableProps(), + className: { type: String, default: undefined }, + action: { type: Object as PropType, default: null }, + tableColumn: { type: Array as PropType, default: () => [] }, + isLightFilter: { type: Boolean, default: false }, + onSortChange: { type: Function as PropType<(sort: any) => void>, default: undefined }, + onFilterChange: { type: Function as PropType<(sort: any) => void>, default: undefined }, + editableUtils: { type: Object as PropType, default: undefined }, + getRowKey: { type: Function as PropType>, default: undefined } + }, + slots: ['toolbarDom', 'alertDom', 'searchNode'], + setup(props, { attrs, slots }) { + const counter = useContainer()! + + /** 需要遍历一下,不然不支持嵌套表格 */ + const columns = computed(() => { + const loopFilter = (column: any[]): any[] => { + return column + .map(item => { + // 删掉不应该显示的 + const columnKey = genColumnKey(item.key, item.index) + const config = counter.columnsMap.value[columnKey] + if (config && config.show === false) { + return false + } + if (item.children) { + return { + ...item, + children: loopFilter(item.children) + } + } + return item + }) + .filter(Boolean) + } + return loopFilter(props.tableColumn) + }) + + /** 如果所有列中的 filters=true| undefined 说明是用的是本地筛选 任何一列配置 filters=false,就能绕过这个判断 */ + const useLocaleFilter = computed(() => + columns.value?.every( + column => + (column.filters === true && column.onFilter === true) || + (column.filters === undefined && column.onFilter === undefined) + ) + ) + + // 用户传入的 table 属性 + const userTableProps = computed(() => { + return Object.fromEntries(tablePropKeys.map(k => [k, props[k]])) + }) + + const tableProps = computed(() => ({ + ...userTableProps.value, + size: props.size, + rowSelection: props.rowSelection === false ? undefined : props.rowSelection, + className: props.tableClassName, + style: props.tableStyle, + columns: columns.value.map(item => (item.isExtraColumns ? item.extraColumn : item)), + loading: props.action.loading, + dataSource: props.action.dataSource, + pagination: props.pagination, + onChange: ( + changePagination: TablePaginationConfig, + filters: Record, + sorter: any, + extra: TableCurrentDataSource + ) => { + props.onChange?.(changePagination, filters, sorter, extra) + if (!useLocaleFilter.value) { + props.onFilterChange?.(omitUndefined(filters)) + } + // 制造筛选的数据 + // 制造一个排序的数据 + if (Array.isArray(sorter)) { + const data = sorter.reduce>( + (pre, value) => ({ + ...pre, + [`${value.field}`]: value.order + }), + {} + ) + props.onSortChange?.(omitUndefined(data)) + } else { + const sorterOfColumn = sorter.column?.sorter + const isSortByField = sorterOfColumn?.toString() === sorterOfColumn + props.onSortChange?.( + omitUndefined({ + [`${isSortByField ? sorterOfColumn : sorter.field}`]: sorter.order as SortOrder + }) || {} + ) + } + } + })) + + return () => { + /** 默认的 table dom,如果是编辑模式,外面还要包个 form */ + const baseTableDom = ( + + {slots} +
+ ) + + /** 自定义的 render */ + const tableDom = props.tableViewRender + ? props.tableViewRender( + { + ...tableProps.value, + rowSelection: props.rowSelection !== false ? props.rowSelection : undefined + }, + baseTableDom + ) + : baseTableDom + + // watchEffect(() => { + // // 如果带了name,说明要用自带的 form,需要设置一下。 + // if (props.name && props.editable) { + // counter.setEditorTableForm(props.editable!.form!) + // } + // }) + + const tableContentDom = computed(() => { + // if (props.editable && !props.name) { + // return ( + // <> + // {toolbarDom} + // {alertDom} + // { + // counter.setEditorTableForm(form) + // }} + // // @ts-ignore + // formRef={form => { + // counter.setEditorTableForm(form) + // }} + // {...props.editable?.formProps} + // component={false} + // form={props.editable?.form} + // onValuesChange={editableUtils.onValuesChange} + // key="table" + // submitter={false} + // omitNil={false} + // dateFormatter={props.dateFormatter} + // contentRender={(items: React.ReactNode) => { + // if (counter.editableForm) return items + // if (props.loading === false) return + // const loadingProps = props.loading === true ? {} : props.loading + // return ( + //
+ // + //
+ // ) + // }} + // > + // {tableDom} + //
+ // + // ) + // } + + return ( + <> + {slots.toolbarDom?.()} + {slots.alertDom?.()} + {tableDom} + + ) + }) + + /** Table 区域的 dom,为了方便 render */ + const tableAreaDom = + // cardProps 或者 有了name 就不需要这个padding了,不然会导致不好对齐 + props.cardProps === false ? ( + tableContentDom.value + ) : ( + // @ts-ignore + + {tableContentDom.value} + + ) + + const renderTable = () => { + if (props.tableRender) { + return props.tableRender(props, tableAreaDom, { + toolbar: slots.toolbarDom?.(), + alert: slots.alertDom?.(), + table: tableDom || undefined + }) + } + return tableAreaDom + } + + const proTableDom = ( +
+ {props.isLightFilter ? null : slots.searchNode} + {/* 渲染一个额外的区域,用于一些自定义 */} + {props.tableExtraRender && ( +
+ {props.tableExtraRender(props, props.action.dataSource || [])} +
+ )} + {renderTable()} +
+ ) + + // TODO: 全屏处理 + // 如果不需要的全屏,ConfigProvider 没有意义 + if (!props.options || !props.options?.fullScreen) { + return proTableDom + } + return proTableDom + } + } +}) + +// eslint-disable-next-line vue/one-component-per-file +const ProTable = defineComponent({ + name: 'ProTable', + props: { + ...proTableProps(), + defaultClassName: { type: String, default: undefined }, + className: { type: String, default: undefined } + }, + setup(props, { slots, expose }) { + const className = [props.defaultClassName, props.className] + + const type: ProSchemaComponentTypes = 'table' + + /** 通用的来操作子节点的工具类 */ + const actionRef = ref() + + // const defaultFormRef = ref() + // const formRef = propRef || defaultFormRef + + // useImperativeHandle(props.actionRef, () => actionRef.current) + + /** 单选多选的相关逻辑 */ + const selectedRowKeys = ref() + + watch( + () => props.rowSelection, + () => { + if (props.rowSelection === false) { + selectedRowKeys.value = undefined + } else if (props.rowSelection.selectedRowKeys) { + selectedRowKeys.value = [...props.rowSelection.selectedRowKeys] + } else if (props.rowSelection.defaultSelectedRowKeys) { + selectedRowKeys.value = [...props.rowSelection.defaultSelectedRowKeys] + } else { + selectedRowKeys.value = [] + } + }, + { deep: true, immediate: true } + ) + + const setSelectedRowKeys = (keys: Key[]) => { + selectedRowKeys.value = keys + } + + const selectedRowsRef = ref([]) + + const setSelectedRowsAndKey = (keys: Key[], rows: unknown[]) => { + setSelectedRowKeys(keys) + if (!props.rowSelection || !props.rowSelection?.selectedRowKeys) { + selectedRowsRef.value = rows + } + } + + const formSearch = props.manualRequest ? undefined : {} + // const [formSearch, setFormSearch] = useMountMergeState | undefined>(() => { + // // 如果手动模式,或者 search 不存在的时候设置为 undefined + // // undefined 就不会触发首次加载 + // if (manualRequest || search !== false) { + // return undefined + // } + // return {} + // }) + + const proFilter = ref>() + const proSort = ref>() + /** 设置默认排序和筛选值 */ + watchEffect(() => { + const { sort, filter } = parseDefaultColumnConfig(props.columns) + proFilter.value = filter + proSort.value = sort + }) + + const intl = useIntl() + + /** 需要初始化 不然默认可能报错 这里取了 defaultCurrent 和 current 为了保证不会重复刷新 */ + const fetchPagination = + typeof props.pagination === 'object' + ? (props.pagination as TablePaginationConfig) + : { defaultCurrent: 1, defaultPageSize: 10, pageSize: 10, current: 1 } + + const counter = useContainer()! + // const counter = Container.useContainer() + + // ============================ useFetchData ============================ + const fetchData = () => { + if (!props.request) return undefined + return async (pageParams?: Record) => { + const actionParams = { + ...(pageParams || {}), + ...formSearch, + ...props.params + } + + // eslint-disable-next-line no-underscore-dangle + delete (actionParams as any)._timestamp + const response = await props.request?.(actionParams, proSort.value!, proFilter.value!) + console.log('请求数据:', response) + return response as RequestData + } + } + + const loading = props.loading === undefined ? ref(false) : useVModel(props, 'loading') + + const action = useFetchData(fetchData(), props.defaultData, { + pageInfo: props.pagination === false ? false : fetchPagination, + loading: loading, + dataSource: props.dataSource, + onDataSourceChange: props.onDataSourceChange, + onLoad: props.onLoad, + onLoadingChange: props.onLoadingChange, + onRequestError: props.onRequestError, + postData: props.postData, + revalidateOnFocus: props.revalidateOnFocus ?? false, + manual: formSearch === undefined, + polling: props.polling, + effects: computed(() => [ + new URLSearchParams(props.params).toString(), + new URLSearchParams(formSearch).toString(), + new URLSearchParams(proSort.value as any).toString(), + new URLSearchParams(proFilter.value as any).toString() + ]), + debounceTime: props.debounceTime, + onPageInfoChange: pageInfo => { + // @ts-ignore + if (type === 'list' || !props.pagination || !fetchData) return + + // 总是触发一下 onChange 和 onShowSizeChange + // 目前只有 List 和 Table 支持分页, List 有分页的时候打断 Table 的分页 + props.pagination?.onChange?.(pageInfo.current, pageInfo.pageSize) + props.pagination?.onShowSizeChange?.(pageInfo.current, pageInfo.pageSize) + } + }) + + // ============================ END ============================ + + /** 默认聚焦的时候重新请求数据,这样可以保证数据都是最新的。 */ + // watchEffect(() => { + // // 手动模式和 request 为空都不生效 + // if ( + // props.manualRequest || + // !props.request || + // props.revalidateOnFocus === false + // // || props.form?.ignoreRules + // ) + // return + // + // // 聚焦时重新请求事件 + // const visibilitychange = () => { + // if (document.visibilityState === 'visible') action.value.reload() + // } + // + // document.addEventListener('visibilitychange', visibilitychange) + // }) + // onUnmounted(() => document.removeEventListener('visibilitychange', visibilitychange)) + + // ============================ RowKey ============================ + const getRowKey = computed>(() => { + if (typeof props.rowKey === 'function') { + return props.rowKey + } + return (record: any, index?: number) => { + if (index === -1) { + return (record as any)?.[props.rowKey as string] + } + // 如果 props 中有name 的话,用index 来做行号,这样方便转化为 index + // if (props.name) { + // return index?.toString() + // } + return (record as any)?.[props.rowKey as string] ?? index?.toString() + } + }) + + /** SelectedRowKeys受控处理selectRows */ + const preserveRecordsRef = computed>(() => { + if (action.value.dataSource?.length) { + const newCache = new Map() + action.value.dataSource.forEach(data => { + const dataRowKey = getRowKey.value(data, -1) + newCache.set(dataRowKey, data) + }) + return newCache + } + return new Map() + }) + + watchEffect(() => { + selectedRowsRef.value = + selectedRowKeys.value?.map(key => preserveRecordsRef.value?.get(key)) || [] + }) + + /** 页面编辑的计算 */ + const pagination = computed(() => { + const newPropsPagination = props.pagination === false ? false : { ...props.pagination } + const pageConfig = { + ...action.value.pageInfo, + setPageInfo: ({ pageSize, current }: PageInfo) => { + const { pageInfo } = action.value + // pageSize 发生改变,并且你不是在第一页,切回到第一页 + // 这样可以防止出现 跳转到一个空的数据页的问题 + if (pageSize === pageInfo.pageSize || pageInfo.current === 1) { + action.value.setPageInfo({ pageSize, current }) + return + } + + // 通过request的时候清空数据,然后刷新不然可能会导致 pageSize 没有数据多 + if (props.request) action.value.setDataSource([]) + action.value.setPageInfo({ + pageSize, + // 目前只有 List 和 Table 支持分页, List 有分页的时候 还是使用之前的当前页码 + current: 1 + }) + } + } + if (props.request && newPropsPagination) { + delete newPropsPagination.onChange + delete newPropsPagination.onShowSizeChange + } + return mergePagination(newPropsPagination, pageConfig, intl) + }) + + // useDeepCompareEffect(() => { + // // request 存在且params不为空,且已经请求过数据才需要设置。 + // if (props.request && props.params && action.value.dataSource && action.value?.pageInfo?.current !== 1) { + // action.value.setPageInfo({ + // current: 1 + // }) + // } + // }, [params]) + + // 设置 name 到 store 中,里面用了 ref ,所以不用担心直接 set + // counter.setPrefixName(props.name) + + /** 清空所有的选中项 */ + const onCleanSelected = () => { + if (props.rowSelection && props.rowSelection.onChange) { + props.rowSelection.onChange([], []) + } + setSelectedRowsAndKey([], []) + } + + // counter.setaction.value(action.valueRef.current) + // counter.propsRef.current = props + + /** 可编辑行的相关配置 */ + // const editableUtils = useEditableArray({ + // ...props.editable, + // tableName: props.name, + // getRowKey, + // childrenColumnName: props.expandable?.childrenColumnName, + // dataSource: action.value.dataSource || [], + // setDataSource: data => { + // props.editable?.onValuesChange?.(undefined as any, data) + // action.value.setDataSource(data) + // } + // }) + + /** 绑定 action */ + useActionType(actionRef, action.value, { + fullScreen: () => { + if (!counter.rootDomRef.value || !document.fullscreenEnabled) { + return + } + if (document.fullscreenElement) { + document.exitFullscreen() + } else { + counter.rootDomRef.value?.requestFullscreen() + } + }, + onCleanSelected: () => { + // 清空选中行 + // onCleanSelected() + }, + resetAll: () => { + // 清空选中行 + // onCleanSelected() + // 清空筛选 + proFilter.value = {} + // 清空排序 + proSort.value = {} + // 清空 toolbar 搜索 + counter.setKeyWords(undefined) + // 重置页码 + action.value.setPageInfo({ + current: 1 + }) + + // 重置表单 + // props.formRef?.current?.resetFields() + // setFormSearch({}) + }, + editableUtils: undefined + }) + + // ---------- 列计算相关 start ----------------- + const tableColumn = computed(() => { + return genProColumnToColumn({ + columns: props.columns, + counter, + columnEmptyText: '-', + type, + editableUtils: null, + rowKey: props.rowKey, + childrenColumnName: props.childrenColumnName + }).sort(columnSort(counter.columnsMap.value)) + }) + + /** Table Column 变化的时候更新一下,这个参数将会用于渲染 */ + watchEffect(() => { + if (tableColumn.value && tableColumn.value.length > 0) { + // 重新生成key的字符串用于排序 + const columnKeys = tableColumn.value.map(item => genColumnKey(item.key, item.index)) + counter.setSortKeyColumns(columnKeys) + } + }) + + // /** 同步 Pagination,支持受控的 页码 和 pageSize */ + // useDeepCompareEffect(() => { + // const { pageInfo } = action.value + // const { current = pageInfo?.current, pageSize = pageInfo?.pageSize } = props.pagination || {} + // if ( + // props.pagination && + // (current || pageSize) && + // (pageSize !== pageInfo?.pageSize || current !== pageInfo?.current) + // ) { + // action.value.setPageInfo({ + // pageSize: pageSize || pageInfo.pageSize, + // current: current || pageInfo.current + // }) + // } + // }, [ + // props.pagination && props.pagination.pageSize, + // props.pagination && props.pagination.current + // ]) + + /** 行选择相关的问题 */ + const rowSelection = computed(() => ({ + selectedRowKeys: selectedRowKeys.value, + ...props.rowSelection, + onChange: (keys: Key[], rows: unknown[]) => { + if (props.rowSelection && props.rowSelection.onChange) { + props.rowSelection.onChange(keys, rows) + } + setSelectedRowsAndKey(keys, rows) + } + })) + + /** 是不是 LightFilter, LightFilter 有一些特殊的处理 */ + const isLightFilter: boolean = props.search !== false && props.search?.filterType === 'light' + + // const onFormSearchSubmit = (values: Y): any => { + // // 判断search.onSearch返回值决定是否更新formSearch + // if (props.options && props.options.search) { + // const { name = 'keyword' } = props.options.search === true ? {} : props.options.search + // + // /** 如果传入的 onSearch 返回值为 false,则不要把options.search.name对应的值set到formSearch */ + // const success = (props.options.search as OptionSearchProps)?.onSearch?.(counter.keyWords!) + // + // if (success !== false) { + // setFormSearch({ + // ...values, + // [name]: counter.keyWords + // }) + // return + // } + // } + // + // setFormSearch(values) + // } + + const searchNode = null + // const searchNode = + // search === false && type !== 'form' ? null : ( + // + // pagination={pagination} + // beforeSearchSubmit={beforeSearchSubmit} + // action={actionRef} + // columns={propsColumns} + // onFormSearchSubmit={values => { + // onFormSearchSubmit(values) + // }} + // ghost={ghost} + // onReset={props.onReset} + // onSubmit={props.onSubmit} + // loading={!!action.value.loading} + // manualRequest={manualRequest} + // search={search} + // form={props.form} + // formRef={formRef} + // type={props.type || 'table'} + // cardBordered={props.cardBordered} + // dateFormatter={props.dateFormatter} + // /> + // ) + + expose({ + loading: loading, + actionRef: actionRef + }) + + return () => { + const headerTitle = getRender(props, slots, 'headerTitle') + /** 内置的工具栏 */ + const toolbarDom = + props.toolBarRender === false ? null : ( + { + // setFormSearch({ + // ...formSearch, + // ...newValues + // }) + }} + searchNode={isLightFilter ? searchNode : null} + options={props.options} + actionRef={actionRef} + toolBarRender={props.toolBarRender} + > + {slots} + + ) + + /** 内置的多选操作栏 */ + const alertDom = + props.rowSelection !== false ? ( + + {{ + alertOptionRender: slots.tableAlertOptionRender, + alertInfoRender: slots.tableAlertRender + }} + + ) : null + + return ( + (proSort.value = x)} + onFilterChange={x => (proFilter.value = x)} + editableUtils={null} + getRowKey={getRowKey.value} + > + {{ + alertDom: () => alertDom, + toolbarDom: () => toolbarDom, + ...slots + }} + + ) + } + } +}) + +/** + * 🏆 Use Ant Design Table like a Pro! 更快 更好 更方便 + * + * @param props + */ +// eslint-disable-next-line vue/one-component-per-file +const ProviderWarp = defineComponent({ + name: 'ProviderWarp', + props: proTableProps(), + slots: ['toolBarRender'], + setup(props, { slots, expose }) { + // @ts-ignore + useProvideContainer(props) + + const proTableRef = ref() + expose({ + loading: computed(() => proTableRef?.value.loading), + actionRef: computed(() => proTableRef?.value.actionRef) + }) + + return () => ( + + {slots} + + ) + } +}) + +ProviderWarp.Summary = Table.Summary + +export default ProviderWarp diff --git a/pro-components/table/components/Alert/index.less b/pro-components/table/components/Alert/index.less new file mode 100644 index 0000000..c526a7b --- /dev/null +++ b/pro-components/table/components/Alert/index.less @@ -0,0 +1,26 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-table-alert-prefix-cls: ~'@{ant-prefix}-pro-table-alert'; + +.@{pro-table-alert-prefix-cls} { + margin-bottom: 16px; + // padding: 0 24px; + + .@{ant-prefix}-alert.@{ant-prefix}-alert-no-icon { + padding: @padding-sm @padding-lg; + } + + &-info { + display: flex; + align-items: center; + transition: all 0.3s; + &-content { + flex: 1; + } + &-option { + min-width: 48px; + padding-left: 16px; + } + } +} diff --git a/pro-components/table/components/Alert/index.tsx b/pro-components/table/components/Alert/index.tsx new file mode 100644 index 0000000..d75b38e --- /dev/null +++ b/pro-components/table/components/Alert/index.tsx @@ -0,0 +1,96 @@ +import './index.less' + +import { Alert, Space } from 'ant-design-vue' +import 'ant-design-vue/es/alert/style/index.less' +import 'ant-design-vue/es/space/style/index.less' + +import { getPrefixCls } from '#/layout/RouteContext' +import type { IntlType } from '#/provider' +import { useIntl } from '#/provider' +import type { VueNode } from '#/types' +import { getRender } from '#/layout/utils' +import type { FunctionalComponent } from 'vue' + +type AlertRender = (props: { + intl: IntlType + selectedRowKeys: (number | string)[] + selectedRows: T[] + onCleanSelected: () => void +}) => VueNode + +export type AlertRenderType = AlertRender | false + +export type TableAlertProps = { + selectedRowKeys: (number | string)[] + selectedRows: T[] + alwaysShowAlert?: boolean + alertInfoRender?: AlertRenderType + onCleanSelected: () => void + alertOptionRender?: AlertRenderType +} + +const defaultAlertOptionRender: AlertRender = (props: { + intl: IntlType + onCleanSelected: () => void +}) => { + const { intl, onCleanSelected } = props + return [ + + {intl.getMessage('alert.clear', '清空')} + + ] +} + +const defaultAlertInfoRender: AlertRender = ({ intl, selectedRowKeys }) => ( + + {intl.getMessage('alert.selected', '已选择')} + {selectedRowKeys.length} + {intl.getMessage('alert.item', '项')}   + +) + +const TableAlert: FunctionalComponent> = (props, { slots }) => { + const intl = useIntl() + + const alertRenderProps = { + onCleanSelected: props.onCleanSelected, + selectedRowKeys: props.selectedRowKeys, + selectedRows: props.selectedRows, + intl + } + + let optionRender = getRender>(props, slots, 'alertOptionRender') + if (optionRender !== false && !optionRender) { + optionRender = defaultAlertOptionRender + } + const option = optionRender && optionRender(alertRenderProps) + + const className = getPrefixCls('pro-table-alert') + + let infoRender = getRender>(props, slots, 'alertInfoRender') + if (infoRender === false) { + return null + } else if (!infoRender) { + infoRender = defaultAlertInfoRender + } + const dom = infoRender(alertRenderProps) + + if (dom === false || (props.selectedRowKeys.length < 1 && !props.alwaysShowAlert)) { + return null + } + return ( +
+ +
{dom}
+ {option ?
{option}
: null} +
+ } + type="info" + /> +
+ ) +} + +export default TableAlert diff --git a/pro-components/table/components/ColumnSetting/index.less b/pro-components/table/components/ColumnSetting/index.less new file mode 100644 index 0000000..eb05a26 --- /dev/null +++ b/pro-components/table/components/ColumnSetting/index.less @@ -0,0 +1,89 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-column-setting-prefix-cls: ~'@{ant-prefix}-pro-table-column-setting'; + +.@{pro-column-setting-prefix-cls} { + width: auto; + &-title { + display: flex; + align-items: center; + justify-content: space-between; + height: 32px; + } + + &-overlay { + .@{ant-prefix}-popover-inner-content { + width: 200px; + padding: 0px; + padding-bottom: 8px; + } + + .@{ant-prefix}-tree-node-content-wrapper:hover { + background-color: transparent; + } + + .@{ant-prefix}-tree-draggable-icon { + cursor: grab; + } + + .@{ant-prefix}-tree-treenode { + align-items: center; + + &:hover { + background-color: @item-active-bg; + .@{pro-column-setting-prefix-cls}-list-item-option { + display: block; + } + } + + .@{ant-prefix}-tree-checkbox { + top: 0; + margin: 0; + margin-right: 4px; + } + } + } +} + +.@{pro-column-setting-prefix-cls}-list { + display: flex; + flex-direction: column; + width: 100%; + padding-top: 8px; + + &.@{pro-column-setting-prefix-cls}-list-group { + padding-top: 0; + } + + &-title { + margin-top: 6px; + margin-bottom: 6px; + padding-left: 24px; + color: @text-color-secondary; + font-size: 12px; + } + + &-item { + display: flex; + align-items: center; + + &-title { + flex: 1; + } + + &-option { + display: none; + float: right; + cursor: pointer; + > span { + > span.anticon { + color: @primary-color; + } + } + > span + span { + margin-left: 8px; + } + } + } +} diff --git a/pro-components/table/components/ColumnSetting/index.tsx b/pro-components/table/components/ColumnSetting/index.tsx new file mode 100644 index 0000000..d30eb6a --- /dev/null +++ b/pro-components/table/components/ColumnSetting/index.tsx @@ -0,0 +1,444 @@ +import { + SettingOutlined, + VerticalAlignMiddleOutlined, + VerticalAlignTopOutlined, + VerticalAlignBottomOutlined +} from '@ant-design/icons-vue' + +import { Checkbox, Tree, Popover, Tooltip, Space } from 'ant-design-vue' +import 'ant-design-vue/es/checkbox/style/index.less' +import 'ant-design-vue/es/tree/style/index.less' +import 'ant-design-vue/es/popover/style/index.less' +import 'ant-design-vue/es/tooltip/style/index.less' +import 'ant-design-vue/es/space/style/index.less' + +import type { TableColumnType } from 'ant-design-vue' +import type { DataNode } from 'ant-design-vue/es/tree' + +import { genColumnKey } from '../../utils' +import type { ProColumns } from '../../typing' + +import './index.less' +import type { CheckboxChangeEvent } from 'ant-design-vue/es/checkbox/interface' +import type { FunctionalComponent, PropType } from 'vue' +import { useIntl } from '#/provider' +import { getPrefixCls } from '#/layout/RouteContext' +import type { VueKey, VueNode } from '#/types' +import type { ColumnsState } from '#/table/container' +import { useContainer } from '#/table/container' +import { computed, ref, watchEffect } from 'vue' +import omit from 'ant-design-vue/es/_util/omit' + +type ColumnSettingProps = { + columns: TableColumnType[] + draggable?: boolean + checkable?: boolean + extra?: VueNode + checkedReset?: boolean + listsHeight?: number +} + +const ToolTipIcon: FunctionalComponent<{ + title: string + columnKey: string | number + show: boolean + fixed: 'left' | 'right' | undefined +}> = ({ title, show, columnKey, fixed }, { slots }) => { + const { columnsMap, setColumnsMap } = useContainer()! + if (!show) { + return null + } + return ( + + { + e.stopPropagation() + e.preventDefault() + const config = columnsMap.value[columnKey] || {} + const disableIcon = typeof config.disable === 'boolean' && config.disable + if (disableIcon) return + const columnKeyMap = { + ...columnsMap.value, + [columnKey]: { ...config, fixed } as ColumnsState + } + setColumnsMap(columnKeyMap) + }} + > + {slots.default?.()} + + + ) +} + +const CheckboxListItem: FunctionalComponent<{ + columnKey: string | number + className?: string + title?: VueNode + fixed?: boolean | 'left' | 'right' + hasParent?: boolean // 等于 react 版本的 isLeaf 属性,由于 ant-design-vue 会默认给 isLeaf 属性赋值,这里需要一个额外的属性来处理 +}> = ({ columnKey, hasParent, title, className, fixed }) => { + const intl = useIntl() + const dom = ( + + + + + + + + + + + + ) + return ( + +
{title}
+ {!hasParent ? dom : null} +
+ ) +} + +const CheckboxList = defineComponent({ + name: 'CheckboxList', + props: { + list: { + type: Array as PropType<(ProColumns & { index?: number })[]>, + default: undefined + }, + className: { type: String, default: undefined }, + title: { type: String, default: undefined }, + draggable: { type: Boolean, default: undefined }, + checkable: { type: Boolean, default: undefined }, + showTitle: { type: Boolean, default: true }, + listHeight: { type: Number, default: 280 } + }, + setup(props) { + const { columnsMap, setColumnsMap, sortKeyColumns, setSortKeyColumns } = useContainer()! + const show = computed(() => props.list && props.list.length > 0) + const treeDataConfig = computed(() => { + if (!show.value) return {} + const checkedKeys: string[] = [] + + const loopData = (data: any[], parentConfig?: ColumnsState): DataNode[] => + data.map(({ key, children, ...rest }) => { + const columnKey = genColumnKey(key, rest.index) + const config = columnsMap.value[columnKey || 'null'] || { show: true } + if (config.show !== false && parentConfig?.show !== false && !children) { + checkedKeys.push(columnKey) + } + const item: DataNode = { + key: columnKey, + ...omit(rest, ['className']), + selectable: false, + disabled: config.disable === true, + disableCheckbox: + typeof config.disable === 'boolean' ? config.disable : config.disable?.checkbox, + hasParent: parentConfig ? true : undefined + } + if (children) { + item.children = loopData(children, config) + } + return item + }) + return { list: loopData(props.list as any), keys: checkedKeys } + }) + + /** 移动到指定的位置 */ + const move = (id: VueKey, targetId: VueKey, dropPosition: number) => { + const newMap = { ...columnsMap.value } + // @ts-ignore + const newColumns = [...sortKeyColumns.value] + const findIndex = newColumns.findIndex(columnKey => columnKey === id) + const targetIndex = newColumns.findIndex(columnKey => columnKey === targetId) + const isDownWord = dropPosition > findIndex + if (findIndex < 0) return + const targetItem = newColumns[findIndex] + newColumns.splice(findIndex, 1) + if (dropPosition === 0) { + newColumns.unshift(targetItem) + } else { + newColumns.splice(isDownWord ? targetIndex : targetIndex + 1, 0, targetItem) + } + // 重新生成排序数组 + newColumns.forEach((key, order) => { + newMap[key] = { ...(newMap[key] || {}), order } + }) + // 更新数组 + setColumnsMap(newMap) + setSortKeyColumns(newColumns) + } + + /** 选中反选功能 */ + const onCheckTree = (e: any) => { + const columnKey = e.node.key + const newSetting = { ...columnsMap.value[columnKey] } + + newSetting.show = e.checked + + setColumnsMap({ + ...columnsMap.value, + [columnKey]: newSetting + }) + } + + return () => { + if (!show.value) { + return null + } + + const listDom = ( + 1 + } + checkable={props.checkable} + onDrop={info => { + const dropKey = info.node.key + const dragKey = info.dragNode.key + const { dropPosition, dropToGap } = info + const position = dropPosition === -1 || !dropToGap ? dropPosition + 1 : dropPosition + move(dragKey, dropKey, position) + }} + blockNode + onCheck={(_, e) => onCheckTree(e)} + checkedKeys={treeDataConfig.value.keys} + showLine={false} + height={props.listHeight} + treeData={treeDataConfig.value.list} + > + {{ + title: (_node: DataNode) => { + const node = { ..._node, children: undefined } + return + } + }} + + ) + + return ( + <> + {props.showTitle && {props.title}} + {listDom} + + ) + } + } +}) + +const GroupCheckboxList: FunctionalComponent<{ + localColumns: (ProColumns & { index?: number })[] + className?: string + draggable: boolean + checkable: boolean + listsHeight?: number +}> = ({ localColumns, className, draggable, checkable, listsHeight }) => { + const rightList: (ProColumns & { index?: number })[] = [] + const leftList: (ProColumns & { index?: number })[] = [] + const list: (ProColumns & { index?: number })[] = [] + const intl = useIntl() + + localColumns.forEach(item => { + /** 不在 setting 中展示的 */ + if (item.hideInSetting) { + return + } + const { fixed } = item + if (fixed === 'left') { + leftList.push(item) + return + } + if (fixed === 'right') { + rightList.push(item) + return + } + list.push(item) + }) + + const showRight = rightList && rightList.length > 0 + const showLeft = leftList && leftList.length > 0 + return ( +
+ + {/* 如果没有任何固定,不需要显示title */} + + +
+ ) +} + +const ColumnSetting: FunctionalComponent = ( + props: ColumnSettingProps, + { slots } +) => { + const columnRef = ref({}) + const counter = useContainer()! + const localColumns: TableColumnType & + { + index?: number + fixed?: any + key?: any + }[] = props.columns + const { checkedReset = true } = props + const { columnsMap, setColumnsMap, clearPersistenceStorage } = counter + + watchEffect(() => { + if (counter.propsRef.value?.columnsState?.value) { + columnRef.value = JSON.parse( + JSON.stringify(counter.propsRef.value?.columnsState?.value || {}) + ) + } + }) + + /** + * 设置全部选中,或全部未选中 + * + * @param show + */ + const setAllSelectAction = (show = true) => { + const columnKeyMap = {} + const loopColumns = (columns: any) => { + columns.forEach(({ key, fixed, index, children }: any) => { + const columnKey = genColumnKey(key, index) + if (columnKey) { + // @ts-ignore + columnKeyMap[columnKey] = { + show, + fixed + } + } + if (children) { + loopColumns(children) + } + }) + } + loopColumns(localColumns) + setColumnsMap(columnKeyMap) + } + + /** 全选和反选 */ + const checkedAll = (e: CheckboxChangeEvent) => { + if (e.target.checked) { + setAllSelectAction() + } else { + setAllSelectAction(false) + } + } + + /** 重置项目 */ + const clearClick = () => { + clearPersistenceStorage?.() + setColumnsMap(columnRef.value) + } + + // 未选中的 key 列表 + const unCheckedKeys = computed(() => + Object.values(columnsMap.value).filter( + // @ts-ignore + value => !value || value.show === false + ) + ) + + // 是否已经选中 + const indeterminate = computed( + () => unCheckedKeys.value.length > 0 && unCheckedKeys.value.length !== localColumns.length + ) + + const intl = useIntl() + const className = getPrefixCls('pro-table-column-setting') + return ( + + checkedAll(e)} + > + {intl.getMessage('tableToolBar.columnDisplay', '列展示')} + + {checkedReset ? ( + + {intl.getMessage('tableToolBar.reset', '重置')} + + ) : null} + {props?.extra ? ( + + {props.extra} + + ) : null} +
+ } + overlayClassName={`${className}-overlay`} + trigger="click" + placement="bottomRight" + content={ + + } + > + {slots.default?.() || ( + + + + )} + + ) +} + +export default ColumnSetting diff --git a/pro-components/table/components/Dropdown/index.less b/pro-components/table/components/Dropdown/index.less new file mode 100644 index 0000000..453538f --- /dev/null +++ b/pro-components/table/components/Dropdown/index.less @@ -0,0 +1,8 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-dropdown-prefix-cls: ~'@{ant-prefix}-pro-table-dropdown'; + +.@{pro-dropdown-prefix-cls} { + width: auto; +} diff --git a/pro-components/table/components/Dropdown/index.tsx b/pro-components/table/components/Dropdown/index.tsx new file mode 100644 index 0000000..727692a --- /dev/null +++ b/pro-components/table/components/Dropdown/index.tsx @@ -0,0 +1,71 @@ +import './index.less' + +import { DownOutlined, EllipsisOutlined } from '@ant-design/icons-vue' +import type { MenuItemProps } from 'ant-design-vue' +import { Dropdown, Menu, Button } from 'ant-design-vue' +import type { VueNode } from '../../../types' +import type { CSSProperties, FunctionalComponent } from 'vue' +import { getPrefixCls } from '../../../layout/RouteContext' + +interface MenuItems extends MenuItemProps { + name: VueNode + key: string + title?: string +} + +export type DropdownProps = { + menus?: MenuItems[] + onSelect?: (key: string) => void +} + +/** + * 一个简单的下拉菜单 + */ +const DropdownButton: FunctionalComponent = ( + { menus, onSelect }, + { attrs, slots } +) => { + const tempClassName = getPrefixCls('pro-table-dropdown') + const menu = ( + onSelect && onSelect(params.key as string)}> + {menus?.map(item => ( + {item.name} + ))} + + ) + return ( + + + + ) +} + +const TableDropdown: FunctionalComponent & { + Button: typeof DropdownButton +} = ({ onSelect, menus = [] }, { attrs, slots }) => { + const className = getPrefixCls('pro-table-dropdown') + const menu = ( + { + onSelect?.(params.key as string) + }} + > + {menus.map(({ key, name, ...rest }) => ( + + {name} + + ))} + + ) + return ( + + {slots.default?.() || } + + ) +} + +TableDropdown.Button = DropdownButton + +export default TableDropdown diff --git a/pro-components/table/components/Form/FormRender.tsx b/pro-components/table/components/Form/FormRender.tsx new file mode 100644 index 0000000..03e3832 --- /dev/null +++ b/pro-components/table/components/Form/FormRender.tsx @@ -0,0 +1,5 @@ +import type { BaseQueryFilterProps } from '#/form/layouts/QueryFilter' + +export type SearchConfig = BaseQueryFilterProps & { + filterType?: 'query' | 'light' +} diff --git a/pro-components/table/components/ListToolBar/HeaderMenu.tsx b/pro-components/table/components/ListToolBar/HeaderMenu.tsx new file mode 100644 index 0000000..2c3c936 --- /dev/null +++ b/pro-components/table/components/ListToolBar/HeaderMenu.tsx @@ -0,0 +1,133 @@ +import { Dropdown, Menu, Space, Tabs } from 'ant-design-vue' +import { DownOutlined } from '@ant-design/icons-vue' +import './index.less' +import type { VueKey, VueNode } from '../../../types' +import type { ExtractPropTypes, PropType } from 'vue' +import { computed, defineComponent } from 'vue' + +export type ListToolBarMenuItem = { + key: VueKey + label: VueNode + disabled?: boolean +} + +// export type ListToolBarHeaderMenuProps = { +// type?: 'inline' | 'dropdown' | 'tab' +// activeKey?: VueKey +// items?: ListToolBarMenuItem[] +// onChange?: (activeKey?: VueKey) => void +// prefixCls?: string +// } + +export const listToolBarHeaderMenuProps = () => ({ + type: { type: String as PropType<'inline' | 'dropdown' | 'tab'>, default: 'inline' }, + activeKey: { type: [String, Number] as PropType, default: undefined }, + items: { type: Array as PropType, default: () => [] }, + prefixCls: String, + onChange: { type: Function as PropType<(activeKey?: VueKey) => void> }, + 'onUpdate:activeKey': { type: Function as PropType<(key: VueKey) => void> } +}) + +export type ListToolBarHeaderMenuProps = Partial< + ExtractPropTypes> +> + +const HeaderMenu = defineComponent({ + name: 'HeaderMenu', + props: listToolBarHeaderMenuProps(), + emits: ['update:activeKey'], + setup(props, { emit }) { + const localActiveKey = ref(props.activeKey) + const setActiveKey = (key: VueKey) => { + localActiveKey.value = key + emit('update:activeKey', key) + props.onChange?.(key) + } + + if (props.items.length < 1) { + return null + } + + const activeItem = computed( + () => + props.items.find(item => { + return item.key === localActiveKey.value + }) || props.items[0] + ) + + return () => { + if (props.type === 'inline') { + return ( +
+ {props.items.map((item, index) => ( +
{ + setActiveKey(item.key) + }} + class={[ + `${props.prefixCls}-inline-menu-item`, + activeItem.value.key === item.key + ? `${props.prefixCls}-inline-menu-item-active` + : undefined + ]} + > + {item.label} +
+ ))} +
+ ) + } + + if (props.type === 'tab') { + return ( + setActiveKey(key)}> + {props.items.map(({ label, key, ...rest }, index) => { + return + })} + + ) + } + + const menuItemDomes = props.items.map((item, index) => { + if ( + typeof item.label === 'undefined' || + typeof item.label === 'boolean' || + typeof item.label === 'string' + ) { + return + } + return ( + + {{ title: () => item.label }} + + ) + }) + + return ( +
+ { + setActiveKey(item.key) + }} + > + {menuItemDomes} + + } + > + + {activeItem.value.label} + + + +
+ ) + } + } +}) + +export default HeaderMenu diff --git a/pro-components/table/components/ListToolBar/index.less b/pro-components/table/components/ListToolBar/index.less new file mode 100644 index 0000000..c0e9179 --- /dev/null +++ b/pro-components/table/components/ListToolBar/index.less @@ -0,0 +1,121 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-list-toolbar: ~'@{ant-prefix}-pro-table-list-toolbar'; + +.@{pro-list-toolbar} { + line-height: 1; + + &-container { + display: flex; + justify-content: space-between; + padding: @padding-md 0; + &-mobile { + flex-direction: column; + } + } + + &-title { + display: flex; + align-items: center; + justify-content: flex-start; + color: @heading-color; + font-weight: 500; + font-size: @font-size-lg; + } + + &-search:not(:last-child) { + display: flex; + align-items: center; + justify-content: flex-start; + } + + &-setting-item { + margin: 0 4px; + color: @icon-color-hover; + font-size: @font-size-lg; + cursor: pointer; + + > span { + display: block; + width: 100%; + height: 100%; + } + + &:hover { + color: @primary-color-hover; + } + } + + &-left { + display: flex; + align-items: center; + justify-content: flex-start; + } + + &-right { + display: flex; + justify-content: flex-end; + } + + &-extra-line { + margin-bottom: @margin-md; + } + + &-filter { + &:not(:last-child) { + margin-right: @margin-md; + } + + display: flex; + align-items: center; + + div.@{ant-prefix}-pro-table-search { + margin: 0; + padding: 0; + } + } + + &-inline-menu-item { + display: inline-block; + margin-right: @margin-lg; + cursor: pointer; + opacity: 0.75; + + &-active { + font-weight: bold; + opacity: 1; + } + } + &-dropdownmenu-label { + font-weight: bold; + font-size: @font-size-lg; + text-align: center; + cursor: pointer; + } + + .@{ant-prefix}-tabs-top > .@{ant-prefix}-tabs-nav { + &::before { + border-bottom: 0; + } + margin-bottom: 0; + .@{ant-prefix}-tabs-nav-list { + margin-top: 0; + .@{ant-prefix}-tabs-tab { + padding-top: 0; + } + } + } +} + +@media (max-width: 575px) { + .@{pro-list-toolbar} { + &-container { + display: flex; + flex-wrap: wrap; + } + &-left { + margin-bottom: 16px; + } + } +} diff --git a/pro-components/table/components/ListToolBar/index.tsx b/pro-components/table/components/ListToolBar/index.tsx new file mode 100644 index 0000000..59c670d --- /dev/null +++ b/pro-components/table/components/ListToolBar/index.tsx @@ -0,0 +1,295 @@ +import type { TabPaneProps } from 'ant-design-vue' +import { Tooltip, Space, Tabs } from 'ant-design-vue' +import type { ListToolBarHeaderMenuProps } from './HeaderMenu' +import HeaderMenu from './HeaderMenu' + +import './index.less' +import type { CSSProperties, FunctionalComponent } from 'vue' +import type { VueKey, VueNode } from '#/types' +import useMediaQuery from '../../../utils/hooks/useMediaQuery' +import type { LabelTooltipType, SearchProps } from '../../typing' +import { getPrefixCls } from '#/layout/RouteContext' +import { computed } from 'vue' +import LabelIconTip from '../../../utils/components/LabelIconTip' +import { isValidElement } from '#/utils/isValidElement' + +export type ListToolBarSetting = { + icon: VueNode + tooltip?: LabelTooltipType | string + key?: string + onClick?: (key?: string) => void +} + +/** Antd 默认直接导出了 rc 组件中的 Tab.Pane 组件。 */ +type TabPane = TabPaneProps & { + key?: string +} + +export type ListToolBarTabs = { + activeKey?: string + onChange?: (activeKey: VueKey) => void + items?: TabPane[] +} + +export type ListToolBarMenu = ListToolBarHeaderMenuProps + +type SearchPropType = SearchProps | VueNode | boolean +type SettingPropType = VueNode | ListToolBarSetting + +export type ListToolBarProps = { + prefixCls?: string + /** 标题 */ + title?: VueNode + /** 副标题 */ + subTitle?: VueNode + /** 标题提示 */ + tooltip?: string | LabelTooltipType + /** 搜索输入栏相关配置 */ + search?: SearchPropType + /** 搜索回调 */ + onSearch?: (keyWords: string) => void + /** 工具栏右侧操作区 */ + actions?: VueNode[] + /** 工作栏右侧设置区 */ + settings?: SettingPropType[] + /** 是否多行展示 */ + multipleLine?: boolean + /** 过滤区,通常配合 LightFilter 使用 */ + filter?: VueNode + /** 标签页配置,仅当 `multipleLine` 为 true 时有效 */ + tabs?: ListToolBarTabs + /** 菜单配置 */ + menu?: ListToolBarMenu +} + +/** + * 获取配置区域 DOM Item + * + * @param setting 配置项 + */ +function getSettingItem(setting: SettingPropType) { + if (isValidElement(setting)) { + return setting + } + if (setting) { + const settingConfig: ListToolBarSetting = setting as ListToolBarSetting + const { icon, tooltip, onClick, key } = settingConfig + if (icon && tooltip) { + return ( + + { + if (onClick) { + onClick(key) + } + }} + > + {icon} + + + ) + } + return icon + } + return null +} + +const ListToolBarTabBar: FunctionalComponent<{ + prefixCls: string + filtersNode: VueNode + multipleLine: boolean + tabs: ListToolBarProps['tabs'] +}> = ({ prefixCls, tabs = {}, multipleLine, filtersNode }) => { + if (!multipleLine) return null + return ( +
+ {tabs.items && tabs.items.length ? ( + + {tabs.items.map((tab, index) => ( + + ))} + + ) : ( + filtersNode + )} +
+ ) +} +const ListToolBar: FunctionalComponent = ( + { + prefixCls: customizePrefixCls, + title, + subTitle, + tooltip, + // search, + // onSearch, + multipleLine = false, + filter, + actions = [], + settings = [], + tabs = {}, + menu + }, + { attrs } +) => { + // const intl = useIntl() + + const colSize = useMediaQuery() + + const isMobile = computed(() => colSize.value === 'sm' || colSize.value === 'xs') + + // const placeholder = intl.getMessage('tableForm.inputPlaceholder', '请输入') + + /** + * 获取搜索栏 DOM + * + * @param search 搜索框相关配置 + */ + const searchNode = null + // const searchNode = useMemo(() => { + // if (!search) { + // return null + // } + // if (React.isValidElement(search)) { + // return search + // } + // return ( + // { + // onSearch?.(restParams?.[0]) + // ;(search as SearchProps).onSearch?.(...restParams) + // }} + // /> + // ) + // }, [placeholder, onSearch, search]) + + const prefixCls = getPrefixCls('pro-table-list-toolbar', customizePrefixCls) + + /** 轻量筛选组件 */ + const filtersNode = computed(() => { + if (filter) return
{filter}
+ return null + }) + + /** 有没有 title,需要结合多个场景判断 */ + const hasTitle = computed(() => menu || title || subTitle || tooltip) + + /** 没有 key 的时候帮忙加一下 key 不加的话很烦人 */ + const actionDom = computed(() => { + if (!Array.isArray(actions)) { + return actions + } + if (actions.length < 1) { + return null + } + return {actions} + }) + + const hasRight = computed(() => { + return ( + (hasTitle.value && searchNode) || + (!multipleLine && filtersNode) || + actionDom || + settings?.length + ) + }) + + const hasLeft = computed( + () => tooltip || title || subTitle || menu || (!hasTitle.value && searchNode) + ) + + const leftTitleDom = computed(() => { + // 保留dom是为了占位,不然 right 就变到左边了 + if (!hasLeft.value && hasRight.value) { + return
+ } + + // 减少 space 的dom,渲染的时候能节省点性能 + if (!menu && (hasTitle.value || !searchNode)) { + return ( +
+
+ +
+
+ ) + } + return ( + + {hasTitle.value && !menu && ( +
+ +
+ )} + {menu && } + {!hasTitle.value && searchNode ? ( +
{searchNode}
+ ) : null} +
+ ) + }) + + const rightTitleDom = computed(() => { + if (!hasRight.value) return null + return ( + + {hasTitle.value && searchNode ? ( +
{searchNode}
+ ) : null} + {!multipleLine ? filtersNode.value : null} + {actionDom.value} + {settings?.length ? ( + + {settings.map((setting, index) => { + const settingItem = getSettingItem(setting) + return ( +
+ {settingItem} +
+ ) + })} +
+ ) : null} +
+ ) + }) + + const titleNode = computed(() => { + if (!hasRight.value && !hasLeft.value) return null + const containerClassName = [ + `${prefixCls}-container`, + { + [`${prefixCls}-container-mobile`]: isMobile.value + } + ] + return ( +
+ {leftTitleDom.value} + {rightTitleDom.value} +
+ ) + }) + + return ( +
+ {titleNode.value} + +
+ ) +} + +export default ListToolBar diff --git a/pro-components/table/components/ToolBar/DensityIcon.tsx b/pro-components/table/components/ToolBar/DensityIcon.tsx new file mode 100644 index 0000000..33396bd --- /dev/null +++ b/pro-components/table/components/ToolBar/DensityIcon.tsx @@ -0,0 +1,45 @@ +import { Menu, Dropdown, Tooltip } from 'ant-design-vue' +import 'ant-design-vue/es/menu/style/index.less' +import 'ant-design-vue/es/dropdown/style/index.less' +import 'ant-design-vue/es/tooltip/style/index.less' +import { ColumnHeightOutlined } from '@ant-design/icons-vue' + +import { useIntl } from '#/provider' +import { useContainer } from '#/table/container' + +export type DensitySize = 'middle' | 'small' | 'large' | undefined + +const DensityIcon = () => { + const counter = useContainer()! + const intl = useIntl() + + const largeTitle = intl.getMessage('tableToolBar.densityLarger', '默认') + const middleTitle = intl.getMessage('tableToolBar.densityMiddle', '中等') + const smallTitle = intl.getMessage('tableToolBar.densitySmall', '紧凑') + return ( + { + counter.setTableSize?.(key as DensitySize) + }} + style={{ + width: 80 + }} + > + {largeTitle} + {middleTitle} + {smallTitle} + + } + trigger={['click']} + > + + + + + ) +} + +export default DensityIcon diff --git a/pro-components/table/components/ToolBar/FullscreenIcon.tsx b/pro-components/table/components/ToolBar/FullscreenIcon.tsx new file mode 100644 index 0000000..de6c3e3 --- /dev/null +++ b/pro-components/table/components/ToolBar/FullscreenIcon.tsx @@ -0,0 +1,29 @@ +import { FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons-vue' +import { Tooltip } from 'ant-design-vue' +import { useIntl } from '#/provider' +import { useToggle } from '@vueuse/core' +import { watchEffect } from 'vue' + +const FullScreenIcon = () => { + const intl = useIntl() + const [fullscreen, setFullscreen] = useToggle(false) + watchEffect(() => { + // if (!isBrowser()) { + // return + // } + document.onfullscreenchange = () => { + setFullscreen(!!document.fullscreenElement) + } + }) + return fullscreen.value ? ( + + + + ) : ( + + + + ) +} + +export default FullScreenIcon diff --git a/pro-components/table/components/ToolBar/index.less b/pro-components/table/components/ToolBar/index.less new file mode 100644 index 0000000..4ac7858 --- /dev/null +++ b/pro-components/table/components/ToolBar/index.less @@ -0,0 +1,76 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; +@import '../../index'; + +.@{pro-table-prefix-cls}-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + height: 64px; + padding: 0 24px; + + &-option { + display: flex; + align-items: center; + justify-content: flex-end; + } + + &-title { + flex: 1; + color: @label-color; + font-weight: 500; + font-size: 16px; + line-height: 24px; + opacity: 0.85; + } +} + +@media (max-width: @screen-xs) { + .@{pro-table-prefix-cls} { + .ant-table { + width: 100%; + overflow-x: auto; + &-thead > tr, + &-tbody > tr { + > th, + > td { + white-space: pre; + > span { + display: block; + } + } + } + } + } +} + +@media (max-width: 575px) { + .@{pro-table-prefix-cls}-toolbar { + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + height: auto; + margin-bottom: 16px; + margin-left: 16px; + padding: 8px; + padding-top: 16px; + line-height: normal; + + &-title { + margin-bottom: 16px; + } + + &-option { + display: flex; + justify-content: space-between; + width: 100%; + } + + &-default-option { + display: flex; + flex: 1; + align-items: center; + justify-content: flex-end; + } + } +} diff --git a/pro-components/table/components/ToolBar/index.tsx b/pro-components/table/components/ToolBar/index.tsx new file mode 100644 index 0000000..d6df10a --- /dev/null +++ b/pro-components/table/components/ToolBar/index.tsx @@ -0,0 +1,338 @@ +import { ReloadOutlined, SettingOutlined } from '@ant-design/icons-vue' +import type { TableColumnType } from 'ant-design-vue' +import { Tooltip } from 'ant-design-vue' +import type { ListToolBarProps } from '../ListToolBar' +import ListToolBar from '../ListToolBar' +// import ColumnSetting from '../ColumnSetting' +import './index.less' +import FullScreenIcon from './FullscreenIcon' +import DensityIcon from './DensityIcon' +import type { ActionType, ProTableProps, OptionSearchProps, LabelTooltipType } from '../../typing' +import { useIntl } from '#/provider' +import type { IntlType } from '#/provider' +import { VueNodeOrRenderPropType, VueNodePropType } from '#/types' +import type { VueKey, VueNode, VueNodeOrRender } from '#/types' +import { computed, defineComponent, watchEffect } from 'vue' +import type { ExtractPropTypes, PropType, Ref } from 'vue' +import type { ChangeEvent } from 'ant-design-vue/es/_util/EventInterface' +import omitUndefined from '../../../utils/omitUndefined' +import { useContainer } from '#/table/container' +import { getRender } from '#/layout/utils' +import type { ToolBarRender } from '#/table/renderTypes' +import ColumnSetting from '#/table/components/ColumnSetting' + +export type SettingOptionType = { + draggable?: boolean + checkable?: boolean + checkedReset?: boolean + listsHeight?: number + extra?: VueNode + children?: VueNode +} + +export type OptionConfig = { + density?: boolean + fullScreen?: OptionsType + reload?: OptionsType + setting?: boolean | SettingOptionType + search?: (OptionSearchProps & { name?: string }) | boolean +} + +export type OptionsFunctionType = (e: MouseEvent, action?: ActionType) => void + +export type OptionsType = OptionsFunctionType | boolean + +export const toolBarProps = () => ({ + headerTitle: VueNodeOrRenderPropType as PropType, + tooltip: [String, Object] as PropType, + toolbar: Object as PropType, + toolBarRender: Function as PropType, + action: { + type: Object as PropType>, + default: () => ref({}) + }, + options: { + type: [Object, Boolean] as PropType, + default: undefined + }, + selectedRowKeys: { + type: Array as PropType, + default: () => [] + }, + selectedRows: { + type: Array as PropType + }, + onSearch: Function as PropType<(keyWords: string) => void>, + columns: { + type: Array as PropType[]>, + default: () => [] + } +}) + +export type ToolBarProps = { + headerTitle?: VueNode + tooltip?: string | LabelTooltipType + toolbar?: ListToolBarProps + toolBarRender?: ToolBarRender + action: Ref + options?: OptionConfig | false + selectedRowKeys?: (string | number)[] + selectedRows?: T[] + onSearch?: (keyWords: string) => void + columns: TableColumnType[] +} + +function getButtonText({ + intl +}: OptionConfig & { + intl: IntlType +}) { + return { + reload: { + text: intl.getMessage('tableToolBar.reload', '刷新'), + icon: + }, + density: { + text: intl.getMessage('tableToolBar.density', '表格密度'), + icon: + }, + setting: { + text: intl.getMessage('tableToolBar.columnSetting', '列设置'), + icon: + }, + fullScreen: { + text: intl.getMessage('tableToolBar.fullScreen', '全屏'), + icon: + } + } +} + +/** + * 渲染默认的 工具栏 + */ +function renderDefaultOption( + options: OptionConfig, + defaultOptions: OptionConfig & { + intl: IntlType + }, + actions: Ref, + columns: TableColumnType[] +) { + return Object.keys(options) + .filter(item => item) + .map(key => { + // @ts-ignore + const value = options[key] + if (!value) { + return null + } + + let onClick: OptionsFunctionType = + // @ts-ignore + value === true ? defaultOptions[key] : event => value?.(event, actions.value) + + if (typeof onClick !== 'function') { + onClick = () => ({}) + } + + if (key === 'setting') { + // @ts-ignore + return + } + if (key === 'fullScreen') { + return ( + + + + ) + } + // @ts-ignore + const optionItem = getButtonText(defaultOptions)[key] + if (optionItem) { + return ( + + {optionItem.icon} + + ) + } + return null + }) + .filter(item => item) +} + +// eslint-disable-next-line vue/one-component-per-file +const ToolBar = defineComponent({ + name: 'ToolBar', + props: toolBarProps(), + setup(props, { slots }) { + const counter = useContainer()! + + const intl = useIntl() + + const defaultOptions = computed(() => ({ + reload: () => props.action?.value?.reload(), + density: true, + setting: true, + search: false, + fullScreen: () => props.action?.value?.fullScreen?.() + })) + + const searchConfig = computed(() => { + if (!props.options) { + return false + } + if (!props.options.search) return false + + /** 受控的value 和 onChange */ + const defaultSearchConfig = { + value: counter.keyWords.value, + onChange: (e: ChangeEvent) => counter.setKeyWords(e.target.value) + } + + if (props.options.search === true) return defaultSearchConfig + + return { + ...defaultSearchConfig, + ...props.options.search + } + }) + + watchEffect(() => { + if (counter.keyWords === undefined) { + props.onSearch?.('') + } + }) + + const optionDom = computed(() => { + if (props.options === false) { + return [] + } + + const options = { + ...defaultOptions.value, + fullScreen: true, + ...props.options + } + + return renderDefaultOption( + options, + { + ...defaultOptions.value, + intl + }, + props.action, + props.columns + ) + }) + + // 操作列表 + const actions = computed(() => { + const toolBarRender = getRender(props, slots, 'toolBarRender') + return toolBarRender + ? toolBarRender(props.action.value, { + selectedRowKeys: props.selectedRowKeys, + selectedRows: props.selectedRows + }) + : [] + }) + + const titleDom = computed(() => { + const headerRender = getRender(props, slots, 'headerTitle') + if (typeof headerRender === 'function') { + // @ts-ignore + return headerRender() + } else { + return headerRender + } + }) + + return () => ( + + ) + } +}) + +const toolbarRenderProps = () => ({ + hideToolbar: { type: Boolean, default: false }, + onFormSearchSubmit: Function as PropType<(params: any) => void>, + searchNode: VueNodePropType as PropType, + tableColumn: { type: Array as PropType, default: () => [] }, + tooltip: [String, Object] as PropType, + selectedRows: Array as PropType, + selectedRowKeys: Array as PropType, + headerTitle: VueNodeOrRenderPropType as PropType, + toolbar: Object as PropType, + options: [Object, Boolean] as PropType, + toolBarRender: Function as PropType, + actionRef: Object as PropType> +}) + +export type ToolbarRenderProps = Partial>> + +/** 这里负责与table交互,并且减少 render次数 */ +// eslint-disable-next-line vue/one-component-per-file +const ToolbarRender = defineComponent({ + name: 'ToolbarRender', + props: toolbarRenderProps(), + setup(props, { slots }) { + const onSearch = (keyword: string) => { + if (!props.options || !props.options.search) { + return + } + const { name = 'keyword' } = props.options.search === true ? {} : props.options.search + + /** 如果传入的 onSearch 返回值为 false,应该直接拦截请求 */ + const success = (props.options.search as OptionSearchProps)?.onSearch?.(keyword) + + if (success === false) return + + // 查询的时候的回到第一页 + props.actionRef?.value?.setPageInfo?.({ + current: 1 + }) + + props.onFormSearchSubmit?.( + omitUndefined({ + _timestamp: Date.now(), + [name]: keyword + }) + ) + } + + return () => { + // 不展示 toolbar + if (props.hideToolbar) { + return null + } + return ( + + {slots} + + ) + } + } +}) + +export default ToolbarRender diff --git a/pro-components/table/container.ts b/pro-components/table/container.ts new file mode 100644 index 0000000..9a9ed93 --- /dev/null +++ b/pro-components/table/container.ts @@ -0,0 +1,173 @@ +import { createInjectionState } from '@vueuse/shared' +import { computed, ref, toRef, watch, watchEffect } from 'vue' +import type { TableColumnType } from 'ant-design-vue' +import type { DensitySize } from './components/ToolBar/DensityIcon' +import type { ActionType, ProTableProps } from './typing' +import index from '../utils/hooks/useMergedState' +import { genColumnKey } from './utils' +import type { VueKey } from '#/types' + +export type ColumnsState = { + show?: boolean + fixed?: 'right' | 'left' | undefined + order?: number + disable?: + | boolean + | { + checkbox: boolean + } +} + +export type ProTableColumn = ColumnsState & TableColumnType + +export type UseContainerProps = { + onColumnsStateChange?: (map: Record) => void + size?: DensitySize + defaultSize?: DensitySize + onSizeChange?: (size: DensitySize) => void + columns?: ProTableColumn[] + columnsState?: ProTableProps['columnsState'] +} + +const createContainer = (props: UseContainerProps = {}) => { + const actionRef = ref() + const rootDomRef = ref() + /** 父 form item 的 name */ + const prefixNameRef = ref() + + /** 自己 props 的引用 */ + const propsRef = ref() + + /** 可编辑表格的formRef */ + // const editableFormRef = ref>() + + // 共享状态比较难,就放到这里了 + const keyWords = ref('') + // 用于排序的数组 + const sortKeyColumns = ref([]) + + const propsSize = toRef(props, 'size') + const [tableSize, setTableSize] = index(propsSize, { + defaultValue: props.size || props.defaultSize || 'middle', + onChange: props.onSizeChange + }) + + /** 默认全选中 */ + const defaultColumnKeyMap = computed(() => { + const columnKeyMap = {} + props.columns?.forEach(({ key, dataIndex, fixed, disable }, index) => { + const columnKey = genColumnKey(key ?? (dataIndex as VueKey), index) + if (columnKey) { + // @ts-ignore + columnKeyMap[columnKey] = { + show: true, + fixed, + disable + } + } + }) + return columnKeyMap + }) + + const getColumnsMap = () => { + const { persistenceType, persistenceKey } = props.columnsState || {} + + if (persistenceKey && persistenceType && typeof window !== 'undefined') { + /** 从持久化中读取数据 */ + const storage = window[persistenceType] + try { + const storageValue = storage?.getItem(persistenceKey) + if (storageValue) { + return JSON.parse(storageValue) + } + } catch (error) { + console.warn(error) + } + } + + return ( + props.columnsState?.value || props.columnsState?.defaultValue || defaultColumnKeyMap.value + ) + } + const columnsMap = ref(getColumnsMap()) + + const clearPersistenceStorage = () => { + /** 清空一下当前的 key */ + const { persistenceType, persistenceKey } = props.columnsState || {} + + if (!persistenceKey || !persistenceType || typeof window === 'undefined') return + + /** 给持久化中设置数据 */ + const storage = window[persistenceType] + try { + storage?.removeItem(persistenceKey) + } catch (error) { + console.error(error) + } + } + + watch( + () => columnsMap.value, + value => { + const onChange = props.columnsState?.onChange || props.onColumnsStateChange + onChange?.(value) + clearPersistenceStorage() + } + ) + + watchEffect(() => { + if (!props.columnsState?.persistenceKey || !props.columnsState?.persistenceType) { + return + } + if (typeof window === 'undefined') return + /** 给持久化中设置数据 */ + const { persistenceType, persistenceKey } = props.columnsState + const storage = window[persistenceType] + try { + storage?.setItem(persistenceKey, JSON.stringify(columnsMap.value)) + } catch (error) { + console.error(error) + } + }) + + const renderValue = { + actionRef: actionRef, + setAction: (newAction?: ActionType) => { + actionRef.value = newAction + }, + sortKeyColumns, + setSortKeyColumns: (keys: string[]) => { + sortKeyColumns.value = keys + }, + propsRef: propsRef, + columnsMap, + setColumnsMap: (newColumnsMap: Record) => { + columnsMap.value = newColumnsMap + }, + keyWords: keyWords, + setKeyWords: (k: string | undefined) => (keyWords.value = k), + setTableSize, + tableSize: tableSize, + prefixName: prefixNameRef, + setPrefixName: (name: any) => { + prefixNameRef.value = name + }, + // setEditorTableForm: (form: ProFormInstance) => { + // editableFormRef.current = form + // }, + // editableForm: editableFormRef.current, + columns: props.columns, + rootDomRef, + clearPersistenceStorage + } + + return renderValue +} + +export type CounterType = ReturnType + +const [useProvideContainer, useContainer] = createInjectionState(createContainer) + +export { useProvideContainer } +// If you want to hide `useCounterStore` and wrap it in default value logic or throw error logic, please don't export `useCounterStore` +export { useContainer } diff --git a/pro-components/table/index.less b/pro-components/table/index.less new file mode 100644 index 0000000..e80fbc1 --- /dev/null +++ b/pro-components/table/index.less @@ -0,0 +1,66 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-table-prefix-cls: ~'@{ant-prefix}-pro-table'; + +.pro-table-tooltip-text span { + color: @component-background; +} + +.@{pro-table-prefix-cls} { + z-index: 1; + + &:not(:root):fullscreen { + min-height: 100vh; + overflow: auto; + background: @component-background; + } + + &-extra { + margin-bottom: 16px; + } + + &-polling { + .@{pro-table-prefix-cls}-list-toolbar-setting-item { + .anticon.anticon-reload { + transform: rotate(0deg); + animation: turn 1s linear infinite; + } + } + } + + td.@{ant-prefix}-table-cell { + > a { + font-size: @font-size-base; + } + } + + .@{ant-prefix}-table + .@{ant-prefix}-table-tbody + .@{ant-prefix}-table-wrapper:only-child + .@{ant-prefix}-table { + margin: 0; + } + + .@{ant-prefix}-table.@{ant-prefix}-table-middle .@{pro-table-prefix-cls} { + margin: -12px -8px; + } +} + +@keyframes turn { + 0% { + transform: rotate(0deg); + } + 25% { + transform: rotate(90deg); + } + 50% { + transform: rotate(180deg); + } + 75% { + transform: rotate(270deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/pro-components/table/index.tsx b/pro-components/table/index.tsx new file mode 100644 index 0000000..1b4432c --- /dev/null +++ b/pro-components/table/index.tsx @@ -0,0 +1,6 @@ +import ProTable from './Table' + +export * from './Table' +export * from './typing' + +export default ProTable diff --git a/pro-components/table/renderTypes.ts b/pro-components/table/renderTypes.ts new file mode 100644 index 0000000..fdc3372 --- /dev/null +++ b/pro-components/table/renderTypes.ts @@ -0,0 +1,10 @@ +import type { ActionType } from './typing' +import type { VueNode } from '#/types' + +export type ToolBarRender = ( + action: ActionType | undefined, + rows: { + selectedRowKeys?: (string | number)[] + selectedRows?: T[] + } +) => VueNode[] diff --git a/pro-components/table/typing.ts b/pro-components/table/typing.ts new file mode 100644 index 0000000..6a2e507 --- /dev/null +++ b/pro-components/table/typing.ts @@ -0,0 +1,535 @@ +import type { SpinProps } from 'ant-design-vue/lib/spin' +import type { TableProps } from 'ant-design-vue/lib/table' + +import type { + ColumnFilterItem, + ColumnType, + CompareFn, + SortOrder +} from 'ant-design-vue/lib/table/interface' +import type { ComputedRef, CSSProperties, ExtractPropTypes, PropType, Ref } from 'vue' +import type { AlertRenderType } from './components/Alert' +import type { ListToolBarProps } from './components/ListToolBar' +import type { OptionConfig, ToolBarProps } from './components/ToolBar' +import type { DensitySize } from './components/ToolBar/DensityIcon' +import type { ColumnsState, CounterType } from './container' +import type { SizeType } from 'ant-design-vue/lib/config-provider/context' + +import type { TooltipProps } from 'ant-design-vue/es/tooltip' +import type { VueKey, VueNode, VueNodeOrRender } from '#/types' +import type { CardProps, InputProps } from 'ant-design-vue' +import type { ChangeEvent } from 'ant-design-vue/es/_util/EventInterface' +import { tableProps } from 'ant-design-vue/es/table' +import type { WithFalse } from '#/layout/types' +import { VueNodeOrRenderPropType } from '#/types' +import omit from 'ant-design-vue/es/_util/omit' +import type { ProFieldEmptyText } from '#/field' +import type { LightWrapperProps } from '#/form/BaseForm/LightWrapper' +import type { SearchConfig } from '#/table/components/Form/FormRender' +import type { + ProCoreActionType, + ProSchema, + ProSchemaComponentTypes, + ProTableEditableFnType, + SearchTransformKeyFn +} from '#/utils/typing' +import type { ApiResult } from '@/api/types' + +export type WrapperTooltipProps = TooltipProps & { + icon?: VueNode +} +export type LabelTooltipType = WrapperTooltipProps | VueNode + +export interface SearchProps extends InputProps { + inputPrefixCls?: string + onSearch?: (value: string, event?: ChangeEvent | MouseEvent | KeyboardEvent) => void + // enterButton?: VueNode // vue 暂时不支持 注释 + loading?: boolean +} + +export type PageInfo = { + pageSize: number + total: number + current: number +} + +export type PageResult = { + records: T[] + total: number +} + +export type RequestData = ApiResult> + +export type UseFetchDataAction = { + dataSource: T[] + setDataSource: (dataSource: T[]) => void + loading: boolean | SpinProps | undefined + pageInfo: PageInfo + reload: () => Promise + fullScreen?: () => void + reset: () => void + pollingLoading: boolean + setPageInfo: (pageInfo: Partial) => void +} + +/** 转化列的定义 */ +export type ColumnRenderInterface = { + item: ProColumns + text: any + row: T + index: number + columnEmptyText?: ProFieldEmptyText + type: ProSchemaComponentTypes + counter: CounterType +} + +export type TableRowSelection = TableProps['rowSelection'] + +export type ExtraProColumnType = Omit< + ColumnType, + 'render' | 'children' | 'title' | 'filters' | 'onFilter' | 'sorter' +> & { + sorter?: + | string + | boolean + | CompareFn + | { + compare?: CompareFn + /** Config multiple sorter order priority */ + multiple?: number + } +} + +export type ProColumnType = ProSchema< + T, + ExtraProColumnType & { + index?: number + /** + * 每个表单占据的格子大小 + * + * @param 总宽度 = span* colSize + * @param 默认为 1 + */ + colSize?: number + + /** 搜索表单的默认值 */ + initialValue?: any + + /** 是否缩略 */ + ellipsis?: boolean | { showTitle?: boolean } + /** 是否拷贝 */ + copyable?: boolean + + /** @deprecated Use `search=false` instead 在查询表单中隐藏 */ + hideInSearch?: boolean + + /** 在查询表单中隐藏 */ + search?: + | false + | { + /** + * Transform: (value: any) => ({ startTime: value[0], endTime: value[1] }), + * + * 转化值的key, 一般用于事件区间的转化 + */ + transform: SearchTransformKeyFn + } + + /** 在 table 中隐藏 */ + hideInTable?: boolean + + /** 在新建表单中删除 */ + hideInForm?: boolean + + /** 不在配置工具中显示 */ + hideInSetting?: boolean + + /** 表头的筛选菜单项 */ + filters?: boolean | ColumnFilterItem[] + + /** 筛选的函数,设置为 false 会关闭自带的本地筛选 */ + onFilter?: boolean | ColumnType['onFilter'] + + /** Form 的排序 */ + order?: number + + /** 可编辑表格是否可编辑 */ + editable?: boolean | ProTableEditableFnType + + /** @private */ + listKey?: string + + /** 只读 */ + readonly?: boolean + + /** 列设置的 disabled */ + disable?: + | boolean + | { + checkbox: boolean + } + onCell?: any + render?: any + }, + ProSchemaComponentTypes, + ValueType, + { + lightProps?: LightWrapperProps + } +> + +export type ProColumnGroupType = { + children: ProColumns[] +} & ProColumnType + +export type ProColumns = + | ProColumnGroupType + | ProColumnType + +export type BorderedType = 'search' | 'table' + +export type Bordered = + | boolean + | { + search?: boolean + table?: boolean + } + +export type ColumnsStateType = { + /** + * 持久化的类型,支持 localStorage 和 sessionStorage + * + * @param localStorage 设置在关闭浏览器后也是存在的 + * @param sessionStorage 关闭浏览器后会丢失 + */ + persistenceType?: 'localStorage' | 'sessionStorage' + /** 持久化的key,用于存储到 storage 中 */ + persistenceKey?: string + /** ColumnsState 的值,columnsStateMap将会废弃 */ + defaultValue?: Record + /** ColumnsState 的值,columnsStateMap将会废弃 */ + value?: Record + onChange?: (map: Record) => void +} + +// 表格请求数据的方法 +export type TableRequest> = ( + params: U & { + pageSize?: number + current?: number + keyword?: string + }, + sort: Record, + filter: Record +) => Promise + +export const proTableProps = , ValueType = 'text'>() => ({ + ...omit(tableProps(), ['columns', 'rowSelection']), + + /** + * @name 列配置能力,支持一个数组 + */ + columns: { type: Array as PropType[]>, default: () => [] }, + + /** + * ListToolBar 的属性 + */ + toolbar: Object as PropType, + + /** + * 幽灵模式,即是否取消卡片内容区域的 padding 和 卡片的背景颜色。 + */ + ghost: { type: Boolean, default: false }, + + /** + * request 的参数,修改之后会触发更新 + * + * @example pathname 修改重新触发 request + * params={{ pathName }} + */ + params: { type: Object as PropType, default: () => ({}) }, + + /** + * 列状态配置修改触发事件 + * + * @deprecated 请使用 columnsState.onChange 代替 + */ + onColumnsStateChange: Function as PropType<(map: Record) => void>, + + /** 列状态的配置,可以用来操作列功能 */ + columnsState: Object as PropType, + + onSizeChange: Function as PropType<(size: DensitySize) => void>, + + /** + * table 外面卡片的设置 + */ + cardProps: { + type: [Object, Boolean] as PropType>, + default: undefined + }, + + /** + * 渲染 table + */ + tableRender: Function as PropType< + ( + props: any, + defaultDom: JSX.Element, + /** 各个区域的 dom */ + domList: { + toolbar: VueNode | undefined + alert: VueNode | undefined + table: VueNode | undefined + } + ) => VueNode + >, + + /** + * 渲染 table 视图,用于定制 ProList,不推荐直接使用 + */ + tableViewRender: Function as PropType< + (props: TableProps, defaultDom: JSX.Element) => JSX.Element | undefined + >, + + /** + * table 和搜索表单之间的 dom 渲染 + * + * @example 在table 上方增加一个统计表单 + * + * tableExtraRender={()=> } + */ + tableExtraRender: Function as PropType<(props: any, dataSource: T[]) => VueNode>, + + /** 一个获得 dataSource 的方法 */ + request: Function as PropType>, + + /** 对数据进行一些处理 */ + postData: Function as PropType<(data: any[]) => any[]>, + + /** 默认的数据 */ + defaultData: Array as PropType, + + /** + * 初始化的参数,可以操作 table + * + * @example 重新刷新表格 + * actionRef.current?.reload(); + * + * @example 重置表格 + * actionRef.current?.reset(); + */ + actionRef: Object as PropType>, + + /** + * 操作自带的 form + */ + // formRef: TableFormItem['formRef'] + + /** + * 渲染操作栏 + */ + toolBarRender: { + type: [Function, Boolean] as PropType['toolBarRender'] | false>, + default: undefined + }, + + /** + * 数据加载完成后触发 + */ + onLoad: Function as PropType<(dataSource: T[]) => void>, + + /** + * loading 被修改时触发,一般是网络请求导致的 + */ + onLoadingChange: Function as PropType<(loading: boolean | SpinProps | undefined) => void>, + + /** + * 数据加载失败时触发 + */ + onRequestError: Function as PropType<(e: Error) => void>, + + /** + * 是否轮询 ProTable 它不会自动提交表单,如果你想自动提交表单的功能,需要在 onValueChange 中调用 formRef.current?.submit() + * + * @param dataSource 返回当前的表单数据,你可以用它判断要不要打开轮询 + */ + polling: [Number, Function] as PropType number)>, + + /** 给封装的 table 的 className */ + tableClassName: String, + + /** 给封装的 table 的 style */ + tableStyle: Object as PropType, + + /** 左上角的 title */ + headerTitle: VueNodeOrRenderPropType as PropType, + + /** 标题旁边的 tooltip */ + tooltip: [String, Object] as PropType, + + /** 操作栏配置 */ + options: { type: [Object, Boolean] as PropType>, default: undefined }, + + /** + * @type SearchConfig + * 是否显示搜索表单 + */ + search: { + type: [Object, Boolean] as PropType>, + default: undefined + }, + + /** + * 基本配置与 antd Form 相同, 但是劫持了 form onFinish 的配置 + * + * type="form" 和 搜索表单 的 Form 配置 + */ + // form?: Omit + + /** + * TODO, 使用 dayjs + * + * 暂时只支持 moment - string 会格式化为 YYYY-DD-MM - number 代表时间戳 + * 如何格式化日期 + */ + // dateFormatter?: + // | 'string' + // | 'number' + // | ((value: moment.Moment, valueType: string) => string | number) + // | false + + /** 格式化搜索表单提交数据 */ + beforeSearchSubmit: Function as PropType<(params: Partial) => any>, + + /** + * 设置或者返回false 即可关闭 + * + * 自定义 table 的 alert + */ + tableAlertRender: { + type: [Object, Boolean] as PropType>, + default: undefined + }, + + /** + * 设置或者返回false 即可关闭 + * + * 自定义 table 的 alert 的操作 + */ + tableAlertOptionRender: { + type: [Object, Boolean] as PropType>, + default: undefined + }, + + /** 选择项配置 */ + rowSelection: { + type: [Object, Boolean] as PropType< + | (TableProps['rowSelection'] & { + alwaysShowAlert?: boolean + }) + | false + >, + default: false + }, + + /** 支持 ProTable 的类型 */ + // type: ProSchemaComponentTypes + + /** 提交表单时触发 */ + onSubmit: Function as PropType<(params: U) => void>, + + /** 重置表单时触发 */ + onReset: Function as PropType<() => void>, + + /** 空值时显示 */ + // columnEmptyText: ProFieldEmptyText + + /** 是否手动触发请求 */ + manualRequest: { type: Boolean, default: false }, + + /** + * 编辑行相关的配置 + * + * @example 支持多行编辑 + * editable={{type:"multiple"}} + * + * @example 保存的时候请求后端 + * editable={{ onSave:async (rows)=>{ await save(rows) } }} + */ + // editable?: RowEditableConfig + + /** + * 可编辑表格修改数据的改变 + */ + onDataSourceChange: { + type: Function as PropType<(dataSource: T[]) => void>, + default: undefined + }, + + /** 查询表单和 Table 的卡片 border 配置 */ + cardBordered: { + type: [Boolean, Object] as PropType, + default: undefined + }, + + /** 去抖时间 */ + debounceTime: { type: Number, default: 10 }, + + /** + * 只在request 存在的时候生效,可编辑表格也不会生效 + * + * @default true + * 窗口聚焦时自动重新请求 + */ + revalidateOnFocus: { type: Boolean, default: false }, + + /** 默认的表格大小 */ + defaultSize: String as PropType + + /** + * @name, 可编辑表格的name,通过这个name 可以直接与 form通信,无需嵌套 + */ + // name?: NamePath + + /** + * 错误边界自定义 + */ + //ErrorBoundary: any +}) + +export type ProTableProps = Partial>> + +export type ActionType = ProCoreActionType & { + fullScreen?: () => void + setPageInfo?: (page: Partial) => void +} + +export type UseFetchProps = { + dataSource?: any + loading: Ref + onLoadingChange?: (loading: UseFetchDataAction['loading']) => void + onLoad?: (dataSource: any[], extra: any) => void + onDataSourceChange?: (dataSource?: any) => void + postData: any + pageInfo: + | { + current?: number + pageSize?: number + defaultCurrent?: number + defaultPageSize?: number + } + | false + onPageInfoChange?: (pageInfo: PageInfo) => void + effects?: ComputedRef + onRequestError?: (e: Error) => void + manual: boolean + debounceTime?: number + polling?: number | ((dataSource: any[]) => number) + revalidateOnFocus?: boolean +} + +export type OptionSearchProps = Omit & { + /** 如果 onSearch 返回一个false,直接拦截请求 */ + onSearch?: (keyword: string) => boolean | undefined +} diff --git a/pro-components/table/useFetchData.tsx b/pro-components/table/useFetchData.tsx new file mode 100644 index 0000000..676d71b --- /dev/null +++ b/pro-components/table/useFetchData.tsx @@ -0,0 +1,261 @@ +import type { PageInfo, RequestData, UseFetchProps, UseFetchDataAction } from './typing' +import { postDataPipeline } from './utils' +import { watchEffect, ref } from 'vue' +import type { ComputedRef } from 'vue' +import { useDebounceFn } from '@vueuse/core' +import index from '../utils/hooks/useMergedState' +import { runFunction } from '#/utils/runFunction' + +/** + * 组合用户的配置和默认值 + * + * @param param0 + */ +const mergeOptionAndPageInfo = ({ pageInfo }: UseFetchProps): PageInfo => { + if (pageInfo) { + const { current, defaultCurrent, pageSize, defaultPageSize } = pageInfo + return { + current: current || defaultCurrent || 1, + total: 0, + pageSize: pageSize || defaultPageSize || 10 + } + } + return { current: 1, total: 0, pageSize: 10 } +} + +const useFetchData = >( + getData: undefined | ((params?: { size: number; current: number }) => Promise), + defaultData: any[] | undefined, + options: UseFetchProps +): ComputedRef => { + const umountRef = ref(false) + + /** 是否首次加载的指示器 */ + const manualRequestRef = ref(options.manual) + + /** 轮询的setTime ID 存储 */ + const pollingSetTimeRef = ref() + + const [list, setList] = index(ref(options?.dataSource), { + defaultValue: defaultData, + onChange: options?.onDataSourceChange + }) + + // 表格加载状态 + const setTableLoading = (loading: UseFetchDataAction['loading']) => { + options.loading.value = loading + options.onLoadingChange?.(loading) + } + + const requesting = ref(false) + + const pageInfo = ref() + watchEffect(() => { + pageInfo.value = mergeOptionAndPageInfo(options) + }) + const setPageInfo = (changePageInfo: PageInfo) => { + pageInfo.value = changePageInfo + options?.onPageInfoChange + } + + const pollingLoading = ref(false) + const setPollingLoading = (value: boolean) => (pollingLoading.value = value) + + // Batching update https://github.com/facebook/react/issues/14259 + const setDataAndLoading = (newData: T[], dataTotal: number) => { + setList(newData) + + if (pageInfo.value?.total !== dataTotal) { + setPageInfo({ + ...pageInfo.value, + total: dataTotal || newData.length + }) + } + } + + /** + * 不这样做会导致状态不更新 + * + * https://github.com/ant-design/pro-components/issues/4390 + */ + const requestFinally = () => { + requestAnimationFrame(() => { + setTableLoading(false) + setPollingLoading(false) + }) + } + + // 需要重新请求数据,删除当前页最后一条数据后,自动向前翻页 + let requestPrePage = false + + /** 请求数据 */ + const fetchList = async (isPolling: boolean) => { + if ((!requestPrePage && (options.loading.value || requesting.value)) || !getData) { + return [] + } + + // 需要手动触发的首次请求 + if (manualRequestRef.value) { + manualRequestRef.value = false + return [] + } + if (!isPolling) { + setTableLoading(true) + } else { + setPollingLoading(true) + } + + requesting.value = true + const { pageSize, current } = pageInfo.value || {} + try { + const pageParams = + options?.pageInfo !== false + ? { + current, + size: pageSize + } + : undefined + + const result = await getData(pageParams) + const { records = [], total = 0, ...rest } = result?.data || {} + + // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页 + if (records.length === 0 && current > 1) { + requestPrePage = true + setPageInfo({ + ...pageInfo.value, + current: current - 1 + }) + return [] + } else { + requestPrePage = false + } + + const responseData = postDataPipeline( + records!, + [options.postData].filter(item => item) as any + ) + setDataAndLoading(responseData, total) + options.onLoad?.(responseData, rest) + return responseData + } catch (e) { + // 如果没有传递这个方法的话,需要把错误抛出去,以免吞掉错误 + if (options.onRequestError === undefined) throw new Error(e as string) + if (list === undefined) setList([]) + options.onRequestError(e as Error) + } finally { + // 如果需要重新请求,这里状态就不变更了 + if (!requestPrePage) { + requesting.value = false + requestFinally() + } + } + + return [] + } + + const fetchListDebounce = useDebounceFn(async (isPolling: boolean) => { + if (pollingSetTimeRef.value) { + clearTimeout(pollingSetTimeRef.value) + } + const msg = await fetchList(isPolling) + + // 把判断要不要轮询的逻辑放到后面来这样可以保证数据是根据当前来 + // 放到请求前面会导致数据是上一次的 + const needPolling = runFunction(options.polling, msg) + + // 如果需要轮询,搞个一段时间后执行 + // 如果解除了挂载,删除一下 + if (needPolling && !umountRef.value) { + pollingSetTimeRef.value = setTimeout(() => { + fetchListDebounce(needPolling) + // 这里判断最小要2000ms,不然一直loading + }, Math.max(needPolling, 2000)) + } + return msg + }, options.debounceTime || 10) + + // 如果轮询结束了,直接销毁定时器 + watchEffect(() => { + if (!options.polling) { + clearTimeout(pollingSetTimeRef.value) + } + if (options.polling) { + fetchListDebounce(true) + } + }) + // onUnmounted(() => clearTimeout(pollingSetTimeRef.value)) + // + // onMounted(() => (umountRef.value = false)) + // onUnmounted(() => (umountRef.value = true)) + + /** PageIndex 改变的时候自动刷新 */ + watch( + () => pageInfo.value, + (currentPageInfo, prePageInfo) => { + console.log('页码改变了') + const { current, pageSize } = pageInfo.value || {} + const { current: prePage, pageSize: prePageSize } = prePageInfo || {} + // 如果上次的页码为空或者两次页码等于是没必要查询的 + // 如果 pageSize 发生变化是需要查询的,所以又加了 prePageSize + if (prePage && prePage === current && prePageSize && prePageSize === pageSize) { + return + } + + if ((options.pageInfo && list.value && list.value?.length > pageSize) || 0) { + return + } + + // 如果 list 的长度大于 pageSize 的长度 + // 说明是一个假分页 + // (pageIndex - 1 || 1) 至少要第一页 + // 在第一页大于 10 + // 第二页也应该是大于 10 + // if (current !== undefined && list.value && list.value.length <= pageSize) { + // fetchListDebounce(false) + // } + + fetchListDebounce(false) + }, + { immediate: true } + ) + + watch( + () => options.effects?.value || [], + () => { + fetchListDebounce(false) + if (!options.manual) { + manualRequestRef.value = false + } + } + ) + + return computed(() => ({ + dataSource: list.value!, + setDataSource: setList, + loading: options.loading.value, + reload: async () => { + await fetchListDebounce(false) + }, + pageInfo: pageInfo.value, + pollingLoading: pollingLoading.value, + reset: async () => { + const { pageInfo: optionPageInfo } = options || {} + const { defaultCurrent = 1, defaultPageSize = 10 } = optionPageInfo || {} + const initialPageInfo = { + current: defaultCurrent, + total: 0, + pageSize: defaultPageSize + } + setPageInfo(initialPageInfo) + }, + setPageInfo: async info => { + setPageInfo({ + ...pageInfo.value, + ...info + }) + } + })) +} + +export default useFetchData diff --git a/pro-components/table/utils/columnRender.tsx b/pro-components/table/utils/columnRender.tsx new file mode 100644 index 0000000..ad63bb1 --- /dev/null +++ b/pro-components/table/utils/columnRender.tsx @@ -0,0 +1,182 @@ +import { Space } from 'ant-design-vue' + +import type { ActionType, ProColumns } from '../typing' +import { useContainer } from '../container' +import { isMergeCell } from '.' +import type { VueNode } from '#/types' +import type { ProFieldEmptyText } from '#/field' +import type { ProSchemaComponentTypes, ProTableEditableFnType } from '#/utils/typing' +import LabelIconTip from '#/utils/components/LabelIconTip' +import get from 'ant-design-vue/es/vc-util/get' +import { genCopyable } from '#/utils/genCopyable' + +/** 转化列的定义 */ +type ColumnRenderInterface = { + columnProps: ProColumns + text: any + rowData: T + index: number + columnEmptyText?: ProFieldEmptyText + type: ProSchemaComponentTypes + counter: ReturnType + editableUtils: any + subName: string[] +} + +/** + * 增加了 icon 的功能 render title + * + * @param item + */ +export const renderColumnsTitle = (item: ProColumns) => { + const { title } = item + const ellipsis = typeof item?.ellipsis === 'boolean' ? item?.ellipsis : item?.ellipsis?.showTitle + if (title && typeof title === 'function') { + return title(item, 'table', ) + } + return +} + +/** 判断可不可编辑 */ +function isEditableCell( + text: any, + rowData: T, + index: number, + editable?: ProTableEditableFnType | boolean +) { + if (typeof editable === 'boolean') { + return !editable + } + return editable?.(text, rowData, index) === false +} + +/** + * 默认的 filter 方法 + * + * @param value + * @param record + * @param dataIndex + * @returns + */ +export const defaultOnFilter = (value: string, record: any, dataIndex: string | string[]) => { + const recordElement = Array.isArray(dataIndex) + ? get(record, dataIndex as string[]) + : record[dataIndex] + const itemValue = String(recordElement) as string + + return String(itemValue) === String(value) +} + +// class OptionsCell extends React.Component<{ +// children: (form: ProFormInstance) => React.ReactNode +// record: any +// form: ProFormInstance +// }> { +// shouldComponentUpdate(nextProps: any) { +// const { children, ...restProps } = this.props +// const { children: nextChildren, ...restNextProps } = nextProps +// return !isDeepEqualReact(restProps, restNextProps) +// } +// render() { +// return {this.props.children(this.props.form)} +// } +// } +/** + * 这个组件负责单元格的具体渲染 + * + * @param param0 + */ +export function columnRender({ + columnProps, + text, + rowData, + index, + // columnEmptyText, + // type, + // subName, + editableUtils +}: ColumnRenderInterface): any { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const { actionRef } = useContainer()! + const { isEditable } = editableUtils.isEditable({ ...rowData, index }) + const { renderText = (val: any) => val } = columnProps + + const renderTextStr = renderText(text, rowData, index, actionRef.value as ActionType) + const mode = + isEditable && !isEditableCell(text, rowData, index, columnProps?.editable) ? 'edit' : 'read' + + const textDom = renderTextStr + // const textDom = cellRenderToFromItem({ + // text: renderTextStr, + // valueType: (columnProps.valueType as ProFieldValueType) || 'text', + // index, + // rowData, + // subName, + // columnProps: { + // ...columnProps, + // // 为了兼容性,原来写了个错别字 + // // @ts-ignore + // entry: rowData, + // entity: rowData + // }, + // counter, + // columnEmptyText, + // type, + // recordKey, + // mode, + // prefixName, + // editableUtils + // }) + + const dom: VueNode = mode === 'edit' ? textDom : genCopyable(textDom, columnProps, renderTextStr) + + // /** 如果是编辑模式,并且 renderFormItem 存在直接走 renderFormItem */ + // if (mode === 'edit') { + // if (columnProps.valueType === 'option') { + // return ( + // + // {inform => { + // return editableUtils.actionRender( + // { + // ...rowData, + // index: columnProps.index || index + // }, + // inform! + // ) + // }} + // + // ) + // } + // return dom + // } + // + // if (!columnProps.render) { + // const isReactRenderNode = React.isValidElement(dom) || ['string', 'number'].includes(typeof dom) + // return !isNil(dom) && isReactRenderNode ? dom : null + // } + + const renderDom = columnProps.render?.( + dom, + rowData, + index, + { + ...(actionRef.value as ActionType), + ...editableUtils + }, + { + ...columnProps, + isEditable, + type: 'table' + } + ) + + // 如果是合并单元格的,直接返回对象 + if (isMergeCell(renderDom)) { + return renderDom + } + + if (renderDom && columnProps.valueType === 'option' && Array.isArray(renderDom)) { + return {renderDom} + } + return renderDom as VueNode +} diff --git a/pro-components/table/utils/columnSort.ts b/pro-components/table/utils/columnSort.ts new file mode 100644 index 0000000..de41d89 --- /dev/null +++ b/pro-components/table/utils/columnSort.ts @@ -0,0 +1,19 @@ +import type { ColumnsState } from '../container' + +export const columnSort = (columnsMap: Record) => (a: any, b: any) => { + const { fixed: aFixed, index: aIndex } = a + const { fixed: bFixed, index: bIndex } = b + if ((aFixed === 'left' && bFixed !== 'left') || (bFixed === 'right' && aFixed !== 'right')) { + return -2 + } + if ((bFixed === 'left' && aFixed !== 'left') || (aFixed === 'right' && bFixed !== 'right')) { + return 2 + } + // 如果没有index,在 dataIndex 或者 key 不存在的时候他会报错 + const aKey = a.key || `${aIndex}` + const bKey = b.key || `${bIndex}` + if (columnsMap[aKey]?.order || columnsMap[bKey]?.order) { + return (columnsMap[aKey]?.order || 0) - (columnsMap[bKey]?.order || 0) + } + return (a.index || 0) - (b.index || 0) +} diff --git a/pro-components/table/utils/genProColumnToColumn.tsx b/pro-components/table/utils/genProColumnToColumn.tsx new file mode 100644 index 0000000..7248610 --- /dev/null +++ b/pro-components/table/utils/genProColumnToColumn.tsx @@ -0,0 +1,156 @@ +import type { TableColumnType, TableProps } from 'ant-design-vue' +import { Table } from 'ant-design-vue' + +import type { ProColumns, ProColumnGroupType } from '../typing' +import type { useContainer } from '../container' +import { genColumnKey } from './index' +import { defaultOnFilter, renderColumnsTitle, columnRender } from './columnRender' +import type { VueKey } from '#/types' +import type { ProSchemaComponentTypes } from '#/utils/typing' +import omitBoolean from '#/utils/omitBoolean' +import omitUndefinedAndEmptyArr from '#/utils/omitUndefinedAndEmptyArr' +import type { ProFieldEmptyText } from '#/field' + +/** + * 转化 columns 到 pro 的格式 主要是 render 方法的自行实现 + * + */ +export function genProColumnToColumn( + params: { + columns: ProColumns[] + counter: ReturnType + columnEmptyText: ProFieldEmptyText + type: ProSchemaComponentTypes + editableUtils: any + } & Pick, 'rowKey' | 'childrenColumnName'> +): (TableColumnType & { + index?: number + isExtraColumns?: boolean + extraColumn?: typeof Table.EXPAND_COLUMN | typeof Table.SELECTION_COLUMN +})[] { + const { + columns, + columnEmptyText, + type, + editableUtils, + rowKey = 'id', + childrenColumnName = 'children' + } = params + + const counter = params.counter! + + const subNameRecord = new Map() + + return columns + .map((columnProps, columnsIndex) => { + const { + key, + dataIndex, + valueEnum, + valueType = 'text', + children, + onFilter, + filters = [] + } = columnProps as ProColumnGroupType + const columnKey = genColumnKey(key || dataIndex?.toString(), columnsIndex) + // 这些都没有,说明是普通的表格不需要 pro 管理 + const noNeedPro = !valueEnum && !valueType && !children + if (noNeedPro) { + return { + index: columnsIndex, + ...columnProps + } + } + + /** + * 是不是展开行和多选按钮 + */ + const isExtraColumns = + columnProps === Table.EXPAND_COLUMN || columnProps === Table.SELECTION_COLUMN + + if (isExtraColumns) { + return { + index: columnsIndex, + isExtraColumns: true, + hideInSearch: true, + hideInTable: false, + hideInForm: true, + hideInSetting: true, + extraColumn: columnProps + } + } + + const config = counter.columnsMap.value[columnKey] || { fixed: columnProps.fixed } + + const genOnFilter = () => { + if (onFilter === true) { + return (value: string, row: T) => defaultOnFilter(value, row, dataIndex as string[]) + } + return omitBoolean(onFilter) + } + + let keyName: VueKey = rowKey as string + + const tempColumns = { + index: columnsIndex, + key: columnKey, + ...columnProps, + title: renderColumnsTitle(columnProps), + valueEnum, + filters: filters, + // filters === true + // ? proFieldParsingValueEnumToArray( + // runFunction<[undefined]>(valueEnum, undefined) + // ).filter(valueItem => valueItem && valueItem.value !== 'all') + // : filters, + onFilter: genOnFilter(), + fixed: config.fixed, + width: columnProps.width || (columnProps.fixed ? 200 : undefined), + children: (columnProps as ProColumnGroupType).children + ? genProColumnToColumn({ + ...params, + columns: (columnProps as ProColumnGroupType)?.children + }) + : undefined, + render: (text: any, rowData: T, index: number) => { + if (typeof rowKey === 'function') { + keyName = rowKey(rowData, index) + } + + let uniqueKey: any + if (Reflect.has(rowData as any, keyName)) { + // @ts-ignore + uniqueKey = rowData[keyName] + const parentInfo = subNameRecord.get(uniqueKey) || [] + // @ts-ignore + rowData[childrenColumnName]?.forEach((item: any) => { + const itemUniqueKey = item[keyName] + if (!subNameRecord.has(itemUniqueKey)) { + subNameRecord.set(itemUniqueKey, parentInfo.concat([index, childrenColumnName])) + } + }) + } + + const renderProps = { + columnProps, + text, + rowData, + index, + columnEmptyText, + counter, + type, + subName: subNameRecord.get(uniqueKey), + editableUtils + } + + return columnRender(renderProps) + } + } + return omitUndefinedAndEmptyArr(tempColumns) + }) + .filter(item => !item.hideInTable) as unknown as (TableColumnType & { + index?: number + isExtraColumns?: boolean + extraColumn?: typeof Table.EXPAND_COLUMN | typeof Table.SELECTION_COLUMN + })[] +} diff --git a/pro-components/table/utils/index.ts b/pro-components/table/utils/index.ts new file mode 100644 index 0000000..4e29cff --- /dev/null +++ b/pro-components/table/utils/index.ts @@ -0,0 +1,204 @@ +import type { VueKey, VueText } from '#/types' +import type { SortOrder } from 'ant-design-vue/es/table/interface' +import type { + ActionType, + Bordered, + BorderedType, + ProColumns, + ProColumnType, + UseFetchDataAction +} from '../typing' +import type { TablePaginationConfig } from 'ant-design-vue' +import type { IntlType } from '#/provider' +import { arrayMoveImmutable } from '#/utils/array-move' +import type { Ref } from 'vue' + +/** + * 合并用户 props 和 预设的 props + */ +export function mergePagination( + pagination: TablePaginationConfig | boolean | undefined, + pageInfo: UseFetchDataAction['pageInfo'] & { + setPageInfo: any + }, + intl: IntlType +): TablePaginationConfig | false | undefined { + if (pagination === false) { + return false + } + const { total, current, pageSize, setPageInfo } = pageInfo + const defaultPagination: TablePaginationConfig = typeof pagination === 'object' ? pagination : {} + + return { + showTotal: (all, range) => + `${intl.getMessage('pagination.total.range', '第')} ${range[0]}-${range[1]} ${intl.getMessage( + 'pagination.total.total', + '条/总共' + )} ${all} ${intl.getMessage('pagination.total.item', '条')}`, + total, + ...(defaultPagination as TablePaginationConfig), + current, + pageSize, + showSizeChanger: true, + onChange: (page: number, newPageSize?: number) => { + const { onChange } = pagination as TablePaginationConfig + onChange?.(page, newPageSize || 10) + // pageSize 改变之后就没必要切换页码 + if (newPageSize !== pageSize || current !== page) { + setPageInfo({ pageSize: newPageSize, current: page }) + } + } + } +} + +/** + * 获取用户的 action 信息 + */ +export function useActionType( + ref: Ref, + action: UseFetchDataAction, + props: { + fullScreen: () => void + onCleanSelected: () => void + resetAll: () => void + editableUtils: any + } +) { + /** 这里生成action的映射,保证 action 总是使用的最新 只需要渲染一次即可 */ + const userAction: ActionType = { + ...props.editableUtils, + pageInfo: action.pageInfo, + reload: async (resetPageIndex?: boolean) => { + // 如果为 true,回到第一页 + if (resetPageIndex) { + await action.setPageInfo({ + current: 1 + }) + } + action?.reload() + }, + reloadAndRest: async () => { + // reload 之后大概率会切换数据,清空一下选择。 + props.onCleanSelected() + await action.setPageInfo({ + current: 1 + }) + await action?.reload() + }, + reset: async () => { + await props.resetAll() + await action?.reset?.() + await action?.reload() + }, + fullScreen: () => props.fullScreen(), + clearSelected: () => props.onCleanSelected(), + // @ts-ignore + setPageInfo: rest => action.setPageInfo(rest) + } + ref.value = userAction +} + +type PostDataType = (data: T) => T + +/** + * 一个转化的 pipeline 列表 + * + * @param data + * @param pipeline + */ +export function postDataPipeline(data: T, pipeline: PostDataType[]) { + if (pipeline.filter(item => item).length < 1) { + return data + } + return pipeline.reduce((pre, postData) => { + return postData(pre) + }, data) +} + +export const isBordered = (borderType: BorderedType, border?: Bordered) => { + if (border === undefined) { + return false + } + // debugger + if (typeof border === 'boolean') { + return border + } + return border[borderType] +} + +export const isMergeCell = ( + dom: any // 如果是合并单元格的,直接返回对象 +) => dom && typeof dom === 'object' && dom?.props?.colSpan + +/** + * 根据 key 和 dataIndex 生成唯一 id + * + * @param key 用户设置的 key + * @param index 序列号,理论上唯一 + */ +export const genColumnKey = (key?: VueKey | undefined, index?: number): string => { + if (key) { + return Array.isArray(key) ? key.join('-') : key.toString() + } + return `${index}` +} + +/** + * 将 ProTable - column - dataIndex 转为字符串形式 + * + * @param dataIndex Column 中的 dataIndex + */ +function parseDataIndex(dataIndex: ProColumnType['dataIndex']): string | undefined { + if (Array.isArray(dataIndex)) { + return dataIndex.join(',') + } + return dataIndex?.toString() +} + +/** + * 从 ProColumns 数组中取出默认的排序和筛选数据 + * + * @param columns ProColumns + */ +export function parseDefaultColumnConfig(columns: ProColumns[]) { + const filter: Record = {} + const sort: Record = {} + columns.forEach(column => { + // 转换 dataIndex + const dataIndex = parseDataIndex(column.dataIndex) + if (!dataIndex) { + return + } + // 当 column 启用 filters 功能时,取出默认的筛选值 + if (column.filters) { + const defaultFilteredValue = column.defaultFilteredValue as VueText[] + if (defaultFilteredValue === undefined) { + filter[dataIndex] = null + } else { + filter[dataIndex] = column.defaultFilteredValue as VueText[] + } + } + // 当 column 启用 sorter 功能时,取出默认的排序值 + if (column.sorter && column.defaultSortOrder) { + sort[dataIndex] = column.defaultSortOrder! + } + }) + return { sort, filter } +} + +export type SortDataParams = { oldIndex: number; newIndex: number } + +/** + * 数据排序核心逻辑 + * + * @param oldIndex 原始位置 + * @param newIndex 新位置 + * @param data 原始数组 + */ +export function sortData({ oldIndex, newIndex }: SortDataParams, data: T[]): T[] | null { + if (oldIndex !== newIndex) { + const newData = arrayMoveImmutable([...(data || [])], oldIndex, newIndex).filter(el => !!el) + return [...newData] + } + return null +} diff --git a/pro-components/types.ts b/pro-components/types.ts new file mode 100644 index 0000000..4469582 --- /dev/null +++ b/pro-components/types.ts @@ -0,0 +1,11 @@ +import type { VNode, VNodeChild } from 'vue' + +export type VueKey = string | number +export type VueText = string | number +export type VueNode = VNodeChild | VNode | VNode[] | JSX.Element | string | null | undefined +export type VueRender = (...args: any[]) => VueNode +export type VueNodeOrRender = VueNode | VueRender + +export const VueNodePropType = [Object, String] +export const VueNodeOrRenderPropType = [Object, Function, String] +export const WithFalseVueNodeOrRenderPropType = [Object, Function, String, Boolean] diff --git a/pro-components/utils/array-move/index.ts b/pro-components/utils/array-move/index.ts new file mode 100644 index 0000000..c7f5f87 --- /dev/null +++ b/pro-components/utils/array-move/index.ts @@ -0,0 +1,19 @@ +export function arrayMoveMutable( + array: ValueType[], + fromIndex: number, + toIndex: number +) { + const startIndex = fromIndex < 0 ? array.length + fromIndex : fromIndex + + if (startIndex >= 0 && startIndex < array.length) { + const endIndex = toIndex < 0 ? array.length + toIndex : toIndex + const [item] = array.splice(fromIndex, 1) + array.splice(endIndex, 0, item) + } +} + +export function arrayMoveImmutable(array: T[], fromIndex: number, toIndex: number) { + const newArray = [...array] + arrayMoveMutable(newArray, fromIndex, toIndex) + return newArray +} diff --git a/pro-components/utils/components/LabelIconTip/index.less b/pro-components/utils/components/LabelIconTip/index.less new file mode 100644 index 0000000..ce68439 --- /dev/null +++ b/pro-components/utils/components/LabelIconTip/index.less @@ -0,0 +1,39 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +@pro-core-label-tip: ~'@{ant-prefix}-pro-core-label-tip'; + +.@{pro-core-label-tip} { + display: inline-flex; + align-items: center; + max-width: 100%; + + &-icon { + display: block; + margin-left: 4px; + cursor: pointer; + &:hover { + color: @primary-color-hover; + } + } + + &-title { + display: inline-flex; + flex: 1; + } + + &-subtitle { + margin-left: 8px; + color: @text-color-secondary; + font-weight: normal; + font-size: @font-size-base; + white-space: nowrap; + } + + &-title-ellipsis { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + word-break: keep-all; + } +} diff --git a/pro-components/utils/components/LabelIconTip/index.tsx b/pro-components/utils/components/LabelIconTip/index.tsx new file mode 100644 index 0000000..f72fee3 --- /dev/null +++ b/pro-components/utils/components/LabelIconTip/index.tsx @@ -0,0 +1,57 @@ +import { InfoCircleOutlined } from '@ant-design/icons-vue' +import { Tooltip } from 'ant-design-vue' +import type { TooltipProps } from 'ant-design-vue' +import './index.less' +import type { FunctionalComponent } from 'vue' +import type { VueNode } from '#/types' +import { getPrefixCls } from '#/layout/RouteContext' +import type { LabelTooltipType } from '#/table/typing' + +/** + * 在 form 的 label 后面增加一个 tips 来展示一些说明文案 + * + * @param props + */ +const LabelIconTip: FunctionalComponent<{ + label: VueNode + subTitle?: VueNode + tooltip?: string | LabelTooltipType + ellipsis?: boolean +}> = props => { + const { label, tooltip, ellipsis, subTitle } = props + + if (!tooltip && !subTitle) { + return <>{label} + } + const className = getPrefixCls('pro-core-label-tip') + const tooltipProps = typeof tooltip === 'string' ? { title: tooltip } : (tooltip as TooltipProps) + + const icon = + return ( +
e.stopPropagation()} + onMouseleave={e => e.stopPropagation()} + onMousemove={e => e.stopPropagation()} + > +
+ {label} +
+ {subTitle &&
{subTitle}
} + {tooltip && ( + + {icon} + + )} +
+ ) +} + +export default LabelIconTip diff --git a/pro-components/utils/genCopyable/index.tsx b/pro-components/utils/genCopyable/index.tsx new file mode 100644 index 0000000..26dce3b --- /dev/null +++ b/pro-components/utils/genCopyable/index.tsx @@ -0,0 +1,57 @@ +import { Typography } from 'ant-design-vue' +import type { VueNode } from '#/types' + +const isNeedTranText = (item: any): boolean => { + if (item?.valueType?.toString().startsWith('date')) { + return true + } + if (item?.valueType === 'select' || item?.valueEnum) { + return true + } + return false +} + +/** + * 生成 Copyable 或 Ellipsis 的 dom + * + * @param dom + * @param item + * @param text + */ +export const genCopyable = (dom: VueNode, item: any, text: string) => { + if (item.copyable || item.ellipsis) { + const copyable = + item.copyable && text + ? { + text, + tooltips: ['', ''] + } + : undefined + + /** 有些 valueType 需要设置copy的为string */ + const needTranText = isNeedTranText(item) + + const ellipsis = + item.ellipsis && text + ? { + tooltip: needTranText ?
{dom}
: text + } + : false + return ( + + {dom} + + ) + } + return dom +} diff --git a/pro-components/utils/hooks/useMediaQuery/index.ts b/pro-components/utils/hooks/useMediaQuery/index.ts new file mode 100644 index 0000000..cf4955b --- /dev/null +++ b/pro-components/utils/hooks/useMediaQuery/index.ts @@ -0,0 +1,76 @@ +export const MediaQueryEnum = { + xs: { + maxWidth: 575, + matchMedia: '(max-width: 575px)' + }, + sm: { + minWidth: 576, + maxWidth: 767, + matchMedia: '(min-width: 576px) and (max-width: 767px)' + }, + md: { + minWidth: 768, + maxWidth: 991, + matchMedia: '(min-width: 768px) and (max-width: 991px)' + }, + lg: { + minWidth: 992, + maxWidth: 1199, + matchMedia: '(min-width: 992px) and (max-width: 1199px)' + }, + xl: { + minWidth: 1200, + maxWidth: 1599, + matchMedia: '(min-width: 1200px) and (max-width: 1599px)' + }, + xxl: { + minWidth: 1600, + matchMedia: '(min-width: 1600px)' + } +} + +export type MediaQueryKey = keyof typeof MediaQueryEnum + +/** + * loop query screen className + * Array.find will throw a error + * `Rendered more _hooks than during the previous render.` + * So should use Array.forEach + */ +export const getScreenClassName = () => { + let className: MediaQueryKey = 'md' + // support ssr + if (typeof window === 'undefined') { + return className + } + const mediaQueryKey = (Object.keys(MediaQueryEnum) as MediaQueryKey[]).find(key => { + const { matchMedia } = MediaQueryEnum[key] + if (window.matchMedia(matchMedia).matches) { + return true + } + return false + }) + className = mediaQueryKey as unknown as MediaQueryKey + return className +} + +const useMedia = () => { + const colSpan = ref(getScreenClassName()) + + Object.keys(MediaQueryEnum).forEach(key => { + const { matchMedia } = MediaQueryEnum[key as MediaQueryKey] + const query = window.matchMedia(matchMedia) + if (query.matches) { + colSpan.value = key + } + query.onchange = e => { + if (e.matches) { + colSpan.value = key + } + } + }) + + return colSpan +} + +export default useMedia diff --git a/pro-components/utils/hooks/useMergedState/index.ts b/pro-components/utils/hooks/useMergedState/index.ts new file mode 100644 index 0000000..0e1d8ed --- /dev/null +++ b/pro-components/utils/hooks/useMergedState/index.ts @@ -0,0 +1,34 @@ +import type { Ref } from 'vue' + +function getDefaultValue(propValue: Ref, defaultValue?: T | (() => T)) { + if (propValue.value !== undefined) { + return propValue.value + } + if (defaultValue !== undefined) { + return typeof defaultValue === 'function' ? (defaultValue as any)() : defaultValue + } +} + +export default function index>( + propValue: Ref, + option?: { + defaultValue?: T | (() => T) + onChange?: (value: T) => void + } +): [R, (value: T, ignoreDestroy?: boolean) => void] { + const innerValue = ref(getDefaultValue(propValue, option?.defaultValue)) + + watch( + () => propValue.value, + () => (innerValue.value = propValue.value) + ) + + const triggerChange = (newValue: T) => { + innerValue.value = newValue + if (option?.onChange) { + option.onChange(newValue) + } + } + + return [innerValue as unknown as R, triggerChange] +} diff --git a/pro-components/utils/hooks/usePrevious/index.ts b/pro-components/utils/hooks/usePrevious/index.ts new file mode 100644 index 0000000..bfba332 --- /dev/null +++ b/pro-components/utils/hooks/usePrevious/index.ts @@ -0,0 +1,17 @@ +import { ref, watch } from 'vue' +import type { Ref } from 'vue' + +const usePrevious = (state: Ref): T | undefined => { + const innerState = ref() + + watch( + () => state.value, + (newVal, oldVal) => { + innerState.value = oldVal + } + ) + + return innerState.value +} + +export default usePrevious diff --git a/pro-components/utils/isValidElement/index.ts b/pro-components/utils/isValidElement/index.ts new file mode 100644 index 0000000..9826e7f --- /dev/null +++ b/pro-components/utils/isValidElement/index.ts @@ -0,0 +1,5 @@ +import { isVNode } from 'vue' + +export function isValidElement(el: any) { + return typeof el === 'object' && el !== null && isVNode(el) +} diff --git a/pro-components/utils/omitBoolean/index.ts b/pro-components/utils/omitBoolean/index.ts new file mode 100644 index 0000000..0a4a0f4 --- /dev/null +++ b/pro-components/utils/omitBoolean/index.ts @@ -0,0 +1,8 @@ +const omitBoolean = (obj: boolean | T): T | undefined => { + if (obj && obj !== true) { + return obj + } + return undefined +} + +export default omitBoolean diff --git a/pro-components/utils/omitUndefined/index.ts b/pro-components/utils/omitUndefined/index.ts new file mode 100644 index 0000000..06739a9 --- /dev/null +++ b/pro-components/utils/omitUndefined/index.ts @@ -0,0 +1,17 @@ +const omitUndefined = (obj: T): T => { + const newObj = {} as T + Object.keys(obj || {}).forEach(key => { + // @ts-ignore + if (obj[key] !== undefined) { + // @ts-ignore + newObj[key] = obj[key] + } + }) + // @ts-ignore + if (Object.keys(newObj).length < 1) { + return undefined as any + } + return newObj +} + +export default omitUndefined diff --git a/pro-components/utils/omitUndefinedAndEmptyArr/index.ts b/pro-components/utils/omitUndefinedAndEmptyArr/index.ts new file mode 100644 index 0000000..dd3867a --- /dev/null +++ b/pro-components/utils/omitUndefinedAndEmptyArr/index.ts @@ -0,0 +1,18 @@ +const omitUndefinedAndEmptyArr = (obj: T): T => { + const newObj = {} as T + Object.keys(obj || {}).forEach(key => { + // @ts-ignore + if (Array.isArray(obj[key]) && obj[key]?.length === 0) { + return + } + // @ts-ignore + if (obj[key] === undefined) { + return + } + // @ts-ignore + newObj[key] = obj[key] + }) + return newObj +} + +export default omitUndefinedAndEmptyArr diff --git a/pro-components/utils/runFunction/index.ts b/pro-components/utils/runFunction/index.ts new file mode 100644 index 0000000..60aa82e --- /dev/null +++ b/pro-components/utils/runFunction/index.ts @@ -0,0 +1,7 @@ +/** 如果是个方法执行一下它 */ +export function runFunction(valueEnum: any, ...rest: T) { + if (typeof valueEnum === 'function') { + return valueEnum(...rest) + } + return valueEnum +} diff --git a/pro-components/utils/types/index.ts b/pro-components/utils/types/index.ts new file mode 100644 index 0000000..6824113 --- /dev/null +++ b/pro-components/utils/types/index.ts @@ -0,0 +1,152 @@ +import type { + InputProps, + SelectProps, + TreeSelectProps, + DatePickerProps, + TimeRangePickerProps, + CheckboxProps, + RateProps, + RadioProps, + ProgressProps, + AvatarProps, + InputNumberProps, + SwitchProps, + CascaderProps, + FormInstance, + ImageProps +} from 'ant-design-vue' +import type { RangePickerProps } from 'ant-design-vue/es/date-picker' +import type { TextAreaProps } from 'ant-design-vue/es/input' +import type { ProSchema } from '../typing' + +export interface ProFieldValueTypeWithFieldProps { + text: InputProps + // password: PasswordProps + money: Record + index: Record + indexBorder: Record + option: Record + textarea: TextAreaProps + date: DatePickerProps + dateWeek: DatePickerProps + dateMonth: DatePickerProps + dateQuarter: DatePickerProps + dateYear: DatePickerProps + dateTime: DatePickerProps + fromNow: DatePickerProps + dateRange: RangePickerProps + dateTimeRange: RangePickerProps + time: TimeRangePickerProps + timeRange: TimeRangePickerProps + select: SelectProps + checkbox: CheckboxProps + rate: RateProps + radio: RadioProps + radioButton: RadioProps + progress: ProgressProps + percent: InputNumberProps + digit: InputNumberProps + digitRange: InputNumberProps + second: InputNumberProps + code: InputProps | TextAreaProps + jsonCode: InputProps | TextAreaProps + avatar: AvatarProps + switch: SwitchProps + image: ImageProps | InputProps + cascader: CascaderProps + treeSelect: TreeSelectProps + // color: SketchPickerProps & { + // value?: string + // popoverProps?: PopoverProps + // mode?: 'read' | 'edit' + // onChange?: (color: string) => void + // colors?: string[] + // } +} + +/** + * @param textarea 文本框 + * @param password 密码框 + * @param money 金额 option 操作 需要返回一个数组 + * @param date 日期 YYYY-MM-DD + * @param dateWeek 周选择器 + * @param dateMonth 月选择器 + * @param dateQuarter 季度选择器 + * @param dateYear 年选择器 + * @param dateRange 日期范围 YYYY-MM-DD[] + * @param dateTime 日期和时间 YYYY-MM-DD HH:mm:ss + * @param dateTimeRange 范围日期和时间 YYYY-MM-DD HH:mm:ss[] + * @param time: 时间 HH:mm:ss + * @param timeRange: 时间区间 HH:mm:ss[] + * @param index:序列 + * @param indexBorder:序列 + * @param progress: 进度条 + * @param percent: 百分比 + * @param digit 数值 + * @param second 秒速 + * @param fromNow 相对于当前时间 + * @param avatar 头像 + * @param code 代码块 + * @param image 图片设置 + * @param jsonCode Json 的代码块,格式化了一下 + * @param color 颜色选择器 + * @param color 颜色选择器 + */ +export type ProFieldValueType = Extract + +type FieldPropsTypeBase = + | (( + form: FormInstance, + config: ProSchema & { + type: ComponentsType + isEditable?: boolean + rowKey?: string + rowIndex: number + entity: Entity + } + ) => FieldPropsType | Record) + | FieldPropsType + | Record + +export type ProFieldValueObject = Type extends 'progress' | 'money' | 'percent' | 'image' + ? { + type: Type + status?: 'normal' | 'active' | 'success' | 'exception' | undefined + locale?: string + /** Percent */ + showSymbol?: ((value: any) => boolean) | boolean + showColor?: boolean + precision?: number + moneySymbol?: boolean + // request?: ProFieldRequestData + /** Image */ + width?: number + } + : never + +type ValueTypeWithFieldPropsBase = { + valueType?: + | Type + | ProFieldValueObject + | ((entity: Entity, type: ComponentsType) => Type | ProFieldValueObject) + fieldProps?: FieldPropsTypeBase< + Entity, + ComponentsType, + ExtraProps, + ProFieldValueTypeWithFieldProps[ProFieldValueType] + > +} + +type UnionSameValueType = Type extends any + ? Type extends ProFieldValueType + ? never + : Type + : never + +export type ValueTypeWithFieldProps = + ValueTypeWithFieldPropsBase< + Entity, + ComponentsType, + ExtraProps, + ProFieldValueType | UnionSameValueType | undefined + > diff --git a/pro-components/utils/typing.ts b/pro-components/utils/typing.ts new file mode 100644 index 0000000..1875443 --- /dev/null +++ b/pro-components/utils/typing.ts @@ -0,0 +1,229 @@ +import type { NamePath } from 'ant-design-vue/es/form/interface' +import type { VueKey, VueNode, VueText } from '#/types' +import type { FormInstance, FormItemProps } from 'ant-design-vue' +import type { + ProFieldValueType, + ProFieldValueTypeWithFieldProps, + ValueTypeWithFieldProps +} from './types' +import type { ProSchemaValueEnumMap, ProSchemaValueEnumObj } from '#/provider' +import type { LabelTooltipType } from '#/table/typing' + +export type PageInfo = { + pageSize: number + total: number + current: number +} + +export type { ProFieldValueType, ProFieldValueTypeWithFieldProps } + +export type RequestOptionsType = { + label?: VueNode + value?: VueText + /** 渲染的节点类型 */ + optionType?: 'optGroup' | 'option' + options?: Omit[] + [key: string]: any +} + +export type ProFieldRequestData = (params: U, props: any) => Promise + +export type ProFieldTextType = VueNode | VueNode[] | Record | Record[] + +export type SearchTransformKeyFn = ( + value: any, + namePath: string, + allValues: any +) => string | Record + +export type SearchConvertKeyFn = (value: any, field: NamePath) => string | Record + +export type ProTableEditableFnType = (value: any, record: T, index: number) => boolean + +// 支持的变形,还未完全支持完毕 +/** 支持的变形,还未完全支持完毕 */ +export type ProSchemaComponentTypes = + | 'form' + | 'list' + | 'descriptions' + | 'table' + | 'cardList' + | undefined + +/** 操作类型 */ +// eslint-disable-next-line @typescript-eslint/ban-types +export type ProCoreActionType = { + /** @name 刷新 */ + reload: (resetPageIndex?: boolean) => Promise + /** @name 刷新并清空,只清空页面,不包括表单 */ + reloadAndRest?: () => Promise + /** @name 重置任何输入项,包括表单 */ + reset?: () => void + /** @name 清空选择 */ + clearSelected?: () => void + /** @name p页面的信息都在里面 */ + pageInfo?: PageInfo +} & T + +/** 各个组件公共支持的 render */ +export type ProSchema< + Entity = Record, + ExtraProps = unknown, + ComponentsType = ProSchemaComponentTypes, + ValueType = 'text', + ExtraFormItemProps = unknown +> = { + /** @name 确定这个列的唯一值,一般用于 dataIndex 重复的情况 */ + key?: VueKey + /** + * 支持一个数字,[a,b] 会转化为 obj.a.b + * + * @name 与实体映射的key + */ + dataIndex?: string | number | (string | number)[] + + /** + * 支持 ReactNode 和 方法 + * + * @name 标题 + */ + title?: + | ((schema: ProSchema, type: ComponentsType, dom: VueNode) => VueNode) + | VueNode + + /** @name 展示一个 icon,hover 是展示一些提示信息 */ + tooltip?: LabelTooltipType | string + + /** @deprecated 你可以使用 tooltip,这个更改是为了与 antd 统一 */ + tip?: string + + /** + * 支持 object 和Map,Map 是支持其他基础类型作为 key + * + * @name 映射值的类型 + */ + valueEnum?: + | ((row: Entity) => ProSchemaValueEnumObj | ProSchemaValueEnumMap) + | ProSchemaValueEnumObj + | ProSchemaValueEnumMap + + /** + * @name 自定义的 formItemProps + */ + formItemProps?: + | (FormItemProps & ExtraFormItemProps) + | (( + form: FormInstance, + config: ProSchema & { + type: ComponentsType + isEditable?: boolean + rowKey?: string + rowIndex: number + entity: Entity + } + ) => FormItemProps & ExtraFormItemProps) + + /** + * 修改的数据是会被 valueType 消费 + * + * @name 自定义 render 内容 + */ + renderText?: (text: any, record: Entity, index: number, action: ProCoreActionType) => any + /** + * Render 方法只管理的只读模式,编辑模式需要使用 renderFormItem + * + * @name 自定义只读模式的dom + */ + render?: ( + dom: VueNode, + entity: Entity, + index: number, + action: ProCoreActionType | undefined, + schema: ProSchema & { + isEditable?: boolean + type: ComponentsType + } + ) => + | VueNode + | { + children: VueNode + props: any + } + + /** + * 返回一个 ReactNode,会自动包裹 value 和 onChange + * + * @name 自定义编辑模式 + */ + renderFormItem?: ( + schema: ProSchema & { + isEditable?: boolean + index?: number + type: ComponentsType + originProps?: any + }, + config: { + onSelect?: (value: any) => void + onChange?: (value: T) => void + value?: any + type: ComponentsType + recordKey?: VueKey | VueKey[] + record?: Entity + isEditable?: boolean + defaultRender: ( + newItem: ProSchema + ) => JSX.Element | null + }, + form: FormInstance, + action?: any + // action?: Omit< + // UseEditableUtilType, + // 'newLineRecord' | 'editableKeys' | 'actionRender' | 'setEditableRowKeys' + // > + ) => VueNode + + /** + * @name 可编辑表格是否可编辑 + * + * @example 不允许编辑 + * editable=false + * + * @example 如果id=1不允许编辑 + * editable={(value,row,index)=> row.id !==1 } + */ + editable?: false | ProTableEditableFnType + + /** @name 从服务器请求枚举 */ + request?: ProFieldRequestData + /** @name request防抖动时间 默认10 单位ms */ + debounceTime?: number + /** @name 从服务器请求的参数,改变了会触发 reload */ + params?: + | ((record: Entity, column: ProSchema) => Record) + | Record + /** @name 依赖字段的name,暂时只在拥有 request 的项目中生效,会自动注入到 params 中 */ + dependencies?: NamePath[] + + /** @name 在 descriptions 隐藏 */ + hideInDescriptions?: boolean + /** @name 在 Form 中隐藏 */ + hideInForm?: boolean + /** @name 在 table 中隐藏 */ + hideInTable?: boolean + /** @name 在 table的查询表单 中隐藏 */ + hideInSearch?: boolean + /** 设置到 ProField 上面的 Props,内部属性 */ + proFieldProps?: ProFieldProps +} & ExtraProps & + ValueTypeWithFieldProps + +export interface ProFieldProps { + light?: boolean + emptyText?: VueNode + label?: VueNode + mode?: 'read' | 'edit' + /** 这个属性可以设置useSwr的key */ + proFieldKey?: string + render?: any + readonly?: boolean +} diff --git a/pro-components/utils/useEditableArray/index.tsx b/pro-components/utils/useEditableArray/index.tsx new file mode 100644 index 0000000..a9d9c7a --- /dev/null +++ b/pro-components/utils/useEditableArray/index.tsx @@ -0,0 +1,23 @@ +import type { VueKey } from '../../types' + +export type RowEditableType = 'single' | 'multiple' + +export type RecordKey = VueKey | VueKey[] + +export const recordKeyToString = (rowKey: RecordKey): VueKey => { + if (Array.isArray(rowKey)) return rowKey.join(',') + return rowKey +} + +export type AddLineOptions = { + position?: 'top' | 'bottom' + recordKey?: RecordKey + newRecordType?: 'dataSource' | 'cache' + /** 要增加到哪个节点下,一般用于多重嵌套表格 */ + parentKey?: RecordKey +} + +export type NewLineConfig = { + defaultValue: T | undefined + options: AddLineOptions +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9bf59a5256607395f1f32384ed007157c4243a22 GIT binary patch literal 15406 zcmeHOd018D_CB}ny^Xglr?NCuOe0Ox)EpZ0HaMiEhNh-r&I$;kD9Ug|#fg+uatgFe zP0S%N4N5T)1OyF%(#LM2rKz`aN*T_1fA9Lv{tlb%0WACdcX^)k>~r=x``hpO)>`jc z-}`NBw!hhKwAH9#mU^>@J%vk>^^qGQNM%X3MN?vo+&ycnPm? zo#&z2KV&YvIzvX7rNd z>n~K#j4L<9q=0Tn|L;1_o{b+QxAVJJ4~? zx%IOW3p(C87MwksZNvdY4ci9{NdpGyF_L*b$LPy3#(zY6-T}I-02;@rF^U_{LVdYb z{>EjaU{oeC>M=ecj$J@Mj?s4u(2I8T8?X~M1?S<)_-tTg z2H+=S>>&<4#&+N(8Dk^R<2~TnM4-uhjxihY>iXljY3gB=2Im6Afe|vsXTYl*V_+)K ze7@L6?IEOMuD`IFoA1mZ~0Dp_j$G1~B$3c3G{l*wFZ+eUm%g1QH5_s?pgvs^t zH?siCIR?}i2Z6C!z;KT7n&7aG!TIdG22P)NFk)SQ^NynFtO8t);25FAF@a-@kulOa z#$MMLucQFJ^n=7kmv#6^U#pLEj=-N|IKw{&CUcBH8RG!(I>#8wF$NQdjKSDA@#3~} z-|6e+7*mMw=p&3djxmX21mpmt^%#tefuG=Fzf?3aUt@khJr9qEECs?g!#V9Rz6d#l zQyk;FvHS7;7{<+zZTQ0cd+Yn~d^DZ(7Rti5BFOyR*mT@AApsdfKg1{I^Vaua*{C@q z7rxf>@_F!1+~Jpw*FAlAJ?DgHy!d*WFX5-_`9o6Djlw}Vyt>BXt+|Z{CZ6j0@Az|r zpNKm@^2xY!L;J*^?iRhi=;8CZD{A3r!oRR{@l8luee>`)zi;k6wK(ja5Nxb70lUZx zYib2xWZf~SQxzV7+#}p|D4`yY%?dJibR4zuWYiN0m$O>Fr_HdT(-~Cv*LI@)iUBORwBR~HPCaVIS=8g}m_6thmLd0?#?A@^7Db#U3E z@|%JKyPh7tyW|Vuw^vv*`V)iH4L1hzrN%IZ=ilVLgZZ1Wl%!AYp!SE7aDaV2CjLm0x?`IgF z-sCnD24|1hGYeI0r`g$=RQ&Tz!i~fCI}Z#aFH4;oA{ac)Lo(|Y=h}^d{uc~$Sy#r> zA5xE>OLSpq`=+Xg3PS_VgIA>U)YGx&YgN3n>(l6LbQqn9QmIc;ucbz53{v~0Mkrsf z*1T-SKtBxSoCMHMQp>xqEywW8D&|G3fgzgl7^QqM%+vi@qvuI&lYXH(3{vk@44&+*FiZ7X;5=MaBkgwFz`B^>&ptt8koxGJ2gZW< zLV6E150aM_3@>sXJYpa}w2E_aq=DgdJv(kS&%vY=+{QlTl+XO&!EU(xFX%98us0~4nCI#br00?z!HPlU zgq{cb+Y>)kz(5{Q@wl3Cu!tDusd;dE#h`up-EB5I?;plqO?r!oxvu`g69(y5+<7T| zpeGEB1>xxzWFDB4il>r3 zuEM~)tboB2H!%MzmnK{v5AMk174K6@x#0F_yk?a|83jj6wLR zLangylkjv8=0tPGfX`CAVZFC}jy;B2vkP%Hy1<2Dnt2|Kyp;akiowj012soVJXkPD zJU+45gxYfo@vX)n>kjto3WIQiU{HCo5+@RJj!VSWaZVX0V3QtR3R>6^u-dixSvU^(3&o4s2 zoC1_`{iZO;x<_M>ymVtQbAt(ktf{yrQniBplaswmywrE=eJcITerR41#>^?g@0DUO z_(^!$%})jf&C|?@vi>PpFe(@SsPtY{d=YgBOC%=+LllpSpFD7+!eHhnBOd#u;7i*d zvD<=WYA(V;8M~qEBO>W*%}<)AH9rYAD4u3c3}^0*T*x_L9q5ySRCc$2vkZI9AEzI} zn8~c8{=>600q+-oA z-^{}g8TXzMg^SCMM&Tfbq0n?*A!fdl>ebPemTav!U;k z1J>buWF7`w%Z0-;@MQ3ZI5TP+>%gZjE$3RU^YojD9JGyQU&OV07f;_;c8)!C`>`4L zso$q~sj}Z(%Xxba?qOYe_*#Bz{mq~>wDL`ZxApx0K3ALp(Md$`^5g4zbrKG7)gNSS zDf$W5TqsQX=esE>x5aGvvgWwNuj>1){-Md>41fCv@6h*--ygd^ zw^j;&r*xFu75`A$0PHug8r-mR@y?ruEk0hmL-grK8%`;HwQexNsVU5@H35-4`qc_T zYo-6%an%~{DsUc7D7*vinYFuJumXp4EBO`X5L1O!zhSiRHgaM^pN<7|sr#knuNc`9aQ(t+NcW}koOf$5I_)|(1Py(!d{CL7vP zh|&{W`V#q08>iq$n(!X_Q5BVJX*e>j)JF=f|vkYhSRj$i7B zJIfvjcbsb)S)AY6erZRG$jhmXrj{P9H_3UC+LTl4GW3DiAUfHVyZsSu^TW+o;g*;_ zvhFTwf=zIEWh<>69n0SKM0DzjX+x4r4)xvUEY>=Ktjl_{2UP1K+M(8mYpGML0iIxe zeJtL!MiW1@Aa+0Ue)~8>zn~4GA5ceeJZLXDHe%^_L0^5gq2r1D??0ZjCB0j(d8cPJ zoKkk&qYZ(`sTqv>%=jgbIPdpLjA-0){4#U)hvPM;H2}-BRj+#6O7NN3#d>W;}V#G_)w%&>+(3Xl!?!czMxD`?q`7caZy@ zN`JS#-=c4V?w?%tv(hPp4V{pF;9ktn%mtw-_a8FfzMI-;1?>6RDP8?j&uyS)c183m z(e2b4U_0wDYoWG*vEeb!O z%UYk&Hu%aqO#4CBL1F{@NwW+uaj8As$K`r&u_AdG9Sf4cEY9irALzb!eG z@YtgCZzuZgasF3neOxza8{FE)M;051QQIIo$E&ny0Aot$gVx`~hN7Q=1)p(D=6f7% z?43YANGwGwPIBAOII8TsX$ggXCD{p&i7#H7cQT@Ws58CxM7+s;gSr~KJ|cfv9r3}( zSqEPnwYTIb*IrJ&_7cssG8^2Q9c>W3N;F)zrcR7nuaSHXq~8SpYqU}H)EavgkpoN{ZuSf<_GeN((0PUs)e@19>x{EQv3LG)Cg1ujm~Hb`xdy@m(vrCF2X3$N0atoQ@CH%lEQn(NkL zr6Djj-8!cy8w^fTdZXln)rQSRPSb|IjF$zO)J&+wXf4=kL+7`Mb*{+<$!C`hR~k(B zyiaJhVN53OqfWeU)B!m4+FLXT(e0HEVb~x#fLWVTIc=&9dQV02Su{h*hl%vt82+ZW zQ6F@Dv)a&ZF>`s2VZ%(LzD22A*j(F=+s$~b@5g1KGqufMWz8&l)*rROy&t3fVDM@` z+VL`9N(Z;px9*H1vkhHVQjcSuZWQCn1ygPK`u=FNuwpiUrXDzzT3D%G_g85HeW3in zUO;Pv=K3a_Wc7pE-;!R*VuQlZe16WzhsW7#G?`b?2Co@7SKp3TD$^ZAiwVxd2coMg zJulm(U1(iV<%2nvbUsTgRb~S@=?~jLPU_0K+<3-n^#0D{%w^fz&^CC@ zf`j;1)?I+x%rT?iPsl=D>g%VKo@v-1dZLac+4CT;Li1|1Hn3N7=YzIE*EbI~=)POW zQde@S^sBNrA~rOPfzxX?HhbAoLt{1{slnYxeg3lAE6HQOXtp7XvBZ3?%m!<1(0aA- zs@97oj?DXu!b@&H81+r|Go(gq8)X06n>9h%AeKXW*dZ8-Lb^lp!V^M+MxFGXoKW}-dnB857KA!Vr^5oVDUp&=CTj_3jHhu_qcZ6 z7lWEs?D9G6IBJI<#!u6UzcL$S-%Iaxk?)tN4iFLrLsTP)T<}&@zjydqqo3vpOuFwaQs?zPbM>dB00wtoy%if6W z5y_sR<|NVO^ z<}h_J@Y$+D@5N~B3Aa8cdzIXiN#@IGwn6r&tbUL_!_7(bgRTv_Myq|)y{2`;pRr*h z@v|ptzKlMI$1>u-Nn`bNWa!;E_X|vzT~NNirT2X+*uXfF+VE#>(7Y=7tTh>TeKW<9 z)VI#$pccz<;o)T!pAGPYU(Ru#vRO<43T73$_Qzze(rkm&Ho$KXud5|)eoVT|Qa*2Hl7 z+fM$slatK#P1`^%!((kweTLKqVt<{SKb-p*Bi?h_(QOx&UQfPOWtZ^Lv|Q|%%DkH} ziLZ%Vqs6kGu}6tyypvZQ>{rXeK8M3y-^y)pj?aOE&sdd?J%F`L+xweB9fFtsWS*Ylm|LyVty1%F_W>sb>25!40ktm@h%@=$ml z;@tRo@8D^0PTP)CQ*#g^{;6<1d0XY7g}?diO3l$3h@YH_OM&4o8%9xk=KP=Uo>Fyx zUt#<|_<_@W1Mx?x_zB_KaxP;g6<_n&o8k0Lh39sw8`_Ur8RKYX&~}^+oaUbY(>+tr zvAS#j?Dyb2Mjk>y7;ESh&R66k&&G~UM>zHL3**?Q4NAlJz4w&w zC;pi+tGkBJ8V!!jMd^$jWZU__L)Xg{L-KJOd!&fK1Ne<~xu9=a)z1V}hp)Qt`8;!v zn0zEh=cD~!RbzT3MZsCioV2rFJIOc-%sJw To&VcsKL5Y>|C@pT?-}?%{$42g literal 0 HcmV?d00001 diff --git a/scripts/preinstall.js b/scripts/preinstall.js new file mode 100644 index 0000000..2e580e0 --- /dev/null +++ b/scripts/preinstall.js @@ -0,0 +1,9 @@ +// @ts-check +if (!/pnpm/.test(process.env.npm_execpath || '')) { + console.warn( + `\u001b[33mThis repository requires using pnpm as the package manager ` + + `for scripts to work properly.\n` + + `Note: Please delete node_modules before pnpm install.\u001b[39m\n` + ) + process.exit(1) +} diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..c97bbce --- /dev/null +++ b/src/App.vue @@ -0,0 +1,23 @@ + + + diff --git a/src/api/auth/captcha.ts b/src/api/auth/captcha.ts new file mode 100644 index 0000000..db0a9a3 --- /dev/null +++ b/src/api/auth/captcha.ts @@ -0,0 +1,36 @@ +import type { CaptchaConfig } from '@/components/Captcha/types' +import httpClient from '@/utils/axios' + +export interface CaptchaData { + id: string + captcha: { + backgroundImage: string + templateImage: string + backgroundImageWidth: number + backgroundImageHeight: number + sliderImageWidth: number + sliderImageHeight: number + data: { + randomY?: string + } + } +} + +/** + * 获取验证码图片 + * @param type 图像验证码类型 + * @returns + */ +export function captchaGen(type?: string) { + return httpClient.get('/captcha/tianai/gen', { params: { type: type } }) +} + +/** + * 验证码校验 + * @param id 验证码id + * @param data true:校验通过/false:校验失败 + * @returns + */ +export function captchaCheck(id: string, data: CaptchaConfig) { + return httpClient.post('/captcha/tianai/check', data, { params: { id } }) +} diff --git a/src/api/auth/index.ts b/src/api/auth/index.ts new file mode 100644 index 0000000..01a81e2 --- /dev/null +++ b/src/api/auth/index.ts @@ -0,0 +1,73 @@ +import httpClient from '@/utils/axios' +import type { + OAuth2LoginParam, + AccountLoginParam, + MobileLoginParam, + LoginResult +} from '@/api/auth/types' +import { useUserStore } from '@/stores/user-store' + +// Base64(clientId:clientSecret) +// const BASIC_AUTHORIZATION = 'Basic bm8tY2FwdGNoYTpuby1jYXB0Y2hh' +const BASIC_AUTHORIZATION = 'Basic dWk6dWk=' + +/** + * 账号密码登录 + * @param parameter + */ +export function accountLogin(parameter: AccountLoginParam) { + return login(Object.assign({ grant_type: 'password' }, parameter)) +} + +/** + * 手机号登录 + * @param parameter + */ +export function mobileLogin(parameter: MobileLoginParam) { + return login(Object.assign({ grant_type: 'mobile' }, parameter)) +} + +/** + * 登录 + * @param parameter 登录参数 + */ +function login(parameter: OAuth2LoginParam) { + return httpClient.request({ + url: '/oauth2/token', + method: 'POST', + headers: { + Authorization: BASIC_AUTHORIZATION + }, + params: parameter + }) +} + +/** + * 校验 token + * @param token accessToken + */ +export function checkToken(token: string) { + return httpClient.request({ + url: '/oauth2/check_token', + method: 'POST', + headers: { + Authorization: BASIC_AUTHORIZATION + }, + params: { token: token } + }) +} + +/** + * 登出 + */ +export function logout() { + const accessToken = useUserStore().accessToken + return httpClient.request({ + url: '/oauth2/revoke', + method: 'POST', + headers: { + Authorization: BASIC_AUTHORIZATION + }, + params: { token: accessToken } + }) +} diff --git a/src/api/auth/types.ts b/src/api/auth/types.ts new file mode 100644 index 0000000..4bae204 --- /dev/null +++ b/src/api/auth/types.ts @@ -0,0 +1,51 @@ +/** + * 用户名密码登录所需参数 + */ +export interface AccountLoginParam { + username: string + password: string + captchaId?: string +} + +/** + * 手机号登录所需参数 + */ +export interface MobileLoginParam { + mobile?: string + captcha?: string +} + +/** + * OAuth2 登录需要的参数 + */ +export type OAuth2LoginParam = { + grant_type: string +} & (AccountLoginParam | MobileLoginParam) + +/** + * 用户信息 + */ +export interface LoginUserInfo { + userId: number + username: string + type: number + organizationId: number + nickname: string + avatar?: string +} + +/** + * 登录成功时的返回结果 + */ +export interface LoginResult { + access_token: string + attributes: { + permissions: string[] + roleCodes: string[] + } + expires_in: number + info: LoginUserInfo + refresh_token: string + scope: string + token_type: string +} diff --git a/src/api/clueaccess/accessDetail/index.ts b/src/api/clueaccess/accessDetail/index.ts new file mode 100644 index 0000000..d75dd63 --- /dev/null +++ b/src/api/clueaccess/accessDetail/index.ts @@ -0,0 +1,33 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { AccessLogPageParam, SysMenuDTO } from '@/api/clueaccess/accessDetail/types' + +/** + * 访问日志分页查询 + * @param pageParams 分页参数 + */ +// export function pageAccessLogs(pageParams: AccessLogPageParam) { +// return httpClient.get('/log/access-log/page', { +// params: pageParams +// }) +// } +export function pageAccessLogs(pageParams: AccessLogPageParam) { + return httpClient.get('/clueRecord/page', { + params: pageParams + }) +} +/** + * 新建菜单 + * @param menuDto 菜单传输对象 + */ +export function createMenu(menuDto: SysMenuDTO) { + return httpClient.post>('/system/menu', menuDto) +} + +/** + * 修改菜单 + * @param menuDto 菜单传输对象 + */ +export function updateMenu(menuDto: SysMenuDTO) { + return httpClient.put>('/system/menu', menuDto) +} diff --git a/src/api/clueaccess/accessDetail/types.ts b/src/api/clueaccess/accessDetail/types.ts new file mode 100644 index 0000000..195a684 --- /dev/null +++ b/src/api/clueaccess/accessDetail/types.ts @@ -0,0 +1,126 @@ +import type { PageParam } from '@/api/types' +// import type { DefaultOptionType } from 'ant-design-vue/es/select' + +/** + * 访问日志分页参数 + */ +export type AccessLogPageParam = AccessLogQO & PageParam +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + oldFileName?: string + // 用户ID + // userId?: number + // 访问IP地址 + ip?: string + // 请求Uri + uri?: string + // 请求映射地址 + // matchingPattern?: string + // 响应状态码 + // httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} +/** + * 系统用户状态 + */ +export enum SysUserStatus { + // 正常 + NORMAL = 1, + // 锁定的 + LOCKED = 0 +} +/** + * 系统用户分页视图对象 + */ +export type SysUserPageVO = { + // 用户ID + userId: number + // 登录账号 + username: string + oldFileName: string + // 昵称 + nickname: string + // 头像 + avatar: string + // 性别(0-默认未知,1-男,2-女) + gender: 0 | 1 | 2 + // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常, 0-冻结) + status: SysUserStatus + // 用户类型:1-系统用户,2-客户用户 + type: 1 | 2 + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} +/** + * 系统菜单传输对象 + */ +export interface SysMenuDTO extends Omit { + // 菜单id + id?: number + // 原菜单ID + originalId?: number + // 菜单标题对应的国际化信息 + i18nMessages?: SysMenuI18n[] +} +/** + * 菜单国际化信息 + */ +export interface SysMenuI18n { + // 国际化标识 + code: string + // 消息 + message: string + // 地区语言标签 + languageTag: string +} + +/** + * 系统菜单对象 + */ +export interface SysMenu { + // 菜单ID + // id: number + // // 父级ID + // parentId: number + // 菜单名称 + title: string + // // 菜单图标 + icon: number + // // 权限标识 + // permission?: string + // // 路由地址 + path: string + // // 打开方式 (1组件 2内链 3外链) + // targetType: number + // // 定位标识 (打开方式为组件时其值为组件相对路径,其他为URL地址) + uri: number + // // 显示排序 + // sort: number + // // 组件缓存:0-开启,1-关闭 + // keepAlive: number + // // 隐藏菜单: 0-否,1-是 + // hidden: number + // // 菜单类型 (0目录,1菜单,2按钮) + // type: SysMenuType + // // 备注信息 + // remarks: string + // nickname: string + fileSelection: Array + selectedCompany: Array +} diff --git a/src/api/clueaccess/clueImport/index.ts b/src/api/clueaccess/clueImport/index.ts new file mode 100644 index 0000000..3cdc344 --- /dev/null +++ b/src/api/clueaccess/clueImport/index.ts @@ -0,0 +1,63 @@ +import httpClient from '@/utils/axios' +import type { I18nData, I18nDataDTO, I18nDataQO, I18nImportData } from './types' +import type { FileObject } from '@/components/CropperModal/types' +import type { ImportMode } from '@/api/types' + +export function pageI18nData(query: I18nDataQO) { + return httpClient.get('/i18n/i18n-data/page', { + params: query + }) +} + +export function createI18nData(data: I18nDataDTO) { + return httpClient.post('/i18n/i18n-data', data) +} + +export function deleteI18nData(code: string, languageTag: string) { + return httpClient.delete('/i18n/i18n-data', { + params: { + code: code, + languageTag: languageTag + } + }) +} + +export function updateI18nData(data: I18nData) { + return httpClient.put('/i18n/i18n-data', data) +} + +export function exportI18nDataExcel(params: I18nDataQO) { + return httpClient.get('/i18n/i18n-data/export', { params, responseType: 'blob' }) +} + +export function importI18nDataExcel(data: I18nImportData) { + const { file } = data + const formData = new FormData() + // @ts-ignore + formData.append('file', file, file.name) + // formData.append('importMode', importMode) + return httpClient.postForm('/clueFile/fileUpload', formData) +} + +// export function downloadI18nDataExcelTemplate() { +// return httpClient.request({ +// url: '/i18n/i18n-data/excel-template', +// method: 'get', +// responseType: 'blob' +// }) +// } +export function downloadI18nDataExcelTemplate() { + return httpClient.request({ + url: '/clue/export', + method: 'get', + responseType: 'blob' + }) +} +export function deleteFile(id: string) { + return httpClient.delete( + `/clueRecord/${id}` + // , { + // params: { id } + // } + ) +} diff --git a/src/api/clueaccess/clueImport/types.ts b/src/api/clueaccess/clueImport/types.ts new file mode 100644 index 0000000..8f903a9 --- /dev/null +++ b/src/api/clueaccess/clueImport/types.ts @@ -0,0 +1,50 @@ +import type { ImportMode } from '@/api/types' +import type { UploadFile } from 'ant-design-vue/lib/upload/interface' + +export interface I18nDataQO { + // 国际化标识 + code?: string + // 文本值 + message?: string + // 语言标签 + languageTag?: string +} + +export interface LanguageText { + // 语言标签 + languageTag: string + // 文本值 + message: string +} + +export interface I18nBaseData { + // 唯一标识 + code: string + // 备注 + remarks?: string +} + +export interface I18nData extends LanguageText, I18nBaseData { } + +/** + * i18nData新建修改的传输对象 + */ +export interface I18nDataDTO extends I18nBaseData { + languageTexts: LanguageText[] +} + +/** + * 角色分页视图对象 + */ +export interface I18nDataPageVO extends I18nBaseData, LanguageText { + id: number + // 创建时间 + createTime?: string +} + +export interface I18nImportData { + // 文件内容 + file?: UploadFile + // 导入模式 + // importMode: ImportMode +} diff --git a/src/api/clueaccess/importDetail/index.ts b/src/api/clueaccess/importDetail/index.ts new file mode 100644 index 0000000..cd20128 --- /dev/null +++ b/src/api/clueaccess/importDetail/index.ts @@ -0,0 +1,18 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { AccessLogPageParam } from '@/api/clueaccess/importDetail/types' + +/** + * 访问日志分页查询 + * @param pageParams 分页参数 + */ +// export function pageAccessLogs(pageParams: AccessLogPageParam) { +// return httpClient.get('/log/access-log/page', { +// params: pageParams +// }) +// } +export function pageAccessLogs(pageParams: AccessLogPageParam) { + return httpClient.get('/clueRecord/page', { + params: pageParams + }) +} diff --git a/src/api/clueaccess/importDetail/types.ts b/src/api/clueaccess/importDetail/types.ts new file mode 100644 index 0000000..7b247fa --- /dev/null +++ b/src/api/clueaccess/importDetail/types.ts @@ -0,0 +1,27 @@ +import type { PageParam } from '@/api/types' + +/** + * 访问日志分页参数 + */ +export type AccessLogPageParam = AccessLogQO & PageParam +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + oldFileName?: string + // 用户ID + // userId?: number + // 访问IP地址 + ip?: string + // 请求Uri + // uri?: string + // 请求映射地址 + // matchingPattern?: string + // 响应状态码 + // httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} diff --git a/src/api/clueaccess/login-log/index.ts b/src/api/clueaccess/login-log/index.ts new file mode 100644 index 0000000..b93e96f --- /dev/null +++ b/src/api/clueaccess/login-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { LoginLogPageParam } from '@/api/log/login-log/types' + +/** + * 登录日志分页查询 + * @param pageParams 分页参数 + */ +export function pageLoginLogs(pageParams: LoginLogPageParam) { + return httpClient.get('/log/login-log/page', { + params: pageParams + }) +} diff --git a/src/api/clueaccess/login-log/types.ts b/src/api/clueaccess/login-log/types.ts new file mode 100644 index 0000000..cb1971a --- /dev/null +++ b/src/api/clueaccess/login-log/types.ts @@ -0,0 +1,26 @@ +import type { PageParam } from '@/api/types' + +/** + * 登陆日志查询对象 + */ +export interface LoginLogQO { + // 追踪ID + traceId?: string + // 用户名 + username?: string + // 访问IP地址 + ip?: string + // 状态 + status?: number + // 事件类型 + eventType?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 登陆日志分页参数 + */ +export type LoginLogPageParam = LoginLogQO & PageParam diff --git a/src/api/clueaccess/operation-log/index.ts b/src/api/clueaccess/operation-log/index.ts new file mode 100644 index 0000000..ff06932 --- /dev/null +++ b/src/api/clueaccess/operation-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { OperationLogQO } from '@/api/log/operation-log/type' + +/** + * 操作日志分页查询 + * @param pageParams 分页参数 + */ +export function pageOperationLogs(pageParams: OperationLogQO) { + return httpClient.get('/log/operation-log/page', { + params: pageParams + }) +} diff --git a/src/api/clueaccess/operation-log/type.ts b/src/api/clueaccess/operation-log/type.ts new file mode 100644 index 0000000..7f30292 --- /dev/null +++ b/src/api/clueaccess/operation-log/type.ts @@ -0,0 +1,30 @@ +import type { PageParam } from '@/api/types' + +/** + * 操作日志查询对象 + */ +export interface OperationLogQO { + // 追踪ID + traceId?: string + // 用户名 + userId?: number + // 日志信息 + msg?: string + // 访问IP地址 + ip?: string + // 请求URI + uri?: string + // 操作状态 + status?: number + // 操作类型 + type?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 操作日志分页参数 + */ +export type OperationLogPageParam = OperationLogQO & PageParam diff --git a/src/api/controlcenterstation/customerManagement/index.ts b/src/api/controlcenterstation/customerManagement/index.ts new file mode 100644 index 0000000..7008754 --- /dev/null +++ b/src/api/controlcenterstation/customerManagement/index.ts @@ -0,0 +1,64 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { + SysMenuDTO, + SysUserPageParam, + DistributeTaskDTO +} from '@/api/controlcenterstation/customerManagement/types' + +/** + * 访问日志分页查询 + * @param pageParams 分页参数 + */ +// export function pageAccessLogs(pageParams: AccessLogPageParam) { +// return httpClient.get('/log/access-log/page', { +// params: pageParams +// }) +// } +export function pageAccessLogs(pageParams: SysUserPageParam) { + return httpClient.get('/system/user/pageList', { + params: pageParams + }) +} +/** + * 删除销售人员 + * @param userId 用户id + */ +export function deleteUser(userId: number) { + return httpClient.delete>(`/system/user/${userId}`) +} +/** + * 新建菜单 + * @param menuDto 菜单传输对象 + */ +export function createMenu(menuDto: SysMenuDTO) { + return httpClient.post>('/system/menu', menuDto) +} +/** + * 修改菜单 + * @param menuDto 菜单传输对象 + */ +export function updateMenu(menuDto: SysMenuDTO) { + return httpClient.put>('/system/menu', menuDto) +} +/** + * 新增分发任务 + * @param distributeDto 分发对象 + */ +export function addDistributeConfiguration(distributeDto: DistributeTaskDTO) { + return httpClient.post>('/distributeTask/add', distributeDto) +} +/** + * 修改分发任务 + * @param distributeDto 分发对象 + */ +export function updateDistributeConfigurationmenuDto(distributeDto: DistributeTaskDTO) { + return httpClient.put>('/system/menu', distributeDto) +} +/** + * 文件选择下拉列表数据 + * + */ +export function fileSelectionList() { + return httpClient.get('/clueRecord/select') +} diff --git a/src/api/controlcenterstation/customerManagement/types.ts b/src/api/controlcenterstation/customerManagement/types.ts new file mode 100644 index 0000000..3403370 --- /dev/null +++ b/src/api/controlcenterstation/customerManagement/types.ts @@ -0,0 +1,218 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统菜单传输对象 + */ +export interface SysMenuDTO extends Omit { + // 菜单id + id?: number + // 原菜单ID + originalId?: number + // 菜单标题对应的国际化信息 + i18nMessages?: SysMenuI18n[] +} + +/** + * 菜单国际化信息 + */ +export interface SysMenuI18n { + // 国际化标识 + code: string + // 消息 + message: string + // 地区语言标签 + languageTag: string +} + +/** + * 访问日志分页参数 + */ +// export type AccessLogPageParam = AccessLogQO & PageParam +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + // oldFileName?: string + // 用户ID + // userId?: number + // 访问IP地址 + // ip?: string + // 请求Uri + username?: string + uri?: string + // 请求映射地址 + // matchingPattern?: string + // 响应状态码 + // httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} +/** + * 系统菜单类型 + */ +export enum SysMenuType { + // 目录 + DIRECTORY, + // 菜单 + MENU, + // 按钮 + BUTTON +} +/** + * 系统菜单视图对象 + */ +export interface SysMenuVO extends SysMenu { + // 国际化标题 + i18nTitle: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} +/** + * 系统用户状态 + */ +export enum SysUserStatus { + // 正常 + NORMAL = 1, + // 锁定的 + LOCKED = 0 +} + +/** + * 系统用户分页参数 + */ +export type SysUserPageParam = SysUserQO & PageParam +/** + * 系统用户查询对象 + */ +export type SysUserQO = { + // 登录账号 + username?: string + // 昵称 + nickname?: string + // 性别(0-默认未知,1-男,2-女) + gender?: 0 | 1 | 2 + // 电子邮件 + email?: string + // 电话 + phoneNumber?: string + // 状态(1-正常,0-冻结) + status?: SysUserStatus + // organizationId + organizationId?: number[] + // 用户类型:1:系统用户, 2:客户用户 + type?: number + // 开始时间 + startTime?: string + // 结束时间 + endTime?: string +} +/** + * 系统菜单视图对象 + */ +// export interface SysMenuVO extends SysMenu { +// // 国际化标题 +// i18nTitle: string +// // 创建时间 +// createTime: string +// // 更新时间 +// updateTime: string +// } +/** + * 系统菜单对象 + */ +export interface SysMenu { + // 菜单ID + // id: number + // // 父级ID + // parentId: number + // 菜单名称 + title: string + // // 菜单图标 + icon: number + // // 权限标识 + // permission?: string + // // 路由地址 + path: string + // // 打开方式 (1组件 2内链 3外链) + // targetType: number + // // 定位标识 (打开方式为组件时其值为组件相对路径,其他为URL地址) + uri: number + // // 显示排序 + // sort: number + // // 组件缓存:0-开启,1-关闭 + // keepAlive: number + // // 隐藏菜单: 0-否,1-是 + // hidden: number + // // 菜单类型 (0目录,1菜单,2按钮) + // type: SysMenuType + // // 备注信息 + // remarks: string + // nickname: string + fileSelection: Array +} +/** + * 系统用户分页视图对象 + */ +export type SysUserPageVO = { + // 用户ID + userId: number + // 登录账号 + username: string + // 昵称 + nickname: string + // 头像 + avatar: string + // 性别(0-默认未知,1-男,2-女) + gender: 0 | 1 | 2 + // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常, 0-冻结) + status: SysUserStatus + // 用户类型:1-系统用户,2-客户用户 + type: 1 | 2 + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} +/** + * 权重Id、权重占比 + */ +interface weightDistribute { + userId: number + weight?: number | '' +} +/** + * 新增分发任务 + */ +export interface DistributeTaskDTO { + // 分发任务ID + distributeTaskId?: number + // 任务类型 + distributeTaskType: number + // 任务名称 + taskName: string + // 分发规则 + ruleStatus: number + // 分发时间 + timeStatus?: number + // 选择时间 + startTime?: string + // 文件规则前缀 + fileRulePrefix?: string + //上传文件记录ID + fileRecordIdList?: Array + // 权重 + users: Array +} diff --git a/src/api/controlcenterstation/distributionTaskManagement/index.ts b/src/api/controlcenterstation/distributionTaskManagement/index.ts new file mode 100644 index 0000000..1e86790 --- /dev/null +++ b/src/api/controlcenterstation/distributionTaskManagement/index.ts @@ -0,0 +1,58 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { + SysMenuDTO, + SysUserPageParam, + AccessLogPageParam +} from '@/api/controlcenterstation/distributionTaskManagement/types' + +/** + * 分配任务分页查询 + * @param pageParams 分页参数 + */ +// export function pageAccessLogs(pageParams: AccessLogPageParam) { +// return httpClient.get('/log/access-log/page', { +// params: pageParams +// }) +// } +export function pageAccessLogs(pageParams: SysUserPageParam) { + return httpClient.get('/distributeTask/page', { + params: pageParams + }) +} +/** + * 删除任务 + * @param distributeTaskId 分发id + */ +export function deleteUser(distributeTaskId: number) { + return httpClient.delete>(`/distributeTask/${distributeTaskId}`) +} +/** + * 新增分发任务 + * @param distributeTask 分发任务对象 + */ +export function createMenu(distributeTask: SysMenuDTO) { + return httpClient.post>('/system/menu', distributeTask) +} + +/** + * 修改分发任务 + * @param distributeTask 分发任务对象 + */ +export function updateMenu(distributeTask: SysMenuDTO) { + return httpClient.put>('/system/menu', distributeTask) +} +/** + * 已选择公司下拉列表数据 + * + */ +export function selectedCompanyList() { + return httpClient.get('/system/user/selectSonList') +} +/** + * 文件选择下拉列表数据 + * + */ +export function fileSelectionList() { + return httpClient.get('/clueRecord/select') +} diff --git a/src/api/controlcenterstation/distributionTaskManagement/types.ts b/src/api/controlcenterstation/distributionTaskManagement/types.ts new file mode 100644 index 0000000..2eda180 --- /dev/null +++ b/src/api/controlcenterstation/distributionTaskManagement/types.ts @@ -0,0 +1,198 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统菜单视图对象 + */ +// export interface SysMenuVO extends SysMenu { +// // 国际化标题 +// i18nTitle: string +// // 创建时间 +// createTime: string +// // 更新时间 +// updateTime: string +// } + +/** + * 系统菜单传输对象 + */ +export interface SysMenuDTO extends Omit { + // 菜单id + id?: number + // 原菜单ID + originalId?: number + // 菜单标题对应的国际化信息 + i18nMessages?: SysMenuI18n[] +} + +/** + * 菜单国际化信息 + */ +export interface SysMenuI18n { + // 国际化标识 + code: string + // 消息 + message: string + // 地区语言标签 + languageTag: string +} + +/** + * 访问日志分页参数 + */ +export type AccessLogPageParam = AccessLogQO & PageParam +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + // traceId?: string + // 用户ID + // userId?: number + // 访问IP地址 + ip?: string + // 请求Uri + uri?: string + // 请求映射地址 + // matchingPattern?: string + // 响应状态码 + // httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string + username?: string +} +/** + * 系统菜单对象 + */ +export interface SysMenu { + // 菜单ID + // id: number + // // 父级ID + // parentId: number + // 菜单名称 + title: string + // // 菜单图标 + icon: number + // // 权限标识 + // permission?: string + // // 路由地址 + path: string + // // 打开方式 (1组件 2内链 3外链) + // targetType: number + // // 定位标识 (打开方式为组件时其值为组件相对路径,其他为URL地址) + uri: number + // // 显示排序 + // sort: number + // // 组件缓存:0-开启,1-关闭 + // keepAlive: number + // // 隐藏菜单: 0-否,1-是 + // hidden: number + // // 菜单类型 (0目录,1菜单,2按钮) + // type: SysMenuType + // // 备注信息 + // remarks: string + // nickname: string + fileSelection: Array + selectedCompany: Array +} +/** + * 系统用户状态 + */ +export enum SysUserStatus { + // 正常 + NORMAL = 1, + // 锁定的 + LOCKED = 0 +} +/** + * 系统用户分页视图对象 + */ +export type SysUserPageVO = { + // 用户ID + distributeTaskId: number + // 登录账号 + oldFileName: string + // 昵称 + nickname: string + username: string + // 头像 + avatar: string + // 性别(0-默认未知,1-男,2-女) + gender: 0 | 1 | 2 + // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常, 0-冻结) + status: SysUserStatus + // 用户类型:1-系统用户,2-客户用户 + type: 1 | 2 + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} +/** + * 系统用户分页参数 + */ +export type SysUserPageParam = SysUserQO & PageParam +/** + * 系统用户查询对象 + */ +export type SysUserQO = { + // 登录账号 + username?: string + // 昵称 + nickname?: string + // 性别(0-默认未知,1-男,2-女) + gender?: 0 | 1 | 2 + // 电子邮件 + email?: string + // 电话 + phoneNumber?: string + // 状态(1-正常,0-冻结) + status?: SysUserStatus + // organizationId + organizationId?: number[] + // 用户类型:1:系统用户, 2:客户用户 + type?: number + // 开始时间 + startTime?: string + // 结束时间 + endTime?: string +} +/** + * 权重Id、权重占比 + */ +interface weightDistribute { + userId: number + weight?: number | '' +} +/** + * 新增分发任务 + */ +export interface DistributeTaskDTO { + // 分发任务ID + distributeTaskId?: number + // 任务类型 + distributeTaskType: number + // 任务名称 + taskName: string + // 分发规则 + ruleStatus: number + // 分发时间 + timeStatus?: number + // 选择时间 + startTime?: string + // 文件规则前缀 + fileRulePrefix?: string + //上传文件记录ID + fileRecordIdList?: Array + // 权重 + users: Array +} diff --git a/src/api/controlcenterstation/login-log/index.ts b/src/api/controlcenterstation/login-log/index.ts new file mode 100644 index 0000000..b93e96f --- /dev/null +++ b/src/api/controlcenterstation/login-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { LoginLogPageParam } from '@/api/log/login-log/types' + +/** + * 登录日志分页查询 + * @param pageParams 分页参数 + */ +export function pageLoginLogs(pageParams: LoginLogPageParam) { + return httpClient.get('/log/login-log/page', { + params: pageParams + }) +} diff --git a/src/api/controlcenterstation/login-log/types.ts b/src/api/controlcenterstation/login-log/types.ts new file mode 100644 index 0000000..cb1971a --- /dev/null +++ b/src/api/controlcenterstation/login-log/types.ts @@ -0,0 +1,26 @@ +import type { PageParam } from '@/api/types' + +/** + * 登陆日志查询对象 + */ +export interface LoginLogQO { + // 追踪ID + traceId?: string + // 用户名 + username?: string + // 访问IP地址 + ip?: string + // 状态 + status?: number + // 事件类型 + eventType?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 登陆日志分页参数 + */ +export type LoginLogPageParam = LoginLogQO & PageParam diff --git a/src/api/controlcenterstation/operation-log/index.ts b/src/api/controlcenterstation/operation-log/index.ts new file mode 100644 index 0000000..ff06932 --- /dev/null +++ b/src/api/controlcenterstation/operation-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { OperationLogQO } from '@/api/log/operation-log/type' + +/** + * 操作日志分页查询 + * @param pageParams 分页参数 + */ +export function pageOperationLogs(pageParams: OperationLogQO) { + return httpClient.get('/log/operation-log/page', { + params: pageParams + }) +} diff --git a/src/api/controlcenterstation/operation-log/type.ts b/src/api/controlcenterstation/operation-log/type.ts new file mode 100644 index 0000000..7f30292 --- /dev/null +++ b/src/api/controlcenterstation/operation-log/type.ts @@ -0,0 +1,30 @@ +import type { PageParam } from '@/api/types' + +/** + * 操作日志查询对象 + */ +export interface OperationLogQO { + // 追踪ID + traceId?: string + // 用户名 + userId?: number + // 日志信息 + msg?: string + // 访问IP地址 + ip?: string + // 请求URI + uri?: string + // 操作状态 + status?: number + // 操作类型 + type?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 操作日志分页参数 + */ +export type OperationLogPageParam = OperationLogQO & PageParam diff --git a/src/api/customermanagement/customerList/index.ts b/src/api/customermanagement/customerList/index.ts new file mode 100644 index 0000000..99c5ef8 --- /dev/null +++ b/src/api/customermanagement/customerList/index.ts @@ -0,0 +1,44 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { + AccessLogPageParam, + SysMenuDTO, + SysUserPageParam +} from '@/api/customermanagement/customerList/types' + +/** + * 访问日志分页查询 + * @param pageParams 分页参数 + */ +// export function pageAccessLogs(pageParams: AccessLogPageParam) { +// return httpClient.get('/log/access-log/page', { +// params: pageParams +// }) +// } +export function pageAccessLogs(pageParams: SysUserPageParam) { + return httpClient.get('/system/user/pageList', { + params: pageParams + }) +} +/** + * 删除用户 + * @param userId 用户id + */ +export function deleteUser(userId: number) { + return httpClient.delete>(`/system/user/${userId}`) +} +/** + * 新建菜单 + * @param menuDto 菜单传输对象 + */ +export function createMenu(menuDto: SysMenuDTO) { + return httpClient.post>('/system/menu', menuDto) +} + +/** + * 修改菜单 + * @param menuDto 菜单传输对象 + */ +export function updateMenu(menuDto: SysMenuDTO) { + return httpClient.put>('/system/menu', menuDto) +} diff --git a/src/api/customermanagement/customerList/types.ts b/src/api/customermanagement/customerList/types.ts new file mode 100644 index 0000000..dc724e1 --- /dev/null +++ b/src/api/customermanagement/customerList/types.ts @@ -0,0 +1,202 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统菜单传输对象 + */ +export interface SysMenuDTO extends Omit { + // 菜单id + id?: number + // 原菜单ID + originalId?: number + // 菜单标题对应的国际化信息 + i18nMessages?: SysMenuI18n[] +} + +/** + * 菜单国际化信息 + */ +export interface SysMenuI18n { + // 国际化标识 + code: string + // 消息 + message: string + // 地区语言标签 + languageTag: string +} +/** + * 系统菜单类型 + */ +export enum SysMenuType { + // 目录 + DIRECTORY, + // 菜单 + MENU, + // 按钮 + BUTTON +} +/** + * 访问日志分页参数 + */ +export type AccessLogPageParam = AccessLogQO & PageParam +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + // traceId?: string + // 用户ID + userId?: number + // 访问IP地址 + ip?: string + // 请求Uri + uri?: string + // 请求映射地址 + // matchingPattern?: string + // 响应状态码 + httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string + username?: string +} +// interface timeobject { +// check: boolean +// content: string +// } +/** + * 系统菜单视图对象 + */ +// export interface SysMenuVO extends SysMenu { +// //国际化标题 +// i18nTitle: string +// // 创建时间 +// createTime: string +// // 更新时间 +// updateTime: string +// errorMsg: string +// httpStatus: number +// id: number +// ip: string +// matchingPattern: string +// method: string +// originalId: number +// reqBody: string +// reqParams: string +// result: string +// time: number +// traceId: string +// uri: string +// userAgent: string +// userId: string +// username: boolean +// parentId: number +// timelineList: timeobject[] +// } +interface timelineListObj { + check: boolean + content: string +} +/** + * 系统菜单对象 + */ +export interface SysMenu { + // 菜单ID + // id: number + // // 父级ID + // parentId: number + // // 菜单名称 + // title: string + // // 菜单图标 + // icon: string + // // 权限标识 + // permission?: string + // // 路由地址 + // path: string + // // 打开方式 (1组件 2内链 3外链) + // targetType: number + // // 定位标识 (打开方式为组件时其值为组件相对路径,其他为URL地址) + // uri: string + // // 显示排序 + // sort: number + // 组件缓存:0-开启,1-关闭 + keepAlive: number + // 隐藏菜单: 0-否,1-是 + // hidden: number + // // 菜单类型 (0目录,1菜单,2按钮) + // type: SysMenuType + // // 备注信息 + // remarks: string + // nickname: string + fileSelection: Array + timelineList: Array +} +/** + * 系统用户状态 + */ +export enum SysUserStatus { + // 正常 + NORMAL = 1, + // 锁定的 + LOCKED = 0 +} +/** + * 系统用户分页视图对象 + */ +export type SysUserPageVO = { + // 用户ID + userId: number + // 登录账号 + username: string + // 昵称 + nickname: string + // 头像 + avatar: string + // 性别(0-默认未知,1-男,2-女) + gender: 0 | 1 | 2 + // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常, 0-冻结) + status: SysUserStatus + // 用户类型:1-系统用户,2-客户用户 + type: 1 | 2 + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} +/** + * 系统用户分页参数 + */ +export type SysUserPageParam = SysUserQO & PageParam +/** + * 系统用户查询对象 + */ +export type SysUserQO = { + // 登录账号 + username?: string + // 昵称 + nickname?: string + // 性别(0-默认未知,1-男,2-女) + gender?: 0 | 1 | 2 + // 电子邮件 + email?: string + // 电话 + phoneNumber?: string + // 状态(1-正常,0-冻结) + status?: SysUserStatus + // organizationId + organizationId?: number[] + // 用户类型:1:系统用户, 2:客户用户 + type?: number + // 开始时间 + startTime?: string + // 结束时间 + endTime?: string +} diff --git a/src/api/i18n/i18n-data.ts b/src/api/i18n/i18n-data.ts new file mode 100644 index 0000000..96af763 --- /dev/null +++ b/src/api/i18n/i18n-data.ts @@ -0,0 +1,48 @@ +import httpClient from '@/utils/axios' +import type { I18nData, I18nDataDTO, I18nDataQO, I18nImportData } from './types' +import type { FileObject } from '@/components/CropperModal/types' +import type { ImportMode } from '@/api/types' + +export function pageI18nData(query: I18nDataQO) { + return httpClient.get('/i18n/i18n-data/page', { + params: query + }) +} + +export function createI18nData(data: I18nDataDTO) { + return httpClient.post('/i18n/i18n-data', data) +} + +export function deleteI18nData(code: string, languageTag: string) { + return httpClient.delete('/i18n/i18n-data', { + params: { + code: code, + languageTag: languageTag + } + }) +} + +export function updateI18nData(data: I18nData) { + return httpClient.put('/i18n/i18n-data', data) +} + +export function exportI18nDataExcel(params: I18nDataQO) { + return httpClient.get('/i18n/i18n-data/export', { params, responseType: 'blob' }) +} + +export function importI18nDataExcel(data: I18nImportData) { + const { file, importMode } = data + const formData = new FormData() + // @ts-ignore + formData.append('file', file, file.name) + formData.append('importMode', importMode) + return httpClient.postForm('i18n/i18n-data/import', formData) +} + +export function downloadI18nDataExcelTemplate() { + return httpClient.request({ + url: '/i18n/i18n-data/excel-template', + method: 'get', + responseType: 'blob' + }) +} diff --git a/src/api/i18n/types.ts b/src/api/i18n/types.ts new file mode 100644 index 0000000..9c72aa8 --- /dev/null +++ b/src/api/i18n/types.ts @@ -0,0 +1,50 @@ +import type { ImportMode } from '@/api/types' +import type { UploadFile } from 'ant-design-vue/lib/upload/interface' + +export interface I18nDataQO { + // 国际化标识 + code?: string + // 文本值 + message?: string + // 语言标签 + languageTag?: string +} + +export interface LanguageText { + // 语言标签 + languageTag: string + // 文本值 + message: string +} + +export interface I18nBaseData { + // 唯一标识 + code: string + // 备注 + remarks?: string +} + +export interface I18nData extends LanguageText, I18nBaseData { } + +/** + * i18nData新建修改的传输对象 + */ +export interface I18nDataDTO extends I18nBaseData { + languageTexts: LanguageText[] +} + +/** + * 角色分页视图对象 + */ +export interface I18nDataPageVO extends I18nBaseData, LanguageText { + id: number + // 创建时间 + createTime?: string +} + +export interface I18nImportData { + // 文件内容 + file?: UploadFile + // 导入模式 + importMode: ImportMode +} diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..eabc41c --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,5 @@ +import type { ApiResult } from '@/api/types' + +export const isSuccess = (result: ApiResult) => { + return result.code === 200 +} diff --git a/src/api/log/access-log/index.ts b/src/api/log/access-log/index.ts new file mode 100644 index 0000000..46891d3 --- /dev/null +++ b/src/api/log/access-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { AccessLogPageParam } from '@/api/log/access-log/types' + +/** + * 访问日志分页查询 + * @param pageParams 分页参数 + */ +export function pageAccessLogs(pageParams: AccessLogPageParam) { + return httpClient.get('/log/access-log/page', { + params: pageParams + }) +} diff --git a/src/api/log/access-log/types.ts b/src/api/log/access-log/types.ts new file mode 100644 index 0000000..132e19e --- /dev/null +++ b/src/api/log/access-log/types.ts @@ -0,0 +1,28 @@ +import type { PageParam } from '@/api/types' + +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + traceId?: string + // 用户ID + userId?: number + // 访问IP地址 + ip?: string + // 请求Uri + uri?: string + // 请求映射地址 + matchingPattern?: string + // 响应状态码 + httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 访问日志分页参数 + */ +export type AccessLogPageParam = AccessLogQO & PageParam diff --git a/src/api/log/login-log/index.ts b/src/api/log/login-log/index.ts new file mode 100644 index 0000000..b93e96f --- /dev/null +++ b/src/api/log/login-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { LoginLogPageParam } from '@/api/log/login-log/types' + +/** + * 登录日志分页查询 + * @param pageParams 分页参数 + */ +export function pageLoginLogs(pageParams: LoginLogPageParam) { + return httpClient.get('/log/login-log/page', { + params: pageParams + }) +} diff --git a/src/api/log/login-log/types.ts b/src/api/log/login-log/types.ts new file mode 100644 index 0000000..cb1971a --- /dev/null +++ b/src/api/log/login-log/types.ts @@ -0,0 +1,26 @@ +import type { PageParam } from '@/api/types' + +/** + * 登陆日志查询对象 + */ +export interface LoginLogQO { + // 追踪ID + traceId?: string + // 用户名 + username?: string + // 访问IP地址 + ip?: string + // 状态 + status?: number + // 事件类型 + eventType?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 登陆日志分页参数 + */ +export type LoginLogPageParam = LoginLogQO & PageParam diff --git a/src/api/log/operation-log/index.ts b/src/api/log/operation-log/index.ts new file mode 100644 index 0000000..ff06932 --- /dev/null +++ b/src/api/log/operation-log/index.ts @@ -0,0 +1,13 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { OperationLogQO } from '@/api/log/operation-log/type' + +/** + * 操作日志分页查询 + * @param pageParams 分页参数 + */ +export function pageOperationLogs(pageParams: OperationLogQO) { + return httpClient.get('/log/operation-log/page', { + params: pageParams + }) +} diff --git a/src/api/log/operation-log/type.ts b/src/api/log/operation-log/type.ts new file mode 100644 index 0000000..7f30292 --- /dev/null +++ b/src/api/log/operation-log/type.ts @@ -0,0 +1,30 @@ +import type { PageParam } from '@/api/types' + +/** + * 操作日志查询对象 + */ +export interface OperationLogQO { + // 追踪ID + traceId?: string + // 用户名 + userId?: number + // 日志信息 + msg?: string + // 访问IP地址 + ip?: string + // 请求URI + uri?: string + // 操作状态 + status?: number + // 操作类型 + type?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} + +/** + * 操作日志分页参数 + */ +export type OperationLogPageParam = OperationLogQO & PageParam diff --git a/src/api/notify/announcement/index.ts b/src/api/notify/announcement/index.ts new file mode 100644 index 0000000..0690e17 --- /dev/null +++ b/src/api/notify/announcement/index.ts @@ -0,0 +1,79 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { + Announcement, + AnnouncementDTO, + AnnouncementPageParam, + AnnouncementPageVO +} from './types' +import type { FileObject } from '@/components/CropperModal/types' + +/** + * 分页查询公告 + * @param query 分页查询参数 + */ +export function pageAnnouncements(query: AnnouncementPageParam) { + return httpClient.get>('/notify/announcement/page', { + params: query + }) +} + +/** + * 创建公告信息 + * @param announcementDTO + */ +export function createAnnouncement(announcementDTO: AnnouncementDTO) { + return httpClient.post>('/notify/announcement', announcementDTO) +} + +/** + * 修改公告信息 + * @param announcementDTO + */ +export function updateAnnouncement(announcementDTO: AnnouncementDTO) { + return httpClient.put>('/notify/announcement', announcementDTO) +} + +/** + * 删除公告信息 + * @param id 公告id + */ +export function deleteAnnouncement(id: number) { + return httpClient.delete>('/notify/announcement/' + id) +} + +/** + * 发布公告信息 + * @param id 公告id + */ +export function publishAnnouncement(id: number) { + return httpClient.patch>('/notify/announcement/publish/' + id) +} + +/** + * 关闭公告信息 + * @param id 公告id + */ +export function closeAnnouncement(id: number) { + return httpClient.patch>('/notify/announcement/close/' + id) +} + +/** + * 上传公告图片 + * @param resultFiles + */ +export function uploadAnnouncementImage(resultFiles: FileObject[]) { + const formData = new FormData() + resultFiles.forEach(file => { + formData.append('files', file.data, file.name) + }) + return httpClient.postForm>('/notify/announcement/image', formData) +} + +export function getUserAnnouncements() { + return httpClient.get>('/notify/announcement/user') +} + +export function readAnnouncement(announcementId: number) { + return httpClient.patch('/notify/user-announcement/read/' + announcementId) +} diff --git a/src/api/notify/announcement/types.ts b/src/api/notify/announcement/types.ts new file mode 100644 index 0000000..55a6286 --- /dev/null +++ b/src/api/notify/announcement/types.ts @@ -0,0 +1,102 @@ +import type { PageParam } from '@/api/types' + +/** + * 公告状态 + */ +export enum AnnouncementStatusEnum { + // 已关闭 + DISABLED = 0, + // 开启的 + ENABLED = 1, + // 未发布 + UNPUBLISHED = 2 +} + +/** + * 公告信息查询对象 + */ +export type AnnouncementQO = { + // 标题 + title?: string + // 接收人筛选方式 + recipientFilterType?: number + // 状态 + status?: AnnouncementStatusEnum[] +} + +/** + * 公告信息分页参数 + */ +export type AnnouncementPageParam = AnnouncementQO & PageParam + +/** + * 用户公告信息 + */ +export type Announcement = { + //ID + id: number + //标题 + title: string + //内容 + content: string + //接收人筛选方式 + recipientFilterType: number + //对应接收人筛选方式的条件信息。如角色标识,组织ID,用户类型,用户ID等 + recipientFilterCondition?: any[] + //接收方式 + receiveMode: number[] + //状态 + status: AnnouncementStatusEnum + //永久有效的 + immortal: number + //截止日期 + deadline?: string +} + +/** + * 公告信息传输实体, 修改时 id 为空 + */ +export type AnnouncementDTO = Omit & { + //ID + id?: number +} + +/** + * 公告信息分页视图对象 + */ +export type AnnouncementPageVO = Announcement & { + // 创建人ID + createBy: number + // 创建人名称 + createUsername: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} + +/** + * 公告 websocket 推送消息体 + */ +export type AnnouncementPushMessage = { + type: 'announcement-push' + //ID + id: number + //标题 + title: string + //内容 + content: string + //永久有效的 + immortal: number + //截止日期 + deadline: string +} + +/** + * 公告 websocket 关闭消息体 + */ +export type AnnouncementCloseMessage = { + type: 'announcement-close' + //ID + id: number +} diff --git a/src/api/salesmanagement/salespersonList/index.ts b/src/api/salesmanagement/salespersonList/index.ts new file mode 100644 index 0000000..b52dd7d --- /dev/null +++ b/src/api/salesmanagement/salespersonList/index.ts @@ -0,0 +1,58 @@ +import httpClient from '@/utils/axios' +import type { + SysUserDTO, + SysUserPageParam, + SysUserPassDTO +} from '@/api/salesmanagement/salespersonList/types' +import type { ApiResult, SelectData } from '@/api/types' + +/** + * 分页查询用户 + * @param query 分页查询参数 + */ +// export function pageUsers(query: SysUserPageParam) { +// return httpClient.get>('/system/user/page', { +// params: query +// }) +// } +export function pageAccessLogs(pageParams: SysUserPageParam) { + return httpClient.get('/system/user/pageList', { + params: pageParams + }) +} + +/** + * 新建用户 + * @param useCreateDto 新建用户的传输对象 + */ +export function createUser(useCreateDto: SysUserDTO) { + return httpClient.post>('/system/user', useCreateDto) +} +/** + * 修改用户 + * @param userUpdateDto 用户更新的传输对象 + */ +export function updateUser(userUpdateDto: SysUserDTO) { + return httpClient.put>('/system/user', userUpdateDto) +} +/** + * 获取角色的选择框数据 + */ +export function listRoleSelectData() { + return httpClient.get>('/system/role/select') +} +/** + * 删除销售人员 + * @param userId 用户id + */ +export function deleteUser(userId: number) { + return httpClient.delete>(`/system/user/${userId}`) +} +/** + * 更新用户密码 + * @param userId + * @param data + */ +export function updateUserPassword(userId: number, data: SysUserPassDTO) { + return httpClient.put>(`/system/user/pass/${userId}`, data) +} diff --git a/src/api/salesmanagement/salespersonList/types.ts b/src/api/salesmanagement/salespersonList/types.ts new file mode 100644 index 0000000..c2a42ce --- /dev/null +++ b/src/api/salesmanagement/salespersonList/types.ts @@ -0,0 +1,138 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统菜单视图对象 + */ +// export interface SysMenuVO extends SysMenu { +// // 国际化标题 +// i18nTitle: string +// // 创建时间 +// createTime: string +// // 更新时间 +// updateTime: string +// } +/** + * 访问日志查询对象 + */ +export interface AccessLogQO { + // 追踪ID + oldFileName?: string + // 用户ID + userId?: number + // 访问IP地址 + ip?: string + // 请求Uri + uri?: string + // 请求映射地址 + matchingPattern?: string + // 响应状态码 + httpStatus?: number + // 访问时间区间的开始值 + startTime?: string + // 访问时间区间的结束值 + endTime?: string +} +export type SysUserDTO = { + // 主键id + userId?: number + // 前端传入密码 + pass: string + // // 登录账号 + username: string + // // 昵称 + nickname: string + // // 头像 + // avatar?: string + // // 性别(0-默认未知,1-男,2-女) + gender: number + // // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常,0-冻结) + status: number + // 组织机构ID + organizationId?: number + // 角色标识列表 + roleCodes: string[] + // desc: objectState + // stage: objectState +} +/** + * 系统用户查询对象 + */ +export type SysUserQO = { + // 登录账号 + username?: string + // 昵称 + // nickname?: string + // // 性别(0-默认未知,1-男,2-女) + // gender?: 0 | 1 | 2 + // // 电子邮件 + // email?: string + // // 电话 + // phoneNumber?: string + // 状态(1-正常,0-冻结) + status?: SysUserStatus + // organizationId + // organizationId?: number[] + // // 用户类型:1:系统用户, 2:客户用户 + // type?: number + // 开始时间 + startTime?: string + // 结束时间 + endTime?: string +} +export type SysUserPassDTO = { + pass: string + confirmPass: string +} + +/** + * 访问日志分页参数 + */ +export type AccessLogPageParam = AccessLogQO & PageParam +/** + * 系统用户状态 + */ +export enum SysUserStatus { + // 正常 + NORMAL = 1, + // 锁定的 + LOCKED = 0 +} +/** + * 系统用户分页视图对象 + */ +export type SysUserPageVO = { + // 用户ID + userId: number + // 登录账号 + username: string + // 昵称 + nickname: string + // 头像 + avatar: string + // 性别(0-默认未知,1-男,2-女) + gender: 0 | 1 | 2 + // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常, 0-冻结) + status: SysUserStatus + // 用户类型:1-系统用户,2-客户用户 + type: 1 | 2 + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} +/** + * 系统用户分页参数 + */ +export type SysUserPageParam = SysUserQO & PageParam diff --git a/src/api/system/config/index.ts b/src/api/system/config/index.ts new file mode 100644 index 0000000..a90765b --- /dev/null +++ b/src/api/system/config/index.ts @@ -0,0 +1,37 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { SysConfigDTO, SysConfigPageParam, SysConfigPageVO } from '@/api/system/config/types' + +/** + * 系统配置分页查询 + * @param pageParams 分页参数 + */ +export function pageConfigs(pageParams: SysConfigPageParam) { + return httpClient.get>('/system/config/page', { + params: pageParams + }) +} + +/** + * 创建系统配置 + * @param dto + */ +export function createConfig(dto: SysConfigDTO) { + return httpClient.post>('/system/config', dto) +} + +/** + * 修改系统配置 + * @param dto + */ +export function updateConfig(dto: SysConfigDTO) { + return httpClient.put>('/system/config', dto) +} + +/** + * 删除系统配置 + * @param confKey 配置 key + */ +export function deleteConfig(confKey: string) { + return httpClient.delete>(`/system/config?confKey=${confKey}`) +} diff --git a/src/api/system/config/types.ts b/src/api/system/config/types.ts new file mode 100644 index 0000000..f15bd00 --- /dev/null +++ b/src/api/system/config/types.ts @@ -0,0 +1,54 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统配置查询对象 + */ +export interface SysConfigQO { + // 配置名称 + name?: string + // 配置在缓存中的key名 + confKey?: string + // 分类 + category?: string +} + +/** + * 系统配置分页参数 + */ +export type SysConfigPageParam = SysConfigQO & PageParam + +/** + * 系统配置 + */ +export interface SysConfig { + // 主键 + id: number + // 配置名称 + name: string + // 配置在缓存中的key名 + confKey: string + // 配置值 + confValue: string + // 分类 + category: string + // 备注 + remarks: string +} + +/** + * 系统配置分页视图对象 + */ +export interface SysConfigPageVO extends SysConfig { + // 创建时间 + createTime: string + // 修改时间 + updateTime: string +} + +/** + * 系统配置传输对象 + */ +export interface SysConfigDTO extends Omit { + // 主键 + id?: number +} diff --git a/src/api/system/dict/index.ts b/src/api/system/dict/index.ts new file mode 100644 index 0000000..7efdc88 --- /dev/null +++ b/src/api/system/dict/index.ts @@ -0,0 +1,106 @@ +import httpClient from '@/utils/axios' +import type { + DictDataVO, + DictHashData, + SysDictDTO, + SysDictItemDTO, + SysDictItemPageParam, + SysDictPageParam, + SysDictPageVO +} from '@/api/system/dict/types' +import type { ApiResult } from '@/api/types' +import type { DictItemStatus } from '@/api/system/dict/types' + +/** + * 根据指定的字典标识获取字典数据 + * @param dictCodes 字典标识数组 + */ +export function getDictData(dictCodes: string[]) { + return httpClient.get>('/system/dict/data', { + params: { dictCodes: dictCodes.join(',') } + }) +} + +/** + * 通过指定的 hash 值,去获取 hash 已经失效的 dictCode 列表 + */ +export function invalidDictHash(dictHashData: DictHashData) { + return httpClient.post>('/system/dict/invalid-hash', dictHashData) +} + +/** + * 分页查询字典 + * @param query 分页查询参数 + */ +export function pageDicts(query?: SysDictPageParam) { + return httpClient.get>('/system/dict/page', { + params: query + }) +} + +/** + * 新建字典 + * @param dictCreateDto 新建字典的传输对象 + */ +export function createDict(dictCreateDto: SysDictDTO) { + return httpClient.post>('/system/dict', dictCreateDto) +} + +/** + * 修改字典 + * @param dictUpdateDto 修改字典的传输对象 + */ +export function updateDict(dictUpdateDto: SysDictDTO) { + return httpClient.put>('/system/dict', dictUpdateDto) +} + +/** + * 删除字典 + * @param id 字典id + */ +export function deleteDict(id: number) { + return httpClient.delete>(`/system/dict/${id}`) +} + +/** + * 分页查询字典项 + * @param query 分页查询参数 + */ +export function pageDictItems(query?: SysDictItemPageParam) { + return httpClient.get>('/system/dict/item/page', { + params: query + }) +} + +/** + * 新建字典项 + * @param dictItemCreateDto 新建字典项的传输对象 + */ +export function createDictItem(dictItemCreateDto: SysDictItemDTO) { + return httpClient.post>('/system/dict/item', dictItemCreateDto) +} + +/** + * 修改字典项 + * @param dictItemUpdateDto 修改字典项的传输对象 + */ +export function updateDictItem(dictItemUpdateDto: SysDictItemDTO) { + return httpClient.put>('/system/dict/item', dictItemUpdateDto) +} + +/** + * 删除字典项 + * @param id 字典项id + */ +export function removeDictItem(id: number) { + return httpClient.delete>(`/system/dict/item/${id}`) +} + +/** + * 修改字典项状态 + * @param id 字典项ID + * @param status 状态 + */ +export function updateDictItemStatus(id: number, status: DictItemStatus) { + return httpClient.patch(`/system/dict/item/${id}?status=${status}`) +} diff --git a/src/api/system/dict/types.ts b/src/api/system/dict/types.ts new file mode 100644 index 0000000..9032629 --- /dev/null +++ b/src/api/system/dict/types.ts @@ -0,0 +1,182 @@ +import type { PresetColorType, PresetStatusColorType } from 'ant-design-vue/es/_util/colors' +import type { PageParam } from '@/api/types' + +/** + * 字典值类型枚举 + */ +export enum DictValueTypeEnum { + NUMBER = 1, + STRING, + BOOLEAN +} + +/** + * 字典值 + */ +export type DictValue = number | string | boolean + +/** + * 字典项状态枚举 + */ +export enum DictItemStatus { + ENABLED = 1, + DISABLED = 0 +} + +/** 字典的 Hash 存储, key 为 dictCode, value 为 hash值 */ +export type DictHashData = Record + +/** + * 系统字典查询对象 + */ +export interface SysDictQO { + // 字典标识 + code?: string + // 字典名称 + title?: string +} + +/** + * 系统字典分页参数 + */ +export type SysDictPageParam = SysDictQO & PageParam + +/** + * 系统字典 + */ +interface SysDictBase { + // 字典编号 + id?: number + // 字典标识 + code: string + // 字典名称 + title: string + // Hash值 + hashCode?: number + // 数据类型 + valueType: DictValueTypeEnum + // 备注 + remarks?: string +} + +/** + * 系统字典分页视图对象 + */ +export interface SysDictPageVO extends SysDictBase { + id: number + // 创建时间 + createTime: string + // 修改时间 + updateTime: string +} + +/** + * 系统字典传输对象 + */ +export type SysDictDTO = SysDictBase + +/** + * 系统字典项查询对象 + */ +export interface SysDictItemQO { + // 字典标识 + dictCode: string +} + +/** + * 系统字典项分页参数 + */ +export type SysDictItemPageParam = SysDictItemQO & PageParam + +/** + * 字典项基础属性 + */ +interface SysDictItemBase { + id?: number + // 字典标识 + dictCode: string + // 数据值 + value: string + // 文本值 + name: string + // 状态 + status: DictItemStatus + // 附加属性值 + attributes?: DictItemAttributes + // 排序 + sort: number + // 备注 + remarks?: string +} + +/** + * 字典项分页视图对象,服务端返回 + */ +export interface SysDictItemPageVO { + id: number + createTime?: string + updateTime?: string +} + +/** + * 系统字典项传输对象 + */ +export type SysDictItemDTO = SysDictItemBase + +/** + * 字典项属性 + */ +export interface DictItemAttributes extends Record { + languages?: Record + tagColor?: string + textColor?: string + badgeColor?: PresetColorType | string + badgeStatus?: PresetStatusColorType +} + +/** + * 字典项视图对象,服务端返回 + */ +export interface DictItemVO { + id: number + // 数据值 + value: string + // 文本值 + name: string + // 状态 + status: DictItemStatus + // 附加属性值 + attributes?: DictItemAttributes +} + +/** + * 字典数据 + */ +export interface DictDataVO { + // 字典标识 + dictCode: string + // 字典Hash值, 用来判断本地缓存是否过期 + hashCode: string + // 字典值类型 + valueType: DictValueTypeEnum + // 字典项列表 + dictItems: DictItemVO[] +} + +/** + * 字典项 + */ +export interface DictItem extends Omit { + // value 会被转换为实际类型 + value: DictValue + // 是否禁用 + disabled: boolean +} + +/** + * 字典数据 + */ +export interface DictData extends Omit { + // 字典项列表 + dictItems: DictItem[] +} diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts new file mode 100644 index 0000000..83c0c05 --- /dev/null +++ b/src/api/system/menu/index.ts @@ -0,0 +1,54 @@ +import httpClient from '@/utils/axios' +import type { + SysMenuGrantVO, + SysMenuVO, + SysMenuQO, + SysMenuRouterVO, + SysMenuDTO +} from '@/api/system/menu/types' +import type { ApiResult } from '@/api/types' + +/** + * 获取当前登录用户拥有的菜单列表 + */ +export function getLoginUserMenus() { + return httpClient.get>('/system/menu/router') +} + +/** + * 获取授权菜单列表 + */ +export function getMenuGrantList() { + return httpClient.get>('/system/menu/grant-list') +} + +/** + * 获取菜单列表 + */ +export function listMenus(query: SysMenuQO) { + return httpClient.get>('/system/menu/list', { params: query }) +} + +/** + * 新建菜单 + * @param menuDto 菜单传输对象 + */ +export function createMenu(menuDto: SysMenuDTO) { + return httpClient.post>('/system/menu', menuDto) +} + +/** + * 修改菜单 + * @param menuDto 菜单传输对象 + */ +export function updateMenu(menuDto: SysMenuDTO) { + return httpClient.put>('/system/menu', menuDto) +} + +/** + * 删除菜单 + * @param menuId 菜单id + */ +export function deleteMenu(menuId: number) { + return httpClient.delete>(`/system/menu/${menuId}`) +} diff --git a/src/api/system/menu/types.ts b/src/api/system/menu/types.ts new file mode 100644 index 0000000..ba051a5 --- /dev/null +++ b/src/api/system/menu/types.ts @@ -0,0 +1,119 @@ +/** + * 系统菜单类型 + */ +export enum SysMenuType { + // 目录 + DIRECTORY, + // 菜单 + MENU, + // 按钮 + BUTTON +} + +/** + * 菜单查询对象 + */ +export interface SysMenuQO { + // 菜单ID + id?: number + // 菜单名称 + title?: string + // 授权标识 + permission?: string + // 路由地址 + path?: string +} + +/** + * 系统菜单对象 + */ +export interface SysMenu { + // 菜单ID + id: number + // 父级ID + parentId: number + // 菜单名称 + title: string + // 菜单图标 + icon: string + // 权限标识 + permission?: string + // 路由地址 + path: string + // 打开方式 (1组件 2内链 3外链) + targetType: number + // 定位标识 (打开方式为组件时其值为组件相对路径,其他为URL地址) + uri: string + // 显示排序 + sort: number + // 组件缓存:0-开启,1-关闭 + keepAlive: number + // 隐藏菜单: 0-否,1-是 + hidden: number + // 菜单类型 (0目录,1菜单,2按钮) + type: SysMenuType + // 备注信息 + remarks: string +} + +/** + * 系统菜单视图对象 + */ +export interface SysMenuVO extends SysMenu { + // 国际化标题 + i18nTitle: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} + +/** + * 系统菜单视图树 + */ +export interface SysMenuVOTree extends SysMenuVO { + children?: SysMenuVOTree[] +} + +/** + * 系统菜单路由视图对象 + */ +export type SysMenuRouterVO = Omit + +/** + * 系统菜单传输对象 + */ +export interface SysMenuDTO extends Omit { + // 菜单id + id?: number + // 原菜单ID + originalId?: number + // 菜单标题对应的国际化信息 + i18nMessages?: SysMenuI18n[] +} + +/** + * 菜单国际化信息 + */ +export interface SysMenuI18n { + // 国际化标识 + code: string + // 消息 + message: string + // 地区语言标签 + languageTag: string +} + +/** + * 菜单权限授权对象 + */ +export interface SysMenuGrantVO { + // 菜单ID + id: number + // 父级ID + parentId: number + // 菜单名称 + title: string + // 菜单类型 (0目录,1菜单,2按钮) + type: SysMenuType +} diff --git a/src/api/system/organization/index.ts b/src/api/system/organization/index.ts new file mode 100644 index 0000000..05a1ad5 --- /dev/null +++ b/src/api/system/organization/index.ts @@ -0,0 +1,41 @@ +import httpClient from '@/utils/axios' +import type { ApiResult } from '@/api/types' +import type { SysOrganizationDTO, SysOrganizationVO } from '@/api/system/organization/types' + +/** + * 查询组织机构列表 + */ +export function listOrganizations() { + return httpClient.get>('/system/organization/list') +} + +/** + * 新建组织 + * @param data + */ +export function createOrganization(data: SysOrganizationDTO) { + return httpClient.post>('/system/organization', data) +} + +/** + * 修改组织 + * @param data + */ +export function updateOrganization(data: SysOrganizationDTO) { + return httpClient.put>('/system/organization', data) +} + +/** + * 删除组织 + * @param id 组织id + */ +export function deleteOrganization(id: number) { + return httpClient.delete>(`/system/organization/${id}`) +} + +/** + * 修正组织机构层级 + */ +export function revisedOrganization() { + return httpClient.patch>('/system/organization/revised') +} diff --git a/src/api/system/organization/types.ts b/src/api/system/organization/types.ts new file mode 100644 index 0000000..42a5d19 --- /dev/null +++ b/src/api/system/organization/types.ts @@ -0,0 +1,51 @@ +/** + * 组织架构视图对象 + */ +export interface SysOrganizationVO { + id: number + // 组织名称 + name: string + // 父级ID + parentId: number + // 层级信息,从根节点到当前节点的最短路径,使用-分割节点ID + hierarchy: string + // 当前节点深度 + depth: number + // 备注 + remarks: string + // 排序字段,由小到大 + sort: number + // 创建者 + createBy: string + // 修改者 + updateBy: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} + +/** + * 组织架构树 + */ +export interface SysOrganizationTree extends SysOrganizationVO { + key?: number + // 下级组织 + children?: SysOrganizationVO[] +} + +/** + * 组织架构传输对象 + */ +export interface SysOrganizationDTO { + // 组织ID + id?: number + // 组织名称 + name: string + // 父级ID + parentId: number + // 备注 + remarks: string + // 排序字段,由小到大 + sort: number +} diff --git a/src/api/system/role/index.ts b/src/api/system/role/index.ts new file mode 100644 index 0000000..bb09d88 --- /dev/null +++ b/src/api/system/role/index.ts @@ -0,0 +1,90 @@ +import httpClient from '@/utils/axios' +import type { + SysRoleDTO, + SysRolePageParam, + SysRolePageVO, + SysRoleUserPageParam, + SysRoleUserVO +} from '@/api/system/role/types' +import type { ApiResult, SelectData } from '@/api/types' + +/** + * 分页查询角色 + * @param query 分页查询参数 + */ +export function pageRoles(query?: SysRolePageParam) { + return httpClient.get>('/system/role/page', { + params: query + }) +} + +/** + * 新建角色 + * @param roleCreateDto 新建角色的传输对象 + */ +export function createRole(roleCreateDto: SysRoleDTO) { + return httpClient.post>('/system/role', roleCreateDto) +} + +/** + * 修改角色 + * @param roleUpdateDto 更新角色的传输对象 + */ +export function updateRole(roleUpdateDto: SysRoleDTO) { + return httpClient.put>('/system/role', roleUpdateDto) +} + +/** + * 删除角色 + * @param id 角色id + */ +export function deleteRole(id: number) { + return httpClient.delete>(`/system/role/${id}`) +} + +/** + * 获取角色的选择框数据 + */ +export function listRoleSelectData() { + return httpClient.get>('/system/role/select') +} + +/** + * 获取指定角色所拥有的权限 id 集合 + * @param roleCode 角色标识 + */ +export function listRolePermissionIds(roleCode: string) { + return httpClient.get>(`/system/role/permission/code/${roleCode}`) +} + +/** + * 修改指定角色所拥有的权限 id + * @param roleCode 角色标识 + * @param permissionIds 权限id 集合 + */ +export function updateRolePermissionIds(roleCode: string, permissionIds: number[]) { + return httpClient.put>(`/system/role/permission/code/${roleCode}`, permissionIds) +} + +/* + * 分页查询角色绑定的用户 + */ +export function pageRoleUsers(query: SysRoleUserPageParam) { + return httpClient.get>('/system/role/user/page', { + params: query + }) +} + +/** + * 解绑用户和角色 + * @param userId 用户id + * @param roleCode 角色标识 + */ +export function unbindRoleUser(userId: number, roleCode: string) { + return httpClient.delete>('/system/role/user', { + params: { + userId: userId, + roleCode: roleCode + } + }) +} diff --git a/src/api/system/role/types.ts b/src/api/system/role/types.ts new file mode 100644 index 0000000..adc0b17 --- /dev/null +++ b/src/api/system/role/types.ts @@ -0,0 +1,90 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统角色查询对象 + */ +export interface SysRoleQO { + // 角色名称 + name?: string + // 角色标识 + code?: string + // 开始时间 + startTime?: string + // 结束时间 + endTime?: string +} + +/** + * 系统角色分页参数 + */ +export type SysRolePageParam = SysRoleQO & PageParam + +/** + * 系统角色 + */ +export interface SysRole { + // 角色编号 + id?: number + // 角色名称 + name: string + // 角色标识 + code: string + // 角色类型 + type: number + // 数据权限 + scopeType: number + // 数据范围资源,当数据权限为自定义时使用 + scopeResources?: string + // 备注 + remarks?: string +} + +/** + * 角色分页视图对象 + */ +export interface SysRolePageVO extends SysRole { + id: number + // 创建时间 + createTime: string + // 修改时间 + updateTime: string +} + +/** + * 角色新建修改的传输对象 + */ +export type SysRoleDTO = SysRole + +/** + * 角色绑定用户的查询对象 + */ +export interface SysRoleUserQO { + // 角色标识 + roleCode: string + // 用户ID + userId?: number + // 用户名 + username?: string + // 组织ID + organizationId?: number +} + +/** + * 系统角色已绑用户分页参数 + */ +export type SysRoleUserPageParam = SysRoleUserQO & PageParam + +export interface SysRoleUserVO { + // 用户ID + userId: number + // 登录账号 + username: string + // 昵称 + nickname: string + // 1:系统用户, 2:客户用户 + type: number + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string +} diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts new file mode 100644 index 0000000..2cbca08 --- /dev/null +++ b/src/api/system/user/index.ts @@ -0,0 +1,95 @@ +import httpClient from '@/utils/axios' +import type { FileObject } from '@/components/CropperModal/types' +import type { Key } from '@/utils/tree-utils' +import type { + SysUserDTO, + SysUserPageParam, + SysUserPageVO, + SysUserPassDTO, + SysUserScope +} from '@/api/system/user/types' +import type { SysUserStatus } from '@/api/system/user/types' +import type { ApiResult } from '@/api/types' + +/** + * 分页查询用户 + * @param query 分页查询参数 + */ +export function pageUsers(query: SysUserPageParam) { + return httpClient.get>('/system/user/page', { + params: query + }) +} + +/** + * 新建用户 + * @param useCreateDto 新建用户的传输对象 + */ +export function createUser(useCreateDto: SysUserDTO) { + return httpClient.post>('/system/user', useCreateDto) +} + +/** + * 修改用户 + * @param userUpdateDto 用户更新的传输对象 + */ +export function updateUser(userUpdateDto: SysUserDTO) { + return httpClient.put>('/system/user', userUpdateDto) +} + +/** + * 删除用户 + * @param userId 用户id + */ +export function deleteUser(userId: number) { + return httpClient.delete>(`/system/user/${userId}`) +} + +/** + * 修改用户状态 + * @param userIds 用户id 集合 + * @param status 修改的状态 + */ +export function updateUserStatus(userIds: number[], status: SysUserStatus) { + return httpClient.put>('/system/user/status/', userIds, { + params: { status: status } + }) +} + +/** + * 更新用户头像 + * @param userId 用户id + * @param fileObj 头像文件 + */ +export function updateUserAvatar(userId: Key, fileObj: FileObject) { + const formData = new FormData() + formData.append('file', fileObj.data, fileObj.name) + formData.append('userId', userId + '') + return httpClient.postForm>('/system/user/avatar', formData) +} + +/** + * 查询用户角色 + * @param userId + */ +export function queryUserScope(userId: number) { + return httpClient.get>(`/system/user/scope/${userId}`) +} + +/** + * 更新用户权限信息 + * @param userId + * @param userScope + */ +export function updateUserScope(userId: number, userScope: SysUserScope) { + return httpClient.put>(`/system/user/scope/${userId}`, userScope) +} + +/** + * 更新用户密码 + * @param userId + * @param data + */ +export function updateUserPassword(userId: number, data: SysUserPassDTO) { + return httpClient.put>(`/system/user/pass/${userId}`, data) +} diff --git a/src/api/system/user/types.ts b/src/api/system/user/types.ts new file mode 100644 index 0000000..f3cf875 --- /dev/null +++ b/src/api/system/user/types.ts @@ -0,0 +1,168 @@ +import type { PageParam } from '@/api/types' + +/** + * 系统用户状态 + */ +export enum SysUserStatus { + // 正常 + NORMAL = 1, + // 锁定的 + LOCKED = 0 +} + +/** + * 系统用户查询对象 + */ +export type SysUserQO = { + // 登录账号 + username?: string + // 昵称 + nickname?: string + // 性别(0-默认未知,1-男,2-女) + gender?: 0 | 1 | 2 + // 电子邮件 + email?: string + // 电话 + phoneNumber?: string + // 状态(1-正常,0-冻结) + status?: SysUserStatus + // organizationId + organizationId?: number[] + // 用户类型:1:系统用户, 2:客户用户 + type?: number + // 开始时间 + startTime?: string + // 结束时间 + endTime?: string +} + +/** + * 系统用户分页参数 + */ +export type SysUserPageParam = SysUserQO & PageParam + +/** + * 系统用户分页视图对象 + */ +export type SysUserPageVO = { + // 用户ID + userId: number + // 登录账号 + username: string + // 昵称 + nickname: string + // 头像 + avatar: string + // 性别(0-默认未知,1-男,2-女) + gender: 0 | 1 | 2 + // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常, 0-冻结) + status: SysUserStatus + // 用户类型:1-系统用户,2-客户用户 + type: 1 | 2 + // 组织机构ID + organizationId: number + // 组织机构名称 + organizationName: string + // 创建时间 + createTime: string + // 更新时间 + updateTime: string +} + +/** + * 系统用户传输对象 + */ +interface objectState { + tags: string[] + inputVisible: boolean + inputValue: string +} +export type SysUserDTOClue = { + // 主键id + // userId?: number + // 前端传入密码 + pass: string + // // 登录账号 + username: string + // // 昵称 + nickname: string + // // 头像 + // avatar?: string + // // 性别(0-默认未知,1-男,2-女) + gender: number + // // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常,0-冻结) + status: number + // 组织机构ID + organizationId?: number + // 角色标识列表 + roleCodes: string[] + stage: objectState +} +export type SysUserDTOTag = { + // 主键id + userId?: number + // 前端传入密码 + pass: string + // // 登录账号 + username: string + // // 昵称 + nickname: string + // // 头像 + // avatar?: string + // // 性别(0-默认未知,1-男,2-女) + gender: number + // // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常,0-冻结) + status: number + // 组织机构ID + organizationId?: number + // 角色标识列表 + roleCodes: string[] + desc: objectState +} +export type SysUserDTO = { + // 主键id + userId?: number + // 前端传入密码 + pass: string + // // 登录账号 + username: string + // // 昵称 + nickname: string + // // 头像 + // avatar?: string + // // 性别(0-默认未知,1-男,2-女) + gender: number + // // 电子邮件 + email: string + // 电话 + phoneNumber: string + // 状态(1-正常,0-冻结) + status: number + // 组织机构ID + organizationId?: number + // 角色标识列表 + roleCodes: string[] + desc?: objectState + stage?: objectState +} + +export type SysUserScope = { + roleCodes: string[] +} + +export type SysUserPassDTO = { + pass: string + confirmPass: string +} diff --git a/src/api/types.ts b/src/api/types.ts new file mode 100644 index 0000000..8681336 --- /dev/null +++ b/src/api/types.ts @@ -0,0 +1,63 @@ +/** + * 服务端统一返回信息 + */ +export interface ApiResult { + // 状态码 + code: number + // 数据 + data: T + // 信息 + message: string +} + +/** + * 分页查询参数 + */ +export interface PageParam { + // 当前页码 + current?: number + // 每页显示条数 + size?: number + // 排序规则 + sort?: string + // 其他额外属性 + [key: string]: any +} + +/** + * 分页返回结果 + */ +export interface PageResult { + // 分页数据 + records: T[] + // 数据总量 + total: number +} + +/** + * 下拉框数据 + */ +export interface SelectData { + // 显示名称 + name: string + // 选中值 + value: string + // 默认是否被选中 + selected?: boolean + // 是否被禁用 + disabled?: boolean + // 类型,可分组 + type?: string + // 扩展对象 + extendObj?: T +} + +/** + * 导入模式 + */ +export enum ImportMode { + // 跳过已有数据 + SKIP_EXISTING = 'SKIP_EXISTING', + // 覆盖已有数据 + OVERWRITE_EXISTING = 'OVERWRITE_EXISTING' +} diff --git a/src/assets/backgroud.svg b/src/assets/backgroud.svg new file mode 100644 index 0000000..89c2597 --- /dev/null +++ b/src/assets/backgroud.svg @@ -0,0 +1,69 @@ + + + + Group 21 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f4bc837ac430f40a1638797a3df1dbd3f5fb5281 GIT binary patch literal 3286 zcmYk8c{mi_*T6-V(PCdpeHo^iln7~*tPNwbXG=-c@Y;v5FDYYJwi&XG>>_0iSwf}0 z$RMPZEE6eFhO9Zi>3NsuJ(Rg|KFh65(Yy5&$1mMUHWq2zf~BH`5CVTgV%u~1A}4k!kul0 z7SruUYhd`ZqSaZqHDNe;gs}XRJmlL$41+O2bGTkVGMHKg7y{mnd8P^Ze>&wi+-3 zx8e_jk2o;={?wVlP$YPZLYoOR6XrWZzouEU7tkLv(Gm}>M!+sUP!a}$+B-VnbtI%< zwmTf4#}#NtpjIDpjzPC8v{^&@dARuxWGX;^@MgKrN`v!ao8KP_YB5TC=4srQTnBjR z{OWlv6stk!rR_%B?XGKVfYT-a1vmbIeC4*f$IxyMk8PpuJajtzjrsg4JTQfp3()Hc zWk%3o4bL3mkrnj&LzM-zU4%Xo+&6(D!@qe;2=K293d4u>ci zcxVnoH-Vjz;R_=%aLw~Ckp4i(H-H2=cpdTgjARMu3k6?spzFgh1q$$R`w;j`{v|^a zgJd*>Nx`#gFc<=CNkp;l5mFCBo<7jz;f?|X?Sqj7aPfkSBWy&Fs{|>EkgWyT3cv`1 zoU<@o0nAtMXA>T|L8TpJVu7j#y#et3EsV9p+dAlr14bk?1VA?lo>)VX1vKcx?;o%< z3;rZ<^8zmqsB(l>Q&?xg;%Deeh2bP<4Tda#@NtLw%TS7g0v*UZ16^@&(-$gypw$cV z&cVwhXp4gSNJ#L66h|mN4SjduRsi_BicD|CvR^;N|GcRshbotnq!^Eo{2rMfClNej zcP|`MkUp?`da5Eh($*FuB(U65Q(blcI@!h4KvQC4@$2;1*yv#Yi_Rwv6-5Qvnbf32 zXL~I*q~ylx@{hUMcf-R&z0aPu6lSDEh6eh0T`|S$pOsu+Wi8E*4EH?mXlty=O^yi< z53#^wmgftCJg=(Ws}vOC;6NY4dJ~^}SztXOJEzd{;JJVNc zG&@u$cCOWWc41*-e1Y2eWrB0^8FTf@mC5UCmlxWbcdc!aGAQ3J+tnRbel;^{o*I#t zp4HRXkgzxx*3$oE+#$hkeyg#rLK7A6)?X|m%l5We(;=fTJsPJOPXZaF8cvmMv0`O( z;{~Pl#qv|LIm+glrjgnEvw}XqbV$>@{_zTSKNn|!!1XysOXrDCH>6q%>mOupHgYjz zbR5MCv0=KyK8s#`vHMlDn#;xx6#u%5JU+PSbeTJiqi+|_^Oyl;+a>o;R59Jm)jjkI z8Bup%v`$CYS`)e6e0T|Uf{Wx|iq-H# za$tA21W)e!n-d>*J*DdyZS2<_yT0wo zYV;xsi{h(h2-?~myq_a{(E)-lR(a8a++?h*gq(0z{K%aDq*5W_iAMHUQXAP(%5;O) z&7q@b$?HDTC)Md`cH^jq4^>VeSch^^;-`=L!|b`O9vY5(G;KKwWoyJ`6qfc0dCR`V zTi&|YgFMaT*;mqUP?f9QQ8ZgC*rAY(QZlC7^LMY;^MthMR^;EtScnIo>(9whT=|UF z)SqURSZ&FOV4QT%AD2)x#@q;2a~{aYm$a?vGEZwX`&hWW7m>%xesS56ZU3mep}H>s zK_LGPaQ7G~@3*>{h&EB!O8k^%V*+KZ*33?$x$y>Rp9JmXu5RXskh5db5~51RPDE~U z4|QU0!Nx^|M9Xa#@KJ5CM$QEumCcWK@o~;1-lr|w9hc6n3nY(MPE4dLVp0`UIMS+Y z5N3L+DU~PX8)d5q{r>M=9lj}~qG#u#qLhrV7r`v`)!Us{+QS>~5(h(-BSt@TfALV{ zQY}u;-hE4YBPPMn_1lh+z?-qgzh#M$WHMvFjzgQeuB<>CL9vz=YUq%jrEhY0nm7F@ zRdrxlZm;*{FPDTIPtz)8LS~E)PCd{s8B)+eojA25>O0f;%VkT4O0w*r$e9U|ieIF& zag21tq7LstdL-Bt(Ct@pX!ntw)#JrwHDD~ z{K~u1X-E5)n1%MyZbrSF-`J27RnLT!b0a78QDZjI#tWj|1;Wv#dd*^K=#^A^rxt%i zYNsdD^X^abmX2_a5NESTCW~{$U0h~q!cMCBXe(_!t~)P~tnt+9u^5uZYtqRiQ05|> zhEg@E^;Gy$QL1rG^*5#7=iQrUhCX9C#at3nannONJv?#mbD|+lqxwV7O0==0!3|+5 z+Kk2GrGAeS47{F>L6WyR*SWg+aNhJO&p?}YFcR@d=+fWznBeJHB(^=e zV38ZoG!Rb|D`m3qlXpNy}FQ=iyiyqB&`>kF_mCNE;?_GZ#L8u|ABtHXT`5~+W zZ_66uM%POuxkH}MdBUrAW)7;6zIN5hKmGS zKDyhGEPk9@DzRG*A71iWkw#1_6AT`&Kf~#DH6b&<)_RiqDP7EP99Q}>HYogb6G{}> zoS*c(hnl@_^F?0*ZR=gp&{dI&pM04ZU6!~$Pueo+Zp4PRI>3h~P(f%z0G^wYOg$3gA623ppLsBn03naJne?4;S7WQ3JwQfb@o7Ok1^|vchglPPqO=dBR{YB#- M=$qoI^c*Sw0isE+*Z=?k literal 0 HcmV?d00001 diff --git a/src/assets/sprite.1.2.4.png b/src/assets/sprite.1.2.4.png new file mode 100644 index 0000000000000000000000000000000000000000..eca4e8dc5cc43445787259b3bf50e3e5a93b9e42 GIT binary patch literal 15178 zcmdVBWmH_Og2JHdmy zCwOpzoXNM=+I#KY&OYt5`{&;KgVvzhtTE>pvyVRB=k1+vbyazM9BLc@0PqzRWHbQ) z4GR8L!!W^5G@o&f0Dvfwq6|{oYi2hc+n3bp!|md)J*a{LN>StqJTT!2Z7lC9U!UnZ ze0mx=g;ba#!khvkbmtHvIKk5{Oi>RRk*Z{#B1alANF*AS%QG8VQcoFt0&@|(P)bE< z7=z#Vt#`pdmpAD)mBAAa!yB*zk>>hI)YrL;=_xK6`M%LrhIy#&$){}?w-t21m(HBT8@{~;e zsa4Yn8QLb3$c&BP(Eh=uy-U1ndU(56Bfh0t>}=6OW@=7^Kswi@aX}ovJg-k13}+_3 z)?;=rJ21^&+J{Ju!Ie<&l>46-98YTH(6eyfCef96vS7DALo>usB_bg?;wMJ^;L%mi-gu}N3@`#xM{Ndd zCzl1+VfH7Jamd+B^}6Q zl$*Kc33EW6jmLT`#HC_zW zF{|)0VI8G&pbik=7mO?!YbYpalJvctzP&!rr74z#!=asv6GVp{z0qyGUy&>8q~hGF0<`QUq9!h-UK#5cQ<-GGq~5)3 zB!zxAw&naoHEyQ@08`_BS#`y(h1p{l#|wU$MO*%>_z66rlF#0KcTCurfC2&6A+1|^ zQq)rQCeALn=$`U&kr04;{MCUWHi;lIE1Ldr3W_m-25@UqKF`Z}llkV5(@+*auFDu1sT>%mzDUl^K+pC1_e1wnMX1|+l?v5 z@Ju1ufK-1Z1N4{Qhe#n}1Qd{>)WbFMA_D;0q=EvQFQ1omfMM6Ta_)31+>gOeBP6bg z=db{SH27933s0sRclK{4!H(ca@IDMUV)r@i1N-wXZ?X%T{u~+rw!PU)BwsOjGMbIG zu;|#hi=Z|5K*c@JRyJWhEpBDfXyxRdC0Z|YYbg$;fF|m=D9Bpe0RVZMP$gY4q&k$^R0K1`0_zb^QeAWiR zcm^(5+v5YwuR)6k4vL!at$@(4&`_JW?&Wh~)s3Zh{9nLzDlIFNI$2mf+&S_Qi#%TC z@plVq!%`r;XQ>F>^!465M+|*N4L${?iUHR#i`m#kG=TeSipx^n4WR4)IiJ8{cgNDx}nJ% z_k*Sblo=U@&MP;EW&676@1J=HYtsg&Rr8K;2n1ZmKDUnxU?YL7iw^87BEX+erldJ@ zgerD2Ri073B^s+iZM)#>1QV=F8<*xf!Q4j|L+t5gk}Q%Q+Ex?qqKsc)Mz#ueajM^A9tS)v)nS0v3iWA8g+ z#+!^w;O+S+;>2QJ^FdW*^Jmgl1m)EWpk~K)X`@%gcAXNtbyDKT8IjIqIx{5G9z97Q zvIUO48)_1qve)uzGeDI32wx(}3hjmxn8F(P0t3Lr10Y}k0D}Mk3IJ@A5yv~z<@Y73 zn^bX={BX8bRxGX-!7Eg>FKEUhv5z{?oog}7uP;yV>yUDCaz%cPJ|~)O+HY7O8tN+D z(h)7KL0Hk(nZCajKhgOfZ;hO9qaQrchndSr84}Pw9v8G5&!;i0w0ji_Ci!O??@ihk z>-oYH!++1==;-vn@QzCCoa_J97J^GpN>08v+vHa-zo3+mX+_SfM*s-0A$h|C%Y2st zu`ICgsom9-m6gfETb6_zXDaMxtBSI6Z0GAL!=j_fc#`^)?OQjGSbW4XIzD{(aQy4n zui3#&$p;*qoSnhgBz;}cG}S>dMe}8r-KUeL{*7G@D#H&NAsRpy6%3*)R|p@-l$6X- zO5zz)faWqYGgqi7DiZC^RE}}@8<+ByDma@j4>K^>>OOlWR8UdjK3;0xuDa+pB(4-g zFWJN{EL=Tqck_f2u!SIbu>*N9add`jXq;-66~Dpg7>E?M#=pcPD3F7_?DCd}>MtAx zau|Mn>0%~I;+ga^Jy(@OYp_LD*8wyfpR zrAyO(g09K^Eq-FvG?ByYsHmv2Tr5%p(Xk{bC@6$0 zU!U#aq+TW-k0#w~64r-(;C;t3dVR3mo;vYWzx?@RvGJI0v5_}j83w=;gwX3WTW$+^ zLHpQ!Dmg99mqb_9ukW-U!=D^ieX+?efk{3_nO4l};5)eH*J1K>-k+h_Kno!|jGWJz z%cP-(5W98ur%ZPYt-o_&7LUe~+4ERBaT#CVE0v0E|E+rb*9Waw&BW5Fs~F(da!8?t zl%%Aj$E;d@lRCP_KLTYwDh4Co^Oo|)agOL{yiaGwL02S=K;QsI(#X^=MAfqfpA#hzj}=d0a!mqC!FU3hZQ)IaLnHV0q2@6HHDbJ7isOw0|- zw(ff5jcm{yr(=PU$v6yaVR5B8&Xw&3S7KAcsy^-yg@8OCZzROOyP%+e=0Y?cA;wVz z-Q~Sm0|eCJUyIu!$T)9u9A~SvY6U+&iVP(1?{=E6D`QvA*>7?i{jBI8ybVY(L0f-u zh#e0<31`N{)yEUbUQAoTeAT*`Ap5bd&WAy~{SO8P#`^D+W4dTK2Egb}g{QkbVfgYo z_Wk?!0*zxD0&(x&wWKGFZc(`^!mU$e01H40ih>KsnRi7|^_G>Djn#SV&OGpp3&Nadx{6w!a65}o47Vj6B zNyFtt3y`b9^PGRB%lVDqo2dI1{DiP~=wP>c(Rz$uyc&#_BTxf z?G~zvd_OMd^|yXQn6z3!O+hE3*sB?>rja*C*m244dzc<#5mF1}pA4pp7J?BH49@G= z?Q0Yjf3BoH%z*b$(_O}Adpo3Udaq$h=M;4wa(=?{XkrQLRV`Fp>ne?>tv9LbO0CEKL|gftS-zhqY+a$}ZF zPHon_Ai4Q*?}&3$OqaBF%E=Egz0>6A9?k2?L`U4qje=v>eO z5&vfAlLI&os8`f;GzhTqdIXQ`z(m8;%%!wPu^e8G>I0wZ|wV;=g`hs1Z<4ZW2V z1x|2Laa@(Txf}bNLz$DKHS*Hu1PZTAf0SMmWqf=qIXEOUd)2orNiW#C4LBZa9`ik)*)8Ap-{jaKm_+^>BRgf)b+nS9#hLa z@@YJba6Lr3FmKEa7f-%{jC}U1d!QyXxo4N=S(;LMPq$K z!-4 z<__R>K(z&VB_nsPK2t8LnAnP`WUUh08_3FH)Z^Bl?ata{NaJUNo0l9yw&=O&SIzL~ z(S?n!kxPgWZ+_x!@dS~4Y4O_+rONpHQHqsDpD;c3G{4{Gx3(us4@_BvwWaXeKqcef zVH+Ya0RbsE4i1jT)oFDz_pAE(`y+E#Jv@ZM!q1*POZ?4`gai4e@UL`%B{elQAB^7W zdCu84ILF;1+K(V-V6 z70Xi0MAzZV%u5zVKT1uG38sUw*wOO~DZk#XNe&8M^uP5Zlf;!I;Q})s1+<*qOW1M7 z-Dhj~W4~IO$OXI2%ikfT#9t-+dTIhI^H9{63dVv0$0r5(+ZG-asu^OvsM54dSsX|Q z5CDU=8Y%kLB^>l|mT-CPly%Fova#jK&$yM1m5}u!dELsuStAZTO}hwH-~-jviK2>%+ELAQvx*kN;MCFD;T^v2)nl)0 z|7$T_;=4s@W;4J48Sey|3|atY4PISBOXYyEk&&-ceiC6h-lX-~JZAo0ypR%_FaaCE=gCl7f7EWz$fqX&iID^NrM(O|SPG z&)(F6N9QL^JUcgO%UZg)_aM0=| z)x&$Lr1U7v%VH=)-10(nbdUNcM=}QTwb0cxnr(7FyzkY)FVQ3}{cpF&KgZU@@%(cN z3Vs<7zh!+5RH=&uC@k9CZhTK=YdGwp34L)E;tYah77@y6mudp zgwFk??s~A)`l#GyXn{2(tBVoSnGC22=6T|mowfT3r?%2_e}P^(RcJTv+qZ8npmL35 za~amm`(jsPK5|k46jZv&Ow`O9d<~FTy@%aakYwWXVi}ZteJavRft0`jI*v4@2CwJ! z4-R@A<^6U-$*Y|JH1uat)Pi=5I&%ZT!NJcn%tFRWx3%ho$8(m9aKuiisu5}8uTSyj zJyp!jm;1n9eeH=M^Be)Gpu*#Zopg{6sKnD137ymj3wF zf(23XYX)gNpynP*J(NAU2;*9JMun`J^}&Oe{6)XeqZ5{$jt`-*3VA$(} zkiM#HgWy*Cf~$$_o*a1PSlJ)0>?K?VV4?{FsdOw2U3#bwV+d}Yv9_(c=S!|6g>6p7 z&cN}CSr&%(43edfEiGc-%0O(&cb$z@P!~)wH<@DcsZ3lV4e)TVk?Y$1Xqf zO8<)zlz>jmcIS32UXA)>iINDrh0vBEmikf)wzf9s*%5skAVmU0DZ80H%3e%H?q`c_vMxZ2g* zy4}!u*7&=R6T?rgEu4hyO?q4$U!ugHk;B#QW^U#3`>oNy(nA(FTQ^eR01(U&~LpjVUx)4pI;{DF-o5J z_#`yCx3^c=W&Qcsjce}P%^?f4U$fOEu4_GUUxKg*n=UT5OXv@Km}1|9R?#^cMk^y` zOlKs;83TitX!_Pv*(#wE**FW%y{Mg$PoZJ4vCZKg*Mxr6=7bXGOS;m719%$15-|?= zte`URiT~2HT~Jv3ODcPqSsMP7QZKnDVXJ_>Pn9?%kQql7L?E7zcgP8n-A`uBefRx^ z#_6y?ebP10Us6`0ev_hf{#S>Vcb5es^eizy$wk}E*Sc*AgAnwgi!AntS4h}h!?}L` zMa2cC-zHi}NC->-;v8;-+4y3F&-eVmTYK7R?FQq!2Hrq+%VHULBFNngGQ(mcmO3hc zfVVKz4;{TSi_Yc>$5{`KYE}UozTxHlsUkyR@{ljb^PZ|71b)Uk(*m}^2tDJFP&yy> zxDGRh$iR#`aq6Z0zHD`4gCN~)(=Veyknio}wu%&|$4OLa460fu2o%fp?s{a$8s< zC!uAiZAid&IBP=GbMGsP9e|s_NylQpJhUE2zIo1I+uC8f6-GJ|RA+?Bxc{ajjObbs zF2O4Q3)*sp~SFJLF>aVnGKYDLP z_;W8|Qqnb=_t|e(XzUilORi7u^R4GS=yeWa{O&JnNY)hJ`U)z5;XrG>9^6mWFLT+**5CagDJm@KtjnUpj-;WR< z#N8{OjU$3@izAvd7dR8I))@{PFA4c%{S-}Tws5ivCZK2}&d=WT%i0_LX(1joe12h<9rHIWyz#{0mqFI zw)N^l7(?=JE?+ONc)gRK@!71WQDG`9dEm+wyIar={NV?mNY~77novx_#!smc%=6Hx_RxQloaG-nPcpF^+xA&hsR4VqxP4F+Kg}h zCRgHMoa)*17FG{Sh3IY8jIFaOukES*j(V#L=^WGJfPT1HTQqLRHdbEvrv*aU*mL^G zvUKv$vsF zx8JB~Q6G+NoD@mtQf)Hc{=aAG`OMEc6InBy)@tojHUzV03RmG?1w)}0yUS_AD~#Q8 zU(EM>lxCVEurAjlg$AKiBw=594EH-}KWwE`*tBQT23%saDkK_cX&s#%Z4TMLmmib_Jkx&?>u7{+AziZmu{qG-EQ)2C3M1Dt?zS}aaeQWY#%|Vy{$Vo!w4&g1`$<(w zN=j$0tjvRJ4ir<;`Cq@1UO8l+`rfgabPb-tx*lj_=c!3vA3rLYq$y!Ph4s7^qpN}s zI!=`?YlQ(oTrJ*=>+Q|;kLL#aJP#h+PLt^xwQ9&cqKa62rw$R1yF!m_!vNN}ST8&7 zS6=yCl<;$CJ zaB^}gU8I1v{`dpfgb_y5%F2qJE7h}f3BSjApr@@NKEk1oiOLMg>}7^QKp_(h!u&o6 z(23SoRw_S-Kl-JO{lv-O&3U$koFwj~OnDw503#yx&X0xLP}6_%ms@&Yw>Q|@vEO{# z6akKc4LU+`xF~(nhEyTP$Kvi=!|QCSX};P+3)(gfh@O{(;`+UvC(Lkj>(}^xp8t2? zye&@gDFifOU7CYlo>M7L1WrqXhPQfb2twH@Xmd4IvRDMv9AhpnE`>fPzsLj$yV_n| zox30xuP3kYuDBA<(Lg6HsnvnS%X%=a*74%^dZ9tJlQ@sKc;mF%_rYRmMMZ2Z65T^j z;c&DSP z12@Ae2XC|UgJl|Hp2>tX>|RsDCpHET>mH;);_Qk7KK(TK;TyefxK+-8aU!qD9gqCe znfLW;lyL}?VYL%&_o6-y>(?EYX#Zr7MCdkud9i#itRvr=*~8zP{8NwD`F% z=>v#84yY(D%=Pv46_A)O_8QL?{;b!%+Kze3m;Ym&J(I}a4`3{Vb7f~?;Z-Oqg8sce zDG7<&?H%If<>b8D2rgBj)iUE_=jOKRU+Mrcq3gHj=Xt?V9bR12sRL-D4f7^3yx(5> z;mM=_?YZQ|&;K`x`E++SGMO?--LK$Ff)wQoT9lhqf$Q40CN)ZL`pV)VauAZgetUyZcFPn)6obZ`Do(2KELaZRwQQw*xALuLYl zUjj!5&yUi=67g^X{eLVa!uSREsJWj>WxB*b&3`C8XskGB2}ECKWjK(+yVJW2QS8a} zH+BiJ9Jy!9q4aM&S_05G!HR-l9EX#&w6yfYq5hs1Qz!T5X?|%s^I&9LMj65f!3BQ1 zSD#y2>bwsA+9Ze_=tS0{0xX4+2m4syY~(5u>WmX}T+oVo_{PnJBY*zsQHC5frK0NpU&7`i?Qo;}w7D$0dZ#35+8+yh7jMHRBon*u zF^Vh~z}DX;L%R&xaL~Yfro;{-I$bIsj9}zSm}cNCW>VHz(+r#WIps&LaS#Fr>=#j4 zEIten=M=7Bc$-g4E-j&RY~)H}*YmK4fzRua49o3b zxVxqbo2of(rc3r-6HFG5P1pb-IMjn=>Y*85mg@t@X5C3yO?DjH3o`ENGWKCX`c^*x z(T9P=gir5m*5bPjSV)mc#61m>#f$Q*@O=qZ^&VB!g+Z+(=IuEl(SS@D!r30e{kku? zwf_?BveG~9%>|akpPh0~@sn|_Ja77<>XPE(1(j}(IA^iGKj+jQ^dh;4eVwpL9I5v> z5Mgdtdk7Z%BpJ;RjSJJLS0B(L^^z<(l8`X1COxO-;M}^x_?AM90;EX0;g|gxnNbuMeN1g*hRIMQLdT>CJ>&xo}*oc`)<1&qhjiQMx!% z?zmtDn-bMBA6I+E;Q9DcQ!)z+{z@3>Np+lz>U_Gzn$-P|5vDjX%)@wK_jm;&(dw}q z7Vl|gxjFF*DiXx?H+tpV&G$fx#lYId^Z8yNyCFVD&5Jlgk^w$+@!Tx-J{~PoXy{HK z*IFY0jBvoj?BcLE4j(k{sHwML)nuX>;((nf*`}u4f9RnqyXW zYSX@tS?0dy8)XT!u%Zwtt)Iwq*tu44hQ#5rwC$Nzgz}E({3a}b5Ha)xzVfCb}1fEniqm_KMR!Sw!jetOZn8_vMF%zv>|u({(qJK|78l{69@0?>?HsG z?fPk2Lr14*I<6|(y8H9z&nlqb`=p!+@E{N71Hm&tKOdG-8(tMXpyIB|m!4YhH2>IL z8Pei}YFQ;AxF_=NK|N2o-~mPg8A0f(@i)wh;{NA??w?klC{VI$EEC1Nw6?Y$+@G%( zekhD)c30L%W3%u5IhLoEo{}075mC{q;)`$G-~Fx@8xVy->apu6-^n`f&s5qo_07pl zwCcL2C)S4V9TI_#QMM6WB!Jx#bBA>;xzlWCsw^C|QwTngv^K;Ju`u*7D47#E4(7df zl+7XvU?+z$kB_}xBxDkhRjKC`gD6e9AEre0!~}WyXgc` zq7og$4M~pEjYjmL?r2La`$-lDvY+>B8oIDkMJ?{)r|tuQF_mDV}RqMZ8w&GieQO z8$+1E2J2p6J}v|c@4H2d6J%ewn{+E}_IN|yy9nMh2bCJ{hF1)z%+cx(&2^Bar;^tS zw%+3(w#2EZQ=&lM`)#DH9Xy}{Od;W3P8BQMH1BA*~Knygu|$ z;@Fjr4jHgfWP}SgSN=|(d-O6@OenCPX}giEsFAej&(>Uhudx@>X(Ky{5g4I=VrFml zk68Zus{f2-@Og=e?t+;B)p7v02De6bizP`-n;T(=dVA(0>#Q>sGrlGJLk_gkIK);; zD)?C3n{FYSdp&dLaiX;P%gNxzy^HIQh^^8;EuYA@!54=f7Dfe_xgpJ-%gS%C{%221 zfbM@pc>pF(8(2TGeERfhl(js^We1yFxut=@Om1&H+ox$FKonQn#AE?R9P}+*c4<2yUSM#p~#d}Y6an18E{>}-FEsE zN$E<23iwCN9RD-2#^2F6C)rFVP~8pYfn2)FLg5o7ao5;5)UN1_gpdS_CJK}LfW|+A z=eHCKUFu!7#>&3B$QBSF3!0PmtnO70Q@?vU)5<)Lq(pM^7oA6tES` z0HX^6Q-ilMBvxfr* z@Sk`nd|2s~08A;s!RQ9BNIa@-bGy?6J?SxDod*Kup?a9Wlsepf$`6dd6P1r$XfhpO zKB`6Ve#>S8ch5h<2@Iwd&VLkJzz?KoQ3rXF*FQ}Ria(FmhBviibCB#e91S|2y8*+; zWe-6 zg%(DDTp|y7z5b2o_(+emPV<5(Arr?R!FO*{MS7H|gg#({8%C#ZPAKQq=%m=dIUiVg zqDL-mK-B!s1!JHHWC-$Ld6_I(2F(F(LP?4nsnwtpqaz#d@0wTGfNc}1R1f-rl%`)> z9{@DiVQCZ}zu1UNgiB%o-=Dy}V$cU8hrfh3p`TgybY(&UtPwEJ1@FySh&K@cK(z8f z1LHsYGVgR6H3tmrs|;^iP&sE4qhh^U#jAPr&Jc0Kdd1KFV5p~uy_*xg<%YaXyiJlI z&_;4aKQ88JU@{BFiaiHao1`Zr(9(r+CQA@(lYDh4G*>426E6t7xDtB1ZvPqteuX)s;`53mD{qhM9xPG*wO z-`=)J7^u|}oA(#X85-cg1CutuyvMeb5kV6oIqdbc4!hwNWTo;PjFMTbYkBf^OA)HkNY-{j8#&Nj3Tn{ef%AAaHcaQ0TLOZ2?HQR4lP)d zWMepw23xJ;PAGS8i6{)dGn!}~kY2*6Uxk#?5qUlq{{uMT$u5;1? z_NIy+-2B-;Td9PYp(C>*#FL@s2Vjq}r;ICK=JwIW8+nT*_gbT~Ctv~%M1Z>dz*#Qy z!Q}QylPq1k7BkLJDCOK|BqVFtg>LS>+P0Wlo7gu}iI#0B2(f{j<$J8};J#`JSNa@B zU)pTOgkoLJ;}6)}%ze~r<6{opcW-4ZvL4@yNpUxkxI-j3)NLSuQz+qqw;sQviG2TN zyRm}wZ()w1;S0k9@U5ETAtTzzFPCpu=W5+T;}CNXuEz3=xe5JM7@Y&2GU#K!Ts}bq zW#+r)n|q>OO5}i)68V361pm=SU5Wr(1UE8Y@ICFZmY-%igcbQCx9u-acO&mqlQCQY z_C_^wu?J5D+2d!hkz3Mq`D<%yj4( z<>;rQqch)VvX6Ky4@$*9iwqiG88V>Ge4mo?$PeuDP#A|uRp3H&96*s&ni4ob^Dj2J zsF>mJ82{yy8O-%KFM05LI@o9<*B}Qtu)^Fn23&?27q?F~`ixD%!X8=0nzp0-dXtm( z+jHM0#fpZvgMRVFmWRmdV8O6+f>QmWS`RV@~7 zGu|h~sJMzqoYf=U`VhM$0l?Q$2=p+A)1$1MGN5AkdPV{cmr=D=s)ppIBk+8X{8fGr#~D7rc+nM*fr9 zKPyk=3f3xl5X&NRf5;53$#7BYGdFi$Of_OFJtjuZE1KLAVV_mAMB~#S1n9&k@wMS6Tfq-N5 zw9-|zQ&;7TiZSW+oxfy(TncBMop z{|59j>^a($*9ZfdK$5nYY7^x@`>cga7#<91sx~}6_aX3WKIkq*CP+WY(3!ce`M7pG zCt}t+bPCdY>?!eo!A=#Jxkn&)RzVn<;XByCO2(Oj$k#E*ZIc3U!^rJVMi^Drkf zD+faHT`U`eWsb+JXlBC5r9*5if_ptl#!1uE=cqoM(Dp+feRP9Kt8dhGBZmykc=7oM zux?>~e*Vp~y?GjtIZNXa$sGalm1|)CUf$q`gh*`8=Xos zcs+Ke-nbLQzTgG(6>RR2>zV?X5lorpL+#fZd2i4HY{{VFZX{UnB0ltj^Hp&=LbWf} z%HN(kp%QCffNe_P)Mu(udx3Yy0^)6!mEp<+)Nd0!3cwJyFaNYg`I^Fgpa*n?`nc4< zc}NN1q85HCyflac#JkL%JFWar#KqV%C$mZLUTM|HyJ(@33V?T#gLe#njrfHseRJ)@ z?WSdIy&*C)bV0eIJZZ$q*&J7^Xu=5vvlRSae?hdxGI3{_gkFSdQ-83|a?lK?NKY{-bk+VOX0suJeCJIN8T+py%}X%*mC)mb%>PFg(t{hxN@}vvv>eDSs2u@C MSyh>0X*1OS0vDEVp8x;= literal 0 HcmV?d00001 diff --git a/src/components/Button/ConfirmTextButton.vue b/src/components/Button/ConfirmTextButton.vue new file mode 100644 index 0000000..cb82801 --- /dev/null +++ b/src/components/Button/ConfirmTextButton.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/Button/DeleteTextButton.vue b/src/components/Button/DeleteTextButton.vue new file mode 100644 index 0000000..67abcef --- /dev/null +++ b/src/components/Button/DeleteTextButton.vue @@ -0,0 +1,24 @@ + + + diff --git a/src/components/Button/IconButton.tsx b/src/components/Button/IconButton.tsx new file mode 100644 index 0000000..6a53175 --- /dev/null +++ b/src/components/Button/IconButton.tsx @@ -0,0 +1,79 @@ +import { buttonProps } from 'ant-design-vue/es/button/button' +import { initDefaultProps } from 'ant-design-vue/es/_util/props-util' + +import { Button as AButton } from 'ant-design-vue' +import { DownloadOutlined, PlusOutlined, UploadOutlined } from '@ant-design/icons-vue' +import { useAdminI18n } from '@/hooks/i18n' + +const iconButtonProps = () => ({ + ...buttonProps(), + i18nKey: { + type: String, + required: false + }, + defaultText: { + type: String, + required: false + } +}) + +// eslint-disable-next-line vue/one-component-per-file +const IconButton = defineComponent({ + name: 'IconButton', + slots: ['icon'], + props: iconButtonProps(), + setup(props, { slots, attrs }) { + const { i18nText } = useAdminI18n() + const text = i18nText(props.i18nKey!, props.defaultText) + + return () => ( + + {{ + default: () => text.value, + ...slots + }} + + ) + } +}) + +// eslint-disable-next-line vue/one-component-per-file +export const NewButton = defineComponent({ + name: 'NewButton', + props: initDefaultProps(buttonProps(), { + type: 'primary' + }), + setup(props, { attrs, slots }) { + return () => ( + + {{ icon: () => , ...slots }} + + ) + } +}) + +// eslint-disable-next-line vue/one-component-per-file +export const ImportButton = defineComponent({ + name: 'ImportButton', + props: buttonProps(), + setup(props, { attrs, slots }) { + return () => ( + + {{ icon: () => , ...slots }} + + ) + } +}) + +// eslint-disable-next-line vue/one-component-per-file +export const ExportButton = defineComponent({ + name: 'ExportButton', + props: buttonProps(), + setup(props, { attrs, slots }) { + return () => ( + + {{ icon: () => , ...slots }} + + ) + } +}) diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts new file mode 100644 index 0000000..16a73c4 --- /dev/null +++ b/src/components/Button/index.ts @@ -0,0 +1,4 @@ +export { NewButton, ImportButton, ExportButton } from './IconButton' + +export { default as ConfirmTextButton } from './ConfirmTextButton.vue' +export { default as DeleteTextButton } from './DeleteTextButton.vue' diff --git a/src/components/Captcha/ConcatCaptcha.vue b/src/components/Captcha/ConcatCaptcha.vue new file mode 100644 index 0000000..95b6aaa --- /dev/null +++ b/src/components/Captcha/ConcatCaptcha.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/components/Captcha/RotateCaptcha.vue b/src/components/Captcha/RotateCaptcha.vue new file mode 100644 index 0000000..9e6e6b2 --- /dev/null +++ b/src/components/Captcha/RotateCaptcha.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/components/Captcha/SliderCaptcha.vue b/src/components/Captcha/SliderCaptcha.vue new file mode 100644 index 0000000..044e175 --- /dev/null +++ b/src/components/Captcha/SliderCaptcha.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/components/Captcha/WordClickCaptcha.vue b/src/components/Captcha/WordClickCaptcha.vue new file mode 100644 index 0000000..92d4b31 --- /dev/null +++ b/src/components/Captcha/WordClickCaptcha.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/src/components/Captcha/index.less b/src/components/Captcha/index.less new file mode 100644 index 0000000..10c282d --- /dev/null +++ b/src/components/Captcha/index.less @@ -0,0 +1,118 @@ +.slider { + background-color: #fff; + width: 278px; + height: 285px; + z-index: 999; + box-sizing: border-box; + padding: 9px; + border-radius: 6px; + box-shadow: 0 0 11px 0 #999999; +} + +.slider .content { + width: 100%; + height: 159px; + position: relative; +} + +.bg-img-div { + width: 100%; + height: 100%; + position: absolute; + transform: translate(0px, 0px); +} + +.slider-img-div { + height: 100%; + position: absolute; + transform: translate(0px, 0px); +} + +.bg-img-div img { + width: 100%; +} + +.slider-img-div img { + height: 100%; +} + +.slider .slider-move { + height: 60px; + width: 100%; + margin: 11px 0; + position: relative; +} + +.slider .bottom { + height: 19px; + width: 100%; +} + +.refresh-btn, +.close-btn, +.slider-move-track, +.slider-move-btn { + background: url(@/assets/sprite.1.2.4.png) no-repeat; +} + +.refresh-btn, +.close-btn { + display: inline-block; +} + +.slider-move .slider-move-track { + line-height: 38px; + font-size: 14px; + text-align: center; + white-space: nowrap; + color: #88949d; + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +.slider { + user-select: none; +} + +.slider-move .slider-move-btn { + transform: translate(0px, 0px); + background-position: -5px 11.79625%; + position: absolute; + top: -12px; + left: 0; + width: 66px; + height: 66px; +} + +.slider-move-btn:hover, +.close-btn:hover, +.refresh-btn:hover { + cursor: pointer; +} + +.bottom .close-btn { + width: 20px; + height: 20px; + background-position: 0 44.86874%; +} + +.bottom .refresh-btn { + width: 20px; + height: 20px; + background-position: 0 81.38425%; +} + +.captcha-mask { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: 1009; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} diff --git a/src/components/Captcha/index.ts b/src/components/Captcha/index.ts new file mode 100644 index 0000000..2ba92eb --- /dev/null +++ b/src/components/Captcha/index.ts @@ -0,0 +1,4 @@ +export { default as SliderCaptcha } from '@/components/Captcha/SliderCaptcha.vue' +export { default as RotateCaptcha } from '@/components/Captcha/RotateCaptcha.vue' +export { default as ConcatCaptcha } from '@/components/Captcha/ConcatCaptcha.vue' +export { default as WordClickCaptcha } from '@/components/Captcha/WordClickCaptcha.vue' diff --git a/src/components/Captcha/types.ts b/src/components/Captcha/types.ts new file mode 100644 index 0000000..677ec0d --- /dev/null +++ b/src/components/Captcha/types.ts @@ -0,0 +1,27 @@ +export interface CaptchaConfig { + startX?: number + startY?: number + type?: string + startTime?: Date + stopTime?: Date + trackArr?: Track[] + end?: number + bgImageWidth?: number + bgImageHeight?: number + templateImageWidth?: number + templateImageHeight?: number + movePercent?: number + moveX?: number + t?: number +} + +export interface Track { + x: number + y: number + type: string + t: number +} + +export interface CaptchaProps { + onSuccess?: (id: string) => void +} diff --git a/src/components/Captcha/useCaptcha.ts b/src/components/Captcha/useCaptcha.ts new file mode 100644 index 0000000..2a1665c --- /dev/null +++ b/src/components/Captcha/useCaptcha.ts @@ -0,0 +1,127 @@ +import type { Track, CaptchaConfig } from '@/components/Captcha/types' + +export const useCaptcha = ( + options: { + doDown?: (captchaConfig: CaptchaConfig) => void + doMove?: (captchaConfig: CaptchaConfig) => void + valid?: (captchaConfig: CaptchaConfig) => void + } = {} +) => { + // 验证码配置 + let currentCaptchaConfig: CaptchaConfig = {} + + function initConfig( + bgImageWidth: number, + bgImageHeight: number, + sliderImageWidth: number, + sliderImageHeight: number, + end: number + ) { + currentCaptchaConfig = { + startTime: new Date(), + trackArr: [], + movePercent: 0, + bgImageWidth, + bgImageHeight, + sliderImageWidth, + sliderImageHeight, + end + } + } + + const down = (event: MouseEvent | TouchEvent) => { + const targetTouches = (event as TouchEvent)?.targetTouches + let startX = (event as MouseEvent)?.pageX + let startY = (event as MouseEvent)?.pageY + if (startX === undefined) { + startX = Math.round(targetTouches[0].pageX) + startY = Math.round(targetTouches[0].pageY) + } + currentCaptchaConfig.startX = startX + currentCaptchaConfig.startY = startY + + const pageX = currentCaptchaConfig.startX + const pageY = currentCaptchaConfig.startY + const startTime = currentCaptchaConfig.startTime + const trackArr = currentCaptchaConfig.trackArr + trackArr!.push({ + x: pageX - startX, + y: pageY - startY, + type: 'down', + t: new Date().getTime() - startTime!.getTime() + }) + // pc + window.addEventListener('mousemove', move) + window.addEventListener('mouseup', up) + // 手机端 + window.addEventListener('touchmove', move, false) + window.addEventListener('touchend', up, false) + + options.doDown?.(currentCaptchaConfig) + } + + function move(event: MouseEvent | TouchEvent) { + let touchMouseEvent: MouseEvent | Touch = event as MouseEvent + if (window.TouchEvent && event instanceof TouchEvent) { + touchMouseEvent = event.touches[0] + } + const pageX = Math.round(touchMouseEvent.pageX) + const pageY = Math.round(touchMouseEvent.pageY) + const startX = currentCaptchaConfig.startX as number + const startY = currentCaptchaConfig.startY as number + const startTime = currentCaptchaConfig.startTime as Date + const end = currentCaptchaConfig.end as number + const bgImageWidth = currentCaptchaConfig.bgImageWidth as number + const trackArr = currentCaptchaConfig.trackArr as unknown[] + let moveX = pageX - startX + const track = { + x: pageX - startX, + y: pageY - startY, + type: 'move', + t: new Date().getTime() - startTime.getTime() + } + trackArr.push(track) + if (moveX < 0) { + moveX = 0 + } else if (moveX > end) { + moveX = end + } + currentCaptchaConfig.moveX = moveX + currentCaptchaConfig.movePercent = moveX / bgImageWidth + + options.doMove?.(currentCaptchaConfig) + } + + function up(event: MouseEvent | TouchEvent) { + let touchMouseEvent: MouseEvent | Touch = event as MouseEvent + window.removeEventListener('mousemove', move) + window.removeEventListener('mouseup', up) + window.removeEventListener('touchmove', move) + window.removeEventListener('touchend', up) + if (window.TouchEvent && event instanceof TouchEvent) { + touchMouseEvent = event.changedTouches[0] + } + currentCaptchaConfig.stopTime = new Date() + const pageX = Math.round(touchMouseEvent.pageX) + const pageY = Math.round(touchMouseEvent.pageY) + const startX = currentCaptchaConfig.startX as number + const startY = currentCaptchaConfig.startY as number + const startTime = currentCaptchaConfig.startTime as Date + const trackArr = currentCaptchaConfig.trackArr as Track[] + + const track: Track = { + x: pageX - startX, + y: pageY - startY, + type: 'up', + t: new Date().getTime() - startTime.getTime() + } + trackArr.push(track) + + options.valid?.(currentCaptchaConfig) + } + + return { + initConfig, + down + } +} diff --git a/src/components/CropperModal/index.vue b/src/components/CropperModal/index.vue new file mode 100644 index 0000000..f525d56 --- /dev/null +++ b/src/components/CropperModal/index.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/src/components/CropperModal/types.ts b/src/components/CropperModal/types.ts new file mode 100644 index 0000000..fd8b073 --- /dev/null +++ b/src/components/CropperModal/types.ts @@ -0,0 +1,4 @@ +export interface FileObject { + data: Blob + name: string +} diff --git a/src/components/Dict/display/DictBadge.vue b/src/components/Dict/display/DictBadge.vue new file mode 100644 index 0000000..d59177e --- /dev/null +++ b/src/components/Dict/display/DictBadge.vue @@ -0,0 +1,23 @@ + + + + + + + diff --git a/src/components/Dict/display/DictTag.vue b/src/components/Dict/display/DictTag.vue new file mode 100644 index 0000000..6c0b5af --- /dev/null +++ b/src/components/Dict/display/DictTag.vue @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/Dict/display/DictTagGroup.vue b/src/components/Dict/display/DictTagGroup.vue new file mode 100644 index 0000000..517490c --- /dev/null +++ b/src/components/Dict/display/DictTagGroup.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/Dict/display/DictText.vue b/src/components/Dict/display/DictText.vue new file mode 100644 index 0000000..e726806 --- /dev/null +++ b/src/components/Dict/display/DictText.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/components/Dict/group/DictCheckboxGroup.vue b/src/components/Dict/group/DictCheckboxGroup.vue new file mode 100644 index 0000000..a76f5db --- /dev/null +++ b/src/components/Dict/group/DictCheckboxGroup.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/src/components/Dict/group/DictRadioGroup.vue b/src/components/Dict/group/DictRadioGroup.vue new file mode 100644 index 0000000..7894c41 --- /dev/null +++ b/src/components/Dict/group/DictRadioGroup.vue @@ -0,0 +1,51 @@ + + + + + + + diff --git a/src/components/Dict/group/DictSelect.vue b/src/components/Dict/group/DictSelect.vue new file mode 100644 index 0000000..bc0b09b --- /dev/null +++ b/src/components/Dict/group/DictSelect.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/Dict/index.ts b/src/components/Dict/index.ts new file mode 100644 index 0000000..bff3f48 --- /dev/null +++ b/src/components/Dict/index.ts @@ -0,0 +1,9 @@ +export { default as DictSelect } from './group/DictSelect.vue' +export { default as DictCheckboxGroup } from './group/DictCheckboxGroup.vue' +export { default as DictRadioGroup } from './group/DictRadioGroup.vue' + +export { default as DictBadge } from './display/DictBadge.vue' +export { default as DictTag } from './display/DictTag.vue' +export { default as DictText } from './display/DictText.vue' + +export { default as DictTagGroup } from './display/DictTagGroup.vue' diff --git a/src/components/Dict/types.ts b/src/components/Dict/types.ts new file mode 100644 index 0000000..b32e129 --- /dev/null +++ b/src/components/Dict/types.ts @@ -0,0 +1,88 @@ +import type { DictItem, DictValue } from '@/api/system/dict/types' +import type { BadgeProps } from 'ant-design-vue' +import { selectProps } from 'ant-design-vue/es/select' +import type { ExtractPropTypes, PropType } from 'vue' +import { checkboxGroupProps } from 'ant-design-vue/es/checkbox' +import { radioGroupProps } from 'ant-design-vue/es/radio/Group' + +/** 字典组件 */ +const dictCommonProps = () => ({ + // 字典标识 + dictCode: String as PropType, + // 用于过滤出指定的字典项 + itemFilter: Function as PropType<(dictItem: DictItem) => boolean>, + // 给字典项添加是否禁用的属性 + itemDisabledChecker: Function as PropType<(dictItem: DictItem) => boolean> +}) + +export interface DictComponentProps { + // 字典标识 + dictCode: string + // 用于过滤出指定的字典项 + itemFilter?: (dictItem: DictItem) => boolean + // 给字典项添加是否禁用的属性 + itemDisabledChecker?: (dictItem: DictItem) => boolean +} + +/** 字典回显组件:如 Text,徽章等 */ +export interface DictDisplayComponentProps extends DictComponentProps { + // 字典的值 + value: DictValue | null +} + +/** 字典文字回显组件属性 */ +export type DictTextProps = DictDisplayComponentProps + +/** 字典标签回显组件属性 */ +export type DictTagProps = DictDisplayComponentProps + +/** 字典标签组回显组件属性 */ +export type DictTagGroupProps = { + dictCode: string + dictValues: DictValue[] +} + +/** 字典徽章组件属性 */ +export type DictBadgeProps = DictDisplayComponentProps & Omit + +/** 字典组的组件:如选择框,checkbox 等,支持多选 */ +export interface DictGroupComponentProps extends DictComponentProps { + // 字典的值 + value: DictValue | DictValue[] | null +} + +/** 字典选择器 Prop 类型 */ +export const dictSelectProps = () => ({ + ...selectProps(), + ...dictCommonProps(), + // 显示搜索 + showSearch: { + type: Boolean as PropType, + default: true + } +}) + +export type DictSelectProps = Partial>> + +/** 字典复选框组 Prop 类型 */ +export const dictCheckboxGroupProps = () => ({ + ...checkboxGroupProps(), + ...dictCommonProps() +}) + +export type DictCheckboxGroupProps = Partial< + ExtractPropTypes> +> + +/** 字典单选框组 Prop 类型 */ +export const dictRadioGroupProps = () => ({ + ...radioGroupProps(), + ...dictCommonProps(), + // 显示类型 + type: { + type: String as PropType<'radio' | 'button'>, + default: 'radio' + } +}) + +export type DictRadioGroupProps = Partial>> diff --git a/src/components/Dict/use-dict.ts b/src/components/Dict/use-dict.ts new file mode 100644 index 0000000..20ec256 --- /dev/null +++ b/src/components/Dict/use-dict.ts @@ -0,0 +1,90 @@ +import { useDictStore } from '@/stores/dict-store' +import type { DictItem, DictValue } from '@/api/system/dict/types' +import { DictItemStatus, DictValueTypeEnum } from '@/api/system/dict/types' +import type { DictComponentProps, DictDisplayComponentProps } from '@/components/Dict/types' + +// 默认的 item 是否禁用的判断器 +const defaultItemDisabledChecker = (dictItem: DictItem) => + dictItem.status !== DictItemStatus.ENABLED + +export const useDict = (props: DictComponentProps) => { + const { dictDataCache, getDictData } = useDictStore() + + // 先尝试初始化 + watch( + () => props.dictCode, + dictCode => getDictData(dictCode), + { immediate: true } + ) + + return computed(() => { + const dictData = dictDataCache[props.dictCode] + if (!dictData) return [] as DictItem[] + + const result: DictItem[] = [] + + const dictItemVOs = dictData.dictItems + for (const item of dictItemVOs) { + const dictItem = Object.assign({}, item) as DictItem + + // 转换字典项的值为其真实类型 + dictItem.value = convertValueType(item.value, dictData.valueType) + + // 过滤字典项 + if (props.itemFilter && !props.itemFilter(dictItem)) { + continue + } + + // 选择名称,国际化处理 + // dictItem.name = props.i18nName(dictItem) + + // 字典项是否 disable + const itemDisabledChecker = props.itemDisabledChecker || defaultItemDisabledChecker + dictItem.disabled = itemDisabledChecker(dictItem) + + // 添加字典项 + result.push(dictItem) + } + return result + }) +} + +export const useDictDisplay = (props: DictDisplayComponentProps) => { + const dictItems = useDict(props) + + // 当前展示的 dictItem + const dictItem = computed(() => dictItems.value.find(dictItem => dictItem.value === props.value)) + + // 显示的文本 + const showText = computed(() => dictItem.value?.name || dictItem.value?.value) + + return { + dictItems, + dictItem, + showText + } +} + +/** + * 服务端返回的都是 String 类型,需转换为真实类型 + * @param value 值 + * @param valueType 值类型 + * @returns {number | boolean | string} + */ +function convertValueType(value: string, valueType: DictValueTypeEnum): DictValue { + let res = value as DictValue + // 如果没有type, 按number 处理 + valueType = valueType || DictValueTypeEnum.NUMBER + if (valueType === DictValueTypeEnum.NUMBER) { + res = Number(value) // 数字 + } else if (valueType === DictValueTypeEnum.STRING) { + res = String(value) // 字符串 + } else if (valueType === DictValueTypeEnum.BOOLEAN) { + // 布尔 + // 字符串 ”false“ 也会被转换为 true,所以要额外判断下 + // 参看 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean + const b = Boolean(value) + res = b && value.toLowerCase() === 'false' ? false : b + } + return res +} diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue new file mode 100644 index 0000000..4fa8c4b --- /dev/null +++ b/src/components/Editor/index.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/src/components/Editor/types.ts b/src/components/Editor/types.ts new file mode 100644 index 0000000..463c637 --- /dev/null +++ b/src/components/Editor/types.ts @@ -0,0 +1,6 @@ +import type { ApiResult } from '@/api/types' +import type { FileObject } from '@/components/CropperModal/types' + +export type InsertFnType = (url: string, alt: string, href: string) => void + +export type UploadFunction = (files: FileObject[]) => Promise> diff --git a/src/components/Editor/view.less b/src/components/Editor/view.less new file mode 100644 index 0000000..ba6e29a --- /dev/null +++ b/src/components/Editor/view.less @@ -0,0 +1,52 @@ +.editor-content-view { + border: 3px solid #ccc; + border-radius: 5px; + padding: 0 10px; + margin-top: 20px; + overflow-x: auto; +} + +.editor-content-view p, +.editor-content-view li { + white-space: pre-wrap; /* 保留空格 */ +} + +.editor-content-view blockquote { + border-left: 8px solid #d0e5f2; + padding: 10px 10px; + margin: 10px 0; + background-color: #f1f1f1; +} + +.editor-content-view code { + font-family: monospace; + background-color: #eee; + padding: 3px; + border-radius: 3px; +} +.editor-content-view pre>code { + display: block; + padding: 10px; +} + +.editor-content-view table { + border-collapse: collapse; +} +.editor-content-view td, +.editor-content-view th { + border: 1px solid #ccc; + min-width: 50px; + height: 20px; +} +.editor-content-view th { + background-color: #f1f1f1; +} + +.editor-content-view ul, +.editor-content-view ol { + padding-left: 20px; +} + +.editor-content-view input[type="checkbox"] { + margin-right: 5px; +} \ No newline at end of file diff --git a/src/components/Editor/wangeditor.d.ts b/src/components/Editor/wangeditor.d.ts new file mode 100644 index 0000000..804f585 --- /dev/null +++ b/src/components/Editor/wangeditor.d.ts @@ -0,0 +1,14 @@ +import { SlateDescendant, SlateElement, SlateText } from '@wangeditor/editor' + +declare module '@wangeditor/editor' { + // 扩展 Text + interface SlateText { + text: string + } + + // 扩展 Element + interface SlateElement { + type: string + children: SlateDescendant[] + } +} diff --git a/src/components/IconSelector/IconSelector.vue b/src/components/IconSelector/IconSelector.vue new file mode 100644 index 0000000..7356420 --- /dev/null +++ b/src/components/IconSelector/IconSelector.vue @@ -0,0 +1,103 @@ + + + + + + + diff --git a/src/components/IconSelector/IconSelectorModal.vue b/src/components/IconSelector/IconSelectorModal.vue new file mode 100644 index 0000000..895db0f --- /dev/null +++ b/src/components/IconSelector/IconSelectorModal.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/components/IconSelector/icons.ts b/src/components/IconSelector/icons.ts new file mode 100644 index 0000000..2630933 --- /dev/null +++ b/src/components/IconSelector/icons.ts @@ -0,0 +1,392 @@ +/** + * 增加新的图标时,请遵循以下数据结构 + * Adding new icon please follow the data structure below + */ +export default [ + { + key: 'directional', + title: '方向性图标', + icons: [ + 'step-backward', + 'step-forward', + 'fast-backward', + 'fast-forward', + 'shrink', + 'arrows-alt', + 'down', + 'up', + 'left', + 'right', + 'caret-up', + 'caret-down', + 'caret-left', + 'caret-right', + 'up-circle', + 'down-circle', + 'left-circle', + 'right-circle', + 'double-right', + 'double-left', + 'vertical-left', + 'vertical-right', + 'forward', + 'backward', + 'rollback', + 'enter', + 'retweet', + 'swap', + 'swap-left', + 'swap-right', + 'arrow-up', + 'arrow-down', + 'arrow-left', + 'arrow-right', + 'play-circle', + 'up-square', + 'down-square', + 'left-square', + 'right-square', + 'login', + 'logout', + 'menu-fold', + 'menu-unfold', + 'border-bottom', + 'border-inner', + 'border-outer', + 'border-left', + 'border-right', + 'border-top', + 'pic-center', + 'pic-left', + 'pic-right', + 'radius-upleft', + 'radius-upright', + 'fullscreen' + ] + }, + { + key: 'suggested', + title: '提示建议性图标', + icons: [ + 'question', + 'question-circle', + 'plus', + 'plus-circle', + 'pause', + 'pause-circle', + 'minus', + 'minus-circle', + 'plus-square', + 'minus-square', + 'info', + 'info-circle', + 'exclamation', + 'close', + 'close-circle', + 'close-square', + 'check', + 'check-circle', + 'check-square', + 'clock-circle', + 'warning', + 'issues-close', + 'stop' + ] + }, + { + key: 'editor', + title: '编辑类图标', + icons: [ + 'edit', + 'form', + 'copy', + 'scissor', + 'delete', + 'snippets', + 'diff', + 'highlight', + 'align-center', + 'align-left', + 'align-right', + 'bg-colors', + 'bold', + 'italic', + 'underline', + 'strikethrough', + 'redo', + 'undo', + 'zoom-in', + 'zoom-out', + 'font-colors', + 'font-size', + 'line-height', + 'dash', + 'small-dash', + 'sort-ascending', + 'drag', + 'ordered-list', + 'unordered-list', + 'radius-setting', + 'column-width', + 'column-height' + ] + }, + { + key: 'data', + title: '数据类图标', + icons: [ + 'area-chart', + 'pie-chart', + 'bar-chart', + 'dot-chart', + 'line-chart', + 'radar-chart', + 'heat-map', + 'fall', + 'rise', + 'stock', + 'box-plot', + 'fund', + 'sliders' + ] + }, + { + key: 'brand_logo', + title: '网站通用图标', + icons: [ + 'account-book', + 'alert', + 'api', + 'appstore', + 'audio', + 'bank', + 'bell', + 'book', + 'bug', + 'bulb', + 'calculator', + 'build', + 'calendar', + 'camera', + 'car', + 'carry-out', + 'cloud', + 'code', + 'compass', + 'contacts', + 'container', + 'control', + 'credit-card', + 'crown', + 'dashboard', + 'database', + 'dislike', + 'environment', + 'experiment', + 'eye-invisible', + 'eye', + 'file-add', + 'file-excel', + 'file-image', + 'file-markdown', + 'file-pdf', + 'file-ppt', + 'file-text', + 'file-unknown', + 'file-word', + 'file-zip', + 'file', + 'filter', + 'fire', + 'flag', + 'folder-add', + 'folder', + 'folder-open', + 'frown', + 'funnel-plot', + 'gift', + 'hdd', + 'heart', + 'home', + 'hourglass', + 'idcard', + 'insurance', + 'interaction', + 'layout', + 'like', + 'lock', + 'mail', + 'medicine-box', + 'meh', + 'message', + 'mobile', + 'money-collect', + 'pay-circle', + 'notification', + 'phone', + 'picture', + 'play-square', + 'printer', + 'profile', + 'project', + 'pushpin', + 'property-safety', + 'read', + 'reconciliation', + 'red-envelope', + 'rest', + 'rocket', + 'save', + 'schedule', + 'security-scan', + 'setting', + 'shop', + 'shopping', + 'skin', + 'smile', + 'sound', + 'star', + 'switcher', + 'tablet', + 'tag', + 'tags', + 'tool', + 'thunderbolt', + 'trophy', + 'unlock', + 'usb', + 'video-camera', + 'wallet', + 'apartment', + 'audit', + 'barcode', + 'bars', + 'block', + 'border', + 'branches', + 'ci', + 'cloud-download', + 'cloud-server', + 'cloud-sync', + 'cloud-upload', + 'cluster', + 'coffee', + 'copyright', + 'deployment-unit', + 'desktop', + 'disconnect', + 'dollar', + 'download', + 'ellipsis', + 'euro', + 'exception', + 'export', + 'file-done', + 'file-jpg', + 'file-protect', + 'file-sync', + 'file-search', + 'fork', + 'gateway', + 'global', + 'gold', + 'history', + 'import', + 'inbox', + 'key', + 'laptop', + 'link', + 'line', + 'loading', + 'man', + 'menu', + 'monitor', + 'more', + 'number', + 'percentage', + 'paper-clip', + 'pound', + 'poweroff', + 'pull-request', + 'qrcode', + 'reload', + 'safety', + 'robot', + 'scan', + 'search', + 'select', + 'shake', + 'share-alt', + 'shopping-cart', + 'solution', + 'sync', + 'table', + 'team', + 'to-top', + 'trademark', + 'transaction', + 'upload', + 'user-add', + 'user-delete', + 'usergroup-add', + 'user', + 'wifi', + 'woman' + ] + }, + { + key: 'application', + title: '品牌和标识', + icons: [ + 'android', + 'apple', + 'windows', + 'ie', + 'chrome', + 'github', + 'aliwangwang', + 'dingding', + 'weibo-square', + 'weibo-circle', + 'taobao-circle', + 'html5', + 'weibo', + 'twitter', + 'wechat', + 'youtube', + 'alipay-circle', + 'taobao', + 'skype', + 'qq', + 'medium-workmark', + 'gitlab', + 'medium', + 'linkedin', + 'google-plus', + 'dropbox', + 'facebook', + 'codepen', + 'code-sandbox', + 'amazon', + 'google', + 'codepen-circle', + 'alipay', + 'ant-design', + 'ant-cloud', + 'aliyun', + 'zhihu', + 'slack', + 'slack-square', + 'behance', + 'behance-square', + 'dribbble', + 'dribbble-square', + 'instagram', + 'yuque', + 'alibaba', + 'yahoo', + 'reddit', + 'sketch' + ] + } +] diff --git a/src/components/IconSelector/index.ts b/src/components/IconSelector/index.ts new file mode 100644 index 0000000..91fc09d --- /dev/null +++ b/src/components/IconSelector/index.ts @@ -0,0 +1,2 @@ +export { default as IconSelector } from './IconSelector.vue' +export { default as IconSelectorModal } from './IconSelectorModal.vue' diff --git a/src/components/IconSelector/types.ts b/src/components/IconSelector/types.ts new file mode 100644 index 0000000..7dae853 --- /dev/null +++ b/src/components/IconSelector/types.ts @@ -0,0 +1,10 @@ +/** + * 增加新的图标时,请遵循以下数据结构 + * Adding new icon please follow the data structure below + */ +export type Icon = string +export interface IconGroup { + key: string + title: string + icons: Icon[] +} diff --git a/src/components/Lov/Lov.vue b/src/components/Lov/Lov.vue new file mode 100644 index 0000000..8cbb368 --- /dev/null +++ b/src/components/Lov/Lov.vue @@ -0,0 +1,219 @@ + + + diff --git a/src/components/Lov/LovModal.vue b/src/components/Lov/LovModal.vue new file mode 100644 index 0000000..b4e86ad --- /dev/null +++ b/src/components/Lov/LovModal.vue @@ -0,0 +1,333 @@ + + + + + diff --git a/src/components/Lov/LovSearch.vue b/src/components/Lov/LovSearch.vue new file mode 100644 index 0000000..7945e14 --- /dev/null +++ b/src/components/Lov/LovSearch.vue @@ -0,0 +1,126 @@ + + + + + + diff --git a/src/components/Lov/index.ts b/src/components/Lov/index.ts new file mode 100644 index 0000000..8052531 --- /dev/null +++ b/src/components/Lov/index.ts @@ -0,0 +1,6 @@ +// @ts-ignore +export { default as LovLocal } from './Lov.vue' +// @ts-ignore +export { default as LovModal } from './LovModal.vue' +// @ts-ignore +export { default as LovSearch } from './LovSearch.vue' diff --git a/src/components/Lov/lov-options.ts b/src/components/Lov/lov-options.ts new file mode 100644 index 0000000..e2314ff --- /dev/null +++ b/src/components/Lov/lov-options.ts @@ -0,0 +1,49 @@ +// Lov 搜索条件控件的类型 +// @ts-ignore +import type { LovProps } from '@/components/Lov/Lov.vue' + +import { pageUsers as getUserPage } from '@/api/system/user' +import { LOV_SEARCH_TYPE_ENUM } from '@/components/Lov/type' +import type { SysUserPageParam, SysUserPageVO } from '@/api/system/user/types' + +export const sysUserLov: LovProps = { + multiple: true, + isNumberValue: true, + modalTitle: '用户', + dataKey: 'userId', + // 自定义选择项的展示标题 + customOptionTitle(record: SysUserPageVO) { + return record.nickname + }, + getPageData: getUserPage, + // 搜索配置 + searchOptions: [ + { + label: '用户名', + field: 'username', + type: LOV_SEARCH_TYPE_ENUM.INPUT, + placeholder: 'message.pleaseEnter' + }, + { + label: '昵称', + field: 'nickname', + type: LOV_SEARCH_TYPE_ENUM.INPUT, + placeholder: 'message.pleaseEnter' + } + ], + // 表格列 + tableColumns: [ + { + title: '用户名', + dataIndex: 'username' + }, + { + title: '昵称', + dataIndex: 'nickname' + }, + { + title: '组织', + dataIndex: 'organizationName' + } + ] +} diff --git a/src/components/Lov/type.ts b/src/components/Lov/type.ts new file mode 100644 index 0000000..f6a810b --- /dev/null +++ b/src/components/Lov/type.ts @@ -0,0 +1,6 @@ +export enum LOV_SEARCH_TYPE_ENUM { + INPUT = 'input', + NUMBER_INPUT = 'number-input', + SELECT = 'select', + DICT_SELECT = 'dict-select' +} diff --git a/src/components/Notify/AnnouncementModal.tsx b/src/components/Notify/AnnouncementModal.tsx new file mode 100644 index 0000000..c7ddae4 --- /dev/null +++ b/src/components/Notify/AnnouncementModal.tsx @@ -0,0 +1,29 @@ +import { Modal } from 'ant-design-vue' +import { readAnnouncement } from '@/api/notify/announcement' +import type { AnnouncementDTO } from '@/api/notify/announcement/types' +import { NotificationOutlined } from '@ant-design/icons-vue' +import { defineComponent } from 'vue' +import '@wangeditor/editor/dist/css/style.css' +import '@/components/Editor/view.less' + +export const AnnouncementModal = defineComponent({ + name: 'AnnouncementModal', + setup(props, { expose }) { + function show(announcement: AnnouncementDTO, isPreview = false) { + Modal.info({ + title: announcement.title, + width: 800, + // JSX support + icon: () => , + content: () =>
, + onOk: function () { + // 不是预览且状态是未读 + if (!isPreview && announcement.status === 0) { + return readAnnouncement(announcement.id!) + } + } + }) + } + expose({ show }) + } +}) diff --git a/src/components/Notify/AnnouncementRibbon.vue b/src/components/Notify/AnnouncementRibbon.vue new file mode 100644 index 0000000..3d2b5bb --- /dev/null +++ b/src/components/Notify/AnnouncementRibbon.vue @@ -0,0 +1,129 @@ + + + + + + diff --git a/src/components/Operation/OperationGroup.vue b/src/components/Operation/OperationGroup.vue new file mode 100644 index 0000000..b83eee0 --- /dev/null +++ b/src/components/Operation/OperationGroup.vue @@ -0,0 +1,16 @@ + + + + + diff --git a/src/components/Operation/index.ts b/src/components/Operation/index.ts new file mode 100644 index 0000000..097f20a --- /dev/null +++ b/src/components/Operation/index.ts @@ -0,0 +1 @@ +export { default as OperationGroup } from './OperationGroup.vue' diff --git a/src/components/Search/SearchActions.vue b/src/components/Search/SearchActions.vue new file mode 100644 index 0000000..3271dff --- /dev/null +++ b/src/components/Search/SearchActions.vue @@ -0,0 +1,51 @@ + + + + + + + diff --git a/src/components/SelectLanguage/index.vue b/src/components/SelectLanguage/index.vue new file mode 100644 index 0000000..a7e9d7b --- /dev/null +++ b/src/components/SelectLanguage/index.vue @@ -0,0 +1,52 @@ + + + + diff --git a/src/config/index.ts b/src/config/index.ts new file mode 100644 index 0000000..fc3de1a --- /dev/null +++ b/src/config/index.ts @@ -0,0 +1,74 @@ +import type { ProSettings } from '#/layout/defaultSettings' + +export type LanguageInfo = { + lang: string + title: string + symbol: string +} + +export type SupportLanguage = Record + +// 项目标题 +export const projectTitle = '线索分发系统' +// 项目描述 +export const projectDesc = 'Ballcat Admin 是一套简单好用的后台管理系统' + +// Local Storage/ Session Storage 的 key 前缀 prefix +export const storageKeyPrefix = 'ballcat-admin/' + +// 开启 websocket,开启此选项需要服务端同步支持 websocket 功能 +// 若服务端不支持,则本地启动时,抛出 socket 异常,导致 proxyServer 关闭 +export const enableWebsocket = true + +// 开启布局设置 +export const enableLayoutSetting = true + +// 开启登录验证码 +export const enableLoginCaptcha = true + +// 是否开启国际化 +export const enableI18n = true +// 项目默认语言 +export const defaultLanguage = 'zh-CN' +// 支持的语言信息 +export const supportLanguage: SupportLanguage = { + 'zh-CN': { + lang: 'zh-CN', + title: '简体中文', + symbol: '🇨🇳' + }, + 'en-US': { + lang: 'en-US', + title: 'English', + symbol: '🇺🇸' + } +} + +// 路由布局的组件名称 +export const routerLayoutName = 'RouterLayout' +// 刷新时占位的空组件名 +export const emptyNodeName = '_EmptyNode' +// 重定向的路由路径 +export const redirectPath = '/redirect' +// 登录页的地址 +export const loginPath = '/login' + +/* 应用设置 */ +export const appSettings: ProSettings = { + navTheme: 'dark', + headerTheme: 'dark', + layout: 'side', + contentWidth: 'Fluid', + fixedHeader: false, + fixSiderbar: true, + headerHeight: 48, + iconfontUrl: '', + primaryColor: '#1890ff', + splitMenus: false, + + // 布局内容默认都渲染 + headerRender: undefined, + footerRender: undefined, + menuRender: undefined, + menuHeaderRender: undefined +} diff --git a/src/hooks/form.ts b/src/hooks/form.ts new file mode 100644 index 0000000..279ef84 --- /dev/null +++ b/src/hooks/form.ts @@ -0,0 +1,115 @@ +import type { ColProps } from 'ant-design-vue' +import type { ApiResult } from '@/api/types' +import { Form } from 'ant-design-vue' +import type { Ref } from 'vue' +import type { Props } from 'ant-design-vue/es/form/useForm' +import type { Callbacks } from 'ant-design-vue/es/form/interface' +import type { RequestOptions } from '@/utils/axios/types' +import { doRequest } from '@/utils/axios/request' +const useForm = Form.useForm + +export interface DebounceSettings { + leading?: boolean + wait?: number + trailing?: boolean +} + +// 表单行为类型,标识当前表单是用来新建的还是更新的 +export const enum FormAction { + OTHER = 'other', + CREATE = 'create', + UPDATE = 'update', + IMPORT = 'import' +} + +export interface FormRequestMapping { + [key: string]: (model: T) => Promise> +} + +// 默认的表单的标签布局 +export const labelCol: ColProps = { + sm: { span: 24 }, + md: { span: 5 } +} + +// 默认的表单元素布局 +export const wrapperCol: ColProps = { + sm: { span: 24 }, + md: { span: 19 } +} + +export const useAdminForm = ( + formAction: FormAction | Ref, + formRequestMapping: FormRequestMapping, + modelRef: Props | Ref, + rulesRef?: Props | Ref, + options?: { + immediate?: boolean + deep?: boolean + validateOnRuleChange?: boolean + debounce?: DebounceSettings + onValidate?: Callbacks['onValidate'] + } +) => { + // 表单提交状态 + const submitLoading = ref(false) + + // 调用 antdv 的 useForm 初始化表单 + const useFormResult = useForm(modelRef, rulesRef, options) + + /* 表单提交方法 */ + const submit = (model: T, requestOptions?: RequestOptions) => { + const request = formRequestMapping[unref(formAction)] + submitLoading.value = true + doRequest(request(model), { + ...requestOptions, + onFinally: () => { + submitLoading.value = false + requestOptions?.onFinally?.() + } + }) + } + + /* 表单校验后并提交 */ + const validateAndSubmit = (model: T, requestOptions?: RequestOptions) => { + // 防止动态 formRule 异常抛出 outOfDate,使用 setTimeout 包一层 + setTimeout(() => { + useFormResult + .validate() + .then(() => { + submit(model, requestOptions) + }) + .catch(e => { + import.meta.env.DEV && console.log('error', e) + }) + }, 0) + } + + return { + submit, + submitLoading, + validateAndSubmit, + ...useFormResult + } +} + +/** + * 表单行为管理 + * @param defaultFormAction 默认的表单行为 + */ +export const useFormAction = (defaultFormAction: FormAction = FormAction.OTHER) => { + // 表单类型 + const formAction = ref(defaultFormAction) + + // 表单类型是否是新建 + const isCreateForm = computed(() => formAction.value === FormAction.CREATE) + + // 表单类型是否是修改 + const isUpdateForm = computed(() => formAction.value === FormAction.UPDATE) + + return { + formAction, + isCreateForm, + isUpdateForm + } +} diff --git a/src/hooks/i18n.ts b/src/hooks/i18n.ts new file mode 100644 index 0000000..06e44f3 --- /dev/null +++ b/src/hooks/i18n.ts @@ -0,0 +1,23 @@ +import { useI18n } from 'vue-i18n' +import { enableI18n } from '@/config' + +export const useAdminI18n = () => { + function rawI18nText(code: string, defaultText?: string) { + if (enableI18n) { + return useI18n().t(code) + } + return defaultText ?? code + } + + function i18nText(code: string, defaultText?: string) { + return computed(() => rawI18nText(code, defaultText)) + } + + return Object.assign( + { + i18nText, + rawI18nText + }, + enableI18n ? useI18n() : ({} as ReturnType) + ) +} diff --git a/src/hooks/mitt.ts b/src/hooks/mitt.ts new file mode 100644 index 0000000..0374743 --- /dev/null +++ b/src/hooks/mitt.ts @@ -0,0 +1,16 @@ +import mitt from 'mitt' +import type { + AnnouncementCloseMessage, + AnnouncementPushMessage +} from '@/api/notify/announcement/types' + +type Events = { + // 切换语言 + 'switch-language': string + // 推送公告 + 'announcement-push': AnnouncementPushMessage + // 关闭公告 + 'announcement-close': AnnouncementCloseMessage +} + +export const emitter = mitt() diff --git a/src/hooks/modal.ts b/src/hooks/modal.ts new file mode 100644 index 0000000..0408cb2 --- /dev/null +++ b/src/hooks/modal.ts @@ -0,0 +1,16 @@ +export const useModal = (defaultTitle = '') => { + const title = ref(defaultTitle) + + const visible = ref(false) + + return { + title, + visible, + openModal() { + visible.value = true + }, + closeModal() { + visible.value = false + } + } +} diff --git a/src/hooks/permission.ts b/src/hooks/permission.ts new file mode 100644 index 0000000..ddd7e9c --- /dev/null +++ b/src/hooks/permission.ts @@ -0,0 +1,45 @@ +import { useUserStore } from '@/stores/user-store' + +export const useAuthorize = () => { + const { userInfo } = useUserStore() + + function hasPermission(...permissionCodes: string[]) { + return includes(userInfo?.permissions, permissionCodes) + } + + function hasAnyPermission(...permissionCodes: string[]) { + return includesAny(userInfo?.permissions, permissionCodes) + } + + function hasRole(...rolCodes: string[]) { + return includes(userInfo?.roleCodes, rolCodes) + } + + function hasAnyRole(...rolCodes: string[]) { + return includesAny(userInfo?.roleCodes, rolCodes) + } + + return { hasPermission, hasAnyPermission, hasRole, hasAnyRole } +} + +function includes(array: string[] | undefined, items: string[]) { + if (!array || array.length == 0) { + return false + } + if (items.length == 0) { + return false + } + const notInclude = items.find(x => !array.includes(x)) + return !notInclude +} + +function includesAny(array: string[] | undefined, items: string[]) { + if (!array || array.length == 0) { + return false + } + if (items.length == 0) { + return true + } + const includeSomeOne = items.find(x => array.includes(x)) + return !!includeSomeOne +} diff --git a/src/hooks/websocket.ts b/src/hooks/websocket.ts new file mode 100644 index 0000000..0c53fa4 --- /dev/null +++ b/src/hooks/websocket.ts @@ -0,0 +1,57 @@ +import { useWebSocket, type UseWebSocketReturn } from '@vueuse/core' +import { useUserStore } from '@/stores/user-store' +import { emitter } from '@/hooks/mitt' + +let useWebSocketReturn: UseWebSocketReturn | undefined = undefined +const useAdminWebSocket = () => { + if (useWebSocketReturn && useWebSocketReturn.status.value != 'CLOSED') { + return useWebSocketReturn + } + + const { accessToken } = useUserStore() + + // ws地址 + const baseUri = import.meta.env.VITE_API_URL + const host = window.location.host + const wsUri = `ws://${host}${baseUri}/ws?access_token=${accessToken}` + + useWebSocketReturn = useWebSocket(wsUri, { + autoReconnect: { + retries: 3, + delay: 1000, + onFailed() { + console.error('Failed to connect WebSocket after 3 retries') + } + }, + heartbeat: { + message: '{"type": "ping"}', + interval: 30000 + } + }) + + watch( + () => useWebSocketReturn!.data.value, + value => { + let event + let dataMsg + + try { + dataMsg = JSON.parse(value) + event = dataMsg.type + // 心跳响应跳过发布 + if (event === 'pong') { + return + } + } catch (e) { + // 纯文本消息 + event = 'plaintext' + dataMsg = value + } + emitter.emit(event, dataMsg) + } + ) + + return useWebSocketReturn +} + +export default useAdminWebSocket diff --git a/src/layouts/BasicLayout.vue b/src/layouts/BasicLayout.vue new file mode 100644 index 0000000..ae4df51 --- /dev/null +++ b/src/layouts/BasicLayout.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/src/layouts/RouterLayout.vue b/src/layouts/RouterLayout.vue new file mode 100644 index 0000000..eb1373e --- /dev/null +++ b/src/layouts/RouterLayout.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/src/layouts/components/Footer/BallcatFooter.vue b/src/layouts/components/Footer/BallcatFooter.vue new file mode 100644 index 0000000..7d64549 --- /dev/null +++ b/src/layouts/components/Footer/BallcatFooter.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/layouts/components/HeaderDropdown/index.module.less b/src/layouts/components/HeaderDropdown/index.module.less new file mode 100644 index 0000000..7a182d6 --- /dev/null +++ b/src/layouts/components/HeaderDropdown/index.module.less @@ -0,0 +1,16 @@ +@import (reference) 'ant-design-vue/es/style/themes/index'; + +.container > * { + background-color: @popover-bg; + border-radius: 4px; + box-shadow: @shadow-1-down; +} + +@media screen and (max-width: @screen-xs) { + .container { + width: 100% !important; + } + .container > * { + border-radius: 0 !important; + } +} diff --git a/src/layouts/components/HeaderDropdown/index.tsx b/src/layouts/components/HeaderDropdown/index.tsx new file mode 100644 index 0000000..e3e28cc --- /dev/null +++ b/src/layouts/components/HeaderDropdown/index.tsx @@ -0,0 +1,44 @@ +import { Dropdown } from 'ant-design-vue' +import type { DropdownProps } from 'ant-design-vue/es/dropdown' +import type { VueNode } from '#/types' +import styles from './index.module.less' +import { dropdownProps } from 'ant-design-vue/es/dropdown' + +export type HeaderDropdownProps = { + overlayClassName?: string + overlay: VueNode | (() => VueNode) | any + placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter' +} & Omit + +const HeaderDropdown = defineComponent({ + props: dropdownProps(), + setup(props, { slots }) { + const overlayClassName = computed(() => { + return props.overlayClassName + ? `${styles.container} ${props.overlayClassName}` + : styles.container + }) + console.log(overlayClassName.value) + return () => ( + + {slots} + + ) + } +}) + +// const HeaderDropdown: FunctionalComponent = ( +// { overlayClassName: cls, ...restProps }, +// { slots } +// ) => { +// const overlayClassName = cls ? `${styles.container} ${cls}` : styles.container +// console.log(overlayClassName) +// console.log(cls) +// return ( +// +// {slots} +// +// ) +// } + +export default HeaderDropdown diff --git a/src/layouts/components/MultiTab/MultiTab.less b/src/layouts/components/MultiTab/MultiTab.less new file mode 100644 index 0000000..0157a99 --- /dev/null +++ b/src/layouts/components/MultiTab/MultiTab.less @@ -0,0 +1,115 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +/* 多页签 */ +.ballcat-multi-tabs { + background: @component-background; + box-shadow: 0 3px 4px -2px rgba(0, 21, 41, 0.08); + z-index: 20; // 比 global header 大就行 + transition: all 0.2s; + + .ant-tabs { + .ant-tabs-nav { + margin-bottom: 0; + + .ant-tabs-nav-wrap { + .ant-tabs-tab { + background: none; + height: 40px; + line-height: 40px; + transition: background-color 0.3s, color 0.3s; + padding: 0 @padding-md; + border-radius: 0; + border: none; + margin: 0 !important; + + .ant-tabs-tab-remove { + margin: 0; + } + } + + .ant-tabs-tab-with-remove { + padding-right: (@padding-xs / 2); + } + + .ant-tabs-tab-active { + background: @item-active-bg; + } + + .ant-tabs-ink-bar { + visibility: visible; + transition: width 0.1s, left 0.1s, right 0.1s; + } + } + + .ant-tabs-nav-operations { + .ant-tabs-nav-more { + padding: 8px 13px; + } + } + + .ant-tabs-extra-content { + display: flex; + } + } + + .ant-tabs-content-holder, + .ant-tabs-nav:before { + display: none; + } + + .ballcat-multi-tabs-btn { + padding: 0; + width: 40px; + height: 40px; + line-height: 40px; + text-align: center; + cursor: pointer; + + .anticon { + font-size: @font-size-sm; + vertical-align: -1px; + } + + &.ballcat-multi-tabs-btn-border { + border-left: 0.8px solid #efebeb; + } + + &.ballcat-multi-tabs-btn-disabled { + cursor: not-allowed; + color: rgba(0, 0, 0, 0.25); + } + } + } +} + +.ant-tabs-dropdown-menu-item-remove { + float: right; +} + +.ballcat-multi-tabs-more { + &-title { + padding-left: 12px; + } +} + +// 全屏内容区域 +.ballcat-content-fullscreen { + padding-top: 0 !important; + + .ant-layout-header, + .ant-layout-sider, + .ant-pro-sider-fix-place { + display: none; + } + + .ele-admin-body { + min-height: 100vh; + padding-left: 0 !important; + } + + .ele-admin-tabs { + left: 0 !important; + top: 0 !important; + } +} diff --git a/src/layouts/components/MultiTab/MultiTab.tsx b/src/layouts/components/MultiTab/MultiTab.tsx new file mode 100644 index 0000000..91fd594 --- /dev/null +++ b/src/layouts/components/MultiTab/MultiTab.tsx @@ -0,0 +1,372 @@ +import './MultiTab.less' + +import { Tabs, Dropdown, Menu } from 'ant-design-vue' +import 'ant-design-vue/es/tabs/style/index.less' +import 'ant-design-vue/es/dropdown/style/index.less' +import 'ant-design-vue/es/menu/style/index.less' + +import NProgress from 'nprogress' +import '@/styles/nprogress.less' + +import { + ReloadOutlined, + DownOutlined, + ArrowLeftOutlined, + ArrowRightOutlined, + CloseOutlined, + CompressOutlined, + ExpandOutlined, + LeftOutlined, + RightOutlined +} from '@ant-design/icons-vue' +import { headerViewProps } from '#/layout/Header' +import type { CSSProperties } from 'vue' +import { useMultiTabStore } from '@/stores/multitab-store' +import type { Key } from 'ant-design-vue/es/_util/type' +import { hasClass } from '@/utils/dom-utils' +import type { MenuInfo } from 'ant-design-vue/lib/menu/src/interface' +import type { RouteLocationMatched } from 'vue-router' +import { enableI18n, routerLayoutName } from '@/config' +import { emitter } from '@/hooks/mitt' +import type { RouteLocationNormalizedLoaded } from 'vue-router' + +const MultiTab = defineComponent({ + name: 'MultiTab', + inheritAttrs: false, + props: headerViewProps(), + emits: ['fullscreenChange', 'reloadContent'], + setup(props, { emit, attrs }) { + const activeKey = ref('') + const router = useRouter() + const multiTabStore = useMultiTabStore() + + /** 添加缓存的组件:嵌套路由时,缓存匹配路由下的所有组件 */ + const addCachedComponentNames = (matchedRoutes: RouteLocationMatched[]) => { + matchedRoutes.forEach(route => { + const componentName = route.components?.default.name + if (componentName && route.meta.keepAlive !== false) { + multiTabStore.cachedComponentNames.add(componentName) + } + }) + } + + // 监听路由处理 + watch( + () => router.currentRoute.value, + () => { + // 切换选中 tab + const currentRoute = router.currentRoute.value + activeKey.value = currentRoute.path + + // 更新当前的 tab 列表 + const routeList = multiTabStore.routeList + const index = routeList.findIndex(route => route.path === currentRoute.path) + if (index < 0) { + // @ts-ignore + currentRoute.meta.hideInTab !== true && routeList.push(currentRoute) + } else { + const oldPage = routeList[index] + if (currentRoute.params) { + if (oldPage.params !== currentRoute.params) { + routeList.splice(index, 1, currentRoute) + } + } + } + + // 更新缓存的组件 + addCachedComponentNames(currentRoute.matched) + }, + { immediate: true } + ) + + /** 点击事件 */ + const handleTabClick = (path: Key) => { + router.push(path as string) + } + + /** 修改事件(删除当前) */ + const handleTabEdit = ( + targetKey: MouseEvent | Key | KeyboardEvent, + action: 'add' | 'remove' + ) => { + if (action === 'remove') { + // 查找对应的 routeIndex + const routeList = multiTabStore.routeList + const index = routeList.findIndex(route => route.path === targetKey) + if (index < 0) { + return + } + + // 移除缓存 + routeList[index].matched.forEach(route => { + const componentName = route.components?.default.name + if (componentName && componentName !== routerLayoutName) { + multiTabStore.cachedComponentNames.delete(componentName) + } + }) + + // 移除目标路由 + routeList.splice(index, 1) + + // 如果删除的是当前选中的 tab 则选中后一个 tab,如果后面没有 tab,则选中前一个 + if (activeKey.value === targetKey) { + activeKey.value = + index == routeList.length ? routeList[index - 1].path : routeList[index].path + router.push(activeKey.value) + } + } + } + + /** 更多事件 */ + const handleTabMoreAction = ({ key }: MenuInfo) => { + const routeList = multiTabStore.routeList + const currentIndex = routeList.findIndex(route => route.path === activeKey.value) + switch (key) { + case 'closeLeft': // 删除左边 tab + currentIndex > 0 && routeList.splice(0, currentIndex) + break + case 'closeRight': // 删除右边 tab + currentIndex > -1 && routeList.splice(currentIndex + 1) + break + case 'closeOther': // 删除其他 tab + multiTabStore.routeList = [routeList[currentIndex]] + break + } + + // 更新缓存 + multiTabStore.cachedComponentNames.clear() + multiTabStore.routeList.forEach(route => addCachedComponentNames(route.matched)) + } + + /** 刷新页面 */ + const reloadContent = () => { + // 获取当前页面的缓存, + const componentNames: string[] = [] + router.currentRoute.value.matched.forEach(route => { + const componentName = route.components?.default.name + // 这里不能删除 RouterLayout 的缓存,否则影响嵌套路由的缓存 + if (componentName && componentName !== routerLayoutName) { + componentNames.push(componentName) + } + }) + + // 先删除当前缓存 + componentNames.forEach(item => multiTabStore.cachedComponentNames.delete(item)) + + // 切换状态,以及 nprogress 动画 + multiTabStore.contentLoading = true + NProgress.start() + nextTick(() => { + NProgress.done() + multiTabStore.contentLoading = false + // 添加缓存 + componentNames.forEach(item => multiTabStore.cachedComponentNames.add(item)) + }) + + emit('reloadContent') + // const { path, query, matched } = unref(router.currentRoute) + // router.replace({ + // query: query, + // path: '/redirect' + path + // }) + } + + // 国际化切换时,刷新路由信息 + if (enableI18n) { + const refreshRoute = () => { + multiTabStore.routeList = multiTabStore.routeList.map(oldRoute => { + const newRoute = router + .getRoutes() + .find(r => r.path === oldRoute.path) as unknown as RouteLocationNormalizedLoaded + // 需要保留 matched 防止删除时 NPE + if (newRoute) { + newRoute.matched = oldRoute.matched + return newRoute + } else { + return oldRoute + } + }) + } + emitter.on('switch-language', refreshRoute) + onUnmounted(() => emitter.off('switch-language', refreshRoute)) + } + + // a-tab 的 ref 引用 + const tabRef = ref() + const unScrollable = ref(true) + const handleTabScroll = () => { + nextTick(() => { + const operationsDom = tabRef.value?.$el.querySelector('.ant-tabs-nav-operations') + unScrollable.value = + operationsDom && hasClass(operationsDom, 'ant-tabs-nav-operations-hidden') + }) + } + + const scrollTab = (deltaY: number) => { + if (unScrollable.value) return + const wrapDom = tabRef.value.$el.querySelector('.ant-tabs-nav-wrap') + if (wrapDom) { + const event = new WheelEvent('wheel', { deltaX: 0, deltaY: deltaY }) + wrapDom.dispatchEvent(event) + } + } + const scrollLeft = () => scrollTab(-100) + const scrollRight = () => scrollTab(100) + + // ------- 样式布局相关 ----------- + const isFullScreen = ref(false) + const isTop = computed(() => props.layout === 'top') + const needFixedHeader = computed(() => props.fixedHeader || props.layout === 'mix') + + /** 计算侧边栏的宽度,不然导致左边的样式会出问题 */ + const width = computed(() => { + const needSettingWidth = + needFixedHeader.value && + props.hasSiderMenu && + !isTop.value && + !props.isMobile && + !isFullScreen.value + return needSettingWidth ? `calc(100% - ${props.collapsed ? 48 : props.siderWidth}px)` : '100%' + }) + const multiTabHeight = '40px' + const right = computed(() => (needFixedHeader.value ? 0 : undefined)) + + // 移动 + const arrowClassName = computed(() => [ + 'ballcat-multi-tabs-btn', + { + 'ballcat-multi-tabs-btn-disabled': unScrollable.value + } + ]) + + return () => { + // 刷新按钮 + const reloadActionDom = ( + + + + ) + + // 更多操作,关闭 + const moreActionDom = ( + + {{ + default: () => ( + + {/*由于视觉误差问题,所以调高一点大小*/} + + + ), + overlay: () => ( + + + + 关闭左侧 + + + + 关闭右侧 + + + + 关闭其他 + + + ) + }} + + ) + + // 全屏 + const fullscreenActionDom = ( + { + isFullScreen.value = !isFullScreen.value + emit('fullscreenChange', isFullScreen.value) + }} + > + {isFullScreen.value ? : } + + ) + + return ( + <> + {needFixedHeader.value && ( +
+ )} +
+ + {{ + default: () => ( + <> + {multiTabStore.routeList.map(route => ( + 1} + /> + ))} + + ), + leftExtra: () => ( + + + + ), + rightExtra: () => ( + <> + + + + {reloadActionDom} + {moreActionDom} + {fullscreenActionDom} + + ) + }} + +
+ + ) + } + } +}) + +export default MultiTab diff --git a/src/layouts/components/MultiTab/index.ts b/src/layouts/components/MultiTab/index.ts new file mode 100644 index 0000000..84aece3 --- /dev/null +++ b/src/layouts/components/MultiTab/index.ts @@ -0,0 +1,3 @@ +import MultiTab from './MultiTab' + +export default MultiTab diff --git a/src/layouts/components/MultiTab/types.ts b/src/layouts/components/MultiTab/types.ts new file mode 100644 index 0000000..fe0f467 --- /dev/null +++ b/src/layouts/components/MultiTab/types.ts @@ -0,0 +1,7 @@ +export interface PageInfo { + path: string + name: string + title: string + params?: object + query?: object +} diff --git a/src/layouts/components/RightContent/AvatarDropdown.vue b/src/layouts/components/RightContent/AvatarDropdown.vue new file mode 100644 index 0000000..11bc286 --- /dev/null +++ b/src/layouts/components/RightContent/AvatarDropdown.vue @@ -0,0 +1,106 @@ + + + + + + + diff --git a/src/layouts/components/RightContent/index.less b/src/layouts/components/RightContent/index.less new file mode 100644 index 0000000..f55104b --- /dev/null +++ b/src/layouts/components/RightContent/index.less @@ -0,0 +1,87 @@ +@import (reference) 'ant-design-vue/es/style/themes/index'; + +@pro-header-hover-bg: rgba(0, 0, 0, 0.025); + +.menu { + :global(.anticon) { + margin-right: 8px; + font-size: 12px; + min-width: 12px; + vertical-align: -1px; + } + :global(.ant-dropdown-menu-item) { + min-width: 160px; + } +} + +.right { + display: flex; + float: right; + height: 48px; + margin-left: auto; + overflow: hidden; + .action { + display: flex; + align-items: center; + height: 48px; + padding: 0 12px; + cursor: pointer; + transition: all 0.3s; + > span { + vertical-align: middle; + } + &:hover { + background: @pro-header-hover-bg; + } + &:global(.opened) { + background: @pro-header-hover-bg; + } + } + .search { + padding: 0 12px; + &:hover { + background: transparent; + } + } + .account { + .avatar { + margin-right: 8px; + color: @primary-color; + vertical-align: top; + background: rgba(255, 255, 255, 0.85); + } + } +} + +.dark { + .action { + &:hover { + background: #252a3d; + } + &:global(.opened) { + background: #252a3d; + } + } +} + +@media only screen and (max-width: @screen-md) { + :deep(.ant-divider-vertical) { + vertical-align: unset; + } + .name { + display: none; + } + .right { + position: absolute; + top: 0; + right: 12px; + .account { + .avatar { + margin-right: 0; + } + } + .search { + display: none; + } + } +} diff --git a/src/layouts/components/RightContent/index.vue b/src/layouts/components/RightContent/index.vue new file mode 100644 index 0000000..d3c17ed --- /dev/null +++ b/src/layouts/components/RightContent/index.vue @@ -0,0 +1,42 @@ + + + + + + + diff --git a/src/locales/dayjs.ts b/src/locales/dayjs.ts new file mode 100644 index 0000000..033c572 --- /dev/null +++ b/src/locales/dayjs.ts @@ -0,0 +1,5 @@ +// dayjs 的 local 名称映射 +export const localMapping: Record = { + 'zh-CN': 'zh-cn', + 'en-US': 'en' +} diff --git a/src/locales/index.ts b/src/locales/index.ts new file mode 100644 index 0000000..9a5bf0c --- /dev/null +++ b/src/locales/index.ts @@ -0,0 +1,51 @@ +import { createI18n, type Locale } from 'vue-i18n' +import { useI18nStore } from '@/stores/i18n-store' +import dayjs from 'dayjs' +import { localMapping } from '@/locales/dayjs' +import type { App } from 'vue' +import { defaultLanguage } from '@/config' + +export const i18n = createI18n({ + legacy: false, + locale: '', + messages: {}, + fallbackLocale: defaultLanguage +}) + +const localesMap = Object.fromEntries( + Object.entries(import.meta.glob('./lang/*.ts')).map(([path, loadLocale]) => [ + path.match(/([\w-]*)\.ts$/)?.[1], + loadLocale + ]) +) as Record Promise<{ default: Record }>> + +export const availableLocales = Object.keys(localesMap) + +const loadedLanguages: string[] = [] + +function setI18nLanguage(lang: Locale) { + dayjs.locale(localMapping[lang]) + i18n.global.locale.value = lang as any + if (typeof document !== 'undefined') document.querySelector('html')?.setAttribute('lang', lang) + return lang +} + +export async function loadLanguageAsync(lang: string): Promise { + // If the same language + if (i18n.global.locale.value === lang) return setI18nLanguage(lang) + + // If the language was already loaded + if (loadedLanguages.includes(lang)) return setI18nLanguage(lang) + + // If the language hasn't been loaded yet + const messages = await localesMap[lang]() + i18n.global.setLocaleMessage(lang, messages.default) + loadedLanguages.push(lang) + return setI18nLanguage(lang) +} + +export const install = (app: App) => { + app.use(i18n) + useI18nStore().setLanguage(defaultLanguage) + return loadLanguageAsync(defaultLanguage) +} diff --git a/src/locales/lang/en-US.ts b/src/locales/lang/en-US.ts new file mode 100644 index 0000000..84413a4 --- /dev/null +++ b/src/locales/lang/en-US.ts @@ -0,0 +1,20 @@ +import antdLocale from 'ant-design-vue/es/locale/en_US' +import 'dayjs/locale/en' + +const messages: Record = { + antdLocale, + 'dayjs.language': 'en', + 'locale.language': 'en-US' +} + +// 同步加载语言模块 +const modules = import.meta.glob('./en-US/**/*.json', { eager: true }) +for (const path in modules) { + // @ts-ignore + const json = modules[path].default + for (const key in json) { + messages[key] = json[key] + } +} + +export default messages diff --git a/src/locales/lang/en-US/ballcat.json b/src/locales/lang/en-US/ballcat.json new file mode 100644 index 0000000..2e2cd2d --- /dev/null +++ b/src/locales/lang/en-US/ballcat.json @@ -0,0 +1,82 @@ +{ + "locale.ballcat": "BallCat en-US", + "user.login.submit": "Login", + "user.login.submit.retry": "Login again", + "user.login.expired": "Login status expired!", + "user.pemission.reject": "No Permission!", + "system.tip.title": "System Tip", + "system.tip.request.error": "Abnormal network request!", + "system.tip.request.error.message": "request error status code: {code}", + "system.tip.network.error": "The network is abnormal, and the server cannot be accessed!", + "system.tip.network.error.message": "The network is abnormal, please check whether your network is smooth!", + "system.tip.operate.error": "Operate Error! {message}", + + "lov": { + "selectedData": "The selected data" + }, + + "action": { + "query": "Query", + "reset": "Reset", + "expand": "Expand", + "collapse": "Collapse", + "more": "More", + "new": "New", + "create": "Create", + "update": "Update", + "remove": "Remove", + "delete": "Delete", + "edit": "Edit", + "export": "Export", + "import": "Import", + "details": "Details", + "selectFile": "Select File", + "choose": "Choose", + "cancel": "Cancel" + }, + + "common": { + "operation": "Operation", + "createTime": "Create Time", + "updateTime": "Update Time", + "remarks": "Remarks" + }, + + "message": { + "confirmDelete": "Are you sure delete?", + "pleaseEnter": "Please enter", + "pleaseSelectFile": "Please Select File" + }, + + "import": { + "batchImport": "Batch Import", + "downloadTemplate": "Download Template", + "whenDataExisting": "When the data already exists", + "skipExisting": "Skip Existing", + "overwriteExisting": "Overwrite Existing", + "importSuccess": "Import Success" + }, + + "i18n": { + "i18nData": { + "text": "I18N Data", + "languageTexts": "Language Texts", + "languageTag": { + "text": "Language Tag", + "tips": "LanguageTag,eg. zh-CN en-Us", + "required": "Please enter i18n data language-tag!" + }, + "code": { + "text": "Code", + "tips": "A unique code for i18n data", + "required": "Please enter i18n data code!" + }, + "message": { + "text": "Message", + "tips": "The text of the i18n data", + "required": "Please enter i18n data message!", + "removeSuccess": "Remove Success!" + } + } + } +} diff --git a/src/locales/lang/zh-CN.ts b/src/locales/lang/zh-CN.ts new file mode 100644 index 0000000..d1abc5c --- /dev/null +++ b/src/locales/lang/zh-CN.ts @@ -0,0 +1,19 @@ +import antdLocale from 'ant-design-vue/es/locale/zh_CN' +import 'dayjs/locale/zh-cn' + +const messages: Record = { + antdLocale, + 'locale.language': 'zh-CN' +} + +// 同步加载语言模块 +const modules = import.meta.glob('./zh-CN/**/*.json', { eager: true }) +for (const path in modules) { + // @ts-ignore + const json = modules[path].default + for (const key in json) { + messages[key] = json[key] + } +} + +export default messages diff --git a/src/locales/lang/zh-CN/ballcat.json b/src/locales/lang/zh-CN/ballcat.json new file mode 100644 index 0000000..089c980 --- /dev/null +++ b/src/locales/lang/zh-CN/ballcat.json @@ -0,0 +1,86 @@ +{ + "locale.ballcat": "BallCat zh-CN", + + "user.login.submit": "登录", + "user.login.submit.retry": "重新登录", + "user.login.expired": "登录状态已过期!", + + "user.pemission.reject": "没有权限访问!", + + "system.tip.title": "系统提示", + "system.tip.request.error": "网络请求异常!", + "system.tip.request.error.message": "请求错误状态码: {code}", + "system.tip.network.error": "网络异常, 无法访问到服务器!", + "system.tip.network.error.message": "网络异常, 请检测您的网络是否通畅!", + "system.tip.operate.error": "操作异常! {message}", + + + "lov": { + "selectedData": "已选数据" + }, + + "action": { + "query": "查询", + "reset": "重置", + "expand": "展开", + "collapse": "收起", + "more": "更多", + "new": "新建", + "create": "创建", + "update": "更新", + "remove": "移除", + "delete": "删除", + "edit": "编辑", + "export": "导出", + "import": "导入", + "details": "详情", + "selectFile": "选择文件", + "choose": "选择", + "cancel": "取消" + }, + + "common": { + "operation": "操作", + "createTime": "创建时间", + "updateTime": "更新时间", + "remarks": "备注" + }, + + "message": { + "confirmDelete": "确认要删除吗?", + "pleaseEnter": "请输入", + "pleaseSelectFile": "请选择一个文件", + "removeSuccess": "删除成功!" + }, + + "import": { + "batchImport": "批量导入", + "downloadTemplate": "下载模板文件", + "whenDataExisting": "当数据已存在时", + "skipExisting": "跳过已有", + "overwriteExisting": "覆盖已有", + "importSuccess": "导入成功" + }, + + "i18n": { + "i18nData": { + "text": "国际化信息", + "languageTexts": "语言文本", + "languageTag": { + "text": "语言标签", + "tips": "语言标签,eg. zh-CN en-Us", + "required": "请输入语言标签!" + }, + "code": { + "text": "国际化标识", + "tips": "国际化信息的标识", + "required": "请输入国际化标识!" + }, + "message": { + "text": "文本值", + "tips": "国际化信息的文本", + "required": "请输入文本值!" + } + } + } +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..fb951f1 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,28 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import router from '@/router' +import { install as installI18n } from '@/locales' + +// 全局样式 +import '@/styles/global.less' +// ant-design-vue 的 message、notification(由于按需加载组件无法自动处理,这里直接全局引入) +import 'ant-design-vue/es/message/style/index.less' +import 'ant-design-vue/es/notification/style/index.less' +import 'ant-design-vue/es/modal/style/index.less' + +import App from './App.vue' +import { enableI18n } from '@/config' + +const app = createApp(App) +app.use(createPinia()) + +if (enableI18n) { + // 加载完 i18n 文件后再注册路由和渲染,防止发起请求时 401,错误弹窗无法国际化 + installI18n(app).then(() => { + app.use(router) + app.mount('#app') + }) +} else { + app.use(router) + app.mount('#app') +} diff --git a/src/router/constant-routes.ts b/src/router/constant-routes.ts new file mode 100644 index 0000000..334fd8b --- /dev/null +++ b/src/router/constant-routes.ts @@ -0,0 +1,74 @@ +// notFound 路由,使用函数获取,方便使用不同的路由名称,支持登录后 content 中显示异常信息 +import type { RouteRecordRaw } from 'vue-router' +import { loginPath } from '@/config' + +export const ExceptionComponentImport = () => import('@/views/basic/exception/index.vue') + +export const buildNotFoundRoute = (routeName: string): RouteRecordRaw => ({ + path: '/:pathMatch(.*)*', + name: routeName, + component: ExceptionComponentImport, + meta: { + name: '404', + hideInMenu: true, + hideInTab: true + }, + props: { + exceptionStatus: '404' + } +}) + +const constantRoutes: RouteRecordRaw[] = [ + { + path: loginPath, + name: 'Login', + // route level code-splitting + // this generates a separate chunk (About.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import('@/views/login/index.vue'), + meta: { + allowAnonymous: true, + withoutLayout: true + } + }, + { + // OAuth2 授权码登录处理页 + path: '/oauth2/authorize', + name: 'OAuth2Authorize', + component: () => import('@/views/oauth2/OAuth2Authorize.vue'), + meta: { + withoutLayout: true + } + }, + { + // OAuth2 授权码登录处理页 + path: '/oauth2/consent', + name: 'OAuth2Consent', + component: () => import('@/views/oauth2/OAuth2Consent.vue'), + meta: { + withoutLayout: true + } + }, + // { + // // OAuth2 授权码登录处理页 + // path: '/clueaccess/clueImport', + // name: 'clueImport', + // component: () => import('@/views/clueaccess/clueImport.vue'), + // meta: { + // withoutLayout: true + // } + // }, + // 404 路由 + buildNotFoundRoute('GlobalNotFound') +] + +// 静态路由的名称集合 +export const constantRouteNames: string[] = [] +const fillConstantRouteNames = (array: any[]) => + array.forEach(item => { + constantRouteNames.push(item.name) + fillConstantRouteNames(item.children || []) + }) +fillConstantRouteNames(constantRoutes) + +export default constantRoutes diff --git a/src/router/dynamic-routes.ts b/src/router/dynamic-routes.ts new file mode 100644 index 0000000..8b0cd05 --- /dev/null +++ b/src/router/dynamic-routes.ts @@ -0,0 +1,149 @@ +import { listToTree } from '@/utils/tree-utils' +import { firstUpperCase } from '@/utils/str-utils' +import type { SysMenuRouterVO } from '@/api/system/menu/types' +import type { RouteMeta, RouteRecordRaw } from 'vue-router' +import { buildNotFoundRoute, ExceptionComponentImport } from '@/router/constant-routes' + +type SysMenuRouterTree = SysMenuRouterVO & { key: number; children: SysMenuRouterTree[] } + +// 动态组件模块 +const dynamicViewModules = import.meta.glob('/src/views/**/*.{vue,tsx}') + +// 根路由 +const HOME_ROUTE: RouteRecordRaw = { + path: '/', + name: '/', + component: () => import('@/layouts/BasicLayout.vue'), + meta: { + keepAlive: false + }, + children: [] +} + +export const generatorDynamicRouter = (userMenus: SysMenuRouterVO[]): RouteRecordRaw => { + const routes: RouteRecordRaw = { ...HOME_ROUTE } + // 后端数据, 根级树数组, 根级 PID + const menuTree = listToTree(userMenus, 0) as SysMenuRouterTree[] + routes.children = menuToRoutes(menuTree) + routes.children.push(buildNotFoundRoute('PageNotFound')) + fillRedirect(routes) + + return routes +} + +const menuToRoutes = (menuTree: SysMenuRouterTree[], parent?: RouteRecordRaw) => { + return menuTree.map(item => { + // 内容打开方式 + const targetType = item.targetType + let path = `${(parent && parent.path) || ''}/${item.path}` + + // 路由名称,由路由地址生成,大驼峰形式 + const name = path + .replace('-', '/') + .split('/') + .filter(x => x && x !== '') + .map(x => firstUpperCase(x)) + .join('') + + const meta: RouteMeta = { + name: item.title, + icon: item.icon || undefined, + targetType: targetType + } + + let component + switch (item.type) { + case 0: + // 目录类型组件, 固定使用 RouterLayout + component = () => import('@/layouts/RouterLayout.vue') + break + case 1: + // 菜单类型需要拼接组件地址 + if (targetType === 1) { + // 内置组件 + item.uri && (component = getComponent(item.uri)) + } else if (targetType === 2) { + // 内嵌iframe + meta.target = item.uri + component = () => import('@/views/basic/iframe/index.vue') + } else if (targetType === 3) { + // 外链 + path = item.uri + meta.target = item.uri + meta.hideInTab = true + } + } + + // 是否设置了隐藏菜单 + if (item.hidden === 1) { + meta.hideInMenu = true + } + + // @ts-ignore + const currentRouter: RouteRecordRaw = { + // 如果路由设置了 path,则作为默认 path,否则 路由地址 动态拼接生成如 /dashboard/workplace + path, + // 路由名称,建议唯一 + name, + // meta: 页面标题, 菜单图标, 页面权限(供指令权限用,可去掉) + meta, + // 组件 + component + } + + // 有子菜单则递归处理 + if (item.children && item.children.length > 0) { + // 给子节点添加一个默认的 404 页面,以便在 content 中显示 404 + currentRouter.children = menuToRoutes(item.children, currentRouter) + fillRedirect(currentRouter) + } + return currentRouter + }) +} + +/** + * 设置当前路由的默认跳转地址为其子路由的path + * @param currentRouter + */ +function fillRedirect(currentRouter: RouteRecordRaw) { + if (!currentRouter.children) return + const redirectRouter = currentRouter.children.find(x => !x.meta?.hideInMenu) + redirectRouter && (currentRouter.redirect = redirectRouter.path) +} + +/** + * 动态获取组件 + * @param componentPath 组件地址 + */ +const getComponent = function (componentPath: string) { + // 如果有后缀,直接返回 + const isFullPath = componentPath.endsWith('.vue') || componentPath.endsWith('.tsx') + if (isFullPath) { + return dynamicViewModules[componentPath] + } + + // 没有后缀的情况下,按顺序尝试加载 + let viewModule = dynamicViewModules[`/src/views/${componentPath}.vue`] + if (!viewModule) { + viewModule = dynamicViewModules[`/src/views/${componentPath}/index.vue`] + } + if (!viewModule) { + viewModule = dynamicViewModules[`/src/views/${componentPath}.tsx`] + } + if (!viewModule) { + viewModule = dynamicViewModules[`/src/views/${componentPath}/index.tsx`] + } + if (!viewModule) { + import.meta.env.DEV && + console.warn( + '在src/views/下找不到`' + + componentPath + + '.vue` 或 `' + + componentPath + + '.tsx`, 请自行创建!' + ) + viewModule = ExceptionComponentImport + } + + return viewModule +} diff --git a/src/router/guards.ts b/src/router/guards.ts new file mode 100644 index 0000000..05bcd2d --- /dev/null +++ b/src/router/guards.ts @@ -0,0 +1,59 @@ +import NProgress from 'nprogress' +import '@/styles/nprogress.less' + +import type { RouteLocationNormalizedLoaded, Router } from 'vue-router' +import { projectTitle, loginPath, redirectPath } from '@/config' +import { useUserStore } from '@/stores/user-store' +import { generatorDynamicRouter } from '@/router/dynamic-routes' + +NProgress.configure({ showSpinner: false }) + +const routerGuards = (router: Router) => { + router.beforeEach(async to => { + NProgress.start() + + const userStore = useUserStore() + if (userStore.accessToken) { + // 如果已经登录的情况下访问登录页,直接跳转到首页 + if (to.path === loginPath) { + NProgress.done() + return { path: '/' } + } + + // 如果是 layout 内部的页面,且没有动态路由,则更新 + if (!to.meta.withoutLayout && (!userStore.userMenus || userStore.userMenus.length === 0)) { + const userMenus = await userStore.fetchUserMenus() + if (userMenus) { + const dynamicRouter = generatorDynamicRouter(userMenus) + router.addRoute(dynamicRouter) + return to.fullPath + } + } + } else if (!to.meta.allowAnonymous) { + // 如果没有登录,访问地址又不允许匿名访问,就跳转到登录页 + return { + path: loginPath, + query: { + redirect: to.fullPath + } + } + } + + updateDocumentTitle(to) + return true + }) + + router.afterEach(() => { + NProgress.done() + }) +} + +/** 更新标签页标题 */ +const updateDocumentTitle = function (route: RouteLocationNormalizedLoaded) { + if (!route?.path?.startsWith(`${redirectPath}/`)) { + const pageTitle = route?.meta?.name + document.title = pageTitle ? `${pageTitle} - ${projectTitle}` : projectTitle + } +} + +export default routerGuards diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..459b9cd --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,25 @@ +import { createRouter, createWebHistory } from 'vue-router' +import routerGuards from '@/router/guards' +import constantRoutes, { constantRouteNames } from '@/router/constant-routes' + +// 创建路由 +const router = createRouter({ + routes: constantRoutes, + history: createWebHistory(import.meta.env.BASE_URL) +}) + +// 路由守卫 +routerGuards(router) + +// 重制路由 +export function resetRouter() { + router.getRoutes().forEach(route => { + const { name } = route + // 保留静态路由 + if (name && !constantRouteNames.includes(name as string)) { + router.hasRoute(name) && router.removeRoute(name) + } + }) +} + +export default router diff --git a/src/router/vue-router.d.ts b/src/router/vue-router.d.ts new file mode 100644 index 0000000..9d50d59 --- /dev/null +++ b/src/router/vue-router.d.ts @@ -0,0 +1,38 @@ +import 'vue-router' +import type { VueNodeOrRender } from '#/types' + +declare module 'vue-router' { + interface RouteMeta { + /** 在菜单中隐藏子节点 */ + hideChildrenInMenu?: boolean + /** 在菜单中隐藏自己和子节点 */ + hideInMenu?: boolean + /** 菜单的icon */ + icon?: VueNodeOrRender + /** 自定义菜单的国际化 key */ + locale?: string | false + /** 菜单的名字 */ + name?: string + /** disable 菜单选项 */ + disabled?: boolean + /** + * 当此节点被选中的时候也会选中 parentKeys 的节点 + * + * 自定义父节点 + */ + parentKeys?: string[] + /** 隐藏自己,并且将子节点提升到与自己平级 */ + flatMenu?: boolean + /** 指定外链打开形式,同a标签 */ + target?: string + + // 不在多页签中显示 + hideInTab?: boolean + // 缓存组件数据 + keepAlive?: boolean + // 允许匿名访问 + allowAnonymous?: boolean + // 在 layout 布局之外的页面 + withoutLayout?: boolean + } +} diff --git a/src/stores/dict-store.ts b/src/stores/dict-store.ts new file mode 100644 index 0000000..47c1db1 --- /dev/null +++ b/src/stores/dict-store.ts @@ -0,0 +1,78 @@ +import type { DictDataVO, DictHashData } from '@/api/system/dict/types' +import { getDictData, invalidDictHash } from '@/api/system/dict' +import { getStorageKey } from '@/utils/storage-utils' +import { useLocalStorage } from '@vueuse/core' + +function getDictStorageKey(dictCode: string) { + return getStorageKey(`dict:${dictCode}`) +} +const dictHashStorageKey = getStorageKey('dict-hash') + +export const useDictStore = defineStore('dictStore', { + state: () => ({ + dictDataCache: {} as Record, + dictRequestLocks: {} as Record, + dictHash: useLocalStorage(dictHashStorageKey, {} as DictHashData, { + writeDefaults: false + }) + }), + actions: { + async getDictData(dictCode: string) { + if (!dictCode) return + + const { dictDataCache: cache, dictRequestLocks: locks } = this + + // 优先从缓存中获取数据 + let dictData = cache[dictCode] + if (dictData) return dictData + + // 再尝试从 LocalStorage 中获取数据 + const storeData = localStorage.getItem(getDictStorageKey(dictCode)) + if (storeData) { + dictData = JSON.parse(storeData) + cache[dictCode] = dictData + } + if (dictData) return dictData + + // 最后尝试从服务器获取数据,如果有锁标识已经在请求中了,不需要再处理了 + if (!locks[dictCode]) { + locks[dictCode] = true + try { + const result = await getDictData([dictCode]) + if (Array.isArray(result.data) && result.data.length > 0) { + dictData = result.data[0] + cache[dictCode] = dictData + localStorage.setItem(getDictStorageKey(dictCode), JSON.stringify(dictData)) + this.dictHash[dictCode] = dictData.hashCode + } + } finally { + locks[dictCode] = false + } + } + return dictData + }, + async getDictDataItems(dictCode: string) { + const dictData = await this.getDictData(dictCode) + return dictData?.dictItems || [] + }, + /** 校验缓存数据 */ + async checkDictData() { + const { dictDataCache, dictHash } = this + // 如果有属性,则去后台查询是否过期 + if (dictHash && Object.getOwnPropertyNames(dictHash).length > 0) { + const res = await invalidDictHash(dictHash) + if (res.code === 200 && res.data) { + // 删除对应过期数据 + for (const dictCode of res.data) { + delete dictHash[dictCode] + localStorage.removeItem(getDictStorageKey(dictCode)) + delete dictDataCache[dictCode] + } + } + } + } + } +}) + +// 刷新页面后就检查一次数据是否可用 +useDictStore().checkDictData() diff --git a/src/stores/i18n-store.ts b/src/stores/i18n-store.ts new file mode 100644 index 0000000..b7d0b3d --- /dev/null +++ b/src/stores/i18n-store.ts @@ -0,0 +1,24 @@ +import { defineStore } from 'pinia' +import { useLocalStorage } from '@vueuse/core' +import { getStorageKey } from '@/utils/storage-utils' + +import { defaultLanguage } from '@/config' + +const i18nKey = getStorageKey('language') + +export const useI18nStore = defineStore('i18nStore', { + state: () => ({ + language: useLocalStorage(i18nKey, defaultLanguage, { + writeDefaults: true + }) + }), + + actions: { + setLanguage(language: string) { + this.language = language + }, + reset() { + this.language = defaultLanguage + } + } +}) diff --git a/src/stores/multitab-store.ts b/src/stores/multitab-store.ts new file mode 100644 index 0000000..5f496ac --- /dev/null +++ b/src/stores/multitab-store.ts @@ -0,0 +1,11 @@ +import { defineStore } from 'pinia' +import type { RouteLocationNormalizedLoaded } from 'vue-router' + +export const useMultiTabStore = defineStore('multiTabStore', { + // 其他配置... + state: () => ({ + contentLoading: false, + cachedComponentNames: new Set(), + routeList: [] as RouteLocationNormalizedLoaded[] + }) +}) diff --git a/src/stores/setting-store.ts b/src/stores/setting-store.ts new file mode 100644 index 0000000..9aced4b --- /dev/null +++ b/src/stores/setting-store.ts @@ -0,0 +1,16 @@ +import { defineStore } from 'pinia' +import { useStorage } from '@vueuse/core' +import { getStorageKey } from '@/utils/storage-utils' + +import { defaultSettings } from '#/layout/defaultSettings' +import { appSettings } from '@/config' + +// 项目的设置 +const projectSetting = Object.assign({}, defaultSettings, appSettings) + +export const useSettingStore = defineStore('settingStore', { + // 其他配置... + state: () => ({ + setting: useStorage(getStorageKey('setting'), projectSetting) + }) +}) diff --git a/src/stores/user-store.ts b/src/stores/user-store.ts new file mode 100644 index 0000000..f2233ed --- /dev/null +++ b/src/stores/user-store.ts @@ -0,0 +1,41 @@ +import { defineStore } from 'pinia' +import { StorageSerializers, useLocalStorage } from '@vueuse/core' +import { getStorageKey } from '@/utils/storage-utils' +import type { LoginUserInfo } from '@/api/auth/types' +import { getLoginUserMenus } from '@/api/system/menu' +import type { SysMenuRouterVO } from '@/api/system/menu/types' + +export interface UserInfo extends LoginUserInfo { + roleCodes: string[] + permissions: string[] +} + +const accessTokenKey = getStorageKey('access-token') +const userInfoKey = getStorageKey('user-info') + +export const useUserStore = defineStore('userStore', { + // 其他配置... + state: () => ({ + accessToken: useLocalStorage(accessTokenKey, undefined, { + writeDefaults: false + }), + userInfo: useLocalStorage(userInfoKey, undefined, { + writeDefaults: false, + serializer: StorageSerializers.object + }), + userMenus: undefined as SysMenuRouterVO[] | undefined + }), + actions: { + async fetchUserMenus() { + const { data } = await getLoginUserMenus() + this.userMenus = data + return data + }, + clean() { + // 不能调用 reset,因为初始值可能是从 localStorage 加载的 + this.accessToken = undefined + this.userInfo = undefined + this.userMenus = undefined + } + } +}) diff --git a/src/styles/global.less b/src/styles/global.less new file mode 100644 index 0000000..1678501 --- /dev/null +++ b/src/styles/global.less @@ -0,0 +1,82 @@ +@root-entry-name: 'default'; +@import (reference) 'ant-design-vue/es/style/themes/index.less'; + +body { + margin: 0; + padding: 0; +} + +html, +body, +#app { + height: 100%; +} + +.colorWeak { + filter: invert(80%); +} + +.ant-layout { + min-height: 100vh; +} + +.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed { + left: unset; +} + +canvas { + display: block; +} + +body { + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +ul, +ol { + list-style: none; +} + +@media (max-width: @screen-xs) { + .ant-table { + width: 100%; + overflow-x: auto; + + &-thead > tr, + &-tbody > tr { + > th, + > td { + white-space: pre; + + > span { + display: block; + } + } + } + } +} + +// Compatible with IE11 +@media screen and(-ms-high-contrast: active), (-ms-high-contrast: none) { + body .ant-design-pro > .ant-layout { + min-height: 100vh; + } +} + +// --------------- 一些自定义样式 ------------------- + +// 查询按钮的包装器样式 +.search-actions-wrapper { + text-align: right; +} + +// 警告文本,多用于删除按钮 +.ballcat-text-danger { + color: @error-color; + + &:hover { + color: @error-color-hover; + } +} diff --git a/src/styles/nprogress.less b/src/styles/nprogress.less new file mode 100644 index 0000000..a486cee --- /dev/null +++ b/src/styles/nprogress.less @@ -0,0 +1,83 @@ +@import (reference) '../../node_modules/ant-design-vue/es/style/themes/index.less'; + +/* Make clicks pass-through */ +#nprogress { + pointer-events: none; +} + +#nprogress .bar { + background: @primary-color; + + position: fixed; + z-index: 1031; + top: 0; + left: 0; + + width: 100%; + height: 2px; +} + +/* Fancy blur effect */ +#nprogress .peg { + display: block; + position: absolute; + right: 0px; + width: 100px; + height: 100%; + box-shadow: 0 0 10px @primary-color, 0 0 5px @primary-color; + opacity: 1; + + -webkit-transform: rotate(3deg) translate(0px, -4px); + -ms-transform: rotate(3deg) translate(0px, -4px); + transform: rotate(3deg) translate(0px, -4px); +} + +/* Remove these to get rid of the spinner */ +#nprogress .spinner { + display: block; + position: fixed; + z-index: 1031; + top: 15px; + right: 15px; +} + +#nprogress .spinner-icon { + width: 18px; + height: 18px; + box-sizing: border-box; + + border: solid 2px transparent; + border-top-color: @primary-color; + border-left-color: @primary-color; + border-radius: 50%; + + -webkit-animation: nprogress-spinner 400ms linear infinite; + animation: nprogress-spinner 400ms linear infinite; +} + +.nprogress-custom-parent { + overflow: hidden; + position: relative; +} + +.nprogress-custom-parent #nprogress .spinner, +.nprogress-custom-parent #nprogress .bar { + position: absolute; +} + +@-webkit-keyframes nprogress-spinner { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(360deg); + } +} +@keyframes nprogress-spinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} diff --git a/src/utils/axios/axios.d.ts b/src/utils/axios/axios.d.ts new file mode 100644 index 0000000..a1d995e --- /dev/null +++ b/src/utils/axios/axios.d.ts @@ -0,0 +1,7 @@ +import 'axios' + +declare module 'axios' { + interface AxiosError { + resolved?: boolean // 扩展属性,是否已经在拦截器种处理过 + } +} diff --git a/src/utils/axios/http-client.ts b/src/utils/axios/http-client.ts new file mode 100644 index 0000000..2ce676d --- /dev/null +++ b/src/utils/axios/http-client.ts @@ -0,0 +1,134 @@ +import type { AxiosInstance, AxiosRequestConfig } from 'axios' +import axios from 'axios' +import type { HttpClientConfig } from '@/utils/axios/types' +import qs from 'qs' +import JSONBig from 'json-bigint' + +// 使用字符串处理 bigint 类型 +const jsonBigInt = JSONBig({ storeAsString: true }) + +// HttpClient 默认的请求配置 +const DefaultRequestConfig: AxiosRequestConfig = { + paramsSerializer: { + serialize: params => { + return qs.stringify(params, { + // 数组的格式化方式为重复参数,例如 { a: ['1', '2']} => a=1&a=2 + arrayFormat: 'repeat', + filter: (prefix: string, value: any) => { + // 空字符串不进行提交 + if (typeof value == 'string' && value.length === 0) { + return + } + return value + } + }) + } + }, + + transformResponse: [ + function transform(data: any) { + // Replacing the default transformResponse in axios because this uses JSON.parse and causes problems + // with precision of big numbers. + // https://github.com/axios/axios/blob/6642ca9aa1efae47b1a9d3ce3adc98416318661c/lib/defaults.js#L57 + if (typeof data === 'string') { + try { + data = jsonBigInt.parse(data) + } catch (e) { + /* Ignore */ + } + } + return data + } + ] +} + +export class HttpClient { + private axiosInstance: AxiosInstance + + constructor(config: HttpClientConfig) { + // 创建 axios 实例 + this.axiosInstance = axios.create(config.defaultRequestConfig) + + // 拦截器配置 + const interceptorOptions = config.interceptorOptions + if (interceptorOptions) { + this.axiosInstance.interceptors.request.use( + interceptorOptions.onRequestFulfilled, + interceptorOptions.onRequestRejected, + interceptorOptions.requestOptions + ) + this.axiosInstance.interceptors.response.use( + interceptorOptions.onResponseFulfilled, + interceptorOptions.onResponseRejected, + interceptorOptions.responseOptions + ) + } + } + + getUri(config?: AxiosRequestConfig) { + return this.axiosInstance.getUri(config) + } + + request(config: AxiosRequestConfig): Promise { + const mergeConfig = Object.assign({}, DefaultRequestConfig, config) + return this.axiosInstance.request(mergeConfig) + } + + get(url: string, config?: AxiosRequestConfig) { + return this.request({ ...config, url, method: 'GET' }) + } + + delete(url: string, config?: AxiosRequestConfig) { + return this.request({ ...config, url, method: 'DELETE' }) + } + + head(url: string, config?: AxiosRequestConfig) { + return this.request({ ...config, url, method: 'HEAD' }) + } + + options(url: string, config?: AxiosRequestConfig) { + return this.request({ ...config, url, method: 'OPTIONS' }) + } + + post(url: string, data?: D, config?: AxiosRequestConfig) { + return this.request({ ...config, url, data, method: 'POST' }) + } + + put(url: string, data?: D, config?: AxiosRequestConfig) { + return this.request({ ...config, url, data, method: 'PUT' }) + } + + patch(url: string, data?: D, config?: AxiosRequestConfig) { + return this.request({ ...config, url, data, method: 'PATCH' }) + } + + postForm(url: string, data?: D, config?: AxiosRequestConfig) { + return this.request({ + ...config, + url, + data, + method: 'POST', + headers: { 'Content-Type': 'multipart/form-data' } + }) + } + + putForm(url: string, data?: D, config?: AxiosRequestConfig) { + return this.request({ + ...config, + url, + data, + method: 'PUT', + headers: { 'Content-Type': 'multipart/form-data' } + }) + } + + patchForm(url: string, data?: D, config?: AxiosRequestConfig) { + return this.request({ + ...config, + url, + data, + method: 'PATCH', + headers: { 'Content-Type': 'multipart/form-data' } + }) + } +} diff --git a/src/utils/axios/index.ts b/src/utils/axios/index.ts new file mode 100644 index 0000000..e551ef5 --- /dev/null +++ b/src/utils/axios/index.ts @@ -0,0 +1,126 @@ +import { Modal, notification, message } from 'ant-design-vue' +import 'ant-design-vue/es/button/style/index.less' + +import type { AxiosError, InternalAxiosRequestConfig, AxiosResponse } from 'axios' +import type { ApiResult } from '@/api/types' + +import { useUserStore } from '@/stores/user-store' +import { loginPath } from '@/config' +import router from '@/router' +import { HttpClient } from '@/utils/axios/http-client' +import { useI18nStore } from '@/stores/i18n-store' +import { i18n } from '@/locales' + +const onRequestFulfilled = (requestConfig: InternalAxiosRequestConfig) => { + const headers = requestConfig.headers || {} + + // token + const { accessToken } = useUserStore() + // Authorization 请求头不存在再进行追加 + if (accessToken && !headers['Authorization']) { + // 让每个请求携带自定义 token 请根据实际情况自行修改 + headers['Authorization'] = 'Bearer ' + accessToken + } + + // i18n + const appLanguage = useI18nStore().language + if (appLanguage && !headers['Accept-Language']) { + headers['Accept-Language'] = appLanguage + } + + if (requestConfig.headers) { + requestConfig.headers = headers + } + return requestConfig +} + +// 响应成功处理函数 +const onResponseFulfilled = (response: AxiosResponse) => { + const headers = response.headers + if ( + headers != null && + headers['content-type'] && + headers['content-type'].startsWith('application/json') + ) { + return response.data + } else { + return response + } +} + +// 响应失败处理函数 +const onResponseRejected = (error: AxiosError) => { + const { t } = i18n.global + + if (error.response) { + const data = error.response.data as unknown as ApiResult + const errorStatus = error.response.status + const errorStatusText = error.response.statusText + switch (errorStatus) { + case 400: + if (router.currentRoute.value.path !== loginPath) { + error.resolved = true + message.error(data?.message || error.message) + } + break + case 401: + error.resolved = true + useUserStore().clean() + if (router.currentRoute.value.path !== loginPath) { + // 防止重复弹出 TODO 这里拦截所有其他的 axios 的请求 + Modal.destroyAll() + Modal.info({ + title: t('system.tip.title'), + content: t('user.login.expired'), + okText: t('user.login.submit.retry'), + onOk: () => { + router.push({ + path: loginPath, + query: { redirect: router.currentRoute.value.fullPath } + }) + } + }) + } + break + case 403: + error.resolved = true + notification.error({ + message: t('user.pemission.reject'), + description: data.message + }) + break + default: + error.resolved = true + notification.error({ + message: t('system.tip.request.error'), + description: + data?.message || + errorStatusText || + error.message || + t('system.tip.request.error.message', { code: errorStatus }) + }) + break + } + } else { + error.resolved = true + notification.error({ + message: t('system.tip.network.error'), + description: error.message || t('system.tip.network.error.message') + }) + } + return Promise.reject(error) +} + +const httpClient = new HttpClient({ + defaultRequestConfig: { + baseURL: import.meta.env.VITE_API_URL, // api base_url + timeout: import.meta.env.VITE_API_TIME_OUT // 请求超时时间 + }, + interceptorOptions: { + onRequestFulfilled: onRequestFulfilled, + onResponseFulfilled: onResponseFulfilled, + onResponseRejected: onResponseRejected + } +}) + +export default httpClient diff --git a/src/utils/axios/request.ts b/src/utils/axios/request.ts new file mode 100644 index 0000000..1045d65 --- /dev/null +++ b/src/utils/axios/request.ts @@ -0,0 +1,108 @@ +import { message, notification, Modal } from 'ant-design-vue' +import type { AxiosError } from 'axios' +import type { AlertMode, MessageInfo, RequestOptions } from '@/utils/axios/types' +import type { ApiResult } from '@/api/types' +import { isSuccess } from '@/api' +import type { AlertType } from 'ant-design-vue/es/alert' + +/** + * 请求方法封装 + * @param request + * @param requestOptions 请求配置 + */ +export function doRequest( + request: Promise>, + requestOptions?: RequestOptions +) { + // 填充默认值 + const finalOptions: RequestOptions = Object.assign( + { + checkSuccess: isSuccess, + // 成功消息提示 + successMessage: false, + // 失败消息提示 + failMessage: true, + // 错误消息提示 + errorMessage: true + }, + requestOptions + ) + request + .then(res => { + if (finalOptions.checkSuccess!(res)) { + alertSuccessMessage(finalOptions, res) + finalOptions.onSuccess?.(res) + } else { + alertFailMessage(finalOptions, res) + finalOptions.onFail?.(res) + } + }) + .catch(e => { + alertErrorMessage(finalOptions, e) + finalOptions.onError?.(e) + }) + .finally(() => { + finalOptions.onFinally?.() + }) +} + +function alertMessage( + type: AlertType, + optionMessage: string | boolean | MessageInfo, + resMessage: string +) { + if (optionMessage === false) { + return + } + + let message + let mode + if (typeof optionMessage == 'string') { + message = optionMessage + } else if (typeof optionMessage == 'object') { + message = optionMessage.message || resMessage + mode = optionMessage.mode + } else { + message = resMessage + } + + alert({ + type, + message, + mode + }) +} + +function alert(alertInfo: { message: string; mode?: AlertMode; type: AlertType }) { + const type = alertInfo.type + const alertMessage = alertInfo.message + if (alertInfo.mode == 'notification') { + notification[type]({ + message: alertMessage + }) + } else if (alertInfo.mode == 'modal') { + Modal[type]({ + content: alertMessage + }) + } else { + message[type](alertMessage) + } +} + +function alertSuccessMessage(requestOptions: RequestOptions, res: ApiResult) { + alertMessage('success', requestOptions.successMessage!, res.message) +} + +function alertFailMessage(requestOptions: RequestOptions, res: ApiResult) { + alertMessage('warning', requestOptions.failMessage!, res.message) +} + +function alertErrorMessage(requestOptions: RequestOptions, e: AxiosError) { + // 未被 axios拦截器处理过,则在这里继续处理 + if (requestOptions.errorMessage && !e.resolved) { + const response = e.response + const data = response?.data as ApiResult + const errorMessage = data?.message || e.message || 'error request' + alertMessage('error', requestOptions.errorMessage!, errorMessage) + } +} diff --git a/src/utils/axios/types.ts b/src/utils/axios/types.ts new file mode 100644 index 0000000..b037fed --- /dev/null +++ b/src/utils/axios/types.ts @@ -0,0 +1,98 @@ +import type { + AxiosInterceptorOptions, + AxiosRequestConfig, + AxiosResponse, + InternalAxiosRequestConfig +} from 'axios' +import type { ApiResult } from '@/api/types' +import type { WithFalse } from '#/layout/types' + +export type AlertMode = 'message' | 'modal' | 'notification' + +export interface MessageInfo { + message: string + mode: AlertMode +} + +/** + * request 请求选项 + */ +export interface RequestOptions { + // 判断是否请求成功 + checkSuccess?: (res: ApiResult) => boolean + // 响应转换 + transformResponse?: WithFalse<(response: any) => T> + // 成功消息提示 + successMessage?: boolean | string | MessageInfo + // 失败消息提示 + failMessage?: boolean | string | MessageInfo + // 错误消息提示 + errorMessage?: boolean | string | MessageInfo + // 成功时的处理逻辑 + onSuccess?: (res: ApiResult) => void + // 失败时的处理逻辑 + onFail?: (res: ApiResult) => void + // 错误时的处理逻辑 + onError?: (e: any) => void + // 最终的处理逻辑 + onFinally?: () => void +} + +/** + * 请求拦截器钩子 + */ +export interface HttpInterceptorOptions { + /** + * 发起请求用前处理 + * @param value AxiosRequestConfig 请求配置 + */ + onRequestFulfilled?: ( + value: InternalAxiosRequestConfig + ) => InternalAxiosRequestConfig | Promise + + /** + * 请求失败后处理 + * @param error 错误 + */ + onRequestRejected?: (error: any) => any + + /** + * 请求的一些设置 + */ + requestOptions?: AxiosInterceptorOptions + + /** + * 响应成功,返回数据前处理 + * @param value AxiosRequestConfig 请求配置 + */ + onResponseFulfilled?: (value: AxiosResponse) => AxiosResponse | Promise + + /** + * 响应失败时处理 + * @param error 错误信息 + */ + onResponseRejected?: (error: any) => any + + /** + * 响应的一些设置 + */ + responseOptions?: AxiosInterceptorOptions +} + +/** + * 请求配置 + */ +export interface HttpClientConfig { + /** + * 默认请求配置 + */ + defaultRequestConfig?: AxiosRequestConfig + /** + * 请求响应拦截器选项 + */ + interceptorOptions?: HttpInterceptorOptions +} + +export type BallcatAxiosRequestConfig = { + setLoading?: (flag: boolean) => void +} & AxiosRequestConfig diff --git a/src/utils/bean-utils.ts b/src/utils/bean-utils.ts new file mode 100644 index 0000000..9d6daa0 --- /dev/null +++ b/src/utils/bean-utils.ts @@ -0,0 +1,12 @@ +/* 使用源对象,覆盖目标对象的已有属性 */ +export function overrideProperties(target: T, source: any, excludes?: string[]): T { + if (!source) return target + // @ts-ignore + Object.keys(target).forEach(key => { + const result = target as any + if (!excludes?.includes(key)) { + result[key] = source[key] + } + }) + return target +} diff --git a/src/utils/dom-utils.ts b/src/utils/dom-utils.ts new file mode 100644 index 0000000..7afc453 --- /dev/null +++ b/src/utils/dom-utils.ts @@ -0,0 +1,9 @@ +export function hasClass(dom: HTMLElement, className: string) { + className = className.replace(/^\s|\s$/g, '') + + return ( + (' ' + ((dom || {}).className || '').replace(/\s/g, ' ') + ' ').indexOf( + ' ' + className + ' ' + ) >= 0 + ) +} diff --git a/src/utils/file-utils.ts b/src/utils/file-utils.ts new file mode 100644 index 0000000..0c286ba --- /dev/null +++ b/src/utils/file-utils.ts @@ -0,0 +1,91 @@ +import type { AxiosResponse, AxiosResponseHeaders } from 'axios' + +export const fileAbsoluteUrl = ( + relativePath: string, + fileDomain = import.meta.env.VITE_IMAGE_DOMAIN +) => { + if (!relativePath || relativePath.length === 0) return + return relativePath.startsWith('/') + ? `${fileDomain}${relativePath}` + : `${fileDomain}/${relativePath}` +} + +/** + * Convert BASE64 to BLOB + * @param base64Image Pass Base64 image data to convert into the BLOB + */ +export function convertBase64ToBlob(base64Image: string) { + // Split into two parts + const parts = base64Image.split(';base64,') + + // Hold the content type + const imageType = parts[0].split(':')[1] + + // Decode Base64 string + const decodedData = window.atob(parts[1]) + + // Create UNIT8ARRAY of size same as row data length + const uInt8Array = new Uint8Array(decodedData.length) + + // Insert all character code into uInt8Array + for (let i = 0; i < decodedData.length; ++i) { + uInt8Array[i] = decodedData.charCodeAt(i) + } + + // Return BLOB image after conversion + return new Blob([uInt8Array], { type: imageType }) +} + +/** + * 远程文件下载 + * @param response + * @param filename + */ +export function remoteFileDownload(response: AxiosResponse, filename?: string) { + if (response.data) { + // 构造一个blob对象来处理数据,并设置文件类型 + const headers = response.headers as AxiosResponseHeaders + const contentType = headers['content-type'] + const blob = new Blob([response.data], { type: contentType }) + + // 不存在则从响应头中解析 + if (!filename) { + filename = resolveFilename(headers) + console.log(filename) + } + fileDownload(blob, filename) + } +} + +/** + * 根据 response header 解析文件名 + * @param headers 响应头 + */ +function resolveFilename(headers: AxiosResponseHeaders): string { + const match = headers['content-disposition'].match(/filename=(.*)/) + if (match && match.length > 0) { + return decodeURI(match[1]) + } + return '' +} + +/** + * 根据 blob 和 文件名进行文件下载 + * @param blob + * @param filename + */ +export function fileDownload(blob: Blob, filename: string) { + //兼容IE10,后续可以移除 + const navigator = window.navigator as any + if (navigator.msSaveOrOpenBlob) { + navigator.msSaveBlob(blob, filename) + } else { + const href = URL.createObjectURL(blob) //创建新的URL表示指定的blob对象 + const a = document.createElement('a') //创建a标签 + a.style.display = 'none' + a.href = href // 指定下载链接 + a.download = filename //指定下载文件名 + a.click() //触发下载 + URL.revokeObjectURL(a.href) //释放URL对象 + } +} diff --git a/src/utils/page-utils.ts b/src/utils/page-utils.ts new file mode 100644 index 0000000..fdea34b --- /dev/null +++ b/src/utils/page-utils.ts @@ -0,0 +1,27 @@ +import type { SortOrder } from 'ant-design-vue/lib/table/interface' +import type { VueKey } from '#/types' + +export type MergePageParamFunction = ( + params: U & { + pageSize?: number + current?: number + keyword?: string + }, + sorter: Record, + filter: Record +) => Record + +export const mergePageParam: MergePageParamFunction = (params, sorter, filter) => { + const sort = [] + for (const key in sorter) { + sort.push(sorter[key] === 'ascend' ? `${key},asc` : `${key},desc`) + } + const { pageSize, current, ...rest } = params + return { + size: pageSize, + page: current, + ...rest, + ...filter, + sort + } +} diff --git a/src/utils/password-utils.ts b/src/utils/password-utils.ts new file mode 100644 index 0000000..9ebc467 --- /dev/null +++ b/src/utils/password-utils.ts @@ -0,0 +1,31 @@ +import CryptoJS from 'crypto-js/index' + +const securityKey = import.meta.env.VITE_PASSWORD_SECRET_KEY + +/** + * 密码加密 + * @param pass + */ +export const passEncrypt = (pass: string) => { + // 密码加密 + const key = CryptoJS.enc.Utf8.parse(securityKey) + return CryptoJS.AES.encrypt(pass, key, { + iv: key, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7 + }).toString() +} + +/** + * @word 要加密的内容 + * @keyWord String 服务器随机返回的关键字 + */ +export function captchaEncrypt(word: string, keyWord = 'XwKsGlMcdPMEhR1B') { + const key = CryptoJS.enc.Utf8.parse(keyWord) + const srcs = CryptoJS.enc.Utf8.parse(word) + const encrypted = CryptoJS.AES.encrypt(srcs, key, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return encrypted.toString() +} diff --git a/src/utils/resolvers.ts b/src/utils/resolvers.ts new file mode 100644 index 0000000..fdfdea6 --- /dev/null +++ b/src/utils/resolvers.ts @@ -0,0 +1,298 @@ +import { kebabCase } from 'unplugin-vue-components' + +export interface IMatcher { + pattern: RegExp + styleDir: string +} + +const antComponents = [ + 'Affix', + 'Alert', + 'Anchor', + 'AnchorLink', + 'AutoComplete', + 'AutoCompleteOptGroup', + 'AutoCompleteOption', + 'Avatar', + 'AvatarGroup', + 'BackTop', + 'Badge', + 'BadgeRibbon', + 'Breadcrumb', + 'BreadcrumbItem', + 'BreadcrumbSeparator', + 'Button', + 'ButtonGroup', + 'Calendar', + 'Card', + 'CardGrid', + 'CardMeta', + 'Carousel', + 'Cascader', + 'CheckableTag', + 'Checkbox', + 'CheckboxGroup', + 'Col', + 'Collapse', + 'CollapsePanel', + 'Comment', + 'ConfigProvider', + 'DatePicker', + 'Descriptions', + 'DescriptionsItem', + 'DirectoryTree', + 'Divider', + 'Drawer', + 'Dropdown', + 'DropdownButton', + 'Empty', + 'Form', + 'FormItem', + 'FormItemRest', + 'Image', + 'ImagePreviewGroup', + 'Input', + 'InputGroup', + 'InputNumber', + 'InputPassword', + 'InputSearch', + 'Layout', + 'LayoutContent', + 'LayoutFooter', + 'LayoutHeader', + 'LayoutSider', + 'List', + 'ListItem', + 'ListItemMeta', + 'LocaleProvider', + 'Mentions', + 'MentionsOption', + 'Menu', + 'MenuDivider', + 'MenuItem', + 'MenuItemGroup', + 'Modal', + 'MonthPicker', + 'PageHeader', + 'Pagination', + 'Popconfirm', + 'Popover', + 'Progress', + 'Radio', + 'RadioButton', + 'RadioGroup', + 'RangePicker', + 'Rate', + 'Result', + 'Row', + 'Select', + 'SelectOptGroup', + 'SelectOption', + 'Skeleton', + 'SkeletonAvatar', + 'SkeletonButton', + 'SkeletonImage', + 'SkeletonInput', + 'Slider', + 'Space', + 'Spin', + 'Statistic', + 'StatisticCountdown', + 'Step', + 'Steps', + 'SubMenu', + 'Switch', + 'TabPane', + 'Table', + 'TableColumn', + 'TableColumnGroup', + 'TableSummary', + 'TableSummaryCell', + 'TableSummaryRow', + 'Tabs', + 'Tag', + 'Textarea', + 'TimePicker', + 'TimeRangePicker', + 'Timeline', + 'TimelineItem', + 'Tooltip', + 'Transfer', + 'Tree', + 'TreeNode', + 'TreeSelect', + 'TreeSelectNode', + 'Typography', + 'TypographyLink', + 'TypographyParagraph', + 'TypographyText', + 'TypographyTitle', + 'Upload', + 'UploadDragger', + 'WeekPicker' +] + +const antMatchComponents: IMatcher[] = [ + { + pattern: /^Avatar/, + styleDir: 'avatar' + }, + { + pattern: /^AutoComplete/, + styleDir: 'auto-complete' + }, + { + pattern: /^Anchor/, + styleDir: 'anchor' + }, + + { + pattern: /^Badge/, + styleDir: 'badge' + }, + { + pattern: /^Breadcrumb/, + styleDir: 'breadcrumb' + }, + { + pattern: /^Button/, + styleDir: 'button' + }, + { + pattern: /^Checkbox/, + styleDir: 'checkbox' + }, + { + pattern: /^Card/, + styleDir: 'card' + }, + { + pattern: /^Collapse/, + styleDir: 'collapse' + }, + { + pattern: /^Descriptions/, + styleDir: 'descriptions' + }, + { + pattern: /^RangePicker|^WeekPicker|^MonthPicker/, + styleDir: 'date-picker' + }, + { + pattern: /^Dropdown/, + styleDir: 'dropdown' + }, + + { + pattern: /^Form/, + styleDir: 'form' + }, + { + pattern: /^InputNumber/, + styleDir: 'input-number' + }, + + { + pattern: /^Input|^Textarea/, + styleDir: 'input' + }, + { + pattern: /^Statistic/, + styleDir: 'statistic' + }, + { + pattern: /^CheckableTag/, + styleDir: 'tag' + }, + { + pattern: /^TimeRangePicker/, + styleDir: 'time-picker' + }, + { + pattern: /^Layout/, + styleDir: 'layout' + }, + { + pattern: /^Menu|^SubMenu/, + styleDir: 'menu' + }, + + { + pattern: /^Table/, + styleDir: 'table' + }, + { + pattern: /^TimePicker|^TimeRangePicker/, + styleDir: 'time-picker' + }, + { + pattern: /^Radio/, + styleDir: 'radio' + }, + + { + pattern: /^Image/, + styleDir: 'image' + }, + + { + pattern: /^List/, + styleDir: 'list' + }, + + { + pattern: /^Tab/, + styleDir: 'tabs' + }, + { + pattern: /^Mentions/, + styleDir: 'mentions' + }, + + { + pattern: /^Step/, + styleDir: 'steps' + }, + { + pattern: /^Skeleton/, + styleDir: 'skeleton' + }, + + { + pattern: /^Select/, + styleDir: 'select' + }, + { + pattern: /^TreeSelect/, + styleDir: 'tree-select' + }, + { + pattern: /^Tree|^DirectoryTree/, + styleDir: 'tree' + }, + { + pattern: /^Typography/, + styleDir: 'typography' + }, + { + pattern: /^Timeline/, + styleDir: 'timeline' + }, + { + pattern: /^Upload/, + styleDir: 'upload' + } +] + +export const antdvStyleDeps = new Set( + antComponents.map(compName => { + const total = antMatchComponents.length + for (let i = 0; i < total; i++) { + const matcher = antMatchComponents[i] + if (compName.match(matcher.pattern)) { + return `ant-design-vue/es/${matcher.styleDir}/style` + } + } + return `ant-design-vue/es/${kebabCase(compName)}/style` + }) +) diff --git a/src/utils/storage-utils.ts b/src/utils/storage-utils.ts new file mode 100644 index 0000000..92e1297 --- /dev/null +++ b/src/utils/storage-utils.ts @@ -0,0 +1,5 @@ +import { storageKeyPrefix } from '@/config' + +export const getStorageKey = (key: string) => { + return storageKeyPrefix + key +} diff --git a/src/utils/str-utils.ts b/src/utils/str-utils.ts new file mode 100644 index 0000000..208ddb3 --- /dev/null +++ b/src/utils/str-utils.ts @@ -0,0 +1,25 @@ +/** + * 下划线转驼峰 + * @param str + */ +export function underlineToLittleCamel(str: string) { + return str.replace(/_([a-z])/g, (p, m) => m.toUpperCase()) +} + +/** + * 小驼峰转下划线 + * @param str + * @returns {{}|*} + */ +export function littleCamelToUnderline(str: string) { + return str.replace(/([A-Z])/g, (p, m) => `_${m.toLowerCase()}`) +} + +/** + * 首字母大写 + * @param str + * @returns {*} + */ +export function firstUpperCase(str: string) { + return str.replace(/^\S/, s => s.toUpperCase()) +} diff --git a/src/utils/tree-utils.ts b/src/utils/tree-utils.ts new file mode 100644 index 0000000..715b357 --- /dev/null +++ b/src/utils/tree-utils.ts @@ -0,0 +1,162 @@ +/** + * 数组转树形结构 + * @param list 源数组 + * @param parentId 父ID + * @param attributeFill 数据处理函数 + */ +export declare type Key = string | number + +interface ListToTreeOptions { + /** + * id字段名称 + */ + idKey?: string | null + /** + * parentId字段名称 + */ + parentIdKey?: string | null + /** + * 生成的children字段名称 + */ + childrenKey?: string | null + /** + * 属性转换的方法 + * @param treeNode 树节点对象 + */ + attributeMapping?: (treeNode: T) => void +} + +export const listToTree = ( + list: T[], + parentId: Key, + options: ListToTreeOptions = { + idKey: 'id', + parentIdKey: 'parentId', + childrenKey: 'children' + } +) => { + const tree: T[] = [] + fillTree(list, tree, parentId, options) + return tree +} + +/** + * 数组转树形结构 + * @param list 源数组 + * @param tree 树 + * @param parentId 父ID + * @param options 转换选项 + * TODO 优化,支持类型转换 + */ +export const fillTree = ( + list: T[], + tree: T[], + parentId: Key, + options: ListToTreeOptions +) => { + const idField = options.idKey || 'id' + const parentIdField = options.parentIdKey || 'parentId' + const childrenField = options.childrenKey || 'children' + const attributeMapping = options.attributeMapping + + list.forEach(item => { + const data = item as any + + // 判断是否为父级菜单 + if (data[parentIdField] === parentId) { + const treeNode = { + ...data, + ['key']: data.key || data[idField], + [childrenField]: [] as T[] + } + + // 额外的数据转换处理 + if (attributeMapping && typeof attributeMapping === 'function') { + attributeMapping(treeNode) + } + + // 迭代 list, 找到当前菜单相符合的所有子菜单 + fillTree(list, treeNode[childrenField], data[idField], options) + // 删掉不存在 children 值的属性 + if (treeNode[childrenField] && (treeNode[childrenField] as T[]).length <= 0) { + delete treeNode[childrenField] + } + // 加入到树中 + tree.push(treeNode) + } + }) +} + +/** + * 根据指定规则进行剪枝 + * @param treeList + * @param matcher + * @returns {*[]} + */ +export function pruneTree( + treeList: T[], + matcher: (node: T) => boolean +) { + const result: T[] = [] + if (treeList) { + for (const treeNode of treeList) { + // @ts-ignore + const children = pruneTree(treeNode.children, matcher) + if (children && children.length > 0) { + treeNode.children = children + result.push(treeNode) + } else if (matcher(treeNode)) { + treeNode.children = [] + result.push(treeNode) + } + } + } + return result +} + +export interface TreeNode { + id: Key + children: TreeNode[] +} + +/** + * 获取匹配节点的所有祖先节点 id + * @param treeList 树节点集合 + * @param matcher 匹配器 + * @returns 祖先节点 id 集合 + */ +export const matchedParentKeys = (treeList: T[], matcher: (node: T) => boolean) => { + const result: Key[] = [] + fillMatchedParentKeys(treeList, matcher, result) + return result +} + +/** + * 获取匹配节点的所有祖先节点 id + * @param treeList 树节点集合 + * @param matcher 匹配器 + * @param result 返回值 + * @returns {boolean} + */ +export function fillMatchedParentKeys( + treeList: any[], + matcher: (node: T) => boolean, + result: Key[] +) { + if (!treeList || treeList.length === 0) { + return false + } + let matched = false + for (const node of treeList) { + // 如果孩子节点有匹配,则把自己的 id 加入返回值 + if (fillMatchedParentKeys(node.children, matcher, result)) { + matched = true + result.push(node.id) + } + // 如果当前节点匹配了,matched 修改为 true + if (matcher(node)) { + matched = true + } + } + return matched +} diff --git a/src/views/basic/exception/index.vue b/src/views/basic/exception/index.vue new file mode 100644 index 0000000..0d1d454 --- /dev/null +++ b/src/views/basic/exception/index.vue @@ -0,0 +1,48 @@ + + + diff --git a/src/views/basic/iframe/index.vue b/src/views/basic/iframe/index.vue new file mode 100644 index 0000000..4fcfc69 --- /dev/null +++ b/src/views/basic/iframe/index.vue @@ -0,0 +1,50 @@ +