From a1b1a8a318649bd61c92006fa1822471802b2d5b Mon Sep 17 00:00:00 2001 From: yangjie <717642468@qq.com> Date: Sun, 3 Nov 2024 22:00:10 +0800 Subject: [PATCH] CRUD-PLUS --- .../.idea/JavaSceneConfigState.xml" | 6 + .../.idea/compiler.xml" | 22 + .../.idea/encodings.xml" | 9 + .../.idea/jarRepositories.xml" | 20 + .../.idea/misc.xml" | 15 + .../.idea/uiDesigner.xml" | 124 + .../.idea/vcs.xml" | 6 + .../.idea/workspace.xml" | 434 + .../LICENSE" | 165 + .../README.md" | 67 + .../crud-plus/pom.xml" | 113 + .../yang/crudplus/CrudPlusApplication.java" | 17 + .../common/apo/ExceptionHandlerAspect.java" | 35 + .../crudplus/common/config/GenConfig.java" | 73 + .../common/config/MybatisPlusConfig.java" | 24 + .../crudplus/common/config/WebConfig.java" | 19 + .../common/constant/GenConstants.java" | 119 + .../common/exception/CustomException.java" | 18 + .../exception/GlobalExceptionHandler.java" | 40 + .../exception/ValidationException.java" | 30 + .../crudplus/common/text/StrFormatter.java" | 124 + .../yang/crudplus/common/utils/GenUtils.java" | 249 + .../common/utils/GenericConverter.java" | 55 + .../crudplus/common/utils/StringUtils.java" | 670 ++ .../crudplus/common/utils/TypeChecker.java" | 54 + .../common/utils/VelocityInitializer.java" | 36 + .../crudplus/common/utils/VelocityUtils.java" | 366 + .../crudplus/controller/TableContrller.java" | 180 + .../controller/TableFunctionController.java" | 145 + .../mapper/GenTableColumnMapper.java" | 61 + .../yang/crudplus/mapper/GenTableMapper.java" | 134 + .../mapper/TableFunctionColumnMapper.java" | 10 + .../crudplus/mapper/TableFunctionMapper.java" | 55 + .../org/yang/crudplus/pojo/GenTable.java" | 108 + .../yang/crudplus/pojo/GenTableColumn.java" | 156 + .../yang/crudplus/pojo/TableFunction.java" | 63 + .../crudplus/pojo/TableFunctionColumn.java" | 73 + .../yang/crudplus/pojo/req/GenTableReq.java" | 33 + .../crudplus/pojo/req/GenTableSaveReq.java" | 53 + .../pojo/req/TableFunctionListReq.java" | 24 + .../pojo/req/TableFunnctionSaveReq.java" | 75 + .../org/yang/crudplus/pojo/req/testReq.java" | 15 + .../pojo/resp/CustomReqRespList.java" | 23 + .../crudplus/pojo/resp/GenTableListResp.java" | 13 + .../crudplus/pojo/resp/GenTableResp.java" | 30 + .../pojo/resp/GenTablesUpdateResp.java" | 25 + .../yang/crudplus/pojo/resp/Response.java" | 31 + .../pojo/resp/TableFunctionListResp.java" | 29 + .../pojo/resp/TableFunctionResp.java" | 54 + .../pojo/resp/TableFunnctionSaveResp.java" | 74 + .../yang/crudplus/pojo/vo/GenTableCRUD.java" | 127 + .../crudplus/pojo/vo/GenTableColumnbVo.java" | 106 + .../pojo/vo/TableFunctionPlusVo.java" | 86 + .../crudplus/service/GenTableService.java" | 97 + .../service/ITableFunctionColumnService.java" | 15 + .../service/ITableFunctionService.java" | 65 + .../service/impl/GenTableServiceImpl.java" | 340 + .../impl/TableFunctionColumnServiceImpl.java" | 20 + .../impl/TableFunctionServiceImpl.java" | 524 + .../main/resources/application.properties" | 3 + .../src/main/resources/application.yml" | 29 + .../src/main/resources/generator.yml" | 10 + .../crud-plus/src/main/resources/logback.xml" | 16 + .../resources/vm/java/controller.java.vm" | 74 + .../main/resources/vm/java/domain.java.vm" | 69 + .../main/resources/vm/java/mapper.java.vm" | 67 + .../src/main/resources/vm/java/req.java.vm" | 16 + .../src/main/resources/vm/java/resp.java.vm" | 16 + .../main/resources/vm/java/service.java.vm" | 86 + .../resources/vm/java/serviceImpl.java.vm" | 258 + .../resources/vm/java/sub-domain.java.vm" | 76 + .../src/main/resources/vm/xml/mapper.xml.vm" | 124 + .../crudplus/CrudPlusApplicationTests.java" | 13 + .../crud-test/pom.xml" | 78 + .../yang/crudplus/CrudTestApplication.java" | 18 + .../controller/StudentsController.java" | 74 + .../org/yang/crudplus/domain/Students.java" | 84 + .../domain/req/deletcStudengtsReq.java" | 14 + .../domain/req/insertStudentsReq.java" | 26 + .../domain/req/selectStudentByIdReq.java" | 14 + .../crudplus/domain/req/updateByAgeReq.java" | 14 + .../domain/resp/selectStudentByIdResp.java" | 26 + .../domain/resp/updateByAgeResp.java" | 26 + .../yang/crudplus/mapper/StudentsMapper.java" | 63 + .../crudplus/service/StudentsService.java" | 111 + .../service/impl/StudentsServiceImpl.java" | 193 + .../src/main/resources/application.yml" | 18 + .../mapper/crudplus/StudentsMapper.xml" | 121 + .../crudtest/CrudTestApplicationTests.java" | 14 + .../image/img.png" | Bin 0 -> 22906 bytes .../image/img_-1.png" | Bin 0 -> 41679 bytes .../image/img_1.png" | Bin 0 -> 47540 bytes .../image/img_2.png" | Bin 0 -> 89592 bytes .../image/img_3.png" | Bin 0 -> 38596 bytes .../image/img_4.png" | Bin 0 -> 15393 bytes .../image/img_5.png" | Bin 0 -> 30529 bytes .../image/img_7.png" | Bin 0 -> 36603 bytes .../image/img_8.png" | Bin 0 -> 53514 bytes .../pom.xml" | 59 + .../sql/crud.sql" | 160 + .../vue-crud/vue-crud/.env.development" | 1 + .../vue-crud/vue-crud/.env.production" | 1 + .../vue-crud/vue-crud/.eslintignore" | 22 + .../vue-crud/vue-crud/.eslintrc.cjs" | 19 + .../vue-crud/vue-crud/.gitignore" | 28 + .../vue-crud/vue-crud/.npmrc" | 2 + .../vue-crud/vue-crud/.prettierrc.cjs" | 29 + .../vue-crud/.vscode/extensions.json" | 3 + .../vue-crud/vue-crud/README.md" | 20 + .../vue-crud/vue-crud/components.d.ts" | 35 + .../vue-crud/vue-crud/index.html" | 14 + .../vue-crud/vue-crud/package-lock.json" | 9911 +++++++++++++++++ .../vue-crud/vue-crud/package.json" | 59 + .../vue-crud/vue-crud/public/favicon.ico" | Bin 0 -> 16958 bytes .../vue-crud/vue-crud/src/App.vue" | 14 + .../vue-crud/vue-crud/src/api/genTables.ts" | 27 + .../vue-crud/src/api/genTablesPlus.ts" | 79 + .../vue-crud/vue-crud/src/api/interface.ts" | 10 + .../vue-crud/vue-crud/src/api/table.ts" | 50 + .../vue-crud/vue-crud/src/assets/404.png" | Bin 0 -> 51678 bytes .../src/components/codemirror/CodeMirror.vue" | 56 + .../src/components/svg-icon/index.ts" | 4 + .../src/components/svg-icon/src/svg-icon.vue" | 40 + .../vue-crud/vue-crud/src/hooks/index.ts" | 195 + .../vue-crud/vue-crud/src/hooks/interface.ts" | 35 + .../vue-crud/src/icons/iconfont/iconfont.js" | 1 + .../vue-crud/vue-crud/src/icons/svg/404.svg" | 1 + .../vue-crud/src/icons/svg/gitee.svg" | 2 + .../components/Navbar/components/Logo.vue" | 27 + .../src/layout/components/Navbar/index.vue" | 64 + .../layout/components/Router/Redirect.vue" | 18 + .../components/Sidebar/components/Menu.vue" | 21 + .../Sidebar/components/MenuItem.vue" | 24 + .../src/layout/components/Sidebar/index.vue" | 9 + .../vue-crud/vue-crud/src/layout/index.vue" | 25 + .../vue-crud/vue-crud/src/main.ts" | 28 + .../vue-crud/vue-crud/src/router/index.ts" | 64 + .../vue-crud/src/styles/element.scss" | 97 + .../vue-crud/vue-crud/src/styles/index.scss" | 3 + .../vue-crud/vue-crud/src/styles/layout.scss" | 67 + .../vue-crud/src/styles/variables.scss" | 20 + .../vue-crud/vue-crud/src/types/shims.d.ts" | 13 + .../vue-crud/vue-crud/src/utils/request.ts" | 51 + .../vue-crud/vue-crud/src/utils/tool.ts" | 45 + .../vue-crud/vue-crud/src/views/404.vue" | 32 + .../addfunction/addFunction.vue" | 364 + .../addfunction/tableFunction.vue" | 202 + .../generator-plus/addfunction/tableInfo.vue" | 95 + .../addfunction/tableRequest.vue" | 126 + .../addfunction/tableResponse.vue" | 122 + .../src/views/generator-plus/edit.vue" | 346 + .../src/views/generator-plus/index.vue" | 230 + .../src/views/generator/TableInfoForm.vue" | 145 + .../src/views/generator/basicInfoForm.vue" | 100 + .../vue-crud/src/views/generator/edit.vue" | 158 + .../vue-crud/src/views/generator/import.vue" | 123 + .../vue-crud/src/views/generator/index.vue" | 184 + .../vue-crud/src/views/generator/preview.vue" | 37 + .../vue-crud/vue-crud/tsconfig.json" | 30 + .../vue-crud/vue-crud/vite.config.ts" | 28 + 160 files changed, 21280 insertions(+) create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/JavaSceneConfigState.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/compiler.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/encodings.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/jarRepositories.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/misc.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/uiDesigner.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/vcs.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/workspace.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/LICENSE" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/README.md" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/pom.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/CrudPlusApplication.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/apo/ExceptionHandlerAspect.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/GenConfig.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/MybatisPlusConfig.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/WebConfig.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/constant/GenConstants.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/CustomException.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/GlobalExceptionHandler.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/ValidationException.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/text/StrFormatter.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenUtils.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenericConverter.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/StringUtils.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/TypeChecker.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityInitializer.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityUtils.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableContrller.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableFunctionController.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableColumnMapper.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableMapper.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionColumnMapper.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionMapper.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTable.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTableColumn.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunction.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunctionColumn.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableSaveReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunctionListReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunnctionSaveReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/testReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/CustomReqRespList.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableListResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTablesUpdateResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/Response.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionListResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunnctionSaveResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableCRUD.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableColumnbVo.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/TableFunctionPlusVo.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/GenTableService.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionColumnService.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionService.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/GenTableServiceImpl.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionColumnServiceImpl.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionServiceImpl.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.properties" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.yml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/generator.yml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/logback.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/controller.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/domain.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/mapper.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/req.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/resp.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/service.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/serviceImpl.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/sub-domain.java.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/xml/mapper.xml.vm" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/test/java/org/yang/crudplus/CrudPlusApplicationTests.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/pom.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/CrudTestApplication.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/controller/StudentsController.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/Students.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/deletcStudengtsReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/insertStudentsReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/selectStudentByIdReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/updateByAgeReq.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/selectStudentByIdResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/updateByAgeResp.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/mapper/StudentsMapper.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/StudentsService.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/impl/StudentsServiceImpl.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/application.yml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/mapper/crudplus/StudentsMapper.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/test/java/org/yang/crudtest/CrudTestApplicationTests.java" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_-1.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_1.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_2.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_3.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_4.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_5.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_7.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_8.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/pom.xml" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/sql/crud.sql" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.development" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.production" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintignore" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintrc.cjs" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.gitignore" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.npmrc" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.prettierrc.cjs" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.vscode/extensions.json" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/README.md" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/components.d.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/index.html" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package-lock.json" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package.json" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/public/favicon.ico" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/App.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTables.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTablesPlus.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/interface.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/table.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/assets/404.png" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/codemirror/CodeMirror.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/index.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/src/svg-icon.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/index.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/interface.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/iconfont/iconfont.js" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/404.svg" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/gitee.svg" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/components/Logo.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/index.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Router/Redirect.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/Menu.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/MenuItem.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/index.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/index.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/main.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/router/index.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/element.scss" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/index.scss" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/layout.scss" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/variables.scss" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/types/shims.d.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/request.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/tool.ts" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/404.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/addFunction.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableFunction.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableInfo.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableRequest.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableResponse.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/edit.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/index.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/TableInfoForm.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/basicInfoForm.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/edit.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/import.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/index.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/preview.vue" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/tsconfig.json" create mode 100644 "CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/vite.config.ts" diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/JavaSceneConfigState.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/JavaSceneConfigState.xml" new file mode 100644 index 0000000..a8442f4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/JavaSceneConfigState.xml" @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/compiler.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/compiler.xml" new file mode 100644 index 0000000..a46bfe0 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/compiler.xml" @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/encodings.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/encodings.xml" new file mode 100644 index 0000000..00f6c6b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/encodings.xml" @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/jarRepositories.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/jarRepositories.xml" new file mode 100644 index 0000000..abb532a --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/jarRepositories.xml" @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/misc.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/misc.xml" new file mode 100644 index 0000000..6ecd755 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/misc.xml" @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/uiDesigner.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/uiDesigner.xml" new file mode 100644 index 0000000..2b63946 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/uiDesigner.xml" @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/vcs.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/vcs.xml" new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/vcs.xml" @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/workspace.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/workspace.xml" new file mode 100644 index 0000000..578dd1c --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/.idea/workspace.xml" @@ -0,0 +1,434 @@ + + + + + + + + + + + + + + + + + + + + + { + "associatedIndex": 7 +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1729760664387 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/LICENSE" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/LICENSE" new file mode 100644 index 0000000..0a04128 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/LICENSE" @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/README.md" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/README.md" new file mode 100644 index 0000000..a2302d2 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/README.md" @@ -0,0 +1,67 @@ +# CRUD-PLUS + +## 站在巨人的肩膀上做CRUD +### 广告 +25届应届毕业生,目前积极找工作中!主后端Java开发,前端基础也还行,业务有需求可转方向!有项目企业实习经历!可实习!意向广东发展!
+有大佬能内推的可以issue我联系您,或者我的wx:**Print_15520182404** 感谢!!!! + +#### 介绍 +开发本项目是因为在实习期间,遇到新的业务开发,每次都需要做单表的CRUD代码,当表数量很多的时候,即使使用代码生成插件也会有一些方法无法生成,代码生成大多基于数据库实体类进行操作,但是在实际开发中, +会跟据业务请求不同封装单独的req和resp,重复代码太多,开发效率低,因此萌生了开发了CRUD-PLUS的想法。 + +CRUD-PLUS是一款低代码生成器,可跟据模板内容自定义生成单表的CRUD代码,同时支持自定义方法的service和serviceImpl和req,resp的生成,让开发者专注于业务逻辑的处理 +项目引入了Mybatis-Plus,可快速实现单表增删改查。 + +在此特别感谢
+[若依/RuoYi](https://gitee.com/y_project/RuoYi)
+[MAKU/maku-generator](https://gitee.com/makunet/maku-generator)
+后端的单表CRUD开发是基于[若依/RuoYi](https://gitee.com/y_project/RuoYi)的代码生成模块进行开发
+前端界面是基于[MAKU/maku-generator](https://gitee.com/makunet/maku-generator)进行二次开发
+因此十分感谢这两个开源项目,感谢! + +**注意:** +项目当中依旧还存在一些不完善的地方,欢迎大家提issue,会尽力修复!
+也欢迎大家fork进行自定义二次开发,有疑问可通过issue提问, + +#### 项目特点 + +**单表:**
+1. 单表domain,service,serviceImp,controller,mapper,xml的生成
+2. 单表req,resp的生成
+3. 基于req和resp的自定义方法,service,serviceImpl的生成
+ +**联表:**
+todo 等待后续开发 + +### 项目结构 +![img.png](image/img.png) +后端采用springboot3、mybatis-plus、mybatis、lombok等
+前端采用vue3、element-plus、ts等
+详情可参考[若依/RuoYi](https://gitee.com/y_project/RuoYi)和 +[MAKU/maku-generator](https://gitee.com/makunet/maku-generator)
+#### 本地启动 +1. clone项目到本地,导入数据库 +2. 加载maven配置,并修改数据库链接 +3. 前端下载依赖 +4. 后端项目启动,前端项目启动 + +#### 使用说明 +- 如果使用自定义方法,可能会存在生成的方法返回类不符合的情况,需要自行修改, +比如方法返回设置为void,但是方法是新增方法,方法默认返回新增操作影响行数,需要自行修改
+- 在创建自定义方法的时候,如果之前已经创建过了方法,那么在创建方法的最终选择请求类和响应类可选择之前创建的方法中的请求类或者响应类实现**复用**
+- 在定义响应类的时候可以输入你的系统中存在的响应类,或Long,String,void等方法返回类
+- 默认查询查询返回的是一个集合List +- 存在以上情况需要手动进行修改一些代码 + + + +### 效果图 +![img.png](image/img_-1.png) +![img_1.png](image/img_1.png) +![img_2.png](image/img_2.png) +![img_3.png](image/img_3.png) +![img_4.png](image/img_4.png) +![img_5.png](image/img_5.png) +![img_7.png](image/img_7.png) +![img_8.png](image/img_8.png) + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/pom.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/pom.xml" new file mode 100644 index 0000000..e40b48e --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/pom.xml" @@ -0,0 +1,113 @@ + + + 4.0.0 + + org.yang + crud + 0.0.1-SNAPSHOT + ../../crud/pom.xml + + + org.yang + CRUD-PLUS + 0.0.1-SNAPSHOT + CRUD-PLUS + CRUD-PLUS + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.mysql + mysql-connector-j + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-validation + + + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.7 + + + org.projectlombok + lombok + 1.18.24 + + + org.apache.commons + commons-lang3 + + + commons-io + commons-io + 2.16.1 + + + org.apache.velocity + velocity-engine-core + 2.3 + + + com.alibaba.fastjson2 + fastjson2 + 2.0.43 + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/CrudPlusApplication.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/CrudPlusApplication.java" new file mode 100644 index 0000000..a492c95 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/CrudPlusApplication.java" @@ -0,0 +1,17 @@ +package org.yang.crudplus; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@MapperScan("org.yang.crudplus.mapper") +@EnableTransactionManagement +public class CrudPlusApplication { + + public static void main(String[] args) { + SpringApplication.run(CrudPlusApplication.class, args); + } + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/apo/ExceptionHandlerAspect.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/apo/ExceptionHandlerAspect.java" new file mode 100644 index 0000000..9585a2d --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/apo/ExceptionHandlerAspect.java" @@ -0,0 +1,35 @@ +package org.yang.crudplus.common.apo; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; +import org.yang.crudplus.common.exception.CustomException; +import org.yang.crudplus.common.exception.ValidationException; +import org.yang.crudplus.pojo.resp.Response; + +@Aspect +@Component +@Slf4j +public class ExceptionHandlerAspect { + + @Around("execution(* org.yang.crudplus.controller..*(..))") + public Object handleControllerMethod(ProceedingJoinPoint pjp) { + try { + // 执行目标方法 + return pjp.proceed(); + } catch (CustomException e) { + log.error("异常抛出: " + e.getMessage(), e); + return new Response<>(e.getCode(), e.getMessage()); + } catch (ValidationException e) { + log.error("参数校验异常: " + e.getMessage(), e); + return new Response<>(e.getCode(), e.getMessage()); + } catch (Throwable e) { + log.error("Unexpected Exception: " + e.getMessage(), e); + return new Response<>(500, "服务异常"); + } + + } +} + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/GenConfig.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/GenConfig.java" new file mode 100644 index 0000000..6dfa0c9 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/GenConfig.java" @@ -0,0 +1,73 @@ +package org.yang.crudplus.common.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = { "classpath:generator.yml" }) +public class GenConfig +{ + /** 作者 */ + public static String author; + + /** 生成包路径 */ + public static String packageName; + + /** 自动去除表前缀,默认是false */ + public static boolean autoRemovePre; + + /** 表前缀(类名不会包含表前缀) */ + public static String tablePrefix; + + public static String getAuthor() + { + return author; + } + + @Value("${author}") + public void setAuthor(String author) + { + GenConfig.author = author; + } + + public static String getPackageName() + { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) + { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() + { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) + { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() + { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) + { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/MybatisPlusConfig.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/MybatisPlusConfig.java" new file mode 100644 index 0000000..8259965 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/MybatisPlusConfig.java" @@ -0,0 +1,24 @@ +package org.yang.crudplus.common.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@MapperScan("org.yang.crudplus.mapper") +public class MybatisPlusConfig { + + /** + * 添加分页插件 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加 + // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType + return interceptor; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/WebConfig.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/WebConfig.java" new file mode 100644 index 0000000..249bf64 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/config/WebConfig.java" @@ -0,0 +1,19 @@ +package org.yang.crudplus.common.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") // 允许的前端地址 + .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") + .allowedHeaders("*") + .allowCredentials(true); + } +} + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/constant/GenConstants.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/constant/GenConstants.java" new file mode 100644 index 0000000..3751cf4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/constant/GenConstants.java" @@ -0,0 +1,119 @@ +package org.yang.crudplus.common.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public class GenConstants +{ + /** 单表(增删改查) */ + public static final String TPL_CRUD = "crud"; + + public static final String UTF_8 = "UTF-8"; + + /** 树表(增删改查) */ + public static final String TPL_TREE = "tree"; + + /** 主子表(增删改查) */ + public static final String TPL_SUB = "sub"; + + /** 树编码字段 */ + public static final String TREE_CODE = "treeCode"; + + /** 树父编码字段 */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** 树名称字段 */ + public static final String TREE_NAME = "treeName"; + + /** 上级菜单ID字段 */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** 上级菜单名称字段 */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** 数据库字符串类型 */ + public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" }; + + /** 数据库文本类型 */ + public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" }; + + /** 数据库时间类型 */ + public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" }; + + /** 数据库数字类型 */ + public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal" }; + + /** 页面不需要编辑字段 */ + public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" }; + + /** 页面不需要显示的列表字段 */ + public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time" }; + + /** 页面不需要查询字段 */ + public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark" }; + + /** Entity基类字段 */ + public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" }; + + /** Tree基类字段 */ + public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" }; + + /** 文本框 */ + public static final String HTML_INPUT = "input"; + + /** 文本域 */ + public static final String HTML_TEXTAREA = "textarea"; + + /** 下拉框 */ + public static final String HTML_SELECT = "select"; + + /** 单选框 */ + public static final String HTML_RADIO = "radio"; + + /** 复选框 */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** 日期控件 */ + public static final String HTML_DATETIME = "datetime"; + + /** 图片上传控件 */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** 文件上传控件 */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** 富文本控件 */ + public static final String HTML_EDITOR = "editor"; + + /** 字符串类型 */ + public static final String TYPE_STRING = "String"; + + /** 整型 */ + public static final String TYPE_INTEGER = "Integer"; + + /** 长整型 */ + public static final String TYPE_LONG = "Long"; + + /** 浮点型 */ + public static final String TYPE_DOUBLE = "Double"; + + /** 高精度计算类型 */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** 时间类型 */ + public static final String TYPE_DATE = "Date"; + + /** 模糊查询 */ + public static final String QUERY_LIKE = "LIKE"; + + /** 相等查询 */ + public static final String QUERY_EQ = "EQ"; + + /** 需要 */ + public static final String REQUIRE = "1"; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/CustomException.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/CustomException.java" new file mode 100644 index 0000000..f1431ce --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/CustomException.java" @@ -0,0 +1,18 @@ +package org.yang.crudplus.common.exception; + +public class CustomException extends RuntimeException { + private int code; + + public CustomException(int code, String message) { + super(message); + this.code = code; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/GlobalExceptionHandler.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/GlobalExceptionHandler.java" new file mode 100644 index 0000000..9f8efd6 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/GlobalExceptionHandler.java" @@ -0,0 +1,40 @@ +package org.yang.crudplus.common.exception; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.yang.crudplus.pojo.resp.Response; + +@RestControllerAdvice +@Slf4j +public class GlobalExceptionHandler { + + @ExceptionHandler(CustomException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public Response handleCustomException(CustomException e) { + log.error("CustomException: " + e.getMessage(), e); + return new Response<>(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public Response handleValidationException(MethodArgumentNotValidException e) { + log.error("ValidationException: " + e.getMessage(), e); + StringBuilder errors = new StringBuilder(); + e.getBindingResult().getAllErrors().forEach(error -> { + errors.append(error.getDefaultMessage()).append(";"); + }); + return new Response<>(400, errors.toString()); + } + + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public Response handleException(Exception e) { + log.error("Unexpected Exception: " + e.getMessage(), e); + return new Response<>(500, "Internal Server Error"); + } +} + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/ValidationException.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/ValidationException.java" new file mode 100644 index 0000000..cbe4c0b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/exception/ValidationException.java" @@ -0,0 +1,30 @@ +package org.yang.crudplus.common.exception; + +public class ValidationException extends RuntimeException { + private int code; + private String message; + + public ValidationException(String message) { + super(message); + this.code = 400; // HTTP 400 Bad Request + this.message = message; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + @Override + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/text/StrFormatter.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/text/StrFormatter.java" new file mode 100644 index 0000000..d92191f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/text/StrFormatter.java" @@ -0,0 +1,124 @@ +package org.yang.crudplus.common.text; + + +import org.apache.commons.lang3.ArrayUtils; +import org.yang.crudplus.common.utils.StringUtils; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; + +import static org.yang.crudplus.common.constant.GenConstants.UTF_8; + +/** + * 字符串格式化 + * + * @author ruoyi + */ +public class StrFormatter { + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) { + if (handledPosition == 0) { + return strPattern; + } else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } else { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } else { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } else { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) { + return str(obj, CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } + + if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[]) { + return str((byte[]) obj, charset); + } else if (obj instanceof Byte[]) { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } else if (obj instanceof ByteBuffer) { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenUtils.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenUtils.java" new file mode 100644 index 0000000..1a3bb69 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenUtils.java" @@ -0,0 +1,249 @@ +package org.yang.crudplus.common.utils; + + + +import org.apache.commons.lang3.RegExUtils; +import org.yang.crudplus.common.config.GenConfig; +import org.yang.crudplus.common.constant.GenConstants; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.util.Arrays; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +public class GenUtils +{ + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable) + { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(genTable.getTableComment()); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) + { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + column.setQueryType(GenConstants.QUERY_EQ); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) + { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } + else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) + { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } + else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) + { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) + { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) + { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else + { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) + { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) + { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) + { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) + { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) + { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) + { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) + { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) + { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) + { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) + { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) + { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + return StringUtils.substring(packageName, lastIndex + 1, nameLength); + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) + { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + return StringUtils.substring(tableName, lastIndex + 1, nameLength); + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) + { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) + { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) + { + String text = replacementm; + for (String searchString : searchList) + { + if (replacementm.startsWith(searchString)) + { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + return StringUtils.substringBefore(columnType, "("); + } + else + { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) + { + if (StringUtils.indexOf(columnType, "(") > 0) + { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } + else + { + return 0; + } + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenericConverter.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenericConverter.java" new file mode 100644 index 0000000..59b0bd9 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/GenericConverter.java" @@ -0,0 +1,55 @@ +package org.yang.crudplus.common.utils; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +public class GenericConverter { + + private static final Map FIELD_CACHE = new HashMap<>(); + + public static R convert(T source, Class targetClass) { + if (source == null) { + return null; + } + + try { + R target = targetClass.getDeclaredConstructor().newInstance(); + Field[] sourceFields = getFields(source.getClass()); + Field[] targetFields = getFields(targetClass); + + for (Field sourceField : sourceFields) { + sourceField.setAccessible(true); + String fieldName = sourceField.getName(); + + for (Field targetField : targetFields) { + targetField.setAccessible(true); + if (targetField.getName().equals(fieldName)) { + Object value = sourceField.get(source); + if (value != null && !sourceField.getType().equals(targetField.getType())) { + value = convert(value, targetField.getType()); + } + targetField.set(target, value); + break; + } + } + } + return target; + } catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + e.printStackTrace(); + return null; + } + } + + private static Field[] getFields(Class clazz) { + String key = clazz.getName(); + if (FIELD_CACHE.containsKey(key)) { + return FIELD_CACHE.get(key); + } + + Field[] fields = clazz.getDeclaredFields(); + FIELD_CACHE.put(key, fields); + return fields; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/StringUtils.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/StringUtils.java" new file mode 100644 index 0000000..51f7218 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/StringUtils.java" @@ -0,0 +1,670 @@ +package org.yang.crudplus.common.utils; + + +import org.springframework.util.AntPathMatcher; +import org.yang.crudplus.common.text.StrFormatter; + +import java.util.*; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + /** 下划线 */ + private static final char SEPARATOR = '_'; + + /** 星号 */ + private static final char ASTERISK = '*'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 替换指定字符串的指定区间内字符为"*" + * + * @param str 字符串 + * @param startInclude 开始位置(包含) + * @param endExclude 结束位置(不包含) + * @return 替换后的字符串 + */ + public static String hide(CharSequence str, int startInclude, int endExclude) + { + if (isEmpty(str)) + { + return NULLSTR; + } + final int strLength = str.length(); + if (startInclude > strLength) + { + return NULLSTR; + } + if (endExclude > strLength) + { + endExclude = strLength; + } + if (startInclude > endExclude) + { + // 如果起始位置大于结束位置,不替换 + return NULLSTR; + } + final char[] chars = new char[strLength]; + for (int i = 0; i < strLength; i++) + { + if (i >= startInclude && i < endExclude) + { + chars[i] = ASTERISK; + } + else + { + chars[i] = str.charAt(i); + } + } + return new String(chars); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 判断是否为空,并且不是空白字符 + * + * @param str 要判断的value + * @return 结果 + */ + public static boolean hasText(String str) + { + return (str != null && !str.isEmpty() && containsText(str)); + } + + private static boolean containsText(CharSequence str) + { + int strLen = str.length(); + for (int i = 0; i < strLen; i++) + { + if (!Character.isWhitespace(str.charAt(i))) + { + return true; + } + } + return false; + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) + { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) + { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) + { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) + { + return list; + } + String[] split = str.split(sep); + for (String string : split) + { + if (filterBlank && StringUtils.isBlank(string)) + { + continue; + } + if (trim) + { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) + { + if (isEmpty(cs) || isEmpty(searchCharSequences)) + { + return false; + } + for (CharSequence testStr : searchCharSequences) + { + if (containsIgnoreCase(cs, testStr)) + { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) + { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) + { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/TypeChecker.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/TypeChecker.java" new file mode 100644 index 0000000..a69b80f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/TypeChecker.java" @@ -0,0 +1,54 @@ +package org.yang.crudplus.common.utils; + +import java.util.HashSet; +import java.util.Set; + +public class TypeChecker { + + private static final Set COMMON_RETURN_TYPES = new HashSet<>(); + + static { + COMMON_RETURN_TYPES.add("void"); + COMMON_RETURN_TYPES.add("int"); + COMMON_RETURN_TYPES.add("long"); + COMMON_RETURN_TYPES.add("float"); + COMMON_RETURN_TYPES.add("double"); + COMMON_RETURN_TYPES.add("boolean"); + COMMON_RETURN_TYPES.add("char"); + COMMON_RETURN_TYPES.add("byte"); + COMMON_RETURN_TYPES.add("short"); + COMMON_RETURN_TYPES.add("String"); + COMMON_RETURN_TYPES.add("Integer"); + COMMON_RETURN_TYPES.add("Long"); + COMMON_RETURN_TYPES.add("Float"); + COMMON_RETURN_TYPES.add("Double"); + COMMON_RETURN_TYPES.add("Boolean"); + COMMON_RETURN_TYPES.add("Character"); + COMMON_RETURN_TYPES.add("Byte"); + COMMON_RETURN_TYPES.add("Short"); + } + + public static boolean isCommonReturnType(String type) { + return COMMON_RETURN_TYPES.contains(type); + } + + public static boolean isClass(String type) { + try { + Class.forName(type); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + public static String determineType(String type) { + if (isCommonReturnType(type)) { + return "Common Return Type"; + } else if (isClass(type)) { + return "Class"; + } else { + return "Unknown"; + } + } + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityInitializer.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityInitializer.java" new file mode 100644 index 0000000..7721352 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityInitializer.java" @@ -0,0 +1,36 @@ +package org.yang.crudplus.common.utils; + + +import org.apache.velocity.app.Velocity; +import org.yang.crudplus.common.constant.GenConstants; + +import java.util.Properties; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +public class VelocityInitializer +{ + /** + * 初始化vm方法 + */ + public static void initVelocity() + { + Properties p = new Properties(); + try + { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, GenConstants.UTF_8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityUtils.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityUtils.java" new file mode 100644 index 0000000..373faca --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/common/utils/VelocityUtils.java" @@ -0,0 +1,366 @@ +package org.yang.crudplus.common.utils; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; + +import org.apache.velocity.VelocityContext; +import org.yang.crudplus.common.constant.GenConstants; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.vo.GenTableCRUD; +import org.yang.crudplus.pojo.vo.GenTableColumnbVo; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 模板处理工具类 + * + * @author ruoyi + */ +public class VelocityUtils { + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTableCRUD genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : genTable.getClassName()); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + //获取当前类的package名 + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", new SimpleDateFormat("yyyy-MM-dd").format(new Date())); + velocityContext.put("pkColumn", genTable.getPkColumn()); + //需要导入包的集合 + velocityContext.put("importList", getImportList(genTable)); + //获取权限前缀 + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + velocityContext.put("tableFunction", genTable.getTableFunction());//自定义方法 + + + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTableCRUD genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTableCRUD genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTableCRUD genTable) { + GenTableCRUD subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @param tplCategory 生成的模板 + * @param tplWebType 前端类型 + * @return 模板列表 + */ + public static Map> getTemplateList(String tplCategory, String tplWebType) { + Map> templates = new HashMap<>(); + // 只生成一次的模板 + List singleTemplates = new ArrayList<>(); + singleTemplates.add("vm/java/domain.java.vm"); + singleTemplates.add("vm/java/mapper.java.vm"); + singleTemplates.add("vm/java/controller.java.vm"); + singleTemplates.add("vm/xml/mapper.xml.vm"); + + // 根据自定义方法生成的模板 + List customTemplates = new ArrayList<>(); + customTemplates.add("vm/java/req.java.vm"); + customTemplates.add("vm/java/resp.java.vm"); + + List singleAndCustom = new ArrayList<>(); + singleAndCustom.add("vm/java/service.java.vm"); + singleAndCustom.add("vm/java/serviceImpl.java.vm"); + + templates.put("single", singleTemplates); + templates.put("custom", customTemplates); + templates.put("singleAndCustom",singleAndCustom); + + return templates; + } + + + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTableCRUD genTable,String customPath) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } else if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.js.vm")) { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("req.java.vm")) { + fileName=StringUtils.format("{}/domain/req/{}.java", javaPath, customPath); + } else if (template.contains("resp.java.vm")) { + fileName=StringUtils.format("{}/domain/resp/{}.java", javaPath, customPath); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + return StringUtils.substring(packageName, 0, lastIndex); + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTableCRUD genTable) { + List columns = genTable.getColumns(); + GenTableCRUD subTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subTable)) { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTableCRUD genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + addDicts(dicts, columns); + //主子表 + if (StringUtils.isNotNull(genTable.getSubTable())) { + List subColumns = genTable.getSubTable().getColumns(); + addDicts(dicts, subColumns); + } + return StringUtils.join(dicts, ", "); + } + + /** + * 添加字典列表 + * + * @param dicts 字典列表 + * @param columns 列集合 + */ + public static void addDicts(Set dicts, List columns) { + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) { + dicts.add("'" + column.getDictType() + "'"); + } + } + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTableCRUD genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSON.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableContrller.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableContrller.java" new file mode 100644 index 0000000..e386c3d --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableContrller.java" @@ -0,0 +1,180 @@ +package org.yang.crudplus.controller; + +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.yang.crudplus.common.exception.CustomException; +import org.yang.crudplus.common.utils.StringUtils; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.req.GenTableReq; +import org.yang.crudplus.pojo.req.GenTableSaveReq; +import org.yang.crudplus.pojo.resp.GenTableListResp; +import org.yang.crudplus.pojo.resp.GenTablesUpdateResp; +import org.yang.crudplus.pojo.resp.Response; +import org.yang.crudplus.service.GenTableService; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +@Slf4j +@RestController +@RequestMapping("/table") +@Validated +public class TableContrller { + + @Autowired + private GenTableService genTableService; + + /** + * 查询导入的表格列表 + * + * @param req + * @return + */ + @GetMapping("/list") + public Response list(@Valid GenTableReq req) { + log.info("表格数据集合请求:{}", req.toString()); + GenTableListResp resp = genTableService.list(req); + log.info("表格数据请求响应:{}", resp); + return new Response<>(resp); + } + + /** + * 系统表格查询 + * + * @param req + * @return + */ + @GetMapping("/db/list") + public Response> DBlist(@Valid GenTableReq req) { + log.info("系统表格查询请求:{}", req.toString()); + List resp = genTableService.DBlist(req); + log.info("系统表格查询响应:{}", resp); + return new Response<>(resp); + } + + /** + * 导入表结构 + * + * @param tables + * @return + */ + @PostMapping("/importTable") + public Response importTable(@RequestBody String[] tables) { + log.info("导入表结构请求:{}", Arrays.toString(tables)); + if (tables == null || tables.length == 0) { + return new Response<>(400, "参数为空"); + } + genTableService.importTable(tables); + return new Response<>(200, "导入成功"); + } + + /** + * 查询代码生成配置信息 + * + * @param tableId + * @return + */ + @GetMapping("/{tableId}") + public Response getTableInfo(@PathVariable("tableId") Long tableId) { + log.info("查询表格详情请求:{}", tableId); + GenTablesUpdateResp resp = genTableService.getTableInfo(tableId); + log.info("查询表格详情响应:{}", resp); + return new Response<>(resp); + } + + /** + * 删除代码生成 + * + * @param tableIds + * @return + */ + @PostMapping("/delete") + public Response deleteTable(@RequestBody String[] tableIds) { + log.info("删除表格请求:{}", Arrays.toString(tableIds)); + genTableService.removeById(tableIds); + return new Response<>(); + } + /** + * 同步表结构:等同于重新导入 + * 丢失相关信息 + * + * @param tableName + * @return + */ + @GetMapping("/synchDb/{tableName}") + public Response synchDb (@PathVariable("tableName") String tableName){ + log.info("同步表结构请求:{}", tableName); + genTableService.synchDb(tableName); + return new Response<>(); + } + + /** + * 保存表配置信息请求 + * + * @param req + * @return + */ + @PostMapping("/save") + public Response save (@RequestBody GenTableSaveReq req){ + log.info("保存表配置信息请求:{}", req.toString()); + genTableService.saveConfig(req); + return new Response<>(); + } + + /** + * 代码生成--单表crud + * + * @param response + * @param tables + * @throws IOException + */ + @GetMapping("/batchGenCode") + public Response batchGenCode (HttpServletResponse response, String tables) throws IOException { + log.info("批量生成代码请求:{}", tables.toString()); + if (StringUtils.isBlank(tables)) { + throw new CustomException(400, "参数为空"); + } + String[] tableNames = StringUtils.split(tables, ","); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + return new Response<>(); + } + + + /** + * 生成zip文件 + */ + private void genCode (HttpServletResponse response,byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"crud.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } + + /** + * 跟据表名称,查询字段集合 + * + * @param tableName + * @return + */ + @GetMapping("/getTableColumns") + public Response> getTableColumnListByTableName (String tableName){ + log.info("根据表名称查询字段集合请求:{}", tableName); + List resp = genTableService.getTableColumnListByTableName(tableName); + log.info("根据表名称查询字段集合响应:{}", resp); + return new Response<>(resp); + } + + + } diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableFunctionController.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableFunctionController.java" new file mode 100644 index 0000000..09ca3e0 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/controller/TableFunctionController.java" @@ -0,0 +1,145 @@ +package org.yang.crudplus.controller; + +import java.io.IOException; +import java.util.List; + +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.yang.crudplus.common.exception.CustomException; +import org.yang.crudplus.common.utils.StringUtils; +import org.yang.crudplus.pojo.TableFunction; +import org.yang.crudplus.pojo.req.TableFunctionListReq; +import org.yang.crudplus.pojo.req.TableFunnctionSaveReq; +import org.yang.crudplus.pojo.resp.CustomReqRespList; +import org.yang.crudplus.pojo.resp.Response; +import org.yang.crudplus.pojo.resp.TableFunctionListResp; +import org.yang.crudplus.pojo.resp.TableFunnctionSaveResp; +import org.yang.crudplus.service.ITableFunctionService; + + +/** + * TableFunctionController + * + * @author crud + * @date 2024-10-30 + */ +@Slf4j +@RestController +@RequestMapping("/plus/table") +public class TableFunctionController { + @Autowired + private ITableFunctionService tableFunctionService; + + /** + * 保存crud的方法 + * + * @return + */ + @PostMapping("/save") + public Response add(@RequestBody TableFunnctionSaveReq req) { + log.info("保存crud的方法请求:{}", req.toString()); + tableFunctionService.saveConfig(req); + return new Response<>(); + } + + + /** + * 代码生成--单表-service层自定义方法 + * + * @param response + * @param tables + * @throws IOException + */ + @GetMapping("/batchGenCode") + public Response batchGenCode(HttpServletResponse response, String tables) throws IOException { + log.info("代码生成--单表-service层自定义方法:{}", tables.toString()); + if (StringUtils.isBlank(tables)) { + throw new CustomException(400, "参数为空"); + } + String[] tableNames = StringUtils.split(tables, ","); + byte[] data = tableFunctionService.downloadCode(tableNames); + genCode(response, data); + return new Response<>(); + } + + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"crud.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } + + /** + * 查询tableFunction列表 + * + * @param req + * @return + */ + @GetMapping("/list") + public Response> list(TableFunctionListReq req) { + log.info("查询tableFunction列表请求:{}", req.toString()); + Listresp = tableFunctionService.list(req); + log.info("查询tableFunction列表响应:{}", resp); + return new Response<>(resp); + } + + /** + * 自定义的方法请求对象 + */ + @GetMapping("/customReqList") + public Response> customReqList() { + log.info("自定义的方法请求对象"); + return new Response<>(tableFunctionService.customReResoList("req")); + } + + /** + * 自定义的方法请求对象 + */ + @GetMapping("/customRespList") + public Response> customRespList() { + log.info("自定义的方法请求对象"); + return new Response<>(tableFunctionService.customReResoList("resp")); + } + + /** + * 跟据方法id获取到该方法的相关信息 + * @param functionId + * @return + */ + @GetMapping("/functionInfoById") + public Response functionInfoById(Long functionId) { + log.info("查询tableFunction列表请求:{}", functionId); + return new Response<>(tableFunctionService.functionInfoById(functionId)); + } + + /** + * 删除方法 + * @param functionId + * @return + */ + @GetMapping("/deleteById") + public Response deleteById(Long functionId){ + log.info("删除请求:{}", functionId); + tableFunctionService.deleteFunctionById(functionId); + return new Response<>(); + } + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableColumnMapper.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableColumnMapper.java" new file mode 100644 index 0000000..c23fb0e --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableColumnMapper.java" @@ -0,0 +1,61 @@ +package org.yang.crudplus.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.util.List; + +public interface GenTableColumnMapper extends BaseMapper { + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + + @Select("") + public List selectDbTableColumnsByName(@Param("tableName") String tableName); + + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + + @Select( + " select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column " + + "where table_id = #{tableId} " + + " order by sort" + ) + public List selectGenTableColumnListByTableId(@Param("tableId") Long tableId); + + + @Select("SELECT column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time FROM gen_table_column WHERE table_id = #{tableId} ORDER BY sort") + List selectByTableId(Long tableId); + + + @Select("") + List selectFunctionByTableName(@Param("type") String type, @Param("functionId") Long functionId); + +} + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableMapper.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableMapper.java" new file mode 100644 index 0000000..7f77cd2 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/GenTableMapper.java" @@ -0,0 +1,134 @@ +package org.yang.crudplus.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.*; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.req.GenTableReq; +import org.yang.crudplus.pojo.vo.GenTableColumnbVo; + +import java.util.List; + +public interface GenTableMapper extends BaseMapper { + + + /** + * 查询数据库中有那些表 + * + * @param req + * @return + */ + @Select("") + public List DBlist(Page page, @Param("req") GenTableReq req); + + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + + @Select("") + public List selectDbTableListByNames(String[] tableNames); + + + /** + * 查询表ID业务信息 + * + * @param tableId 业务ID + * @return 业务信息 + */ + + @Select("SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, " + + "t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, " + + "t.gen_type, t.gen_path, t.options, t.remark, c.column_id, c.column_name, c.column_comment, c.column_type, " + + "c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, " + + "c.is_query, c.query_type, c.html_type, c.dict_type, c.sort FROM gen_table t LEFT JOIN gen_table_column c " + + " ON t.table_id = c.table_id WHERE t.table_id = #{tableId} ORDER BY c.sort") + @Results({ + @Result(column = "table_id", property = "tableId"), + @Result(column = "table_name", property = "tableName"), + @Result(column = "table_comment", property = "tableComment"), + @Result(column = "sub_table_name", property = "subTableName"), + @Result(column = "sub_table_fk_name", property = "subTableFkName"), + @Result(column = "class_name", property = "className"), + @Result(column = "tpl_category", property = "tplCategory"), + @Result(column = "tpl_web_type", property = "tplWebType"), + @Result(column = "package_name", property = "packageName"), + @Result(column = "module_name", property = "moduleName"), + @Result(column = "business_name", property = "businessName"), + @Result(column = "function_name", property = "functionName"), + @Result(column = "function_author", property = "functionAuthor"), + @Result(column = "gen_type", property = "genType"), + @Result(column = "gen_path", property = "genPath"), + @Result(column = "options", property = "options"), + @Result(column = "remark", property = "remark"), + @Result(property = "columns", column = "table_id", javaType = List.class, many = @Many(select = "org.yang.crudplus.mapper.GenTableColumnMapper.selectByTableId")) + }) + List selectGenTableById(Long tableId); + + @Select("SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, " + + "t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, " + + "t.gen_type, t.gen_path, t.options, t.remark, c.column_id, c.column_name, c.column_comment, c.column_type, " + + "c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, " + + "c.is_query, c.query_type, c.html_type, c.dict_type, c.sort FROM gen_table t LEFT JOIN gen_table_column c " + + " ON t.table_id = c.table_id WHERE t.table_name = #{tableName} ORDER BY c.sort") + @Results({ + @Result(column = "table_id", property = "tableId"), + @Result(column = "table_name", property = "tableName"), + @Result(column = "table_comment", property = "tableComment"), + @Result(column = "sub_table_name", property = "subTableName"), + @Result(column = "sub_table_fk_name", property = "subTableFkName"), + @Result(column = "class_name", property = "className"), + @Result(column = "tpl_category", property = "tplCategory"), + @Result(column = "tpl_web_type", property = "tplWebType"), + @Result(column = "package_name", property = "packageName"), + @Result(column = "module_name", property = "moduleName"), + @Result(column = "business_name", property = "businessName"), + @Result(column = "function_name", property = "functionName"), + @Result(column = "function_author", property = "functionAuthor"), + @Result(column = "gen_type", property = "genType"), + @Result(column = "gen_path", property = "genPath"), + @Result(column = "options", property = "options"), + @Result(column = "remark", property = "remark"), + @Result(property = "columns", column = "table_id", javaType = List.class, many = @Many(select = "org.yang.crudplus.mapper.GenTableColumnMapper.selectByTableId")) }) + List selectGenTableByName(@Param("tableName") String tableName); + + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Select( + " SELECT t.table_id, t.table_name, t.table_comment, t.sub_table_name, t.sub_table_fk_name, t.class_name, t.tpl_category, t.tpl_web_type, t.package_name, t.module_name, t.business_name, t.function_name, t.function_author, t.options, t.remark, " + + " c.column_id, c.column_name, c.column_comment, c.column_type, c.java_type, c.java_field, c.is_pk, c.is_increment, c.is_required, c.is_insert, c.is_edit, c.is_list, c.is_query, c.query_type, c.html_type, c.dict_type, c.sort " + + " FROM gen_table t " + + " LEFT JOIN gen_table_column c ON t.table_id = c.table_id " + + " order by c.sort" + ) + public List selectGenTableAll(); + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionColumnMapper.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionColumnMapper.java" new file mode 100644 index 0000000..b42b391 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionColumnMapper.java" @@ -0,0 +1,10 @@ +package org.yang.crudplus.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.yang.crudplus.pojo.TableFunctionColumn; + +public interface TableFunctionColumnMapper extends BaseMapper { + + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionMapper.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionMapper.java" new file mode 100644 index 0000000..81e65dc --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/mapper/TableFunctionMapper.java" @@ -0,0 +1,55 @@ +package org.yang.crudplus.mapper; + +import java.util.List; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.TableFunction; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.yang.crudplus.pojo.resp.TableFunctionResp; + + +/** + * TableFunction的Mapper接口 + * + * @author crud + * @date 2024-10-30 + */ +public interface TableFunctionMapper extends BaseMapper { + + @Select("") + List selectListPage(Page page, @Param("tableName") String tableName); + + @Select("") + List selectTableFunction(@Param("tableName") String tableName); + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTable.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTable.java" new file mode 100644 index 0000000..4d6b303 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTable.java" @@ -0,0 +1,108 @@ +package org.yang.crudplus.pojo; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 代码生成业务表 + * + * @TableName gen_table + */ +@Data +public class GenTable implements Serializable { + + /** + * 编号 + */ + @TableId(type = IdType.AUTO) + private Long tableId; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + + private String tableComment; + /** + * 关联子表的表名 + */ + private String subTableName; + /** + * 子表关联的外键名 + */ + private String subTableFkName; + /** + * 实体类名称 + */ + private String className; + /** + * 使用的模板(crud单表操作 tree树表操作) + */ + private String tplCategory; + /** + * 前端模板类型(element-ui模版 element-plus模版) + */ + private String tplWebType; + /** + * 生成包路径 + */ + private String packageName; + /** + * 生成模块名 + */ + private String moduleName; + /** + * 生成业务名 + */ + private String businessName; + /** + * 生成功能名 + */ + private String functionName; + /** + * 生成功能作者 + */ + private String functionAuthor; + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + /** + * 生成路径(不填默认项目路径) + */ + private String genPath; + /** + * 其它生成选项 + */ + private String options; + /** + * 创建者 + */ + private String createBy; + /** + * 创建时间 + */ + + private Date createTime; + /** + * 更新者 + */ + private String updateBy; + /** + * 更新时间 + */ + private Date updateTime; + /** + * 备注 + */ + private String remark; + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTableColumn.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTableColumn.java" new file mode 100644 index 0000000..2425c05 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/GenTableColumn.java" @@ -0,0 +1,156 @@ +package org.yang.crudplus.pojo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.hibernate.validator.constraints.Length; +import org.yang.crudplus.common.utils.StringUtils; + +import java.io.Serializable; +import java.util.Date; + +/** + * 代码生成业务表字段 + * + * @TableName gen_table_column + */ +@Data +public class GenTableColumn implements Serializable { + + /** + * 编号 + */ + @TableId(type = IdType.AUTO) + private Long columnId; + /** + * 归属表编号 + */ + + private Long tableId; + /** + * 列名称 + */ + private String columnName; + /** + * 列描述 + */ + private String columnComment; + /** + * 列类型 + */ + private String columnType; + /** + * JAVA类型 + */ + private String javaType; + /** + * JAVA字段名 + */ + private String javaField; + /** + * 是否主键(1是) + */ + private String isPk; + /** + * 是否自增(1是) + */ + private String isIncrement; + /** + * 是否必填(1是) + */ + private String isRequired; + /** + * 是否为插入字段(1是) + */ + private String isInsert; + /** + * 是否编辑字段(1是) + */ + private String isEdit; + /** + * 是否列表字段(1是) + */ + private String isList; + /** + * 是否查询字段(1是) + */ + + private String isQuery; + /** + * 查询方式(等于、不等于、大于、小于、范围) + */ + private String queryType; + /** + * 显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件) + */ + private String htmlType; + /** + * 字典类型 + */ + private String dictType; + /** + * 排序 + */ + private Integer sort; + /** + * 创建者 + */ + private String createBy; + /** + * 创建时间 + */ + private Date createTime; + /** + * 更新者 + */ + private String updateBy; + /** + * 更新时间 + */ + private Date updateTime; + + /** + * java字段名转首字母大写 + */ + @TableField(exist = false) + private String javaFieldStr; + + + public boolean isPk() + { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) + { + return isPk != null && StringUtils.equals("1", isPk); + } + + + public boolean isSuperColumn() + { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isList() + { + return isList(this.isList); + } + + public boolean isList(String isList) + { + return isList != null && StringUtils.equals("1", isList); + } + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunction.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunction.java" new file mode 100644 index 0000000..02898b8 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunction.java" @@ -0,0 +1,63 @@ +package org.yang.crudplus.pojo; + + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * table_function表的实体对象 tableFunction + * + * @author crud + * @date 2024-10-30 + */ +@Data +public class TableFunction { + + /** + * 方法id + */ + @TableId(type = IdType.AUTO) + private Long functionId; + /** + * 表id + */ + private Long tableId; + /** + * 方法名称 + */ + private String functionName; + /** + * 方法描述 + */ + private String functionDescription; + /** + * 方法类型(insert,update,delete,selelct) + */ + private String functionType; + /** + * 方法请求对象名称 + */ + private String functionReq; + /** + * 方法响应对象名称 + */ + private String functionResp; + /** + * 使用的方法响应对象名称 + */ + private String functionRespUse; + /** + * 使用方法的请求对象名称 + */ + private String functionReqUse; + /** + * 方法响应对象自定义名称 + */ + private String functionRespCustom; + + + + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunctionColumn.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunctionColumn.java" new file mode 100644 index 0000000..badc188 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/TableFunctionColumn.java" @@ -0,0 +1,73 @@ +package org.yang.crudplus.pojo; + + +import com.baomidou.mybatisplus.annotation.TableId; + +/** + * table_function_column表的实体对象 tableFunctionColumn + * + * @author crud + * @date 2024-10-30 + */ +public class TableFunctionColumn { + + /** + * 方法字段id + */ + @TableId + private Long functionColumId; + /** + * 基类字段id + */ + private Long columnId; + /** + * 方法id + */ + private Long tableFunctionId; + /** + * 字段所属对象(req,resp) + */ + private String functionColumType; + + public void setFunctionColumId(Long functionColumId) { + this.functionColumId = functionColumId; + } + + public Long getFunctionColumId() { + return functionColumId; + } + + public void setColumnId(Long columnId) { + this.columnId = columnId; + } + + public Long getColumnId() { + return columnId; + } + + public void setTableFunctionId(Long tableFunctionId) { + this.tableFunctionId = tableFunctionId; + } + + public Long getTableFunctionId() { + return tableFunctionId; + } + + public void setFunctionColumType(String functionColumType) { + this.functionColumType = functionColumType; + } + + public String getFunctionColumType() { + return functionColumType; + } + + @Override + public String toString() { + return "TableFunctionColumn{" + + "functionColumId=" + getFunctionColumId() + + "columnId=" + getColumnId() + + "tableFunctionId=" + getTableFunctionId() + + "functionColumType=" + getFunctionColumType() + + "}"; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableReq.java" new file mode 100644 index 0000000..130e9df --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableReq.java" @@ -0,0 +1,33 @@ +package org.yang.crudplus.pojo.req; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serializable; + +/** + * 代码生成表 + * + * @TableName gen_table + */ +@Data +public class GenTableReq implements Serializable { + + + /** + * 表名 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + @NotNull(message = "PageNum cannot be null") + @Min(value = 1, message = "分页大小不低于1") + private int pageNum; + @NotNull(message = "PageSize cannot be null") + @Min(value = 1, message = "分页总数不低于1") + private int pageSize; + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableSaveReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableSaveReq.java" new file mode 100644 index 0000000..2d351bb --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/GenTableSaveReq.java" @@ -0,0 +1,53 @@ +package org.yang.crudplus.pojo.req; + +import lombok.Data; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.io.Serializable; +import java.util.List; +/** + * 代码生成配置保存请求对象 + */ +@Data +public class GenTableSaveReq implements Serializable { + /** + * 表id + */ + private Long tableId; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 类名称 + */ + private String className; + + /** + * 作者 + */ + private String functionAuthor; + /** + * 包路径 + */ + private String packageName; + + /** + * 生成路径(不填默认项目路径) + */ + private String genPath; + /** + * 备注 + */ + private String remark; + /** + * 字段生成信息 + */ + private List columns; + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunctionListReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunctionListReq.java" new file mode 100644 index 0000000..0435294 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunctionListReq.java" @@ -0,0 +1,24 @@ +package org.yang.crudplus.pojo.req; + +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.io.Serializable; + +/** + * 自定义方法生成 + */ +@Data +public class TableFunctionListReq implements Serializable { + /** + * 使用的表名称 + */ + private String tableName; + @NotNull(message = "PageNum cannot be null") + @Min(value = 1, message = "分页大小不低于1") + private int pageNum; + @NotNull(message = "PageSize cannot be null") + @Min(value = 1, message = "分页总数不低于1") + private int pageSize; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunnctionSaveReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunnctionSaveReq.java" new file mode 100644 index 0000000..7a2046e --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/TableFunnctionSaveReq.java" @@ -0,0 +1,75 @@ +package org.yang.crudplus.pojo.req; + +import lombok.Data; +import org.yang.crudplus.pojo.GenTableColumn; + +import javax.swing.table.TableColumn; +import java.io.Serializable; +import java.util.List; + +/** + * 保存crud生成的方法数据 + */ +@Data +public class TableFunnctionSaveReq implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 使用的表名称 + */ + private String tableName; + /** + * 方法名称 + */ + private String functionName; + /** + * 方法类型,insert,update,select,delete + */ + private String functionType; + /** + * 方法描述 + */ + private String functionDescription; + /** + * 请求pojo对象名称 + */ + private String reqFunctionPojoName; + /** + * 请求pojo对象参数 + */ + private List reqFunctionParam; + /** + * 响应pojo对象名称 + */ + private String respFunctionPojoName; + /** + * 自定义响应对象名称 + */ + private String respFunctionCustomPojoName; + /** + * 响应pojo对象参数 + */ + private List respFunctionParam; + /** + * 真正使用的方法请求类 + */ + private String reqPojoUse; + /** + * reqPojoParamUse + */ + private List reqPojoParamUse; + /** + * 真正使用的方法请求类字段-使用某些字段进行操作 + */ + private List reqPojoParamDataUse; + /** + * 真正使用的方法响应类 + */ + private String respPojoUse; + /** + * 真正使用的方法响应类的字段 + */ + private List respPojoParamUse; + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/testReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/testReq.java" new file mode 100644 index 0000000..c1633b5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/req/testReq.java" @@ -0,0 +1,15 @@ +package org.yang.crudplus.pojo.req; + +import java.io.Serializable; + +public class testReq implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 姓名 + */ + private String name; + /** + * 年龄 + */ + private String age; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/CustomReqRespList.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/CustomReqRespList.java" new file mode 100644 index 0000000..f82a490 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/CustomReqRespList.java" @@ -0,0 +1,23 @@ +package org.yang.crudplus.pojo.resp; + +import lombok.Data; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.io.Serializable; +import java.util.List; + +/** + * 自定义方法中所有的请对/响应象名称 + */ +@Data +public class CustomReqRespList implements Serializable { + private static final long serialVersionUID = 1L; + /** + * 自定义的名称 + */ + private String customName; + /** + * 对象的名称 + */ + private List columnsList; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableListResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableListResp.java" new file mode 100644 index 0000000..c0afb98 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableListResp.java" @@ -0,0 +1,13 @@ +package org.yang.crudplus.pojo.resp; + +import lombok.Data; +import org.yang.crudplus.pojo.GenTable; + +import java.io.Serializable; +import java.util.List; +@Data +public class GenTableListResp implements Serializable { + private List list; + + private Long total; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableResp.java" new file mode 100644 index 0000000..ff78821 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTableResp.java" @@ -0,0 +1,30 @@ +package org.yang.crudplus.pojo.resp; + + + +import lombok.Data; + +import java.io.Serializable; + + +/** +* 代码生成表 +* @TableName gen_table +*/ +@Data +public class GenTableResp implements Serializable { + /** + * 表名 + */ + private String tableName; + /** + * 类名 + */ + private String className; + /** + * 说明 + */ + private String tableComment; + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTablesUpdateResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTablesUpdateResp.java" new file mode 100644 index 0000000..818a8d8 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/GenTablesUpdateResp.java" @@ -0,0 +1,25 @@ +package org.yang.crudplus.pojo.resp; + +import lombok.AllArgsConstructor; +import lombok.Data; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.vo.GenTableColumnbVo; + +import java.io.Serializable; +import java.util.List; + +/** + * 修改代码生成结构表响应 + */ +@Data +public class GenTablesUpdateResp implements Serializable { + /** + * 表信息 + */ + private GenTableColumnbVo info; + + private List tables; + + private List rows; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/Response.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/Response.java" new file mode 100644 index 0000000..bc7f1a9 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/Response.java" @@ -0,0 +1,31 @@ +package org.yang.crudplus.pojo.resp; + +import lombok.Data; + +@Data +public class Response { + private int code; + private String message; + private T data; + + // 默认构造函数,响应成功 + public Response() { + this.code = 200; + this.message = "Success"; + } + + // 带数据的构造函数,响应成功 + public Response(T data) { + this(); + this.data = data; + } + + // 带错误码和消息的构造函数 + public Response(int code, String message) { + this.code = code; + this.message = message; + } +} + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionListResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionListResp.java" new file mode 100644 index 0000000..dc98a17 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionListResp.java" @@ -0,0 +1,29 @@ +package org.yang.crudplus.pojo.resp; + +import lombok.Data; +import org.yang.crudplus.pojo.TableFunction; + +import java.io.Serializable; +import java.util.List; + +/** + * 自定义方法响应集合 + */ +@Data +public class TableFunctionListResp implements Serializable { + private List list; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 表方法总数 + */ + private int functionNum; + + private Long total; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionResp.java" new file mode 100644 index 0000000..0326259 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunctionResp.java" @@ -0,0 +1,54 @@ +package org.yang.crudplus.pojo.resp; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 自定义方法响应 + */ +@Data +public class TableFunctionResp implements Serializable { + + /** + * 方法id + */ + private Long functionId; + /** + * 表id + */ + private Long tableId; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + private String tableComment; + /** + * 方法名称 + */ + private String functionName; + /** + * 方法类型(insert,update,delete,selelct) + */ + private String functionType; + /** + * 方法请求对象名称 + */ + private String functionReq; + + /** + * 使用的方法响应对象名称 + */ + private String functionRespUse; + + /** + * 使用的方法请求对象名称 + */ + private String functionReqUse; + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunnctionSaveResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunnctionSaveResp.java" new file mode 100644 index 0000000..8250894 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/resp/TableFunnctionSaveResp.java" @@ -0,0 +1,74 @@ +package org.yang.crudplus.pojo.resp; + +import lombok.Data; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.io.Serializable; +import java.util.List; + +/** + * 保存crud生成的方法数据 + */ +@Data +public class TableFunnctionSaveResp implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 使用的表名称 + */ + private String tableName; + /** + * 方法名称 + */ + private String functionName; + /** + * 方法类型,insert,update,select,delete + */ + private String functionType; + /** + * 方法描述 + */ + private String functionDescription; + /** + * 请求pojo对象名称 + */ + private String reqFunctionPojoName; + /** + * 请求pojo对象参数 + */ + private List reqFunctionParam; + /** + * 响应pojo对象名称 + */ + private String respFunctionPojoName; + /** + * 自定义响应对象名称 + */ + private String respFunctionCustomPojoName; + /** + * 响应pojo对象参数 + */ + private List respFunctionParam; + /** + * 真正使用的方法请求类 + */ + private String reqPojoUse; + /** + * reqPojoParamUse + */ + private List reqPojoParamUse; + /** + * 真正使用的方法请求类字段-使用某些字段进行操作 + */ + private List reqPojoParamDataUse; + /** + * 真正使用的方法响应类 + */ + private String respPojoUse; + /** + * 真正使用的方法响应类的字段 + */ + private List respPojoParamUse; + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableCRUD.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableCRUD.java" new file mode 100644 index 0000000..cee5d1f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableCRUD.java" @@ -0,0 +1,127 @@ +package org.yang.crudplus.pojo.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.TableFunction; + +import java.util.Date; +import java.util.List; + +/** + * crud最终生成的处理类 + */ +@Data +public class GenTableCRUD { + /** + * 编号 + */ + private Long tableId; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + + private String tableComment; + /** + * 关联子表的表名 + */ + private String subTableName; + /** + * 子表关联的外键名 + */ + private String subTableFkName; + /** + * 实体类名称 + */ + private String className; + /** + * 使用的模板(crud单表操作 tree树表操作) + */ + private String tplCategory; + /** + * 前端模板类型(element-ui模版 element-plus模版) + */ + private String tplWebType; + /** + * 生成包路径 + */ + private String packageName; + /** + * 生成模块名 + */ + private String moduleName; + /** + * 生成业务名 + */ + private String businessName; + /** + * 生成功能名 + */ + private String functionName; + /** + * 生成功能作者 + */ + private String functionAuthor; + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + /** + * 生成路径(不填默认项目路径) + */ + private String genPath; + /** + * 其它生成选项 + */ + private String options; + /** + * 创建者 + */ + private String createBy; + /** + * 创建时间 + */ + + private Date createTime; + /** + * 更新者 + */ + private String updateBy; + /** + * 更新时间 + */ + private Date updateTime; + /** + * 备注 + */ + private String remark; + /** + * 字段信息 + */ + private List columns; + /** + * 子表(主子表) + */ + private GenTableCRUD subTable; + + + /** + * 主键信息 + */ + private GenTableColumn pkColumn; + + //自定义方法-扩展信息 + /** + * 方法信息 + */ + private List tableFunction; + + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableColumnbVo.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableColumnbVo.java" new file mode 100644 index 0000000..2ecee73 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/GenTableColumnbVo.java" @@ -0,0 +1,106 @@ +package org.yang.crudplus.pojo.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.util.Date; +import java.util.List; + +/** + * gen_table_column和gen_table关联 + */ +@Data +public class GenTableColumnbVo { + /** + * 编号 + */ + @TableId(type = IdType.AUTO) + private Long tableId; + /** + * 表名称 + */ + private String tableName; + /** + * 表描述 + */ + + private String tableComment; + /** + * 关联子表的表名 + */ + private String subTableName; + /** + * 子表关联的外键名 + */ + private String subTableFkName; + /** + * 实体类名称 + */ + private String className; + /** + * 使用的模板(crud单表操作 tree树表操作) + */ + private String tplCategory; + /** + * 前端模板类型(element-ui模版 element-plus模版) + */ + private String tplWebType; + /** + * 生成包路径 + */ + private String packageName; + /** + * 生成模块名 + */ + private String moduleName; + /** + * 生成业务名 + */ + private String businessName; + /** + * 生成功能名 + */ + private String functionName; + /** + * 生成功能作者 + */ + private String functionAuthor; + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + /** + * 生成路径(不填默认项目路径) + */ + private String genPath; + /** + * 其它生成选项 + */ + private String options; + /** + * 创建者 + */ + private String createBy; + /** + * 创建时间 + */ + + private Date createTime; + /** + * 更新者 + */ + private String updateBy; + /** + * 更新时间 + */ + private Date updateTime; + /** + * 备注 + */ + private String remark; + private List columns; + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/TableFunctionPlusVo.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/TableFunctionPlusVo.java" new file mode 100644 index 0000000..be0242f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/pojo/vo/TableFunctionPlusVo.java" @@ -0,0 +1,86 @@ +package org.yang.crudplus.pojo.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.yang.crudplus.pojo.GenTableColumn; + +import java.util.List; + +/** + * 一个自定义方法的vo + */ +@Data +public class TableFunctionPlusVo { + /** + * 方法id + */ + private Long functionId; + /** + * 表id + */ + private Long tableId; + /** + * 方法名称 + */ + private String functionName; + /** + * 方法类型(insert,update,delete,selelct) + */ + private String functionType; + /** + * 方法请求对象名称 + */ + private String functionReq; + + /** + * 方法响应对象名称 + */ + private String functionResp; + /** + * 使用的方法响应对象名称 + */ + private String functionRespUse; + /** + * 使用的方法响应对象名称--方法上面的 + * 主要用于Select的时候进行区分,List + */ + private String functionRespUsePojo; + /** + * 导包使用 + */ + private String importFunctionRespUse; + /** + * 使用方法的请求对象名称 + */ + private String functionReqUse; + + /** + * 方法描述 + */ + private String functionDescription; + + /** + * 请求类字段 + */ + private List reqColumns; + /** + * 响应类字段 + */ + private List respColumns; + + + /** + * 是否使用自定义的请求参数,true使用,false未使用 + */ + private Boolean reqUseFlag; + /** + * 是否使用自定义的响应参数,true使用,false未使用 + */ + private Boolean respUseFlag; + /** + * 请求参数自定义--使用到的字段 + */ + private List reqUseColumns; + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/GenTableService.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/GenTableService.java" new file mode 100644 index 0000000..0ad36c7 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/GenTableService.java" @@ -0,0 +1,97 @@ +package org.yang.crudplus.service; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import jakarta.validation.Valid; + +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.req.GenTableReq; +import org.yang.crudplus.pojo.req.GenTableSaveReq; +import org.yang.crudplus.pojo.resp.GenTableListResp; +import org.yang.crudplus.pojo.resp.GenTablesUpdateResp; + +import java.util.List; + +public interface GenTableService { + /** + * 集合查询 + * + * @param genTableReq + * @return + */ + public GenTableListResp list(GenTableReq genTableReq); + + + /** + * 查询数据库中有那些表 + * + * @param genTableReq + * @return + */ + public List DBlist(GenTableReq genTableReq); + + /** + * 导入数据表 + * + * @param tables + */ + public void importTable(String[] tables); + + /** + * 导入gen_table,gen_table_column + * + * @param tableList + */ + public void importGenTable(List tableList); + + /** + * 获取表结构详情 + * + * @param tableId + * @return + */ + public GenTablesUpdateResp getTableInfo(Long tableId); + + /** + * 删除代码生成 + * + * @param tableIds + */ + public void removeById(String[] tableIds); + + /** + * 同步表结构--等同于重新导入 + * + * @param tableName + */ + public void synchDb(String tableName); + + + /** + * 保存代码生成表结构配置 + * + * @param req + */ + void saveConfig(GenTableSaveReq req); + + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + + /** + * 查询表名称查询字段信息 + * + * @param tableName + * @return + */ + public List getTableColumnListByTableName(String tableName); + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionColumnService.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionColumnService.java" new file mode 100644 index 0000000..8f8067b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionColumnService.java" @@ -0,0 +1,15 @@ +package org.yang.crudplus.service; + +import java.util.List; +import org.yang.crudplus.pojo.TableFunctionColumn; + +/** + * TableFunctionColumnService接口 + * + * @author crud + * @date 2024-10-30 + */ +public interface ITableFunctionColumnService +{ + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionService.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionService.java" new file mode 100644 index 0000000..e4a39de --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/ITableFunctionService.java" @@ -0,0 +1,65 @@ +package org.yang.crudplus.service; + +import java.util.List; + +import org.yang.crudplus.pojo.TableFunction; +import org.yang.crudplus.pojo.req.TableFunctionListReq; +import org.yang.crudplus.pojo.req.TableFunnctionSaveReq; +import org.yang.crudplus.pojo.resp.CustomReqRespList; +import org.yang.crudplus.pojo.resp.TableFunctionListResp; +import org.yang.crudplus.pojo.resp.TableFunnctionSaveResp; + +/** + * TableFunctionService接口 + * + * @author crud + * @date 2024-10-30 + */ +public interface ITableFunctionService { + /** + * 保存crud方法信息 + * + * @param req + * @return + */ + int saveConfig(TableFunnctionSaveReq req); + + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 自定义方法列表 + * + * @param req + * @return + */ + public List list(TableFunctionListReq req); + + /** + * 自定义请求类列表 + * @return + */ + public List customReResoList(String tableType); + + /** + * 跟据id查询方法所有信息 + * @param functionId + * @return + */ + TableFunnctionSaveResp functionInfoById(Long functionId); + + /** + * 删除方法,跟据id + * @param functionId + */ + void deleteFunctionById(Long functionId); + + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/GenTableServiceImpl.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/GenTableServiceImpl.java" new file mode 100644 index 0000000..8d9e94c --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/GenTableServiceImpl.java" @@ -0,0 +1,340 @@ +package org.yang.crudplus.service.impl; + + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; + +import org.springframework.transaction.annotation.Transactional; +import org.yang.crudplus.common.constant.GenConstants; +import org.yang.crudplus.common.exception.CustomException; +import org.yang.crudplus.common.utils.GenUtils; +import org.yang.crudplus.common.utils.StringUtils; +import org.yang.crudplus.common.utils.VelocityInitializer; +import org.yang.crudplus.common.utils.VelocityUtils; +import org.yang.crudplus.mapper.GenTableColumnMapper; +import org.yang.crudplus.mapper.GenTableMapper; +import org.yang.crudplus.mapper.TableFunctionColumnMapper; +import org.yang.crudplus.mapper.TableFunctionMapper; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.TableFunction; +import org.yang.crudplus.pojo.TableFunctionColumn; +import org.yang.crudplus.pojo.req.GenTableReq; +import org.yang.crudplus.pojo.req.GenTableSaveReq; +import org.yang.crudplus.pojo.resp.GenTableListResp; +import org.yang.crudplus.pojo.resp.GenTablesUpdateResp; +import org.yang.crudplus.pojo.vo.GenTableCRUD; +import org.yang.crudplus.pojo.vo.GenTableColumnbVo; +import org.yang.crudplus.service.GenTableService; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +@Slf4j +@Service +public class GenTableServiceImpl extends ServiceImpl implements GenTableService { + @Autowired + private GenTableMapper genTableMapper; + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + + + + /** + * 查询导入的表格列表 + * + * @param req + * @return + */ + @Override + public GenTableListResp list(GenTableReq req) { + Page page = new Page<>(req.getPageNum(), req.getPageSize()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(req.getTableName())) { + queryWrapper.like("table_name", req.getTableName()); + } + if (StringUtils.isNotBlank(req.getTableComment())) { + queryWrapper.like("table_comment", req.getTableComment()); + } + queryWrapper.orderByDesc("update_time"); + List records = genTableMapper.selectPage(page, queryWrapper).getRecords(); + GenTableListResp resp = new GenTableListResp(); + resp.setList(records); + resp.setTotal(page.getTotal()); + return resp; + } + + + /** + * 查询数据库中有那些表 + * + * @param req + * @return + */ + @Override + public List DBlist(GenTableReq req) { + Page page = new Page<>(req.getPageNum(), req.getPageSize()); + List resp = genTableMapper.DBlist(page, req); + return resp; + } + + + /** + * 导入数据表 + * + * @param tables + */ + @Transactional + @Override + public void importTable(String[] tables) { + List genTables = genTableMapper.selectDbTableListByNames(tables); + importGenTable(genTables); + } + + /** + * 导入gen_table,gen_table_column + * + * @param tableList + */ + + @Override + public void importGenTable(List tableList) { + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + //初始化插入数据gen_table + GenUtils.initTable(table); + //插入数据gen_table + int row = genTableMapper.insert(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + //插入数据到gen_table_column + genTableColumnMapper.insert(column); + } + } + } + } catch (Exception e) { + throw new CustomException(400, "导入失败"); + } + } + + + /** + * 获取表结构详情 + * + * @param tableId + * @return + */ + public GenTablesUpdateResp getTableInfo(Long tableId) { + GenTablesUpdateResp genTablesUpdateResp = new GenTablesUpdateResp(); + List genTable = genTableMapper.selectGenTableById(tableId); + if (genTable.size() > 0) { + genTablesUpdateResp.setInfo(genTable.get(0)); + } + //用作联表查询,主-子表 + List genTables = genTableMapper.selectGenTableAll(); + List genTableColumns = genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + genTablesUpdateResp.setTables(genTables); + genTablesUpdateResp.setRows(genTableColumns); + return genTablesUpdateResp; + + } + + /** + * 删除代码生成 + * + * @param tableIds + */ + @Override + public void removeById(String[] tableIds) { + for (String tableId : tableIds) { + genTableMapper.deleteById(tableId); + genTableColumnMapper.delete(new QueryWrapper().eq("table_id", tableId)); + } + } + + + /** + * 同步表结构--等同于重新导入 + * + * @param tableName + */ + @Override + public void synchDb(String tableName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("table_name", tableName); + GenTable genTable = new GenTable(); + try { + genTable = genTableMapper.selectOne(queryWrapper); + } catch (Exception e) { + log.error("重置表结构异常!!!"); + throw new CustomException(400, "存在相同表名称"); + } + String[] tableIds = new String[]{genTable.getTableId().toString()}; + removeById(tableIds); + importTable(new String[]{tableName}); + + } + + + /** + * 保存代码生成表结构配置 + * + * @param req + */ + @Override + @Transactional + public void saveConfig(GenTableSaveReq req) { + GenTable genTable = new GenTable(); + BeanUtils.copyProperties(req, genTable); + int row = genTableMapper.updateById(genTable); + if (row > 0) { + for (GenTableColumn column : req.getColumns()) { + genTableColumnMapper.updateById(column); + } + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) { + + List genTable = genTableMapper.selectGenTableByName(tableName); + + + GenTableCRUD table = new GenTableCRUD(); + if (genTable.size() > 0) { + GenTableColumnbVo tableColumnbVo = genTable.get(0); + BeanUtils.copyProperties(tableColumnbVo, table); + } + + setPkColumn(table); + //初始化加载模板 + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + Map> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); + for (String template : templates.get("single")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF_8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table,null))); + IOUtils.write(sw.toString(), zip, GenConstants.UTF_8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName()); + } + } + for (String template : templates.get("singleAndCustom")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF_8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table,null))); + IOUtils.write(sw.toString(), zip, GenConstants.UTF_8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName()); + } + } + } + + + /** + * 设置主键列信息--单表crud + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTableCRUD table) { + for (GenTableColumn column : table.getColumns()) { + //某个字段是主键 + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + //前面没有找到主键,默认第一个字段是主键 + if (StringUtils.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + } + + + /** + * 查询表名称查询字段信息 + * + * @param tableName + * @return + */ + @Override + public List getTableColumnListByTableName(String tableName) { + QueryWrapper genTableQueryWrapper = new QueryWrapper<>(); + genTableQueryWrapper.eq("table_name", tableName); + GenTable genTable = genTableMapper.selectOne(genTableQueryWrapper); + if(genTable==null){ + throw new CustomException(400,"表不存在"); + } + QueryWrapper genTableColumnQueryWrapper = new QueryWrapper<>(); + genTableColumnQueryWrapper.eq("table_id", genTable.getTableId()); + return genTableColumnMapper.selectList(genTableColumnQueryWrapper); + } + + + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionColumnServiceImpl.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionColumnServiceImpl.java" new file mode 100644 index 0000000..e43687c --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionColumnServiceImpl.java" @@ -0,0 +1,20 @@ +package org.yang.crudplus.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.yang.crudplus.pojo.TableFunctionColumn; +import org.yang.crudplus.service.ITableFunctionColumnService; + +/** + * TableFunctionColumnService业务层处理 + * + * @author crud + * @date 2024-10-30 + */ +@Service +public class TableFunctionColumnServiceImpl implements ITableFunctionColumnService { + + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionServiceImpl.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionServiceImpl.java" new file mode 100644 index 0000000..8a848e7 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/java/org/yang/crudplus/service/impl/TableFunctionServiceImpl.java" @@ -0,0 +1,524 @@ +package org.yang.crudplus.service.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.yang.crudplus.common.constant.GenConstants; +import org.yang.crudplus.common.exception.CustomException; +import org.yang.crudplus.common.utils.StringUtils; +import org.yang.crudplus.common.utils.TypeChecker; +import org.yang.crudplus.common.utils.VelocityInitializer; +import org.yang.crudplus.common.utils.VelocityUtils; +import org.yang.crudplus.mapper.GenTableColumnMapper; +import org.yang.crudplus.mapper.GenTableMapper; +import org.yang.crudplus.mapper.TableFunctionColumnMapper; +import org.yang.crudplus.mapper.TableFunctionMapper; +import org.yang.crudplus.pojo.GenTable; +import org.yang.crudplus.pojo.GenTableColumn; +import org.yang.crudplus.pojo.TableFunction; +import org.yang.crudplus.pojo.TableFunctionColumn; +import org.yang.crudplus.pojo.req.TableFunctionListReq; +import org.yang.crudplus.pojo.req.TableFunnctionSaveReq; +import org.yang.crudplus.pojo.resp.*; +import org.yang.crudplus.pojo.vo.GenTableCRUD; + +import org.yang.crudplus.pojo.vo.GenTableColumnbVo; +import org.yang.crudplus.pojo.vo.TableFunctionPlusVo; +import org.yang.crudplus.service.GenTableService; +import org.yang.crudplus.service.ITableFunctionService; + +import javax.swing.table.TableColumn; + +/** + * TableFunctionService业务层处理 + * + * @author crud + * @date 2024-10-30 + */ +@Slf4j +@Service +public class TableFunctionServiceImpl implements ITableFunctionService { + @Autowired + private TableFunctionMapper tableFunctionMapper; + @Autowired + private GenTableMapper genTableMapper; + @Autowired + private TableFunctionColumnMapper tableFunctionColumnMapper; + @Autowired + private GenTableColumnMapper genTableColumnMapper; + @Autowired + private GenTableService genTableService; + + private static List templateList = new ArrayList<>(); + + //定义集合,并固定值 + static { + templateList.add("crud/req.java.vm"); + templateList.add("crud/resp.java.vm"); + templateList.add("crud/service.java.vm"); + templateList.add("crud/serviceImpl.java.vm"); + } + + /** + * 保存crud方法信息 + * + * @param req + * @return + */ + @Override + @Transactional + public int saveConfig(TableFunnctionSaveReq req) { + //1. 表是否存在 + String tableName = req.getTableName(); + QueryWrapper genTableQueryWrapper = new QueryWrapper<>(); + genTableQueryWrapper.eq("table_name", tableName); + GenTable genTable = genTableMapper.selectOne(genTableQueryWrapper); + if (genTable == null) { + throw new RuntimeException("表不存在"); + } + + + TableFunction tableFunction = new TableFunction(); + tableFunction.setTableId(genTable.getTableId()); + tableFunction.setFunctionName(req.getFunctionName()); + tableFunction.setFunctionType(req.getFunctionType()); + tableFunction.setFunctionDescription(req.getFunctionDescription()); + + //编写了自定义请求类和响应类,就默认去生成 + tableFunction.setFunctionReq(req.getReqFunctionPojoName());//自定义的请求类名称 + tableFunction.setFunctionReqUse(req.getReqPojoUse());//自定义的请求类是最终使用 + + tableFunction.setFunctionRespCustom(req.getRespFunctionCustomPojoName());//自定义对象名称 + + tableFunction.setFunctionResp(req.getRespFunctionPojoName());//自定义的响应类名称 + tableFunction.setFunctionRespUse(req.getRespPojoUse());//自定义的响应类是最终使用 + int insert = tableFunctionMapper.insert(tableFunction); + if (insert < 1) { + throw new RuntimeException("保存失败"); + } + //自定义请求对象参数存储 + List reqPojoParamUse = req.getReqPojoParamUse(); + if (reqPojoParamUse.size() > 0) { + for (GenTableColumn genTableColumn : reqPojoParamUse) { + TableFunctionColumn tableFunctionColumn = new TableFunctionColumn(); + tableFunctionColumn.setColumnId(genTableColumn.getColumnId()); + tableFunctionColumn.setTableFunctionId(tableFunction.getFunctionId()); + tableFunctionColumn.setFunctionColumType("req"); + tableFunctionColumnMapper.insert(tableFunctionColumn); + } + } + List reqPojoParamDataUse = req.getReqPojoParamDataUse(); + if (reqPojoParamDataUse.size() > 0) { + for (GenTableColumn genTableColumn : reqPojoParamDataUse) { + TableFunctionColumn tableFunctionColumn = new TableFunctionColumn(); + tableFunctionColumn.setColumnId(genTableColumn.getColumnId()); + tableFunctionColumn.setTableFunctionId(tableFunction.getFunctionId()); + tableFunctionColumn.setFunctionColumType("reqUse"); + tableFunctionColumnMapper.insert(tableFunctionColumn); + } + } + //响应对象参数字段 + List respFunctionParam = req.getRespFunctionParam(); + if (respFunctionParam.size() > 0) { + for (GenTableColumn genTableColumn : respFunctionParam) { + TableFunctionColumn tableFunctionColumn1 = new TableFunctionColumn(); + tableFunctionColumn1.setColumnId(genTableColumn.getColumnId()); + tableFunctionColumn1.setTableFunctionId(tableFunction.getFunctionId()); + tableFunctionColumn1.setFunctionColumType("resp"); + tableFunctionColumnMapper.insert(tableFunctionColumn1); + } + } + + return insert; + + } + + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) { + byte[] bytes = downloadCodePlus(tableNames); + return bytes; + } + + + /** + * 自定义方法列表 + * + * @param req + * @return + */ + @Override + public List list(TableFunctionListReq req) { + //查询存在自定义方法的表 + List genTables = tableFunctionMapper.selectTableFunction(req.getTableName()); + List respList = new ArrayList<>(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + for (GenTable genTable : genTables) { + TableFunctionListResp resp = new TableFunctionListResp(); + resp.setTableName(genTable.getTableName()); + resp.setTableComment(genTable.getTableComment()); + queryWrapper.eq("table_id", genTable.getTableId()); + List tableFunctions = tableFunctionMapper.selectList(queryWrapper); + ArrayList tableFunctionResps = new ArrayList<>(); + for (TableFunction tableFunction : tableFunctions) { + TableFunctionResp tableFunctionResp = new TableFunctionResp(); + BeanUtils.copyProperties(tableFunction, tableFunctionResp); + tableFunctionResps.add(tableFunctionResp); + } + resp.setList(tableFunctionResps); + respList.add(resp); + } + return respList; + } + + + /** + * 自定义请求/响应类列表 + * + * @return + */ + @Override + public List customReResoList(String tableType) { + QueryWrapper tableFunctionQueryWrapper = new QueryWrapper<>(); + List tableFunctions = tableFunctionMapper.selectList(tableFunctionQueryWrapper); + List respLists = new ArrayList<>(); + for (TableFunction tableFunction : tableFunctions) { + CustomReqRespList customReqRespList = new CustomReqRespList(); + if ("req".equals(tableType)) { + if (StringUtils.isNotEmpty(tableFunction.getFunctionReq())) { + customReqRespList.setCustomName(tableFunction.getFunctionReq()); + } else { + continue; + } + } + if ("resp".equals(tableType)) { + if (StringUtils.isNotEmpty(tableFunction.getFunctionResp())) { + customReqRespList.setCustomName(tableFunction.getFunctionResp()); + } else { + continue; + } + } + List reqFunctionColums = genTableColumnMapper.selectFunctionByTableName(tableType, tableFunction.getFunctionId()); + customReqRespList.setColumnsList(reqFunctionColums); + respLists.add(customReqRespList); + } + respLists = respLists.stream() + .collect(Collectors.collectingAndThen( + Collectors.toMap(CustomReqRespList::getCustomName, Function.identity(), (existing, replacement) -> existing), + map -> new ArrayList<>(map.values()) + )); + //排除子自定义名称为空的值 + return respLists; + } + + + /** + * 跟据id查询方法所有信息 + * + * @param functionId + * @return + */ + public TableFunnctionSaveResp functionInfoById(Long functionId) { + TableFunnctionSaveResp resp = new TableFunnctionSaveResp(); + //查询基础信息 + QueryWrapper tableQuery = new QueryWrapper<>(); + tableQuery.eq("function_id", functionId); + TableFunction tableFunction = tableFunctionMapper.selectOne(tableQuery); + QueryWrapper genTableQueryWrapper = new QueryWrapper<>(); + genTableQueryWrapper.eq("table_id", tableFunction.getTableId()); + GenTable genTable = genTableMapper.selectOne(genTableQueryWrapper); + resp.setTableName(genTable.getTableName()); + resp.setFunctionName(tableFunction.getFunctionName()); + resp.setFunctionType(tableFunction.getFunctionType()); + resp.setFunctionDescription(tableFunction.getFunctionDescription()); + + //方法请求对象 + //逻辑:判断是否存在自定义对象,存在通过方法id和req去table_function_column表找到又那些字段,在拿着字段id去gen_table_column找到字段的详细信息 + if (StringUtils.isNotEmpty(tableFunction.getFunctionReq())) { + resp.setReqFunctionPojoName(tableFunction.getFunctionReq()); + QueryWrapper tableFunctionColumnQueryWrapper = new QueryWrapper<>(); + tableFunctionColumnQueryWrapper.eq("table_function_id", tableFunction.getFunctionId()); + tableFunctionColumnQueryWrapper.eq("function_colum_type", "req"); + List tableFunctionColumnList = tableFunctionColumnMapper.selectList(tableFunctionColumnQueryWrapper);//拿到字段id集合 + + List reqFunctionParam = new ArrayList<>(); + for (TableFunctionColumn tableFunctionColumn : tableFunctionColumnList) { + reqFunctionParam.add(genTableColumnMapper.selectById(tableFunctionColumn.getFunctionColumId())); + } + resp.setReqFunctionParam(reqFunctionParam); + } + //响应对象同理前面 + if (StringUtils.isNotEmpty(tableFunction.getFunctionResp())) { + resp.setRespFunctionPojoName(tableFunction.getFunctionResp()); + QueryWrapper tableFunctionColumnQueryWrapper = new QueryWrapper<>(); + tableFunctionColumnQueryWrapper.eq("table_function_id", tableFunction.getFunctionId()); + tableFunctionColumnQueryWrapper.eq("function_colum_type", "resp"); + List tableFunctionColumnList = tableFunctionColumnMapper.selectList(tableFunctionColumnQueryWrapper); + List respFunctionParam = new ArrayList<>(); + for (TableFunctionColumn tableFunctionColumn : tableFunctionColumnList) { + respFunctionParam.add(genTableColumnMapper.selectById(tableFunctionColumn.getFunctionColumId())); + } + resp.setRespFunctionParam(respFunctionParam); + } + //自定义响应对象名称 + if (StringUtils.isNotEmpty(tableFunction.getFunctionRespCustom())) { + resp.setRespFunctionCustomPojoName(tableFunction.getFunctionRespCustom()); + } + //真正使用的请求对象名称 + resp.setReqPojoUse(tableFunction.getFunctionReqUse()); + //todo 暂时不设置请求对象的参数 + QueryWrapper tableFunctionColumnQueryWrapper = new QueryWrapper<>(); + tableFunctionColumnQueryWrapper.eq("table_function_id", tableFunction.getFunctionId()); + tableFunctionColumnQueryWrapper.eq("function_colum_type", "reqUse"); + List tableFunctionColumnList = tableFunctionColumnMapper.selectList(tableFunctionColumnQueryWrapper); + List reqUseFunctionParam = new ArrayList<>(); + for (TableFunctionColumn tableFunctionColumn : tableFunctionColumnList) { + reqUseFunctionParam.add(genTableColumnMapper.selectById(tableFunctionColumn.getFunctionColumId())); + } + resp.setReqPojoParamDataUse(reqUseFunctionParam); + + //真正使用的响应对象名称 + resp.setRespPojoUse(tableFunction.getFunctionRespUse()); + //todo 暂时不设置响应对象的参数 + + return resp; + + } + + + /** + * 删除方法,跟据id + * + * @param functionId + */ + @Override + @Transactional + public void deleteFunctionById(Long functionId) { + QueryWrapper tableFunctionQueryWrapper = new QueryWrapper<>(); + tableFunctionQueryWrapper.eq("function_id", functionId); + tableFunctionMapper.delete(tableFunctionQueryWrapper); + tableFunctionColumnMapper.delete(new QueryWrapper().eq("table_function_id", functionId)); + } + + + /** + * 进阶-单表生成 + * + * @param tableNames 表数组 + * @return + */ + public byte[] downloadCodePlus(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + generatorCodePlus(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + + private void generatorCodePlus(String tableName, ZipOutputStream zip) { + + List genTable = genTableMapper.selectGenTableByName(tableName); + + GenTableCRUD table = new GenTableCRUD(); + if (genTable.size() > 0) { + GenTableColumnbVo tableColumnbVo = genTable.get(0); + BeanUtils.copyProperties(tableColumnbVo, table); + } + //额外处理 + //获取自定义方法的 + Long tableId = table.getTableId(); + QueryWrapper tableFunctionQueryWrapper = new QueryWrapper<>(); + tableFunctionQueryWrapper.eq("table_id", tableId); + List tableFunctionList = tableFunctionMapper.selectList(tableFunctionQueryWrapper);//该表的所有自定义方法 + + List tableFunctionPlusVoList = new ArrayList<>(); + for (TableFunction tableFunction : tableFunctionList) { + TableFunctionPlusVo tableFunctionPlusVo = new TableFunctionPlusVo(); + BeanUtils.copyProperties(tableFunction, tableFunctionPlusVo); + + + //自定义请求类不为空,且不等于使用中的,则需要生成新的 + String functionReq = tableFunction.getFunctionReq(); + if (StringUtils.isNotEmpty(functionReq) && functionReq.equals(tableFunction.getFunctionReqUse())) { + tableFunctionPlusVo.setReqUseFlag(true); + List reqFunctionColums = genTableColumnMapper.selectFunctionByTableName("req", tableFunction.getFunctionId()); + tableFunctionPlusVo.setReqColumns(reqFunctionColums); + } else { + tableFunctionPlusVo.setReqUseFlag(false); + } + //不管是否使用自定义请求类,都需要表明使用的请求类的那些字段 + List reqUseColumns = genTableColumnMapper.selectFunctionByTableName("reqUse", tableFunction.getFunctionId()); + tableFunctionPlusVo.setReqUseColumns(reqUseColumns); + + //自定义响应类不为空,且不等于使用中的,则需要生成新的 + String functionResp = tableFunction.getFunctionResp(); + if (StringUtils.isNotEmpty(functionResp) && functionResp.equals(tableFunction.getFunctionRespUse())) { + tableFunctionPlusVo.setRespUseFlag(true); + List respFunctionColums = genTableColumnMapper.selectFunctionByTableName("resp", tableFunction.getFunctionId()); + tableFunctionPlusVo.setRespColumns(respFunctionColums); + } else { + tableFunctionPlusVo.setRespUseFlag(false); + + } + + tableFunctionPlusVoList.add(tableFunctionPlusVo); + } + // table.setTableFunction(tableFunctionPlusVoList); + setPkColumn(table); + //初始化加载模板 + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + + // 获取模板列表 + Map> templates = VelocityUtils.getTemplateList(table.getTplCategory(), table.getTplWebType()); + for (String template : templates.get("single")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF_8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table, null))); + IOUtils.write(sw.toString(), zip, GenConstants.UTF_8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + for (TableFunctionPlusVo functionPlusVo : tableFunctionPlusVoList) { + functionPlusVo.setImportFunctionRespUse(functionPlusVo.getFunctionRespUse()); + boolean commonReturnType = TypeChecker.isCommonReturnType(functionPlusVo.getFunctionRespUse()); + if (commonReturnType) { + functionPlusVo.setImportFunctionRespUse("null"); + } + functionPlusVo.setFunctionRespUsePojo(functionPlusVo.getFunctionRespUse()); + if (!commonReturnType) { + if ("select".equals(functionPlusVo.getFunctionType())) { + functionPlusVo.setFunctionRespUsePojo("List<" + functionPlusVo.getFunctionRespUse() + ">"); + } + } + } + + + //todo service serviceimpl + for (String template : templates.get("singleAndCustom")) { + context.put("functionList", tableFunctionPlusVoList);//自定义方法集合 + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF_8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table, null))); + IOUtils.write(sw.toString(), zip, GenConstants.UTF_8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + + // 生成根据自定义方法生成的文件 + for (TableFunctionPlusVo functionPlusVo : tableFunctionPlusVoList) { + context.put("function", functionPlusVo); + context.put("reqClassName", functionPlusVo.getFunctionReq());//请求对象名称 + context.put("respClassName", functionPlusVo.getFunctionResp());//返回对象名称 + String reqClassName = functionPlusVo.getFunctionReq(); + String respClassName = functionPlusVo.getFunctionResp(); + + + for (String template : templates.get("custom")) { + String fileName; + if (template.contains("req.java.vm")) { + Boolean reqUseFlag = functionPlusVo.getReqUseFlag(); + if (reqUseFlag) { + fileName = VelocityUtils.getFileName(template, table, reqClassName); + } else { + continue; + } + } else if (template.contains("resp.java.vm")) { + Boolean respUseFlag = functionPlusVo.getRespUseFlag(); + if (respUseFlag) { + fileName = VelocityUtils.getFileName(template, table, respClassName); + } else { + continue; + } + } else { + fileName = VelocityUtils.getFileName(template, table, null); + } + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, GenConstants.UTF_8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(fileName)); + IOUtils.write(sw.toString(), zip, GenConstants.UTF_8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + + } + } + + + } + + + /** + * 设置主键列信息--单表crud + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTableCRUD table) { + for (GenTableColumn column : table.getColumns()) { + //某个字段是主键 + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + //前面没有找到主键,默认第一个字段是主键 + if (StringUtils.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + } + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.properties" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.properties" new file mode 100644 index 0000000..82acecb --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.properties" @@ -0,0 +1,3 @@ +spring.application.name=CRUD-PLUS +mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.yml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.yml" new file mode 100644 index 0000000..a3f8805 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/application.yml" @@ -0,0 +1,29 @@ +server: + port: 8090 + servlet: + context-path: /curd + +spring: + profiles: + active: dev + datasource: + # MySQL + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/crud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + username: root + password: password +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +logging: + level: + com.baomidou.mybatisplus: debug + org.yang.crudplus: debug + org.apache.ibatis: debug + + + + +# 需要指定对应的模板 +generator: + template: /template diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/generator.yml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/generator.yml" new file mode 100644 index 0000000..24bec30 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/generator.yml" @@ -0,0 +1,10 @@ +# 代码生成 +gen: + # 作者 + author: crud + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: org.yang.crudplus + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/logback.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/logback.xml" new file mode 100644 index 0000000..963a545 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/logback.xml" @@ -0,0 +1,16 @@ + + + + %d{yyyy-MM-dd HH:mm:ss} - %msg%n + + + + + + + + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/controller.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/controller.java.vm" new file mode 100644 index 0000000..4c557f1 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/controller.java.vm" @@ -0,0 +1,74 @@ +package ${packageName}.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.${ClassName}Service; + + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller { + @Autowired + private ${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @GetMapping("/list") + public List<${ClassName}> list(${ClassName} ${className}) { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return list; + } + + + /** + * 获取${functionName}详细信息 + */ + @GetMapping(value = "/{${pkColumn.javaField}}") + public ${ClassName} getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { + return ${className}Service.select${ClassName}By${pkColumn.javaField}(${pkColumn.javaField}); + } + + /** + * 新增${functionName} + */ + @PostMapping + public int add(@RequestBody ${ClassName} ${className}) { + return ${className}Service.insert${ClassName}(${className}); + } + + /** + * 修改${functionName} + */ + + @PutMapping + public int edit(@RequestBody ${ClassName} ${className}) { + return ${className}Service.update${ClassName}(${className}); + } + + /** + * 删除${functionName} + */ + + @DeleteMapping("/{${pkColumn.javaField}s}") + public int remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { + return ${className}Service.delete${ClassName}By${pkColumn.javaField}s(${pkColumn.javaField}s); + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/domain.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/domain.java.vm" new file mode 100644 index 0000000..1c71b01 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/domain.java.vm" @@ -0,0 +1,69 @@ +package ${packageName}.domain; + + #foreach ($import in $importList) + import ${import}; + #end + +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * ${tableName}表的实体对象 ${className} + * + * @author ${author} + * @date ${datetime} + */ +@Data +public class ${ClassName} { + + #foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ + #if($column.list) + #set($parentheseIndex=$column.columnComment.indexOf("(")) + #if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) + #else + #set($comment=$column.columnComment) + #end + #end + #if($column.isPk == '1') + @TableId + #end + private $column.javaType $column.javaField; + #end + #end + + #foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + public void set${AttrName}($column.javaType $column.javaField) { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() { + return $column.javaField; + } + #end + #end + + @Override + public String toString() { + return "${ClassName}{" + #foreach ($column in $columns) + #if(!$table.isSuperColumn($column.javaField)) + #if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$column.javaField) + #else + #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) + #end + + "${column.javaField}=" + get${AttrName}() + #end + #end + + "}"; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/mapper.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/mapper.java.vm" new file mode 100644 index 0000000..fb0d31f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/mapper.java.vm" @@ -0,0 +1,67 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +#if($table.sub) +import +import com.baomidou.mybatisplus.core.mapper.BaseMapper; ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}的Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper extends BaseMapper<${ClassName}> +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.javaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.javaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.javaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/req.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/req.java.vm" new file mode 100644 index 0000000..c821fbf --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/req.java.vm" @@ -0,0 +1,16 @@ +package ${packageName}.domain.req; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class ${reqClassName} implements Serializable { + private static final long serialVersionUID = 1L; + + #foreach($column in $function.reqColumns) + /** + * ${column.columnComment} + */ + private ${column.javaType} ${column.javaField}; + #end +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/resp.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/resp.java.vm" new file mode 100644 index 0000000..6de09f4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/resp.java.vm" @@ -0,0 +1,16 @@ +package ${packageName}.pojo.resp; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class ${respClassName} implements Serializable { + private static final long serialVersionUID = 1L; + + #foreach($column in $function.respColumns) + /** + * ${column.columnComment} + */ + private ${column.javaType} ${column.javaField}; + #end +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/service.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/service.java.vm" new file mode 100644 index 0000000..6ee1013 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/service.java.vm" @@ -0,0 +1,86 @@ +package ${packageName}.service; + +import java.util.List; + +import ${packageName}.domain.${ClassName}; +#foreach($column in $functionList) +import ${packageName}.domain.req.${column.functionReqUse}; +#if(${column.importFunctionRespUse}!="null") +import ${packageName}.domain.resp .${column.functionRespUse}; +#end +#end + + + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ + +public interface ${ClassName}Service { + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.javaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.javaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.javaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + + + #foreach($column in $functionList) + /** + * #if(${column.functionDescription}) + ${column.functionDescription} + #else + ' ' + #end + * @param req + * @return ${column.functionRespUse} + */ + public ${column.functionRespUsePojo} ${column.functionName}(${column.functionReqUse} req); + #end + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/serviceImpl.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/serviceImpl.java.vm" new file mode 100644 index 0000000..dd607d5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/serviceImpl.java.vm" @@ -0,0 +1,258 @@ +package ${packageName}.service.impl; + +import java.util.List; +import java.util.ArrayList; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +#foreach ($column in $columns) + #if($column.javaField == 'createTime' || $column.javaField == 'updateTime') + import com.ruoyi.common.utils.DateUtils; + #break + #end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.beans.BeanUtils; + +#if($table.sub) +import java.util.ArrayList; + +import com.ruoyi.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.${ClassName}Service; + +#foreach($column in $functionList) +import ${packageName}.domain.req.${column.functionReqUse}; + #if(${column.importFunctionRespUse}!="null") + import ${packageName}.domain.resp .${column.functionRespUse}; + #end +#end + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements ${ClassName}Service { + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.javaField}(${pkColumn.javaType} ${pkColumn.javaField}) { + return ${className}Mapper.select${ClassName}By${pkColumn.javaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int insert${ClassName}(${ClassName} ${className}) { + #foreach ($column in $columns) + #if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); + #end + #end + #if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; + #else + return ${className}Mapper.insert${ClassName}(${className}); + #end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int update${ClassName}(${ClassName} ${className}) { + #foreach ($column in $columns) + #if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); + #end + #end + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.javaField}()) + ; + insert${subClassName}(${className}); + #end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int delete${ClassName}By${pkColumn.javaField}s(${pkColumn.javaType}[] ${pkColumn.javaField}s) { + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); + #end + return ${className}Mapper.delete${ClassName}By${pkColumn.javaField}s(${pkColumn.javaField}s); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + #if($table.sub) + @Transactional + #end + @Override + public int delete${ClassName}By${pkColumn.javaField}(${pkColumn.javaType} ${pkColumn.javaField}) { + #if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); + #end + return ${className}Mapper.delete${ClassName}By${pkColumn.javaField}(${pkColumn.javaField}); + } + #if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.javaField}(); + if (StringUtils.isNotNull(${subclassName}List)) { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} :${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) { + ${className}Mapper.batch${subClassName}(list); + } + } + } + #end + + + #foreach($column in $functionList) + /** + * #if(${column.functionDescription}) + ${column.functionDescription} + #else + ' ' + #end + * @param req + * @return ${column.functionRespUse} + */ + @Override + public ${column.functionRespUsePojo} ${column.functionName}(${column.functionReqUse} req){ + #if($column.functionType=="insert") + ${ClassName} ${className}=new ${ClassName}(); + #foreach($useColumn in $column.reqUseColumns) + #if($useColumn.javaField.length() > 2 && $useColumn.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$useColumn.javaField) + #else + #set($AttrName=$useColumn.javaField.substring(0,1).toUpperCase() + ${useColumn.javaField.substring(1)}) + #end + ${className}.set${AttrName}(req.get${AttrName}()); + #end + int flag = ${className}Mapper.insert(${className}); + return flag; + #elseif($column.functionType=="delete") + QueryWrapper< ${ClassName}> queryWrapper = new QueryWrapper<>(); + #foreach($useColumn in $column.reqUseColumns) + #if($useColumn.javaField.length() > 2 && $useColumn.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$useColumn.javaField) + #else + #set($AttrName=$useColumn.javaField.substring(0,1).toUpperCase() + ${useColumn.javaField.substring(1)}) + #end + queryWrapper.eq("${useColumn.columnName}", req.get${AttrName}()); + #end + return ${className}Mapper.delete(queryWrapper); + #elseif($column.functionType=="update") + UpdateWrapper<${ClassName}> updateWrapper = new UpdateWrapper<>(); + #foreach($useColumn in $column.reqUseColumns) + #if($useColumn.javaField.length() > 2 && $useColumn.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$useColumn.javaField) + #else + #set($AttrName=$useColumn.javaField.substring(0,1).toUpperCase() + ${useColumn.javaField.substring(1)}) + #end + updateWrapper.eq("${useColumn.columnName}", req.get${AttrName}()); + #end + #foreach($useColumn in $column.reqColumns) + #if($useColumn.javaField.length() > 2 && $useColumn.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$useColumn.javaField) + #else + #set($AttrName=$useColumn.javaField.substring(0,1).toUpperCase() + ${useColumn.javaField.substring(1)}) + #end + updateWrapper.set("${useColumn.columnName}", req.get${AttrName}()); + #end + return ${className}Mapper.update(null, updateWrapper); + #elseif($column.functionType=="select") + + QueryWrapper<${ClassName}> queryWrapper = new QueryWrapper<>(); + #foreach($useColumn in $column.reqUseColumns) + #if($useColumn.javaField.length() > 2 && $useColumn.javaField.substring(1,2).matches("[A-Z]")) + #set($AttrName=$useColumn.javaField) + #else + #set($AttrName=$useColumn.javaField.substring(0,1).toUpperCase() + ${useColumn.javaField.substring(1)}) + #end + queryWrapper.eq("${useColumn.columnName}", req.get${AttrName}()); + #end + #foreach($respColumn in $column.respColumns) + queryWrapper.select("${respColumn.columnName}"); + #end + List<${ClassName}> list = ${className}Mapper.selectList(queryWrapper); + List<${column.functionRespUse}> respList = new ArrayList<>(); + for (${ClassName} ${className} :list){ + ${column.functionRespUse} resp = new ${column.functionRespUse}(); + BeanUtils.copyProperties(${className}, resp); + respList.add(resp); + } + return respList; + + #end + } + #end +} + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/sub-domain.java.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/sub-domain.java.vm" new file mode 100644 index 0000000..a3f53eb --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/java/sub-domain.java.vm" @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/xml/mapper.xml.vm" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/xml/mapper.xml.vm" new file mode 100644 index 0000000..c7c95de --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/main/resources/vm/xml/mapper.xml.vm" @@ -0,0 +1,124 @@ + + + + + + #foreach ($column in $columns) + + #end + + + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end + from ${tableName} + + + + + + + + + insert into ${tableName} + + #foreach($column in $columns) + #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, + + #end + #end + + + #foreach($column in $columns) + #if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, + + #end + #end + + + + + update ${tableName} + + #foreach($column in $columns) + #if($column.columnName != $pkColumn.columnName) + $column.columnName = + #{$column.javaField}, + + #end + #end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete + from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/test/java/org/yang/crudplus/CrudPlusApplicationTests.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/test/java/org/yang/crudplus/CrudPlusApplicationTests.java" new file mode 100644 index 0000000..dff118a --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-plus/src/test/java/org/yang/crudplus/CrudPlusApplicationTests.java" @@ -0,0 +1,13 @@ +package org.yang.crudplus; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CrudPlusApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/pom.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/pom.xml" new file mode 100644 index 0000000..7f30657 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/pom.xml" @@ -0,0 +1,78 @@ + + + 4.0.0 + + org.yang + crud + 0.0.1-SNAPSHOT + ../../crud/pom.xml + + org.yang + crud-test + 0.0.1-SNAPSHOT + crud-test + crud-test + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.mysql + mysql-connector-j + runtime + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.7 + + + org.projectlombok + lombok + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/CrudTestApplication.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/CrudTestApplication.java" new file mode 100644 index 0000000..7b2d0f6 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/CrudTestApplication.java" @@ -0,0 +1,18 @@ +package org.yang.crudplus; + + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@MapperScan("org.yang.crudplus.mapper") +@EnableTransactionManagement +public class CrudTestApplication { + + public static void main(String[] args) { + SpringApplication.run(CrudTestApplication.class, args); + } + +} \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/controller/StudentsController.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/controller/StudentsController.java" new file mode 100644 index 0000000..fe13857 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/controller/StudentsController.java" @@ -0,0 +1,74 @@ +package org.yang.crudplus.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.yang.crudplus.domain.Students; +import org.yang.crudplus.service.StudentsService; + + +/** + * 学生表Controller + * + * @author crud + * @date 2024-11-02 + */ +@RestController +@RequestMapping("/crudplus/students") +public class StudentsController { + @Autowired + private StudentsService studentsService; + + /** + * 查询学生表列表 + */ + @GetMapping("/list") + public List list(Students students) { + List list = studentsService.selectStudentsList(students); + return list; + } + + + /** + * 获取学生表详细信息 + */ + @GetMapping(value = "/{id}") + public Students getInfo(@PathVariable("id") Long id) { + return studentsService.selectStudentsByid(id); + } + + /** + * 新增学生表 + */ + @PostMapping + public int add(@RequestBody Students students) { + return studentsService.insertStudents(students); + } + + /** + * 修改学生表 + */ + + @PutMapping + public int edit(@RequestBody Students students) { + return studentsService.updateStudents(students); + } + + /** + * 删除学生表 + */ + + @DeleteMapping("/{ids}") + public int remove(@PathVariable Long[] ids) { + return studentsService.deleteStudentsByids(ids); + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/Students.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/Students.java" new file mode 100644 index 0000000..324a69d --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/Students.java" @@ -0,0 +1,84 @@ +package org.yang.crudplus.domain; + + +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * students表的实体对象 students + * + * @author crud + * @date 2024-11-02 + */ +@Data +public class Students { + + /** id */ + @TableId + private Long id; + /** 姓名 */ + private String name; + /** 年龄 */ + private Long age; + /** 类型 */ + private String type; + /** 手机号码 */ + private String phone; + /** 用户id */ + private Long userId; + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + public void setAge(Long age) { + this.age = age; + } + + public Long getAge() { + return age; + } + public void setType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPhone() { + return phone; + } + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getUserId() { + return userId; + } + + @Override + public String toString() { + return "Students{" + + "id=" + getId() + + "name=" + getName() + + "age=" + getAge() + + "type=" + getType() + + "phone=" + getPhone() + + "userId=" + getUserId() + + "}"; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/deletcStudengtsReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/deletcStudengtsReq.java" new file mode 100644 index 0000000..ccdb3b1 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/deletcStudengtsReq.java" @@ -0,0 +1,14 @@ +package org.yang.crudplus.domain.req; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class deletcStudengtsReq implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/insertStudentsReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/insertStudentsReq.java" new file mode 100644 index 0000000..039ed71 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/insertStudentsReq.java" @@ -0,0 +1,26 @@ +package org.yang.crudplus.domain.req; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class insertStudentsReq implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 姓名 + */ + private String name; + /** + * 年龄 + */ + private Long age; + /** + * 类型 + */ + private String type; + /** + * 手机号码 + */ + private String phone; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/selectStudentByIdReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/selectStudentByIdReq.java" new file mode 100644 index 0000000..d64baa2 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/selectStudentByIdReq.java" @@ -0,0 +1,14 @@ +package org.yang.crudplus.domain.req; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class selectStudentByIdReq implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/updateByAgeReq.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/updateByAgeReq.java" new file mode 100644 index 0000000..9a03ab5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/req/updateByAgeReq.java" @@ -0,0 +1,14 @@ +package org.yang.crudplus.domain.req; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class updateByAgeReq implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 年龄 + */ + private Long age; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/selectStudentByIdResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/selectStudentByIdResp.java" new file mode 100644 index 0000000..2aedc01 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/selectStudentByIdResp.java" @@ -0,0 +1,26 @@ +package org.yang.crudplus.domain.resp; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class selectStudentByIdResp implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 姓名 + */ + private String name; + /** + * 年龄 + */ + private Long age; + /** + * 类型 + */ + private String type; + /** + * 手机号码 + */ + private String phone; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/updateByAgeResp.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/updateByAgeResp.java" new file mode 100644 index 0000000..80714bf --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/domain/resp/updateByAgeResp.java" @@ -0,0 +1,26 @@ +package org.yang.crudplus.domain.resp; + +import lombok.Data; + +import java.io.Serializable; +@Data +public class updateByAgeResp implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 姓名 + */ + private String name; + /** + * 年龄 + */ + private Long age; + /** + * 类型 + */ + private String type; + /** + * 手机号码 + */ + private String phone; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/mapper/StudentsMapper.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/mapper/StudentsMapper.java" new file mode 100644 index 0000000..976e35a --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/mapper/StudentsMapper.java" @@ -0,0 +1,63 @@ +package org.yang.crudplus.mapper; + +import java.util.List; +import org.yang.crudplus.domain.Students; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + + +/** + * 学生表的Mapper接口 + * + * @author crud + * @date 2024-11-02 + */ +public interface StudentsMapper extends BaseMapper +{ + /** + * 查询学生表 + * + * @param id 学生表主键 + * @return 学生表 + */ + public Students selectStudentsByid(Long id); + + /** + * 查询学生表列表 + * + * @param students 学生表 + * @return 学生表集合 + */ + public List selectStudentsList(Students students); + + /** + * 新增学生表 + * + * @param students 学生表 + * @return 结果 + */ + public int insertStudents(Students students); + + /** + * 修改学生表 + * + * @param students 学生表 + * @return 结果 + */ + public int updateStudents(Students students); + + /** + * 删除学生表 + * + * @param id 学生表主键 + * @return 结果 + */ + public int deleteStudentsByid(Long id); + + /** + * 批量删除学生表 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteStudentsByids(Long[] ids); +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/StudentsService.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/StudentsService.java" new file mode 100644 index 0000000..8e0e365 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/StudentsService.java" @@ -0,0 +1,111 @@ +package org.yang.crudplus.service; + +import java.util.List; + +import org.yang.crudplus.domain.Students; +import org.yang.crudplus.domain.req.insertStudentsReq; +import org.yang.crudplus.domain.req.deletcStudengtsReq; +import org.yang.crudplus.domain.req.selectStudentByIdReq; +import org.yang.crudplus.domain.resp .selectStudentByIdResp; +import org.yang.crudplus.domain.req.insertStudentsReq; +import org.yang.crudplus.domain.resp .selectStudentByIdResp; +import org.yang.crudplus.domain.req.updateByAgeReq; +import org.yang.crudplus.domain.resp .updateByAgeResp; + + + +/** + * 学生表Service接口 + * + * @author crud + * @date 2024-11-02 + */ + +public interface StudentsService { + /** + * 查询学生表 + * + * @param id 学生表主键 + * @return 学生表 + */ + public Students selectStudentsByid(Long id); + + /** + * 查询学生表列表 + * + * @param students 学生表 + * @return 学生表集合 + */ + public List selectStudentsList(Students students); + + /** + * 新增学生表 + * + * @param students 学生表 + * @return 结果 + */ + public int insertStudents(Students students); + + /** + * 修改学生表 + * + * @param students 学生表 + * @return 结果 + */ + public int updateStudents(Students students); + + /** + * 批量删除学生表 + * + * @param ids 需要删除的学生表主键集合 + * @return 结果 + */ + public int deleteStudentsByids(Long[] ids); + + /** + * 删除学生表信息 + * + * @param id 学生表主键 + * @return 结果 + */ + public int deleteStudentsByid(Long id); + + + + /** + * 新增学生 + + * @param req + * @return void + */ + public void insertStudents(insertStudentsReq req); + /** + * 跟据id删除学生信息 + + * @param req + * @return void + */ + public void deletcStudengtsById(deletcStudengtsReq req); + /** + * 跟据id查询 + + * @param req + * @return selectStudentByIdResp + */ + public List selectStudentById(selectStudentByIdReq req); + /** + * 跟据姓名查询 + + * @param req + * @return selectStudentByIdResp + */ + public List selectStudentByName(insertStudentsReq req); + /** + * 测试update + + * @param req + * @return updateByAgeResp + */ + public updateByAgeResp updateTest(updateByAgeReq req); + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/impl/StudentsServiceImpl.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/impl/StudentsServiceImpl.java" new file mode 100644 index 0000000..9ca9f1f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/java/org/yang/crudplus/service/impl/StudentsServiceImpl.java" @@ -0,0 +1,193 @@ +package org.yang.crudplus.service.impl; + +import java.util.List; +import java.util.ArrayList; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.beans.BeanUtils; + +import org.yang.crudplus.mapper.StudentsMapper; +import org.yang.crudplus.domain.Students; +import org.yang.crudplus.service.StudentsService; + +import org.yang.crudplus.domain.req.insertStudentsReq; +import org.yang.crudplus.domain.req.deletcStudengtsReq; +import org.yang.crudplus.domain.req.selectStudentByIdReq; + import org.yang.crudplus.domain.resp .selectStudentByIdResp; +import org.yang.crudplus.domain.req.insertStudentsReq; + import org.yang.crudplus.domain.resp .selectStudentByIdResp; +import org.yang.crudplus.domain.req.updateByAgeReq; + import org.yang.crudplus.domain.resp .updateByAgeResp; + +/** + * 学生表Service业务层处理 + * + * @author crud + * @date 2024-11-02 + */ +@Service +public class StudentsServiceImpl implements StudentsService { + @Autowired + private StudentsMapper studentsMapper; + + /** + * 查询学生表 + * + * @param id 学生表主键 + * @return 学生表 + */ + @Override + public Students selectStudentsByid(Long id) { + return studentsMapper.selectStudentsByid(id); + } + + /** + * 查询学生表列表 + * + * @param students 学生表 + * @return 学生表 + */ + @Override + public List selectStudentsList(Students students) { + return studentsMapper.selectStudentsList(students); + } + + /** + * 新增学生表 + * + * @param students 学生表 + * @return 结果 + */ + @Override + public int insertStudents(Students students) { + return studentsMapper.insertStudents(students); + } + + /** + * 修改学生表 + * + * @param students 学生表 + * @return 结果 + */ + @Override + public int updateStudents(Students students) { + return studentsMapper.updateStudents(students); + } + + /** + * 批量删除学生表 + * + * @param ids 需要删除的学生表主键 + * @return 结果 + */ + @Override + public int deleteStudentsByids(Long[] ids) { + return studentsMapper.deleteStudentsByids(ids); + } + + /** + * 删除学生表信息 + * + * @param id 学生表主键 + * @return 结果 + */ + @Override + public int deleteStudentsByid(Long id) { + return studentsMapper.deleteStudentsByid(id); + } + + + /** + * 新增学生 + + * @param req + * @return void + */ + @Override + public void insertStudents(insertStudentsReq req){ + Students students=new Students(); + students.setName(req.getName()); + students.setAge(req.getAge()); + students.setType(req.getType()); + students.setPhone(req.getPhone()); + int flag = studentsMapper.insert(students); + + } + /** + * 跟据id删除学生信息 + + * @param req + * @return void + */ + @Override + public void deletcStudengtsById(deletcStudengtsReq req){ + QueryWrapper< Students> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", req.getId()); + studentsMapper.delete(queryWrapper); + + } + /** + * 跟据id查询 + + * @param req + * @return selectStudentByIdResp + */ + @Override + public List selectStudentById(selectStudentByIdReq req){ + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id", req.getId()); + queryWrapper.select("name"); + queryWrapper.select("age"); + queryWrapper.select("type"); + queryWrapper.select("phone"); + List list = studentsMapper.selectList(queryWrapper); + List respList = new ArrayList<>(); + for (Students students :list){ + selectStudentByIdResp resp = new selectStudentByIdResp(); + BeanUtils.copyProperties(students, resp); + respList.add(resp); + } + return respList; + + } + /** + * 跟据姓名查询 + + * @param req + * @return selectStudentByIdResp + */ + @Override + public List selectStudentByName(insertStudentsReq req){ + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("name", req.getName()); + List list = studentsMapper.selectList(queryWrapper); + List respList = new ArrayList<>(); + for (Students students :list){ + selectStudentByIdResp resp = new selectStudentByIdResp(); + BeanUtils.copyProperties(students, resp); + respList.add(resp); + } + return respList; + + } + /** + * 测试update + + * @param req + * @return updateByAgeResp + */ + @Override + public updateByAgeResp updateTest(updateByAgeReq req){ + QueryWrapper< Students> queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("age", req.getAge()); + studentsMapper.delete(queryWrapper); + return null; + } +} + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/application.yml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/application.yml" new file mode 100644 index 0000000..627ad53 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/application.yml" @@ -0,0 +1,18 @@ +mybatis: + # 搜索指定包别名 + typeAliasesPackage: org.yang.**.domain + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + + +spring: + profiles: + active: dev + datasource: + # MySQL + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/crud?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true + username: root + password: password +server: + port: 8099 \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/mapper/crudplus/StudentsMapper.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/mapper/crudplus/StudentsMapper.xml" new file mode 100644 index 0000000..d8d2f9c --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/main/resources/mapper/crudplus/StudentsMapper.xml" @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + select id, name, age, type, phone, user_id + from students + + + + + + + + + insert into students + + id, + + name, + + age, + + type, + + phone, + + user_id, + + + + #{id}, + + #{name}, + + #{age}, + + #{type}, + + #{phone}, + + #{userId}, + + + + + + update students + + name = + #{name}, + + age = + #{age}, + + type = + #{type}, + + phone = + #{phone}, + + user_id = + #{userId}, + + + where id = #{id} + + + + delete + from students where id = #{id} + + + + delete from students where id in + + #{id} + + + + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/test/java/org/yang/crudtest/CrudTestApplicationTests.java" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/test/java/org/yang/crudtest/CrudTestApplicationTests.java" new file mode 100644 index 0000000..bfa4f1b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/crud-test/src/test/java/org/yang/crudtest/CrudTestApplicationTests.java" @@ -0,0 +1,14 @@ +package org.yang.crudtest; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.yang.crudplus.CrudTestApplication; + +@SpringBootTest(classes = CrudTestApplication.class) +class CrudTestApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img.png" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img.png" new file mode 100644 index 0000000000000000000000000000000000000000..96e457a21e34023c227228d1d667b221e70b89e3 GIT binary patch literal 22906 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 literal 0 HcmV?d00001 diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_-1.png" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..8eedaf17e11800920dcaaf4beeb9f952fe2ca826 GIT binary patch literal 41679 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 aP>z~1ZgnwLII|JcFI}{}P;}1a(SHN41A+Yj literal 0 HcmV?d00001 diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_1.png" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_1.png" new file mode 100644 index 0000000000000000000000000000000000000000..daaa625f486a49921a84b96fcb6ca2c1d84288e7 GIT binary patch literal 47540 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 E0wuv2(EtDd literal 0 HcmV?d00001 diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_8.png" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/image/img_8.png" new file mode 100644 index 0000000000000000000000000000000000000000..fb5ff4fcf9310620b08e3aa2cf384e8e8d70bb35 GIT binary patch literal 53514 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 literal 0 HcmV?d00001 diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/pom.xml" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/pom.xml" new file mode 100644 index 0000000..acb71fa --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/pom.xml" @@ -0,0 +1,59 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.3.4 + + + org.yang + crud + 0.0.1-SNAPSHOT + crud + crud + pom + + crud-plus + crud-test + + + + + + + + + + + + + + + + 17 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/sql/crud.sql" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/sql/crud.sql" new file mode 100644 index 0000000..e70c233 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/sql/crud.sql" @@ -0,0 +1,160 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost + Source Server Type : MySQL + Source Server Version : 80039 + Source Host : localhost:3306 + Source Schema : crud + + Target Server Type : MySQL + Target Server Version : 80039 + File Encoding : 65001 + + Date: 03/11/2024 18:59:56 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for gen_table +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table`; +CREATE TABLE `gen_table` ( + `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表名称', + `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表描述', + `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '关联子表的表名', + `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '子表关联的外键名', + `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '实体类名称', + `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)', + `tpl_web_type` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '前端模板类型(element-ui模版 element-plus模版)', + `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成包路径', + `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成模块名', + `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成业务名', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能名', + `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能作者', + `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)', + `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)', + `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '其它生成选项', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注', + PRIMARY KEY (`table_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table +-- ---------------------------- +INSERT INTO `gen_table` VALUES (23, 'students', '学生表', NULL, NULL, 'Students', 'crud', '', 'org.yang.crudplus', 'crudplus', 'students', '学生表', 'crud', '0', '/', NULL, '', '2024-10-28 00:08:33', '', NULL, NULL); + +-- ---------------------------- +-- Table structure for gen_table_column +-- ---------------------------- +DROP TABLE IF EXISTS `gen_table_column`; +CREATE TABLE `gen_table_column` ( + `column_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号', + `table_id` bigint NULL DEFAULT NULL COMMENT '归属表编号', + `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列名称', + `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列描述', + `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列类型', + `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA类型', + `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA字段名', + `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否主键(1是)', + `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否自增(1是)', + `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否必填(1是)', + `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)', + `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)', + `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)', + `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)', + `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)', + `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)', + `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型', + `sort` int NULL DEFAULT NULL COMMENT '排序', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`column_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 63 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of gen_table_column +-- ---------------------------- +INSERT INTO `gen_table_column` VALUES (58, 23, 'id', 'id', 'int', 'Long', 'id', '1', '1', '0', '1', NULL, NULL, NULL, 'EQ', 'input', '', 1, '', NULL, '', NULL); +INSERT INTO `gen_table_column` VALUES (59, 23, 'name', '姓名', 'varchar(255)', 'String', 'name', '0', '0', '0', '1', '1', '1', '1', 'LIKE', 'input', '', 2, '', NULL, '', NULL); +INSERT INTO `gen_table_column` VALUES (60, 23, 'age', '年龄', 'int', 'Long', 'age', '0', '0', '0', '1', '1', '1', '1', 'EQ', 'input', '', 3, '', NULL, '', NULL); +INSERT INTO `gen_table_column` VALUES (61, 23, 'type', '类型', 'char(1)', 'String', 'type', '0', '0', '0', '1', '1', '1', '1', 'EQ', 'select', '', 4, '', NULL, '', NULL); +INSERT INTO `gen_table_column` VALUES (62, 23, 'phone', '手机号码', 'varchar(20)', 'String', 'phone', '0', '0', '0', '1', '1', '1', '1', 'EQ', 'input', '', 5, '', NULL, '', NULL); +INSERT INTO `gen_table_column` VALUES (63, 23, 'user_id', '用户id', 'int', 'Long', 'userId', '0', '0', '0', '1', '1', '1', '1', 'EQ', 'input', '', 6, '', NULL, '', NULL); + +-- ---------------------------- +-- Table structure for students +-- ---------------------------- +DROP TABLE IF EXISTS `students`; +CREATE TABLE `students` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '姓名', + `age` int NULL DEFAULT NULL COMMENT '年龄', + `type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '类型', + `phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '手机号码', + `user_id` int NULL DEFAULT NULL COMMENT '用户id', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学生表' ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of students +-- ---------------------------- +INSERT INTO `students` VALUES (2, '张三', 19, '2', NULL, NULL); + +-- ---------------------------- +-- Table structure for table_function +-- ---------------------------- +DROP TABLE IF EXISTS `table_function`; +CREATE TABLE `table_function` ( + `function_id` int NOT NULL AUTO_INCREMENT COMMENT '方法id', + `table_id` int NULL DEFAULT NULL COMMENT '表id', + `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法名称', + `function_description` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法描述', + `function_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法类型(insert,update,delete,selelct)', + `function_req` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法请求对象名称', + `function_resp` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法响应对象名称', + `function_req_use` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '使用方法的请求对象名称', + `function_resp_use` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '使用的方法响应对象名称', + `function_resp_custom` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '方法自定义响应对象', + PRIMARY KEY (`function_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of table_function +-- ---------------------------- +INSERT INTO `table_function` VALUES (22, 23, 'insertStudents', '新增学生', 'insert', 'insertStudentsReq', '', 'insertStudentsReq', 'void', 'void'); + +-- ---------------------------- +-- Table structure for table_function_column +-- ---------------------------- +DROP TABLE IF EXISTS `table_function_column`; +CREATE TABLE `table_function_column` ( + `function_colum_id` bigint NOT NULL AUTO_INCREMENT, + `column_id` int NULL DEFAULT NULL COMMENT '字段id', + `table_function_id` int NULL DEFAULT NULL COMMENT '方法id', + `function_colum_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '字段所属对象', + PRIMARY KEY (`function_colum_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1852723967590567940 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic; + +-- ---------------------------- +-- Records of table_function_column +-- ---------------------------- +INSERT INTO `table_function_column` VALUES (1852615558614704129, 59, 22, 'req'); +INSERT INTO `table_function_column` VALUES (1852615558614704130, 60, 22, 'req'); +INSERT INTO `table_function_column` VALUES (1852615558614704131, 61, 22, 'req'); +INSERT INTO `table_function_column` VALUES (1852615558635675649, 62, 22, 'req'); +INSERT INTO `table_function_column` VALUES (1852615558635675650, 59, 22, 'reqUse'); +INSERT INTO `table_function_column` VALUES (1852615558635675651, 60, 22, 'reqUse'); +INSERT INTO `table_function_column` VALUES (1852615558635675652, 61, 22, 'reqUse'); +INSERT INTO `table_function_column` VALUES (1852615558635675653, 62, 22, 'reqUse'); + +SET FOREIGN_KEY_CHECKS = 1; diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.development" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.development" new file mode 100644 index 0000000..ab88915 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.development" @@ -0,0 +1 @@ +VITE_API_URL=http://localhost:8090/curd diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.production" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.production" new file mode 100644 index 0000000..90ee8c9 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.env.production" @@ -0,0 +1 @@ +VITE_API_URL=. diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintignore" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintignore" new file mode 100644 index 0000000..c40a313 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintignore" @@ -0,0 +1,22 @@ +logs +*.log +*.sh +node_modules +.DS_Store +lib +*.md +*.scss +*.woff +*.ttf +.vscode +.idea +dist +mock +public +bin +build +config +index.html +components.d.ts +element.d.ts +src/assets diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintrc.cjs" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintrc.cjs" new file mode 100644 index 0000000..6aad6c5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.eslintrc.cjs" @@ -0,0 +1,19 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: ['plugin:vue/vue3-recommended', 'plugin:prettier/recommended'], + parser: 'vue-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser', + ecmaVersion: 2022, + ecmaFeatures: { + jsx: true + } + }, + rules: { + curly: 'error', // 控制语句需要大括号 + 'vue/multi-word-component-names': 'off' + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.gitignore" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.gitignore" new file mode 100644 index 0000000..38adffa --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.gitignore" @@ -0,0 +1,28 @@ +# 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? diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.npmrc" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.npmrc" new file mode 100644 index 0000000..8418a0b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.npmrc" @@ -0,0 +1,2 @@ +# 使用pnpm,则需要 +shamefully-hoist=true diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.prettierrc.cjs" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.prettierrc.cjs" new file mode 100644 index 0000000..f25071b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.prettierrc.cjs" @@ -0,0 +1,29 @@ +// 参考:https://prettier.io/docs/en/options.html +module.exports = { + // 超过指定值换行 + printWidth: 150, + // 制表符宽度 + tabWidth: 2, + // 使用制表符缩进 + useTabs: true, + // 句尾不使用分号 + semi: false, + // 使用单引号 + singleQuote: true, + // 在 JSX 文件中使用单引号代替双引号 + jsxSingleQuote: true, + // 在对象或数组最后一个元素后面是否加逗号,可选值"[none:不追加 | es5:追加] + trailingComma: 'none', + // 在对象,数组括号与代码之间加空格 "{ foo: bar }" + bracketSpacing: true, + // 将多行 JSX 元素的 > 放置于最后一行的末尾,而非换行 + jsxBracketSameLine: true, + //(x) => {} 箭头函数参数只有一个时是否要有小括号,可选值"[always:(x) => x | avoid:x => x] + arrowParens: 'avoid', + // 使用默认的折行标准,可选值"[always|never|preserve]" + proseWrap: 'preserve', + // 指定HTML文件的全局空格敏感度,可选值"[css|strict|ignore]" + htmlWhitespaceSensitivity: 'css', + // 结尾时换行符,默认值lf,可选值"[auto|lf|crlf|cr]" + endOfLine: 'auto' +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.vscode/extensions.json" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.vscode/extensions.json" new file mode 100644 index 0000000..806eacd --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/.vscode/extensions.json" @@ -0,0 +1,3 @@ +{ + "recommendations": ["johnsoncodehk.volar", "johnsoncodehk.vscode-typescript-vue-plugin"] +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/README.md" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/README.md" new file mode 100644 index 0000000..99fe84e --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/README.md" @@ -0,0 +1,20 @@ +# maku-generator-ui + +## Project setup + +```bash +npm install +``` + +### Compiles and hot-reloads for development + +```bash +npm run dev +``` + +### Compiles and minifies for production + +```bash +npm run build +``` + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/components.d.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/components.d.ts" new file mode 100644 index 0000000..3feb808 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/components.d.ts" @@ -0,0 +1,35 @@ +// generated by unplugin-vue-components +// We suggest you to commit this file into source control +// Read more: https://github.com/vuejs/core/pull/3399 +import '@vue/runtime-core' + +declare module '@vue/runtime-core' { + export interface GlobalComponents { + ElAside: typeof import('element-plus/es')['ElAside'] + ElAvatar: typeof import('element-plus/es')['ElAvatar'] + ElButton: typeof import('element-plus/es')['ElButton'] + ElCard: typeof import('element-plus/es')['ElCard'] + ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] + ElContainer: typeof import('element-plus/es')['ElContainer'] + ElDropdown: typeof import('element-plus/es')['ElDropdown'] + ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem'] + ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu'] + ElHeader: typeof import('element-plus/es')['ElHeader'] + ElIcon: typeof import('element-plus/es')['ElIcon'] + ElImage: typeof import('element-plus/es')['ElImage'] + ElLink: typeof import('element-plus/es')['ElLink'] + ElMain: typeof import('element-plus/es')['ElMain'] + ElMenu: typeof import('element-plus/es')['ElMenu'] + ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] + ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] + ElTabPane: typeof import('element-plus/es')['ElTabPane'] + ElTabs: typeof import('element-plus/es')['ElTabs'] + Lang: typeof import('./src/components/Lang/index.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + SvgIcon: typeof import('./src/components/SvgIcon/index.vue')['default'] + } +} + +export {} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/index.html" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/index.html" new file mode 100644 index 0000000..8cf1f38 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/index.html" @@ -0,0 +1,14 @@ + + + + + + + + + + +
+ + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package-lock.json" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package-lock.json" new file mode 100644 index 0000000..8bf587e --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package-lock.json" @@ -0,0 +1,9911 @@ +{ + "name": "maku-generator-ui", + "version": "3.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "maku-generator-ui", + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@codemirror/lang-javascript": "^6.2.1", + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "9.1.1", + "axios": "1.6.0", + "codemirror": "^6.0.1", + "crypto-js": "^4.1.1", + "element-plus": "2.7.6", + "qs": "6.10.3", + "sortablejs": "^1.15.0", + "vue": "3.4.30", + "vue-codemirror": "^6.1.1", + "vue-router": "4.2.5", + "vxe-table": "^4.3.5", + "xe-utils": "^3.5.4" + }, + "devDependencies": { + "@babel/types": "7.24.0", + "@types/node": "20.11.28", + "@types/nprogress": "0.2.3", + "@types/qs": "6.9.12", + "@types/sm-crypto": "0.3.4", + "@types/sortablejs": "1.15.8", + "@vitejs/plugin-vue": "5.0.5", + "@vue/compiler-sfc": "3.4.30", + "@vue/eslint-config-prettier": "9.0.0", + "@vue/eslint-config-typescript": "13.0.0", + "@vue/tsconfig": "0.5.1", + "eslint": "8.57.0", + "eslint-plugin-vue": "9.23.0", + "prettier": "3.2.5", + "sass": "1.72.0", + "typescript": "5.4.2", + "vite": "5.3.1", + "vite-plugin-svg-icons": "2.0.1", + "vite-plugin-vue-setup-extend": "0.4.0", + "vue-tsc": "2.0.22" + } + }, + "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/@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.12.0", + "resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz", + "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + }, + "peerDependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.3.3", + "resolved": "https://registry.npmmirror.com/@codemirror/commands/-/commands-6.3.3.tgz", + "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/@codemirror/lang-javascript/-/lang-javascript-6.2.1.tgz", + "integrity": "sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.10.0", + "resolved": "https://registry.npmmirror.com/@codemirror/language/-/language-6.10.0.tgz", + "integrity": "sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.4.2", + "resolved": "https://registry.npmmirror.com/@codemirror/lint/-/lint-6.4.2.tgz", + "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.5.5", + "resolved": "https://registry.npmmirror.com/@codemirror/search/-/search-6.5.5.tgz", + "integrity": "sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/@codemirror/state/-/state-6.4.0.tgz", + "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==" + }, + "node_modules/@codemirror/view": { + "version": "6.23.1", + "resolved": "https://registry.npmmirror.com/@codemirror/view/-/view-6.23.1.tgz", + "integrity": "sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==", + "dependencies": { + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@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.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.0.tgz", + "integrity": "sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" + }, + "node_modules/@lezer/highlight": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@lezer/highlight/-/highlight-1.2.0.tgz", + "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.4.13", + "resolved": "https://registry.npmmirror.com/@lezer/javascript/-/javascript-1.4.13.tgz", + "integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/bigi": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/bigi/-/bigi-1.4.5.tgz", + "integrity": "sha512-fb5MUzazrD2GRnwlStm91HVu3cZbvolX9kJruqpUBdc24eHBWrLLfyt8XN1/C5JpI0stP/MbaFQp+cJh5WOFfw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", + "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/nprogress": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.3.tgz", + "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "dev": true + }, + "node_modules/@types/sm-crypto": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@types/sm-crypto/-/sm-crypto-0.3.4.tgz", + "integrity": "sha512-tp+KWAawUkwUWSpA3sHymerfy9P0utSyfdh7D60FJ4Aj1rhBZ2Q/nDvARUmmfQeIZZD1FKg9oAcDqecCux0npw==", + "dev": true, + "dependencies": { + "@types/bigi": "*" + } + }, + "node_modules/@types/sortablejs": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz", + "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==", + "dev": true + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.15", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz", + "integrity": "sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.14.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.4.tgz", + "integrity": "sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==", + "dev": true, + "dependencies": { + "@volar/source-map": "2.3.4" + } + }, + "node_modules/@volar/source-map": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.4.tgz", + "integrity": "sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==", + "dev": true + }, + "node_modules/@volar/typescript": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha512-acCvt7dZECyKcvO5geNybmrqOsu9u8n5XP1rfiYsOLYGPxvHRav9BVmEdRyZ3vvY6mNyQ1wLL5Hday4IShe17w==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.3.4", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", + "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.30", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", + "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", + "dependencies": { + "@vue/compiler-core": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", + "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", + "dependencies": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.30", + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", + "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", + "dependencies": { + "@vue/compiler-dom": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0" + }, + "peerDependencies": { + "eslint": ">= 8.0.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", + "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": ">=4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.22.tgz", + "integrity": "sha512-dNTAAtEOuMiz7N1s5tKpypnVVCtawxVSF5BukD0ELcYSw+DSbrSlYYSw8GuwvurodCeYFSHsmslE+c2sYDNoiA==", + "dev": true, + "dependencies": { + "@volar/language-core": "~2.3.1", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.30.tgz", + "integrity": "sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==", + "dependencies": { + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.30.tgz", + "integrity": "sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==", + "dependencies": { + "@vue/reactivity": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.30.tgz", + "integrity": "sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==", + "dependencies": { + "@vue/reactivity": "3.4.30", + "@vue/runtime-core": "3.4.30", + "@vue/shared": "3.4.30", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.30.tgz", + "integrity": "sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==", + "dependencies": { + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30" + }, + "peerDependencies": { + "vue": "3.4.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", + "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.1.1.tgz", + "integrity": "sha512-QfuaNWRDMQcCUwXylCyYhPC3ScS9Tiiz4J0chdwr3vOemBwRToSywq8MP+ZegKYFnbETzRY8G/5zC+ca30wrRQ==", + "dependencies": { + "@types/web-bluetooth": "^0.0.15", + "@vueuse/metadata": "9.1.1", + "@vueuse/shared": "9.1.1", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.1.1.tgz", + "integrity": "sha512-XZ2KtSW+85LLHB/IdGILPAtbIVHasPsAW7aqz3BRMzJdAQWRiM/FGa1OKBwLbXtUw/AmjKYFlZJo7eOFIBXRog==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.1.1.tgz", + "integrity": "sha512-c+IfcOYmHiHqoEa3ED1Tbpue5GHmoUmTp8PtO4YbczthtY155Rt6DmWhjxMLXBF1Bcidagxljmp/7xtAzEHXLw==", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "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/base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "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/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codemirror": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/codemirror/-/codemirror-6.0.1.tgz", + "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "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/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, + "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.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/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" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/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" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/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" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/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/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "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-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/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-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/dom-zindex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.1.tgz", + "integrity": "sha512-M/MERVDZ8hguvjl6MAlLWSLYLS7PzEyXaTb5gEeJ+SF+e9iUC0sdvlzqe91MMDHBoy+nqw7wKcUOrDSyvMCrRg==" + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/element-plus": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.6.tgz", + "integrity": "sha512-36sw1K23hYjgeooR10U6CiCaCp2wvOqwoFurADZVlekeQ9v5U1FhJCFGEXO6i/kZBBMwsE1c9fxjLs9LENw2Rg==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "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.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.23.0.tgz", + "integrity": "sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.0", + "vue-eslint-parser": "^9.4.2", + "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": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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.npmjs.org/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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/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.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/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.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "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/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "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.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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.1", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.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/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/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": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "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/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.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/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "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/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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-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/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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/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/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/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/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "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" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/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/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/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-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-parser/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-rename-id/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/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "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": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/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/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/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/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" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/sass": { + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "dependencies": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sortablejs": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz", + "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==" + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz", + "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" + }, + "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/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/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/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "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/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-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/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/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "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.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.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/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-vue-setup-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz", + "integrity": "sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==", + "dev": true, + "dependencies": { + "@vue/compiler-sfc": "^3.2.29", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vite-plugin-vue-setup-extend/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "node_modules/vue": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.30.tgz", + "integrity": "sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==", + "dependencies": { + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-sfc": "3.4.30", + "@vue/runtime-dom": "3.4.30", + "@vue/server-renderer": "3.4.30", + "@vue/shared": "3.4.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-codemirror": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/vue-codemirror/-/vue-codemirror-6.1.1.tgz", + "integrity": "sha512-rTAYo44owd282yVxKtJtnOi7ERAcXTeviwoPXjIc6K/IQYUsoDkzPvw/JDFtSP6T7Cz/2g3EHaEyeyaQCKoDMg==", + "dependencies": { + "@codemirror/commands": "6.x", + "@codemirror/language": "6.x", + "@codemirror/state": "6.x", + "@codemirror/view": "6.x" + }, + "peerDependencies": { + "codemirror": "6.x", + "vue": "3.x" + } + }, + "node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "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/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.22.tgz", + "integrity": "sha512-lMBIwPBO0sxCcmvu45yt1b035AaQ8/XSXQDk8m75y4j0jSXY/y/XzfEtssQ9JMS47lDaR10O3/926oCs8OeGUw==", + "dev": true, + "dependencies": { + "@volar/typescript": "~2.3.1", + "@vue/language-core": "2.0.22", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vxe-table": { + "version": "4.5.18", + "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-4.5.18.tgz", + "integrity": "sha512-YQJhYjLsB7OqHFQJ0X6jO8uMuerqgGCzvh+wYk14dUqGMv96tBwv5LhHDW7odW7OnUkVrp3mZIRmvq33r/0djQ==", + "dependencies": { + "dom-zindex": "^1.0.1", + "xe-utils": "^3.5.15" + }, + "peerDependencies": { + "vue": "^3.2.28", + "xe-utils": "^3.5.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, + "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/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/xe-utils": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.5.18.tgz", + "integrity": "sha512-+Be37a6yu4U/Q94ZSf30I57IM74tvK6wf9fHvjC/TLXNHFsf7PnhfWQ7TyjhUBOI/GAy5gr6tPK+iXIoLmyimw==" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "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 + }, + "@babel/helper-string-parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==" + }, + "@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@codemirror/autocomplete": { + "version": "6.12.0", + "resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.12.0.tgz", + "integrity": "sha512-r4IjdYFthwbCQyvqnSlx0WBHRHi8nBvU+WjJxFUij81qsBfhNudf/XKKmmC2j3m0LaOYUQTf3qiEK1J8lO1sdg==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "@codemirror/commands": { + "version": "6.3.3", + "resolved": "https://registry.npmmirror.com/@codemirror/commands/-/commands-6.3.3.tgz", + "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", + "requires": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.1.0" + } + }, + "@codemirror/lang-javascript": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/@codemirror/lang-javascript/-/lang-javascript-6.2.1.tgz", + "integrity": "sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==", + "requires": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "@codemirror/language": { + "version": "6.10.0", + "resolved": "https://registry.npmmirror.com/@codemirror/language/-/language-6.10.0.tgz", + "integrity": "sha512-2vaNn9aPGCRFKWcHPFksctzJ8yS5p7YoaT+jHpc0UGKzNuAIx4qy6R5wiqbP+heEEdyaABA582mNqSHzSoYdmg==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "@codemirror/lint": { + "version": "6.4.2", + "resolved": "https://registry.npmmirror.com/@codemirror/lint/-/lint-6.4.2.tgz", + "integrity": "sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/search": { + "version": "6.5.5", + "resolved": "https://registry.npmmirror.com/@codemirror/search/-/search-6.5.5.tgz", + "integrity": "sha512-PIEN3Ke1buPod2EHbJsoQwlbpkz30qGZKcnmH1eihq9+bPQx8gelauUwLYaY4vBOuBAuEhmpDLii4rj/uO0yMA==", + "requires": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "crelt": "^1.0.5" + } + }, + "@codemirror/state": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/@codemirror/state/-/state-6.4.0.tgz", + "integrity": "sha512-hm8XshYj5Fo30Bb922QX9hXB/bxOAVH+qaqHBzw5TKa72vOeslyGwd4X8M0c1dJ9JqxlaMceOQ8RsL9tC7gU0A==" + }, + "@codemirror/view": { + "version": "6.23.1", + "resolved": "https://registry.npmmirror.com/@codemirror/view/-/view-6.23.1.tgz", + "integrity": "sha512-J2Xnn5lFYT1ZN/5ewEoMBCmLlL71lZ3mBdb7cUEuHhX2ESoSrNEucpsDXpX22EuTGm9LOgC9v4Z0wx+Ez8QmGA==", + "requires": { + "@codemirror/state": "^6.4.0", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==" + }, + "@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "requires": {} + }, + "@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "dev": true, + "optional": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@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.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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" + } + }, + "@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true + }, + "@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "requires": { + "@floating-ui/utils": "^0.2.1" + } + }, + "@floating-ui/dom": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.0.tgz", + "integrity": "sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g==", + "requires": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.1" + } + }, + "@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@lezer/common": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-1.2.1.tgz", + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" + }, + "@lezer/highlight": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@lezer/highlight/-/highlight-1.2.0.tgz", + "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@lezer/javascript": { + "version": "1.4.13", + "resolved": "https://registry.npmmirror.com/@lezer/javascript/-/javascript-1.4.13.tgz", + "integrity": "sha512-5IBr8LIO3xJdJH1e9aj/ZNLE4LSbdsx25wFmGRAZsj2zSmwAYjx26JyU/BYOCpRQlu1jcv1z3vy4NB9+UkfRow==", + "requires": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "@lezer/lr": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-1.4.0.tgz", + "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "requires": { + "@lezer/common": "^1.0.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@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.npmjs.org/@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.npmjs.org/@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" + } + }, + "@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true + }, + "@popperjs/core": { + "version": "npm:@sxzz/popperjs-es@2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==" + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-riscv64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "dev": true, + "optional": true + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/bigi": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/bigi/-/bigi-1.4.5.tgz", + "integrity": "sha512-fb5MUzazrD2GRnwlStm91HVu3cZbvolX9kJruqpUBdc24eHBWrLLfyt8XN1/C5JpI0stP/MbaFQp+cJh5WOFfw==", + "dev": true + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.202", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.202.tgz", + "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==" + }, + "@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "requires": { + "@types/lodash": "*" + } + }, + "@types/node": { + "version": "20.11.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", + "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@types/nprogress": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/nprogress/-/nprogress-0.2.3.tgz", + "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "dev": true + }, + "@types/sm-crypto": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@types/sm-crypto/-/sm-crypto-0.3.4.tgz", + "integrity": "sha512-tp+KWAawUkwUWSpA3sHymerfy9P0utSyfdh7D60FJ4Aj1rhBZ2Q/nDvARUmmfQeIZZD1FKg9oAcDqecCux0npw==", + "dev": true, + "requires": { + "@types/bigi": "*" + } + }, + "@types/sortablejs": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.8.tgz", + "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==", + "dev": true + }, + "@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/web-bluetooth": { + "version": "0.0.15", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.15.tgz", + "integrity": "sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==" + }, + "@typescript-eslint/eslint-plugin": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/parser": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + } + }, + "@typescript-eslint/types": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/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.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "7.14.1", + "eslint-visitor-keys": "^3.4.3" + } + }, + "@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "@vitejs/plugin-vue": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.5.tgz", + "integrity": "sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==", + "dev": true, + "requires": {} + }, + "@volar/language-core": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.4.tgz", + "integrity": "sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==", + "dev": true, + "requires": { + "@volar/source-map": "2.3.4" + } + }, + "@volar/source-map": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.4.tgz", + "integrity": "sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==", + "dev": true + }, + "@volar/typescript": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha512-acCvt7dZECyKcvO5geNybmrqOsu9u8n5XP1rfiYsOLYGPxvHRav9BVmEdRyZ3vvY6mNyQ1wLL5Hday4IShe17w==", + "dev": true, + "requires": { + "@volar/language-core": "2.3.4", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "@vue/compiler-core": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", + "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", + "requires": { + "@babel/parser": "^7.24.7", + "@vue/shared": "3.4.30", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + }, + "dependencies": { + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" + } + } + }, + "@vue/compiler-dom": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", + "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", + "requires": { + "@vue/compiler-core": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "@vue/compiler-sfc": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", + "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", + "requires": { + "@babel/parser": "^7.24.7", + "@vue/compiler-core": "3.4.30", + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.10", + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" + } + }, + "@vue/compiler-ssr": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", + "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", + "requires": { + "@vue/compiler-dom": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "@vue/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "dev": true, + "requires": { + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0" + } + }, + "@vue/eslint-config-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", + "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "vue-eslint-parser": "^9.3.1" + } + }, + "@vue/language-core": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.22.tgz", + "integrity": "sha512-dNTAAtEOuMiz7N1s5tKpypnVVCtawxVSF5BukD0ELcYSw+DSbrSlYYSw8GuwvurodCeYFSHsmslE+c2sYDNoiA==", + "dev": true, + "requires": { + "@volar/language-core": "~2.3.1", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/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.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "@vue/reactivity": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.30.tgz", + "integrity": "sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==", + "requires": { + "@vue/shared": "3.4.30" + } + }, + "@vue/runtime-core": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.30.tgz", + "integrity": "sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==", + "requires": { + "@vue/reactivity": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "@vue/runtime-dom": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.30.tgz", + "integrity": "sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==", + "requires": { + "@vue/reactivity": "3.4.30", + "@vue/runtime-core": "3.4.30", + "@vue/shared": "3.4.30", + "csstype": "^3.1.3" + } + }, + "@vue/server-renderer": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.30.tgz", + "integrity": "sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==", + "requires": { + "@vue/compiler-ssr": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "@vue/shared": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", + "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==" + }, + "@vue/tsconfig": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.5.1.tgz", + "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", + "dev": true + }, + "@vueuse/core": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.1.1.tgz", + "integrity": "sha512-QfuaNWRDMQcCUwXylCyYhPC3ScS9Tiiz4J0chdwr3vOemBwRToSywq8MP+ZegKYFnbETzRY8G/5zC+ca30wrRQ==", + "requires": { + "@types/web-bluetooth": "^0.0.15", + "@vueuse/metadata": "9.1.1", + "@vueuse/shared": "9.1.1", + "vue-demi": "*" + } + }, + "@vueuse/metadata": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.1.1.tgz", + "integrity": "sha512-XZ2KtSW+85LLHB/IdGILPAtbIVHasPsAW7aqz3BRMzJdAQWRiM/FGa1OKBwLbXtUw/AmjKYFlZJo7eOFIBXRog==" + }, + "@vueuse/shared": { + "version": "9.1.1", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.1.1.tgz", + "integrity": "sha512-c+IfcOYmHiHqoEa3ED1Tbpue5GHmoUmTp8PtO4YbczthtY155Rt6DmWhjxMLXBF1Bcidagxljmp/7xtAzEHXLw==", + "requires": { + "vue-demi": "*" + } + }, + "acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/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" + } + }, + "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" + } + }, + "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" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "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==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "axios": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", + "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 + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "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 + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "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.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "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" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true + }, + "codemirror": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/codemirror/-/codemirror-6.0.1.tgz", + "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", + "requires": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "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 + }, + "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": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true + }, + "computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + }, + "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.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.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.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/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" + } + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "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-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + }, + "dependencies": { + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/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-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "dom-zindex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dom-zindex/-/dom-zindex-1.0.1.tgz", + "integrity": "sha512-M/MERVDZ8hguvjl6MAlLWSLYLS7PzEyXaTb5gEeJ+SF+e9iUC0sdvlzqe91MMDHBoy+nqw7wKcUOrDSyvMCrRg==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "element-plus": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.7.6.tgz", + "integrity": "sha512-36sw1K23hYjgeooR10U6CiCaCp2wvOqwoFurADZVlekeQ9v5U1FhJCFGEXO6i/kZBBMwsE1c9fxjLs9LENw2Rg==", + "requires": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "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 + }, + "eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "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.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "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": { + "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" + } + } + } + }, + "eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" + } + }, + "eslint-plugin-vue": { + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.23.0.tgz", + "integrity": "sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.0", + "vue-eslint-parser": "^9.4.2", + "xml-name-validator": "^4.0.0" + } + }, + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/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" + } + }, + "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.npmjs.org/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 + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/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.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/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.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "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" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/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.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "requires": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "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" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.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" + } + }, + "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.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "requires": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "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": "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" + } + }, + "globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/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==", + "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.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "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.1", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "requires": { + "get-intrinsic": "^1.2.2" + } + }, + "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-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.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 + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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 + }, + "immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/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" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "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 + }, + "is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "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-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "requires": { + "hasown": "^2.0.0" + } + }, + "is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "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-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-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/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": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "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": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "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" + } + }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + }, + "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" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/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-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "requires": {} + }, + "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 + }, + "magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "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" + } + }, + "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 + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "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.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "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 + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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 + }, + "normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "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-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.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" + } + }, + "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.npmjs.org/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.npmjs.org/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" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/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-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "requires": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + } + }, + "postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "requires": {} + }, + "postcss-selector-parser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "requires": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + } + }, + "posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "requires": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + }, + "dependencies": { + "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 + } + } + }, + "posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true + }, + "posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "requires": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "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": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/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" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@types/estree": "1.0.5", + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "sass": { + "version": "1.72.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.72.0.tgz", + "integrity": "sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true + }, + "set-function-length": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", + "requires": { + "define-data-property": "^1.1.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.1" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "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 + }, + "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" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sortablejs": { + "version": "1.15.2", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz", + "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "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" + } + }, + "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-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "style-mod": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/style-mod/-/style-mod-4.1.0.tgz", + "integrity": "sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==" + }, + "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" + } + }, + "svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "requires": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "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 + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + } + }, + "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 + }, + "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-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true + }, + "ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "requires": {} + }, + "tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "dev": true + }, + "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.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "devOptional": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "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 + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vite": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "dev": true, + "requires": { + "esbuild": "^0.21.3", + "fsevents": "~2.3.3", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + } + }, + "vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "requires": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + } + }, + "vite-plugin-vue-setup-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz", + "integrity": "sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==", + "dev": true, + "requires": { + "@vue/compiler-sfc": "^3.2.29", + "magic-string": "^0.25.7" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true + }, + "vue": { + "version": "3.4.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.30.tgz", + "integrity": "sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==", + "requires": { + "@vue/compiler-dom": "3.4.30", + "@vue/compiler-sfc": "3.4.30", + "@vue/runtime-dom": "3.4.30", + "@vue/server-renderer": "3.4.30", + "@vue/shared": "3.4.30" + } + }, + "vue-codemirror": { + "version": "6.1.1", + "resolved": "https://registry.npmmirror.com/vue-codemirror/-/vue-codemirror-6.1.1.tgz", + "integrity": "sha512-rTAYo44owd282yVxKtJtnOi7ERAcXTeviwoPXjIc6K/IQYUsoDkzPvw/JDFtSP6T7Cz/2g3EHaEyeyaQCKoDMg==", + "requires": { + "@codemirror/commands": "6.x", + "@codemirror/language": "6.x", + "@codemirror/state": "6.x", + "@codemirror/view": "6.x" + } + }, + "vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "requires": {} + }, + "vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "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" + } + }, + "vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "requires": { + "@vue/devtools-api": "^6.5.0" + } + }, + "vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-tsc": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.22.tgz", + "integrity": "sha512-lMBIwPBO0sxCcmvu45yt1b035AaQ8/XSXQDk8m75y4j0jSXY/y/XzfEtssQ9JMS47lDaR10O3/926oCs8OeGUw==", + "dev": true, + "requires": { + "@volar/typescript": "~2.3.1", + "@vue/language-core": "2.0.22", + "semver": "^7.5.4" + } + }, + "vxe-table": { + "version": "4.5.18", + "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-4.5.18.tgz", + "integrity": "sha512-YQJhYjLsB7OqHFQJ0X6jO8uMuerqgGCzvh+wYk14dUqGMv96tBwv5LhHDW7odW7OnUkVrp3mZIRmvq33r/0djQ==", + "requires": { + "dom-zindex": "^1.0.1", + "xe-utils": "^3.5.15" + } + }, + "w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + }, + "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" + } + }, + "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 + }, + "xe-utils": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.5.18.tgz", + "integrity": "sha512-+Be37a6yu4U/Q94ZSf30I57IM74tvK6wf9fHvjC/TLXNHFsf7PnhfWQ7TyjhUBOI/GAy5gr6tPK+iXIoLmyimw==" + }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package.json" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package.json" new file mode 100644 index 0000000..d1d86cf --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/package.json" @@ -0,0 +1,59 @@ +{ + "name": "maku-generator-ui", + "version": "3.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "lint": "eslint --fix --ext .vue,.jsx,.ts,.tsx ." + }, + "dependencies": { + "@codemirror/lang-javascript": "^6.2.1", + "@element-plus/icons-vue": "^2.3.1", + "@vueuse/core": "9.1.1", + "axios": "1.6.0", + "codemirror": "^6.0.1", + "crypto-js": "^4.1.1", + "element-plus": "2.7.6", + "qs": "6.10.3", + "sortablejs": "^1.15.0", + "vue": "3.4.30", + "vue-codemirror": "^6.1.1", + "vue-router": "4.2.5", + "vxe-table": "^4.3.5", + "xe-utils": "^3.5.4" + }, + "devDependencies": { + "@babel/types": "7.24.0", + "@types/node": "20.11.28", + "@types/nprogress": "0.2.3", + "@types/qs": "6.9.12", + "@types/sm-crypto": "0.3.4", + "@types/sortablejs": "1.15.8", + "@vitejs/plugin-vue": "5.0.5", + "@vue/compiler-sfc": "3.4.30", + "@vue/eslint-config-prettier": "9.0.0", + "@vue/eslint-config-typescript": "13.0.0", + "@vue/tsconfig": "0.5.1", + "eslint": "8.57.0", + "eslint-plugin-vue": "9.23.0", + "prettier": "3.2.5", + "sass": "1.72.0", + "typescript": "5.4.2", + "vite": "5.3.1", + "vite-plugin-svg-icons": "2.0.1", + "vite-plugin-vue-setup-extend": "0.4.0", + "vue-tsc": "2.0.22" + }, + "keywords": [ + "vue", + "vue3", + "vuejs", + "vite", + "element-plus", + "generator", + "maku-generator" + ], + "license": "MIT" +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/public/favicon.ico" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/public/favicon.ico" new file mode 100644 index 0000000000000000000000000000000000000000..8d5d381747293f5e38554d4a2ac2efc991d4f231 GIT binary patch literal 16958 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 + + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTables.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTables.ts" new file mode 100644 index 0000000..b869381 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTables.ts" @@ -0,0 +1,27 @@ +//代码生成数据库表配置信息api +import service from '@/utils/request' + + + + +/** + * =====================================generator/edit.vue 数据库表生成配置 start ======================== + */ +/** + * 数据表配置信息详情 + * @param tableId + */ +export const getGenTables = (tableId: number) => { + return service.get('/table/'+tableId) +} +/** + * 保存数据库表的配置 + * @param data + */ +export const saveConfig = (data: object) => { + return service.post('/table/save',data) +} + +/** + * =====================================generator/edit.vue 数据库表生成配置 end ======================== + */ diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTablesPlus.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTablesPlus.ts" new file mode 100644 index 0000000..3b11ff7 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/genTablesPlus.ts" @@ -0,0 +1,79 @@ +//代码生成plus的api +import service from '@/utils/request' + +/** + * 获取已经导入的表 + */ +export const getTableLists = () => { + return service.get('/table/list', { + params: { + pageNum: 1, + pageSize: 10, + } + }) +} +export const functionInfoById=(id:any)=>{ + return service.get('/plus/table/functionInfoById',{ + params:{ + functionId:id + } + }) +} + +/** + * 获所有的自定义方法的请求对象 + */ +export const getCustomReqPojo= async ()=>{ + return service.get('/plus/table/customReqList') +} +/** + * 获所有的自定义方法的响应对象 + */ +export const getCustomRespPojo= async ()=>{ + return service.get('/plus/table/customRespList') +} + +/** + * 获取表字段信息 + */ +export const getTableColumns = (tableName: string) => { + return service.get('/table/getTableColumns', { + params: { + tableName: tableName, + } + }) +} +/** + * 保存生成的方法 + * @param data + */ +export const saveConfigFunction = (data: any) => { + return service.post('/plus/table/save', data) +} +/** + * 获取自定义方法列表 + * @param data + */ +export const getFunctionList = (tableName: string) => { + return service.get('/plus/table/list', { + params: { + tableName: tableName, + pageNum: 1, + pageSize: 10, + } + }) +} + +/** + * 跟据id删除方法 + * @param id + */ +export const deleteFunctionById=(id:any)=>{ + return service.get('/plus/table/deleteById',{ + params:{ + functionId:id + } + }) +} + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/interface.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/interface.ts" new file mode 100644 index 0000000..f8d66b8 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/interface.ts" @@ -0,0 +1,10 @@ +interface GenTableColumn { + columnId: number; + javaType: string; + javaField: string; +} + +interface CustomClass { + customName: string; + columnsList: GenTableColumn[]; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/table.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/table.ts" new file mode 100644 index 0000000..3ad8cba --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/api/table.ts" @@ -0,0 +1,50 @@ +import service from '@/utils/request' + +/** + * =====================================import.vue 导入数据库表使用的接口 start ======================== + */ +/** + * 数据库表列表搜索 + * @param tableName + * @param tableComment + */ +export const searchTableList = (tableName: string, tableComment: string) => { + return service.get('/table/db/list', { + params: { + tableName: tableName, + tableComment: tableComment, + pageNum: 1, + pageSize: 10, + } + } + ) +} +/** + * 导入数据库表 + * @param tableNameList + */ +export const importTableList = (tableNameList: any) => { + return service.post('/table/importTable', tableNameList) +} + + +/** + * 初始化记载数据库表 + */ +export const useDataSourceListApi = () => { + return service.get('/table/db/list',{ + params: { + pageNum: 1, + pageSize: 10, + } + }) +} + +/** + * =====================================import.vue 导入数据库表使用的接口 end ======================== + */ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/assets/404.png" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/assets/404.png" new file mode 100644 index 0000000000000000000000000000000000000000..520dcc1a9373c5aeef72e1f50d1c17104c2bfecd GIT binary patch literal 51678 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

20QzCWuf2X>yQm}oxvu($ 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 literal 0 HcmV?d00001 diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/codemirror/CodeMirror.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/codemirror/CodeMirror.vue" new file mode 100644 index 0000000..682bbef --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/codemirror/CodeMirror.vue" @@ -0,0 +1,56 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/index.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/index.ts" new file mode 100644 index 0000000..4bef962 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/index.ts" @@ -0,0 +1,4 @@ +import { withInstall } from '@/utils/tool' +import SvgIcon from './src/svg-icon.vue' + +export default withInstall(SvgIcon) diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/src/svg-icon.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/src/svg-icon.vue" new file mode 100644 index 0000000..d9a83bb --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/components/svg-icon/src/svg-icon.vue" @@ -0,0 +1,40 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/index.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/index.ts" new file mode 100644 index 0000000..5c949af --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/index.ts" @@ -0,0 +1,195 @@ +import {IHooksOptions} from '@/hooks/interface' +import service from '@/utils/request' +import {onMounted} from 'vue' +import {ElMessage, ElMessageBox} from 'element-plus' + +export const useCrud = (options: IHooksOptions) => { + const defaultOptions: IHooksOptions = { + createdIsNeed: true, + dataListUrl: '', + isPage: true, + deleteUrl: '', + primaryKey: 'tableId', + exportUrl: '', + queryForm: {}, + dataList: [], + order: '', + asc: false, + page: 1, + limit: 10, + total: 0, + pageSizes: [1, 10, 20, 50, 100, 200], + dataListLoading: false, + dataListSelections: [] + } + + const mergeDefaultOptions = (options: any, props: any): IHooksOptions => { + for (const key in options) { + if (!Object.getOwnPropertyDescriptor(props, key)) { + props[key] = options[key] + } + } + return props + } + + // 覆盖默认值 + const state = mergeDefaultOptions(defaultOptions, options) + + onMounted(() => { + if (state.createdIsNeed) { + query() + } + }) + + + const sizeChangeHandle = (val: number) => { + state.page = 1 + state.limit = val + query() + } + + const currentChangeHandle = (val: number) => { + state.page = val + query() + } + + // 多选 + + + // 排序 + const sortChangeHandle = (data: any) => { + const {prop, order} = data + + if (prop && order) { + state.order = prop + state.asc = order === 'ascending' + } else { + state.order = '' + } + + query() + } + + const deleteHandle = (key: number | string) => { + if (!state.deleteUrl) { + return + } + + ElMessageBox.confirm('确定进行删除操作?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + service.delete(state.deleteUrl + '/' + key).then(() => { + ElMessage.success('删除成功') + + query() + }) + }) + .catch(() => { + }) + } + /** + * =====================================generator/index.vue 基本代码生成 start ======================== + */ + + /** + * 初始化加载代码生成列表 + */ + const getDataList = () => { + state.page = 1 + query() + } + /** + * 查询导入的数据库表 + */ + const query = () => { + if (!state.dataListUrl) { + return + } + + state.dataListLoading = true + + service + .get(state.dataListUrl, { + params: { + + pageNum: state.isPage ? state.page : null, + pageSize: state.isPage ? state.limit : null, + ...state.queryForm + } + }) + .then((res: any) => { + state.dataList = state.isPage ? res.data.list : res.data + state.total = state.isPage ? res.total : 0 + }) + + state.dataListLoading = false + } + /** + * 删除导入的数据库表 + * @param key + */ + const deleteBatchHandle = (key?: number | string) => { + let data: any[] = [] + if (key) { + data = [key] + } else { + data = state.dataListSelections ? state.dataListSelections : [] + if (data.length === 0) { + ElMessage.warning('请选择删除记录') + return + } + } + + ElMessageBox.confirm('确定进行删除操作?', '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + .then(() => { + if (state.deleteUrl) { + service.delete(state.deleteUrl, {data}).then(() => { + ElMessage.success('删除成功') + query() + }) + } + }) + .catch(() => { + }) + } + /** + * 重置某张表结构--等同于重新导入,丢失所有设置 + * @param id + */ + const synchDb = (tableName: string) => { + return service.get('/table/synchDb/' + tableName) + } + /** + * 代码生成--单表crud + */ + const batchGenCode = (tables: string) => { + return service.get('/table/batchGenCode',{ + params: { + tables: tables + } + }) + } + + /** + * =====================================generator/index.vue 基本代码生成 end ======================== + */ + + + return { + getDataList, + sizeChangeHandle, + currentChangeHandle, + sortChangeHandle, + deleteHandle, + deleteBatchHandle, + synchDb, + batchGenCode + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/interface.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/interface.ts" new file mode 100644 index 0000000..c8d8edb --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/hooks/interface.ts" @@ -0,0 +1,35 @@ +export interface IHooksOptions { + // 否在创建页面时,调用数据列表接口 + createdIsNeed?: boolean + // 数据列表 Url + dataListUrl?: string + // 是否需要分页 + isPage?: boolean + // 删除 Url + deleteUrl?: string + // 主键key,用于删除场景 + primaryKey?: string + // 导出 Url + exportUrl?: string + // 查询条件 + queryForm?: any + // 数据列表 + dataList?: any[] + // 排序字段 + order?: string + // 是否升序 + asc?: boolean + // 当前页码 + page?: number + // 每页数 + limit?: number + // 总条数 + total?: number + pageSizes?: any[] + // 数据列表,loading状态 + dataListLoading?: boolean + // 数据列表,多选项 + dataListSelections?: any[] + // 选中的数据 + selectedRows?: any +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/iconfont/iconfont.js" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/iconfont/iconfont.js" new file mode 100644 index 0000000..38cadb5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/iconfont/iconfont.js" @@ -0,0 +1 @@ +!function(c){var h,l,v,o,i,a='',t=(t=document.getElementsByTagName("script"))[t.length-1].getAttribute("data-injectcss"),z=function(c,h){h.parentNode.insertBefore(c,h)};if(t&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}function s(){i||(i=!0,v())}function p(){try{o.documentElement.doScroll("left")}catch(c){return void setTimeout(p,50)}s()}h=function(){var c,h=document.createElement("div");h.innerHTML=a,a=null,(h=h.getElementsByTagName("svg")[0])&&(h.setAttribute("aria-hidden","true"),h.style.position="absolute",h.style.width=0,h.style.height=0,h.style.overflow="hidden",h=h,(c=document.body).firstChild?z(h,c.firstChild):c.appendChild(h))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(l=function(){document.removeEventListener("DOMContentLoaded",l,!1),h()},document.addEventListener("DOMContentLoaded",l,!1)):document.attachEvent&&(v=h,o=c.document,i=!1,p(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,s())})}(window); \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/404.svg" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/404.svg" new file mode 100644 index 0000000..6df5019 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/404.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/gitee.svg" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/gitee.svg" new file mode 100644 index 0000000..7d3e6e1 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/icons/svg/gitee.svg" @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/components/Logo.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/components/Logo.vue" new file mode 100644 index 0000000..7f99c5d --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/components/Logo.vue" @@ -0,0 +1,27 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/index.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/index.vue" new file mode 100644 index 0000000..0ddbe2a --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Navbar/index.vue" @@ -0,0 +1,64 @@ + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Router/Redirect.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Router/Redirect.vue" new file mode 100644 index 0000000..90b8fd7 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Router/Redirect.vue" @@ -0,0 +1,18 @@ + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/Menu.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/Menu.vue" new file mode 100644 index 0000000..e7a0081 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/Menu.vue" @@ -0,0 +1,21 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/MenuItem.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/MenuItem.vue" new file mode 100644 index 0000000..69c32c6 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/components/MenuItem.vue" @@ -0,0 +1,24 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/index.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/index.vue" new file mode 100644 index 0000000..f93b66b --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/components/Sidebar/index.vue" @@ -0,0 +1,9 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/index.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/index.vue" new file mode 100644 index 0000000..d4785f4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/layout/index.vue" @@ -0,0 +1,25 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/main.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/main.ts" new file mode 100644 index 0000000..978b5f2 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/main.ts" @@ -0,0 +1,28 @@ +import { createApp } from 'vue' +import ElementPlus from 'element-plus' +import App from './App.vue' +import { router } from './router' +import 'virtual:svg-icons-register' +import 'xe-utils' +import VXETable from 'vxe-table' +import SvgIcon from '@/components/svg-icon' +import 'vxe-table/lib/style.css' + +import '@/icons/iconfont/iconfont' +import 'element-plus/dist/index.css' +import '@/styles/index.scss' + +VXETable.setup({ + zIndex: 3000, + select: { + transfer: true + } +}) + +const app = createApp(App) + +app.use(router) +app.use(SvgIcon) +app.use(ElementPlus) +app.use(VXETable) +app.mount('#app') diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/router/index.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/router/index.ts" new file mode 100644 index 0000000..a2995ea --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/router/index.ts" @@ -0,0 +1,64 @@ +import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router' + +export const menuRoutes: RouteRecordRaw[] = [ + { + path: '/p/gen', + meta: { + title: '代码生成器(单表)', + icon: 'icon-appstore' + }, + children: [ + { + path: '/gen/generator', + name: 'Generator', + component: () => import('../views/generator/index.vue'), + meta: { + title: '基本生成', + icon: 'icon-fire' + } + }, + { + path: '/gen/generatorPlus', + name: 'GeneratorPlus', + component: () => import('../views/generator-plus/index.vue'), + meta: { + title: '进阶生成', + icon: 'icon-fire' + } + } + + ] + } +] + +export const constantRoutes: RouteRecordRaw[] = [ + { + path: '/redirect', + component: () => import('../layout/index.vue'), + children: [ + { + path: '/redirect/:path(.*)', + component: () => import('../layout/components/Router/Redirect.vue') + } + ] + }, + { + path: '/', + component: () => import('../layout/index.vue'), + redirect: '/gen/generator', + children: [...menuRoutes] + }, + { + path: '/404', + component: () => import('../views/404.vue') + }, + { + path: '/:pathMatch(.*)', + redirect: '/404' + } +] + +export const router = createRouter({ + history: createWebHashHistory(), + routes: constantRoutes +}) diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/element.scss" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/element.scss" new file mode 100644 index 0000000..123d6a5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/element.scss" @@ -0,0 +1,97 @@ +// cover some element-plus styles + +.el-menu { + border-right: none !important; + &:not(.el-menu--collapse) { + width: var(--theme-aside-width); + } +} + +.el-menu-item, +.el-sub-menu__title { + color: var(--theme-menu-text-color) !important; + height: 48px !important; + overflow: hidden; +} + +.el-menu.el-menu--horizontal { + border-bottom: none !important; +} + +.el-menu-item { + height: 45px !important; + line-height: 45px !important; +} + +.el-menu-item a, +.el-menu-item a:hover, +.el-menu-item i, +.el-sub-menu__title i { + color: inherit; + text-decoration: none; +} + +.el-menu-item .svg-icon, +.el-sub-menu .svg-icon { + font-size: 16px !important; + display: inline-block; + vertical-align: middle; + margin-right: 5px; + width: 24px; + text-align: center; +} + +.el-sub-menu.is-active > :first-child { + overflow: hidden; + color: var(--theme-menu-hover-color) !important; +} + +.el-menu-item.is-active{ + border-right: 2px solid var(--theme-menu-border-color); + position: relative; + right:1px; + overflow: hidden; + color: var(--theme-menu-hover-color) !important; + background-color: var(--theme-menu-hover-bg-color) !important; + &:hover{ + background-color: var(--theme-menu-hover-bg-color) !important; + } +} + +.el-sub-menu.is-active.is-opened { + .el-sub-menu__title { + background-color: unset !important; + color: var(--theme-menu-hover-color); + } +} + +// 鼠标 hover 时 +.el-menu-item:hover, +.el-sub-menu__title:hover { + background-color: unset !important; + color: var(--theme-menu-hover-color) !important; +} + +.el-pagination{ + margin-top: 15px; + justify-content: flex-end; +} + +.el-form--inline .el-form-item{ + margin-right: 16px !important; +} + +.el-drawer .el-drawer__header { + display: flex; + align-items: center; + height: var(--theme-header-height); + padding: 0 15px; + margin-bottom: 0 !important; + font-size: 15px; + border-bottom: 1px solid var(--el-border-color); + color: var(--el-text-color-primary); +} +.el-card.is-always-shadow{ + box-shadow: none !important; +} + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/index.scss" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/index.scss" new file mode 100644 index 0000000..ac57ebe --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/index.scss" @@ -0,0 +1,3 @@ +@import './variables.scss'; +@import './layout.scss'; +@import './element.scss'; diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/layout.scss" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/layout.scss" new file mode 100644 index 0000000..586aeff --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/layout.scss" @@ -0,0 +1,67 @@ +* { + margin: 0; + padding: 0; + outline: none !important; +} + +html, +body, +#app { + margin: 0; + padding: 0; + width: 100%; + height: 100%; + font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif; + font-weight: 400; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; + font-size: 14px; + overflow: hidden; + position: relative; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +.layout-container { + width: 100%; + height: 100%; + .layout-sidebar { + background: var(--theme-menu-bg-color); + border-right: var(--theme-border-color-light) 1px solid; + height: inherit; + width: var(--theme-aside-width) !important; + position: relative; + display: flex; + flex-direction: column; + overflow-x: hidden !important; + .el-scrollbar__view { + overflow: hidden; + } + } + .layout-header { + padding: 0 !important; + display: flex; + flex-direction: column; + width: 100%; + height: var(--theme-header-height); + } + .layout-main { + padding: 0 !important; + overflow: hidden; + width: 100%; + background-color: var(--theme-main-bg-color); + .layout-card{ + min-height: calc(100vh - 30px - var(--theme-header-height)); + } + } + .layout-scrollbar { + height: calc(100vh - 30px - var(--theme-header-height)); + padding: 15px; + } +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/variables.scss" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/variables.scss" new file mode 100644 index 0000000..1dc218d --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/styles/variables.scss" @@ -0,0 +1,20 @@ +:root { + --el-color-primary: #1e97f8; + + --theme-aside-width: 200px; + --theme-header-height: 50px; + --theme-border-color-light: #f1f2f3; + --theme-logo-text-color: #ffffff; + + --theme-menu-text-color: #333333; + --theme-menu-bg-color: #ffffff; + --theme-menu-border-color: var(--el-color-primary); + --theme-menu-hover-color: var(--el-color-primary); + --theme-menu-hover-bg-color: var(--el-color-primary-light-9); + + --theme-header-bg-color: var(--el-color-primary); + --theme-header-text-color: #ffffff; + --theme-header-hover-color: rgba(0, 0, 0, 0.1); + + --theme-main-bg-color: #f0f2f5; +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/types/shims.d.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/types/shims.d.ts" new file mode 100644 index 0000000..66d0c36 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/types/shims.d.ts" @@ -0,0 +1,13 @@ +declare module '*.svg' +declare module '*.png' +declare module '*.jpg' +declare module '*.gif' +declare module '*.scss' +declare module '*.ts' +declare module '*.js' + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/request.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/request.ts" new file mode 100644 index 0000000..7b271a3 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/request.ts" @@ -0,0 +1,51 @@ +import axios from 'axios' +import qs from 'qs' +import { ElMessage } from 'element-plus' + +// axios实例 +const service = axios.create({ + baseURL: import.meta.env.VITE_API_URL as any, + timeout: 60000, + headers: { 'Content-Type': 'application/json;charset=UTF-8' } +}) + +// 请求拦截器 +service.interceptors.request.use( + (config: any) => { + // 追加时间戳,防止GET请求缓存 + if (config.method?.toUpperCase() === 'GET') { + config.params = { ...config.params, t: new Date().getTime() } + } + + if (Object.values(config.headers).includes('application/x-www-form-urlencoded')) { + config.data = qs.stringify(config.data) + } + + return config + }, + error => { + return Promise.reject(error) + } +) +// 响应拦截器 +service.interceptors.response.use( + response => { + const res = response.data; + // 响应成功 + if (res.code === 200) { + return res; + } else { + // 错误提示 + ElMessage.error(res.msg); + return Promise.reject(new Error(res.msg || 'Error')); + } + }, + error => { + ElMessage.error(error.message); + return Promise.reject(error); + } +); + + +// 导出 axios 实例 +export default service diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/tool.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/tool.ts" new file mode 100644 index 0000000..5ebe9e8 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/utils/tool.ts" @@ -0,0 +1,45 @@ +import type { App, Plugin } from 'vue' +import { AES, lib, enc, mode, pad } from 'crypto-js' +// 全局组件安装 +export const withInstall = (component: T, alias?: string) => { + const comp = component as any + comp.install = (app: App) => { + app.component(comp.__name || comp.displayName, component) + if (alias) { + app.config.globalProperties[alias] = component + } + } + return component as T & Plugin +} + +// 密钥 +const ENCRYPT_KEY = 'makulowcodeyyds1' + +export const decrypt = (ciphertext: string): string => { + // 将密文转换为CipherParams对象 + const cipherParams = lib.CipherParams.create({ + ciphertext: enc.Base64.parse(ciphertext) + }) + + // 使用密钥解密CipherParams对象 + const decrypted = AES.decrypt(cipherParams, enc.Utf8.parse(ENCRYPT_KEY), { + mode: mode.ECB, + padding: pad.Pkcs7 + }) + + // 获取明文 + return decrypted.toString(enc.Utf8) +} + +export const encrypt = (plaintext: string): string => { + // 将明文转换为要加密的格式 + const message = enc.Utf8.parse(plaintext) + + // 使用密钥加密明文 + const encrypted = AES.encrypt(message, enc.Utf8.parse(ENCRYPT_KEY), { + mode: mode.ECB, + padding: pad.Pkcs7 + }) + + return encrypted.toString() +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/404.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/404.vue" new file mode 100644 index 0000000..1616ac4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/404.vue" @@ -0,0 +1,32 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/addFunction.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/addFunction.vue" new file mode 100644 index 0000000..ab01612 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/addFunction.vue" @@ -0,0 +1,364 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableFunction.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableFunction.vue" new file mode 100644 index 0000000..d80f455 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableFunction.vue" @@ -0,0 +1,202 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableInfo.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableInfo.vue" new file mode 100644 index 0000000..158353f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableInfo.vue" @@ -0,0 +1,95 @@ + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableRequest.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableRequest.vue" new file mode 100644 index 0000000..57104ce --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableRequest.vue" @@ -0,0 +1,126 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableResponse.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableResponse.vue" new file mode 100644 index 0000000..df2eaf5 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/addfunction/tableResponse.vue" @@ -0,0 +1,122 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/edit.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/edit.vue" new file mode 100644 index 0000000..0b67602 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/edit.vue" @@ -0,0 +1,346 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/index.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/index.vue" new file mode 100644 index 0000000..ebd478e --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator-plus/index.vue" @@ -0,0 +1,230 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/TableInfoForm.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/TableInfoForm.vue" new file mode 100644 index 0000000..3c11060 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/TableInfoForm.vue" @@ -0,0 +1,145 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/basicInfoForm.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/basicInfoForm.vue" new file mode 100644 index 0000000..0223ddb --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/basicInfoForm.vue" @@ -0,0 +1,100 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/edit.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/edit.vue" new file mode 100644 index 0000000..43bb8c4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/edit.vue" @@ -0,0 +1,158 @@ + + + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/import.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/import.vue" new file mode 100644 index 0000000..0dd19a4 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/import.vue" @@ -0,0 +1,123 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/index.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/index.vue" new file mode 100644 index 0000000..68e096c --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/index.vue" @@ -0,0 +1,184 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/preview.vue" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/preview.vue" new file mode 100644 index 0000000..be1ee01 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/src/views/generator/preview.vue" @@ -0,0 +1,37 @@ + + + diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/tsconfig.json" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/tsconfig.json" new file mode 100644 index 0000000..5858510 --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/tsconfig.json" @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "skipLibCheck": true, + "allowJs": true, + "sourceMap": true, + "resolveJsonModule": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "lib": ["esnext", "dom"], + "types": [ + "web-bluetooth", + "vite/client" + ], + "paths": { + "@/*": ["./src/*"] + }, + "compilerOptions": { + "types": ["vite-plugin-svg-icons/client"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "exclude": ["node_modules"] +} diff --git "a/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/vite.config.ts" "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/vite.config.ts" new file mode 100644 index 0000000..179099f --- /dev/null +++ "b/CRUD-PLUS\344\273\243\347\240\201\347\224\237\346\210\220/vue-crud/vue-crud/vite.config.ts" @@ -0,0 +1,28 @@ +import { resolve } from 'path' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' + +// 参考:https://cn.vitejs.dev/config/ +export default defineConfig({ + base: './', + resolve: { + // 配置别名 + alias: { + '@': resolve(__dirname, './src'), + 'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js' + } + }, + plugins: [ + vue(), + createSvgIconsPlugin({ + iconDirs: [resolve(__dirname, 'src/icons/svg')], + symbolId: 'icon-[dir]-[name]' + }) + ], + server: { + host: '0.0.0.0', + port: 3000, // 端口号 + open: false // 是否自动打开浏览器 + } +}) -- Gitee