From fe7b70cac4d128e295e81089d8a9097a4291e8c2 Mon Sep 17 00:00:00 2001 From: 0GI4 Date: Thu, 20 Feb 2025 16:56:23 +0300 Subject: [PATCH] feat: paragraphStructureAdded --- package-lock.json | 5105 +++++++++++++++++ package.json | 4 +- src/components/signature/Signature.ts | 7 +- .../assets/css/contextmenu/contextmenu.css | 8 - src/editor/assets/css/index.css | 2 +- src/editor/assets/css/table/table.css | 51 - .../assets/images/table-border-dash.svg | 1 - .../assets/images/table-border-internal.svg | 1 - src/editor/core/command/Command.ts | 38 +- src/editor/core/command/CommandAdapt.ts | 1637 ++++-- .../core/contextmenu/menus/tableMenus.ts | 20 - src/editor/core/cursor/Cursor.ts | 18 +- src/editor/core/draw/Draw.ts | 686 ++- src/editor/core/draw/control/Control.ts | 504 +- .../draw/control/checkbox/CheckboxControl.ts | 15 +- .../core/draw/control/date/DateControl.ts | 18 +- .../core/draw/control/number/NumberControl.ts | 3 - .../core/draw/control/radio/RadioControl.ts | 9 +- .../core/draw/control/select/SelectControl.ts | 190 +- .../core/draw/control/text/TextControl.ts | 18 +- src/editor/core/draw/frame/Badge.ts | 88 - src/editor/core/draw/frame/Margin.ts | 2 +- src/editor/core/draw/frame/PageNumber.ts | 44 +- src/editor/core/draw/frame/Watermark.ts | 91 +- src/editor/core/draw/interactive/Area.ts | 219 - src/editor/core/draw/interactive/Search.ts | 153 +- .../core/draw/particle/ImageParticle.ts | 15 +- src/editor/core/draw/particle/ListParticle.ts | 83 +- .../{PageBreakParticle.ts => PageBreak.ts} | 0 .../{SeparatorParticle.ts => Separator.ts} | 1 - .../{SubscriptParticle.ts => Subscript.ts} | 0 ...{SuperscriptParticle.ts => Superscript.ts} | 0 .../particle/block/modules/IFrameBlock.ts | 2 +- .../draw/particle/block/modules/VideoBlock.ts | 1 + .../core/draw/particle/date/DateParticle.ts | 2 +- .../draw/particle/latex/utils/LaTexUtils.ts | 77 +- .../core/draw/particle/previewer/Previewer.ts | 11 +- .../core/draw/particle/table/TableOperate.ts | 968 ---- .../core/draw/particle/table/TableParticle.ts | 54 +- .../core/draw/particle/table/TableTool.ts | 171 +- src/editor/core/event/CanvasEvent.ts | 10 +- src/editor/core/event/GlobalEvent.ts | 20 +- src/editor/core/event/handlers/copy.ts | 19 +- src/editor/core/event/handlers/cut.ts | 1 - src/editor/core/event/handlers/drag.ts | 3 +- src/editor/core/event/handlers/input.ts | 257 +- .../core/event/handlers/keydown/backspace.ts | 330 +- .../core/event/handlers/keydown/delete.ts | 17 - .../core/event/handlers/keydown/enter.ts | 329 +- .../core/event/handlers/keydown/left.ts | 11 +- .../core/event/handlers/keydown/right.ts | 20 +- src/editor/core/event/handlers/keydown/tab.ts | 14 +- .../core/event/handlers/keydown/updown.ts | 8 +- src/editor/core/event/handlers/mouseup.ts | 12 - src/editor/core/event/handlers/paste.ts | 39 +- src/editor/core/i18n/lang/en.json | 2 - src/editor/core/i18n/lang/zh-CN.json | 2 - src/editor/core/listener/Listener.ts | 3 - src/editor/core/observer/MouseObserver.ts | 18 - src/editor/core/observer/ScrollObserver.ts | 16 +- src/editor/core/position/Position.ts | 218 +- src/editor/core/range/RangeManager.ts | 118 +- src/editor/core/worker/WorkerManager.ts | 33 +- src/editor/core/worker/works/catalog.ts | 9 +- src/editor/core/worker/works/group.ts | 2 +- src/editor/core/zone/Zone.ts | 7 - src/editor/dataset/constant/Badge.ts | 6 - src/editor/dataset/constant/ContextMenu.ts | 2 - src/editor/dataset/constant/Element.ts | 22 +- src/editor/dataset/constant/Footer.ts | 3 +- src/editor/dataset/constant/Header.ts | 3 +- src/editor/dataset/constant/Table.ts | 3 +- src/editor/dataset/constant/Watermark.ts | 6 +- src/editor/dataset/enum/Area.ts | 5 - src/editor/dataset/enum/Common.ts | 5 - src/editor/dataset/enum/Control.ts | 11 +- src/editor/dataset/enum/Element.ts | 4 +- src/editor/dataset/enum/table/Table.ts | 4 +- src/editor/index.ts | 45 +- src/editor/interface/Area.ts | 50 - src/editor/interface/Badge.ts | 17 - src/editor/interface/Catalog.ts | 1 - src/editor/interface/Common.ts | 36 +- src/editor/interface/Control.ts | 65 +- src/editor/interface/Draw.ts | 1 - src/editor/interface/Editor.ts | 3 +- src/editor/interface/Element.ts | 55 +- src/editor/interface/Event.ts | 17 +- src/editor/interface/EventBus.ts | 13 +- src/editor/interface/Footer.ts | 1 - src/editor/interface/Header.ts | 1 - src/editor/interface/Listener.ts | 19 +- src/editor/interface/Range.ts | 16 +- src/editor/interface/Row.ts | 3 +- src/editor/interface/Search.ts | 12 - src/editor/interface/Watermark.ts | 5 - src/editor/interface/table/Table.ts | 1 - src/editor/types/index.d.ts | 7 + src/editor/utils/clipboard.ts | 25 +- src/editor/utils/element.ts | 657 ++- src/editor/utils/index.ts | 18 +- src/editor/utils/option.ts | 9 +- src/editor/utils/print.ts | 4 +- src/editor/utils/ua.ts | 5 - src/main.ts | 350 +- src/mock.ts | 499 +- src/plugins/copy/index.ts | 1 - src/vite-env.d.ts | 1 - yarn.lock | 1285 ++--- 109 files changed, 9155 insertions(+), 5976 deletions(-) create mode 100644 package-lock.json delete mode 100644 src/editor/assets/images/table-border-dash.svg delete mode 100644 src/editor/assets/images/table-border-internal.svg delete mode 100644 src/editor/core/draw/control/number/NumberControl.ts delete mode 100644 src/editor/core/draw/frame/Badge.ts delete mode 100644 src/editor/core/draw/interactive/Area.ts rename src/editor/core/draw/particle/{PageBreakParticle.ts => PageBreak.ts} (100%) rename src/editor/core/draw/particle/{SeparatorParticle.ts => Separator.ts} (99%) rename src/editor/core/draw/particle/{SubscriptParticle.ts => Subscript.ts} (100%) rename src/editor/core/draw/particle/{SuperscriptParticle.ts => Superscript.ts} (100%) delete mode 100644 src/editor/core/draw/particle/table/TableOperate.ts delete mode 100644 src/editor/dataset/constant/Badge.ts delete mode 100644 src/editor/dataset/enum/Area.ts delete mode 100644 src/editor/interface/Area.ts delete mode 100644 src/editor/interface/Badge.ts delete mode 100644 src/vite-env.d.ts diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..0bc2b8cda --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5105 @@ +{ + "name": "@hufe921/canvas-editor", + "version": "0.9.103", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@hufe921/canvas-editor", + "version": "0.9.103", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "prismjs": "^1.27.0" + }, + "devDependencies": { + "@rollup/plugin-typescript": "^10.0.1", + "@types/node": "^22.13.4", + "@types/prismjs": "^1.26.0", + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "cypress": "13.6.0", + "cypress-file-upload": "^5.0.8", + "eslint": "7.32.0", + "simple-git-hooks": "^2.8.1", + "typescript": "^5.7.3", + "vite": "^2.4.2", + "vite-plugin-css-injected-by-js": "^2.1.1", + "vitepress": "1.0.0-beta.6", + "vue": "^3.2.45" + }, + "engines": { + "node": ">=16.9.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz", + "integrity": "sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.14.3" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz", + "integrity": "sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz", + "integrity": "sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.14.3" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz", + "integrity": "sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.14.3", + "@algolia/client-search": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", + "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", + "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.14.3", + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz", + "integrity": "sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.14.3", + "@algolia/client-search": "4.14.3", + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", + "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", + "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.14.3", + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.20.3", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz", + "integrity": "sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.14.3", + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", + "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.20.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.20.3", + "@algolia/requester-browser-xhr": "5.20.3", + "@algolia/requester-fetch": "5.20.3", + "@algolia/requester-node-http": "5.20.3" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz", + "integrity": "sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz", + "integrity": "sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.14.3" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.20.3" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz", + "integrity": "sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.20.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.20.3" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.20.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.20.3" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz", + "integrity": "sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.14.3", + "@algolia/logger-common": "4.14.3", + "@algolia/requester-common": "4.14.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@cypress/request": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "6.10.4", + "safe-buffer": "^5.1.2", + "tough-cookie": "^4.1.3", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz", + "integrity": "sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.1.tgz", + "integrity": "sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.5.1", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz", + "integrity": "sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.1", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz", + "integrity": "sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", + "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", + "dev": true, + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "node_modules/@types/node/node_modules/undici-types": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.2.1.tgz", + "integrity": "sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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/@vueuse/integrations": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.2.1.tgz", + "integrity": "sha512-FDP5lni+z9FjHE9H3xuvwSjoRV9U8jmDvJpmHPCBjUgPGYRynwb60eHWXCFJXLUtb4gSIHy0e+iaEbrKdalCkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "10.2.1", + "@vueuse/shared": "10.2.1", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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/@vueuse/metadata": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.1.tgz", + "integrity": "sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.1.tgz", + "integrity": "sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "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/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "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/algoliasearch": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz", + "integrity": "sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.14.3", + "@algolia/cache-common": "4.14.3", + "@algolia/cache-in-memory": "4.14.3", + "@algolia/client-account": "4.14.3", + "@algolia/client-analytics": "4.14.3", + "@algolia/client-common": "4.14.3", + "@algolia/client-personalization": "4.14.3", + "@algolia/client-search": "4.14.3", + "@algolia/logger-common": "4.14.3", + "@algolia/logger-console": "4.14.3", + "@algolia/requester-browser-xhr": "4.14.3", + "@algolia/requester-common": "4.14.3", + "@algolia/requester-node-http": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz", + "integrity": "sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz", + "integrity": "sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.14.3", + "@algolia/requester-common": "4.14.3", + "@algolia/transporter": "4.14.3" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz", + "integrity": "sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.14.3" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz", + "integrity": "sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.14.3" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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" + } + ], + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-scroll-lock": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", + "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", + "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "1.4.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true, + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cypress": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.6.0.tgz", + "integrity": "sha512-quIsnFmtj4dBUEJYU4OH0H12bABJpSujvWexC24Ju1gTlKMJbeT6tTO0vh7WNfiBPPjoIXLN+OUqVtiKFs6SGw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@cypress/request": "^3.0.0", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^18.17.5", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^6.2.1", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.8", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "process": "^0.11.10", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.5.3", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" + } + }, + "node_modules/cypress-file-upload": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz", + "integrity": "sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.2.1" + }, + "peerDependencies": { + "cypress": ">3.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "18.18.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.13.tgz", + "integrity": "sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.8.tgz", + "integrity": "sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/esbuild": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.13.tgz", + "integrity": "sha512-Z17A/R6D0b4s3MousytQ/5i7mTCbaF+Ua/yPfoe71vdTv4KBvVAvQ/6ytMngM2DwGJosl8WxaD75NOQl2QF26Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.13.13", + "esbuild-darwin-64": "0.13.13", + "esbuild-darwin-arm64": "0.13.13", + "esbuild-freebsd-64": "0.13.13", + "esbuild-freebsd-arm64": "0.13.13", + "esbuild-linux-32": "0.13.13", + "esbuild-linux-64": "0.13.13", + "esbuild-linux-arm": "0.13.13", + "esbuild-linux-arm64": "0.13.13", + "esbuild-linux-mips64le": "0.13.13", + "esbuild-linux-ppc64le": "0.13.13", + "esbuild-netbsd-64": "0.13.13", + "esbuild-openbsd-64": "0.13.13", + "esbuild-sunos-64": "0.13.13", + "esbuild-windows-32": "0.13.13", + "esbuild-windows-64": "0.13.13", + "esbuild-windows-arm64": "0.13.13" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.13.13", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.13.tgz", + "integrity": "sha512-oMrgjP4CjONvDHe7IZXHrMk3wX5Lof/IwFEIbwbhgbXGBaN2dke9PkViTiXC3zGJSGpMvATXVplEhlInJ0drHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/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, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "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, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true, + "license": "ISC" + }, + "node_modules/focus-trap": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", + "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true, + "license": "MIT" + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dev": true, + "license": "MIT", + "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-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "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.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.13.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", + "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "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.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "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, + "license": "MIT", + "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.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "license": "ISC" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "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, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "license": "ISC" + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true, + "license": "MIT", + "engines": { + "node": "> 0.8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minisearch": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", + "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", + "dev": true, + "license": "MIT" + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "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, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true, + "license": "MIT" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.11.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz", + "integrity": "sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "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" + } + ], + "license": "MIT" + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "license": "MIT", + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz", + "integrity": "sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/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" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/search-insights": { + "version": "2.17.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "license": "MIT", + "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/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-git-hooks": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.8.1.tgz", + "integrity": "sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "simple-git-hooks": "cli.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true, + "license": "MIT" + }, + "node_modules/table": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", + "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true, + "license": "MIT" + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.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, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "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, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "dev": 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, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-2.6.14.tgz", + "integrity": "sha512-2HA9xGyi+EhY2MXo0+A2dRsqsAG3eFNEVIo12olkWhOmc8LfiM+eMdrXf+Ruje9gdXgvSqjLI9freec1RUM5EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.13.2", + "postcss": "^8.3.8", + "resolve": "^1.20.0", + "rollup": "^2.57.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": ">=12.2.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "less": "*", + "sass": "*", + "stylus": "*" + }, + "peerDependenciesMeta": { + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + } + } + }, + "node_modules/vite-plugin-css-injected-by-js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-2.1.1.tgz", + "integrity": "sha512-gjIG6iFWde32oRr/bK9CsfN+jdbura2y4GlDzeOiEm6py38ud8dXzFl9zwmHjOjZdr8XEgQ9TovzVGNzp47esw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "vite": ">2.0.0-0" + } + }, + "node_modules/vitepress": { + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-beta.6.tgz", + "integrity": "sha512-xK/ulKgQpKZVbvlL4+/vW49VG7ySi5nmSoKUNH1G4kM+Cj9JwYM+PDJO7jSJROv8zW99G0ise+maDYnaLlbGBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "^3.5.1", + "@docsearch/js": "^3.5.1", + "@vitejs/plugin-vue": "^4.2.3", + "@vue/devtools-api": "^6.5.0", + "@vueuse/core": "^10.2.1", + "@vueuse/integrations": "^10.2.1", + "body-scroll-lock": "4.0.0-beta.0", + "focus-trap": "^7.5.2", + "mark.js": "8.11.1", + "minisearch": "^6.1.0", + "shiki": "^0.14.3", + "vite": "^4.4.6", + "vue": "^3.3.4" + }, + "bin": { + "vitepress": "bin/vitepress.js" + } + }, + "node_modules/vitepress/node_modules/@vitejs/plugin-vue": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz", + "integrity": "sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/vitepress/node_modules/esbuild": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } + }, + "node_modules/vitepress/node_modules/rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vitepress/node_modules/vite": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz", + "integrity": "sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + } +} diff --git a/package.json b/package.json index dfeb1cc87..d3f2d57b5 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ }, "devDependencies": { "@rollup/plugin-typescript": "^10.0.1", - "@types/node": "16.18.96", + "@types/node": "^22.13.4", "@types/prismjs": "^1.26.0", "@typescript-eslint/eslint-plugin": "5.62.0", "@typescript-eslint/parser": "5.62.0", @@ -58,7 +58,7 @@ "cypress-file-upload": "^5.0.8", "eslint": "7.32.0", "simple-git-hooks": "^2.8.1", - "typescript": "4.9.5", + "typescript": "^5.7.3", "vite": "^2.4.2", "vite-plugin-css-injected-by-js": "^2.1.1", "vitepress": "1.0.0-beta.6", diff --git a/src/components/signature/Signature.ts b/src/components/signature/Signature.ts index f50dc1b59..60afca35a 100644 --- a/src/components/signature/Signature.ts +++ b/src/components/signature/Signature.ts @@ -246,10 +246,9 @@ export class Signature { this.canvasWidth, this.canvasHeight ) - const self = this - this._saveUndoFn(function () { - self.ctx.clearRect(0, 0, self.canvasWidth, self.canvasHeight) - self.ctx.putImageData(imageData, 0, 0) + this._saveUndoFn(() => { + this.ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight) + this.ctx.putImageData(imageData, 0, 0) }) this.isDrawn = false } diff --git a/src/editor/assets/css/contextmenu/contextmenu.css b/src/editor/assets/css/contextmenu/contextmenu.css index feb1a421b..a3cac0a7e 100644 --- a/src/editor/assets/css/contextmenu/contextmenu.css +++ b/src/editor/assets/css/contextmenu/contextmenu.css @@ -155,18 +155,10 @@ background-image: url(../../../assets/images/table-border-empty.svg); } -.ce-contextmenu-border-dash { - background-image: url(../../../assets/images/table-border-dash.svg); -} - .ce-contextmenu-border-external { background-image: url(../../../assets/images/table-border-external.svg); } -.ce-contextmenu-border-internal { - background-image: url(../../../assets/images/table-border-internal.svg); -} - .ce-contextmenu-border-td { background-image: url(../../../assets/images/table-border-td.svg); } diff --git a/src/editor/assets/css/index.css b/src/editor/assets/css/index.css index 206baa8ad..32e880303 100644 --- a/src/editor/assets/css/index.css +++ b/src/editor/assets/css/index.css @@ -16,7 +16,7 @@ margin: 0; padding: 0; left: 0; - top: 0; + right: 0; letter-spacing: 0; font-size: 12px; position: absolute; diff --git a/src/editor/assets/css/table/table.css b/src/editor/assets/css/table/table.css index 5e456ea27..a0b281e07 100644 --- a/src/editor/assets/css/table/table.css +++ b/src/editor/assets/css/table/table.css @@ -9,8 +9,6 @@ .ce-table-tool__row .ce-table-tool__row__item { width: 100%; position: relative; - cursor: pointer; - transition: all .3s; } .ce-table-tool__row .ce-table-tool__row__item::after { @@ -23,53 +21,10 @@ background-color: #C0C6CF; } -.ce-table-tool__row .ce-table-tool__row__item:hover { - background-color: #dadce0; -} - .ce-table-tool__row .ce-table-tool__row__item:last-child:after { display: none; } -.ce-table-tool__quick__add { - width: 16px; - height: 16px; - position: absolute; - border-radius: 50%; - background-color: #E2E6ED; - cursor: pointer; -} - -.ce-table-tool__quick__add::after { - content: '+'; - color: #ffffff; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -55%); -} - -.ce-table-tool__select { - width: 16px; - height: 18px; - position: absolute; - border-radius: 3px; - cursor: pointer; -} - -.ce-table-tool__select:hover { - background-color: #E2E6ED; -} - -.ce-table-tool__select::after { - content: ':::'; - color: #AAAAAB; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-75%, -50%) rotate(-90deg); -} - .ce-table-tool__col { position: absolute; height: 12px; @@ -82,8 +37,6 @@ .ce-table-tool__col .ce-table-tool__col__item { height: 100%; position: relative; - cursor: pointer; - transition: all .3s; } .ce-table-tool__col .ce-table-tool__col__item::after { @@ -97,10 +50,6 @@ background-color: #C0C6CF; } -.ce-table-tool__col .ce-table-tool__col__item:hover { - background-color: #dadce0; -} - .ce-table-tool__col .ce-table-tool__col__item:first-child:after { display: none; } diff --git a/src/editor/assets/images/table-border-dash.svg b/src/editor/assets/images/table-border-dash.svg deleted file mode 100644 index 9aa7cd9f8..000000000 --- a/src/editor/assets/images/table-border-dash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/editor/assets/images/table-border-internal.svg b/src/editor/assets/images/table-border-internal.svg deleted file mode 100644 index 6ddb7e8d6..000000000 --- a/src/editor/assets/images/table-border-internal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/editor/core/command/Command.ts b/src/editor/core/command/Command.ts index d5a830ae3..779645ad4 100644 --- a/src/editor/core/command/Command.ts +++ b/src/editor/core/command/Command.ts @@ -18,6 +18,7 @@ export class Command { public executePainter: CommandAdapt['painter'] public executeApplyPainterStyle: CommandAdapt['applyPainterStyle'] public executeFormat: CommandAdapt['format'] + public executeFootnote: CommandAdapt['footnote'] public executeFont: CommandAdapt['font'] public executeSize: CommandAdapt['size'] public executeSizeAdd: CommandAdapt['sizeAdd'] @@ -44,11 +45,8 @@ export class Command { public executeDeleteTable: CommandAdapt['deleteTable'] public executeMergeTableCell: CommandAdapt['mergeTableCell'] public executeCancelMergeTableCell: CommandAdapt['cancelMergeTableCell'] - public executeSplitVerticalTableCell: CommandAdapt['splitVerticalTableCell'] - public executeSplitHorizontalTableCell: CommandAdapt['splitHorizontalTableCell'] public executeTableTdVerticalAlign: CommandAdapt['tableTdVerticalAlign'] public executeTableBorderType: CommandAdapt['tableBorderType'] - public executeTableBorderColor: CommandAdapt['tableBorderColor'] public executeTableTdBorderType: CommandAdapt['tableTdBorderType'] public executeTableTdSlashType: CommandAdapt['tableTdSlashType'] public executeTableTdBackgroundColor: CommandAdapt['tableTdBackgroundColor'] @@ -71,22 +69,15 @@ export class Command { public executeSaveAsImageElement: CommandAdapt['saveAsImageElement'] public executeChangeImageDisplay: CommandAdapt['changeImageDisplay'] public executePageMode: CommandAdapt['pageMode'] - public executePageScale: CommandAdapt['pageScale'] public executePageScaleRecovery: CommandAdapt['pageScaleRecovery'] public executePageScaleMinus: CommandAdapt['pageScaleMinus'] public executePageScaleAdd: CommandAdapt['pageScaleAdd'] public executePaperSize: CommandAdapt['paperSize'] public executePaperDirection: CommandAdapt['paperDirection'] public executeSetPaperMargin: CommandAdapt['setPaperMargin'] - public executeSetMainBadge: CommandAdapt['setMainBadge'] - public executeSetAreaBadge: CommandAdapt['setAreaBadge'] public executeInsertElementList: CommandAdapt['insertElementList'] - public executeInsertArea: CommandAdapt['insertArea'] - public executeSetAreaProperties: CommandAdapt['setAreaProperties'] - public executeLocationArea: CommandAdapt['locationArea'] public executeAppendElementList: CommandAdapt['appendElementList'] public executeUpdateElementById: CommandAdapt['updateElementById'] - public executeDeleteElementById: CommandAdapt['deleteElementById'] public executeSetValue: CommandAdapt['setValue'] public executeRemoveControl: CommandAdapt['removeControl'] public executeSetLocale: CommandAdapt['setLocale'] @@ -110,18 +101,15 @@ export class Command { public getImage: CommandAdapt['getImage'] public getOptions: CommandAdapt['getOptions'] public getValue: CommandAdapt['getValue'] - public getAreaValue: CommandAdapt['getAreaValue'] public getHTML: CommandAdapt['getHTML'] public getText: CommandAdapt['getText'] public getWordCount: CommandAdapt['getWordCount'] - public getCursorPosition: CommandAdapt['getCursorPosition'] public getRange: CommandAdapt['getRange'] public getRangeText: CommandAdapt['getRangeText'] public getRangeContext: CommandAdapt['getRangeContext'] public getRangeRow: CommandAdapt['getRangeRow'] public getRangeParagraph: CommandAdapt['getRangeParagraph'] public getKeywordRangeList: CommandAdapt['getKeywordRangeList'] - public getKeywordContext: CommandAdapt['getKeywordContext'] public getPaperMargin: CommandAdapt['getPaperMargin'] public getSearchNavigateInfo: CommandAdapt['getSearchNavigateInfo'] public getLocale: CommandAdapt['getLocale'] @@ -131,7 +119,8 @@ export class Command { public getContainer: CommandAdapt['getContainer'] public getTitleValue: CommandAdapt['getTitleValue'] public getPositionContextByEvent: CommandAdapt['getPositionContextByEvent'] - public getElementById: CommandAdapt['getElementById'] + public getParagraphId: CommandAdapt['getParagraphId'] + public executeParagraphIndent: CommandAdapt['setParagraphIndent'] constructor(adapt: CommandAdapt) { // 全局命令 @@ -153,6 +142,7 @@ export class Command { this.executeApplyPainterStyle = adapt.applyPainterStyle.bind(adapt) this.executeFormat = adapt.format.bind(adapt) // 字体、字体大小、字体变大、字体变小、加粗、斜体、下划线、删除线、字体颜色、背景色 + this.executeFootnote = adapt.footnote.bind(adapt) this.executeFont = adapt.font.bind(adapt) this.executeSize = adapt.size.bind(adapt) this.executeSizeAdd = adapt.sizeAdd.bind(adapt) @@ -181,13 +171,8 @@ export class Command { this.executeDeleteTable = adapt.deleteTable.bind(adapt) this.executeMergeTableCell = adapt.mergeTableCell.bind(adapt) this.executeCancelMergeTableCell = adapt.cancelMergeTableCell.bind(adapt) - this.executeSplitVerticalTableCell = - adapt.splitVerticalTableCell.bind(adapt) - this.executeSplitHorizontalTableCell = - adapt.splitHorizontalTableCell.bind(adapt) this.executeTableTdVerticalAlign = adapt.tableTdVerticalAlign.bind(adapt) this.executeTableBorderType = adapt.tableBorderType.bind(adapt) - this.executeTableBorderColor = adapt.tableBorderColor.bind(adapt) this.executeTableTdBorderType = adapt.tableTdBorderType.bind(adapt) this.executeTableTdSlashType = adapt.tableTdSlashType.bind(adapt) this.executeTableTdBackgroundColor = @@ -212,26 +197,16 @@ export class Command { this.executeChangeImageDisplay = adapt.changeImageDisplay.bind(adapt) // 页面模式、页面缩放、纸张大小、纸张方向、页边距 this.executePageMode = adapt.pageMode.bind(adapt) - this.executePageScale = adapt.pageScale.bind(adapt) this.executePageScaleRecovery = adapt.pageScaleRecovery.bind(adapt) this.executePageScaleMinus = adapt.pageScaleMinus.bind(adapt) this.executePageScaleAdd = adapt.pageScaleAdd.bind(adapt) this.executePaperSize = adapt.paperSize.bind(adapt) this.executePaperDirection = adapt.paperDirection.bind(adapt) this.executeSetPaperMargin = adapt.setPaperMargin.bind(adapt) - // 签章 - this.executeSetMainBadge = adapt.setMainBadge.bind(adapt) - this.executeSetAreaBadge = adapt.setAreaBadge.bind(adapt) - // 区域 - this.getAreaValue = adapt.getAreaValue.bind(adapt) - this.executeInsertArea = adapt.insertArea.bind(adapt) - this.executeSetAreaProperties = adapt.setAreaProperties.bind(adapt) - this.executeLocationArea = adapt.locationArea.bind(adapt) // 通用 this.executeInsertElementList = adapt.insertElementList.bind(adapt) this.executeAppendElementList = adapt.appendElementList.bind(adapt) this.executeUpdateElementById = adapt.updateElementById.bind(adapt) - this.executeDeleteElementById = adapt.deleteElementById.bind(adapt) this.executeSetValue = adapt.setValue.bind(adapt) this.executeRemoveControl = adapt.removeControl.bind(adapt) this.executeSetLocale = adapt.setLocale.bind(adapt) @@ -252,14 +227,12 @@ export class Command { this.getHTML = adapt.getHTML.bind(adapt) this.getText = adapt.getText.bind(adapt) this.getWordCount = adapt.getWordCount.bind(adapt) - this.getCursorPosition = adapt.getCursorPosition.bind(adapt) this.getRange = adapt.getRange.bind(adapt) this.getRangeText = adapt.getRangeText.bind(adapt) this.getRangeContext = adapt.getRangeContext.bind(adapt) this.getRangeRow = adapt.getRangeRow.bind(adapt) this.getRangeParagraph = adapt.getRangeParagraph.bind(adapt) this.getKeywordRangeList = adapt.getKeywordRangeList.bind(adapt) - this.getKeywordContext = adapt.getKeywordContext.bind(adapt) this.getCatalog = adapt.getCatalog.bind(adapt) this.getPaperMargin = adapt.getPaperMargin.bind(adapt) this.getSearchNavigateInfo = adapt.getSearchNavigateInfo.bind(adapt) @@ -268,7 +241,6 @@ export class Command { this.getContainer = adapt.getContainer.bind(adapt) this.getTitleValue = adapt.getTitleValue.bind(adapt) this.getPositionContextByEvent = adapt.getPositionContextByEvent.bind(adapt) - this.getElementById = adapt.getElementById.bind(adapt) // 控件 this.executeSetControlValue = adapt.setControlValue.bind(adapt) this.executeSetControlExtension = adapt.setControlExtension.bind(adapt) @@ -278,5 +250,7 @@ export class Command { this.getControlList = adapt.getControlList.bind(adapt) this.executeLocationControl = adapt.locationControl.bind(adapt) this.executeInsertControl = adapt.insertControl.bind(adapt) + this.getParagraphId = adapt.getParagraphId.bind(adapt) + this.executeParagraphIndent = adapt.setParagraphIndent.bind(adapt) } } diff --git a/src/editor/core/command/CommandAdapt.ts b/src/editor/core/command/CommandAdapt.ts index 7f3be903a..7575557bb 100644 --- a/src/editor/core/command/CommandAdapt.ts +++ b/src/editor/core/command/CommandAdapt.ts @@ -1,6 +1,5 @@ import { NBSP, WRAP, ZERO } from '../../dataset/constant/Common' import { - AREA_CONTEXT_ATTR, EDITOR_ELEMENT_STYLE_ATTR, EDITOR_ROW_ATTR, LIST_CONTEXT_ATTR, @@ -14,6 +13,7 @@ import { defaultWatermarkOption } from '../../dataset/constant/Watermark' import { ImageDisplay, LocationPosition } from '../../dataset/enum/Common' import { ControlComponent } from '../../dataset/enum/Control' import { + EditorContext, EditorMode, EditorZone, PageMode, @@ -33,7 +33,6 @@ import { IGetControlValueOption, IGetControlValueResult, ILocationControlOption, - IRemoveControlOption, ISetControlExtensionOption, ISetControlHighlightOption, ISetControlProperties, @@ -59,24 +58,18 @@ import { IUpdateOption } from '../../interface/Editor' import { - IDeleteElementByIdOption, IElement, IElementPosition, IElementStyle, - IGetElementByIdOption, IUpdateElementByIdOption } from '../../interface/Element' -import { - ICopyOption, - IPasteOption, - IPositionContextByEventOption, - IPositionContextByEventResult, - ITableInfoByEvent -} from '../../interface/Event' +import { IPasteOption, IPositionContextByEvent } from '../../interface/Event' import { IMargin } from '../../interface/Margin' import { ILocationPosition } from '../../interface/Position' import { IRange, RangeContext, RangeRect } from '../../interface/Range' -import { IReplaceOption, ISearchResultContext } from '../../interface/Search' +import { IColgroup } from '../../interface/table/Colgroup' +import { ITd } from '../../interface/table/Td' +import { ITr } from '../../interface/table/Tr' import { ITextDecoration } from '../../interface/Text' import { IGetTitleValueOption, @@ -106,7 +99,7 @@ import { printImageBase64 } from '../../utils/print' import { Control } from '../draw/control/Control' import { Draw } from '../draw/Draw' import { INavigateInfo, Search } from '../draw/interactive/Search' -import { TableOperate } from '../draw/particle/table/TableOperate' +import { TableTool } from '../draw/particle/table/TableTool' import { CanvasEvent } from '../event/CanvasEvent' import { pasteByApi } from '../event/handlers/paste' import { HistoryManager } from '../history/HistoryManager' @@ -115,13 +108,6 @@ import { Position } from '../position/Position' import { RangeManager } from '../range/RangeManager' import { WorkerManager } from '../worker/WorkerManager' import { Zone } from '../zone/Zone' -import { - IGetAreaValueOption, - IGetAreaValueResult, - IInsertAreaOption, - ISetAreaPropertiesOption -} from '../../interface/Area' -import { IAreaBadge, IBadge } from '../../interface/Badge' export class CommandAdapt { private draw: Draw @@ -129,13 +115,14 @@ export class CommandAdapt { private position: Position private historyManager: HistoryManager private canvasEvent: CanvasEvent + private tableTool: TableTool private options: DeepRequired private control: Control private workerManager: WorkerManager private searchManager: Search private i18n: I18n private zone: Zone - private tableOperate: TableOperate + private footnoteCounter = 0 constructor(draw: Draw) { this.draw = draw @@ -143,13 +130,13 @@ export class CommandAdapt { this.position = draw.getPosition() this.historyManager = draw.getHistoryManager() this.canvasEvent = draw.getCanvasEvent() + this.tableTool = draw.getTableTool() this.options = draw.getOptions() this.control = draw.getControl() this.workerManager = draw.getWorkerManager() this.searchManager = draw.getSearch() this.i18n = draw.getI18n() this.zone = draw.getZone() - this.tableOperate = draw.getTableOperate() } public mode(payload: EditorMode) { @@ -162,8 +149,8 @@ export class CommandAdapt { this.canvasEvent.cut() } - public copy(payload?: ICopyOption) { - this.canvasEvent.copy(payload) + public copy() { + this.canvasEvent.copy() } public paste(payload?: IPasteOption) { @@ -309,7 +296,7 @@ export class CommandAdapt { painterStyleKeys.forEach(p => { const key = p as keyof typeof ElementStyleKey if (painterStyle[key] === undefined) { - painterStyle[key] = s[key] as any + painterStyle[key] = s[key] as never } }) }) @@ -350,6 +337,180 @@ export class CommandAdapt { this.draw.render(renderOption) } + public footnote() { + const isDisabled = this.draw.isReadonly() || this.draw.isDisabled() + if (isDisabled) return + + const position = this.draw.getPosition() + const cursorPosition = position.getCursorPosition() + if (!cursorPosition) return + + const rangeManager = this.draw.getRange() + if (!rangeManager.getIsCanInput()) return + + const cursor = this.draw.getCursor() + cursor.clearAgentDomValue() + + const elementList = this.draw.getElementList() + const { startIndex, endIndex } = rangeManager.getRange() + + const footnoteNumber = this.getNextFootnoteNumber(startIndex) + const footnoteElement: IElement = { + value: String(footnoteNumber), + type: ElementType.SUPERSCRIPT, + isFootnote: true, + id: elementList[startIndex]?.id || getUUID() + } + + const start = startIndex + 1 + if (startIndex !== endIndex) { + const end = endIndex + 1 + this.draw.spliceElementList(elementList, end, 0, [footnoteElement]) + } else this.draw.spliceElementList(elementList, start, 0, [footnoteElement]) + + const pageNo = cursorPosition.pageNo + const pageRowList = this.draw.getPageRowList() + const currentPageRows = pageRowList[pageNo] || [] + const pageElements = currentPageRows.reduce((acc: IElement[], row) => { + return acc.concat(row.elementList) + }, []) + if ( + !pageElements.find( + el => el.type === ElementType.SEPARATOR && el.isFootnote + ) + ) { + const separator: IElement = { + dashArray: [], + type: ElementType.SEPARATOR, + value: '\n', + height: 32, + width: 554, + isFootnote: true + } + + this.draw.spliceElementList(elementList, elementList.length, 0, [ + separator + ]) + } + + if ( + elementList.find( + el => + el.type == ElementType.SUPERSCRIPT && + !el.isFootnote && + el.value >= String(footnoteNumber) + ) + ) { + let index = + elementList.findIndex( + el => + el.type == ElementType.SUPERSCRIPT && + !el.isFootnote && + el.value >= String(footnoteNumber) + ) - 1 + const zero: IElement = { + id: getUUID(), + value: ZERO + } + this.draw.spliceElementList(elementList, index, 0, [zero]) + + const footnoteElementUnderSeparator: IElement = { + value: `${footnoteNumber}`, + type: ElementType.SUPERSCRIPT, + id: elementList[index]?.id || getUUID() + } + index++ + + this.draw.spliceElementList(elementList, index, 0, [ + footnoteElementUnderSeparator + ]) + this.calculationFootnoteUnderSeparatorNumbers( + index - 1, + footnoteElementUnderSeparator + ) + this.calculationFootnoteNumbers(startIndex, footnoteElement) + rangeManager.setRange(index, index) + this.draw.render({ + curIndex: index, + isSubmitHistory: true + }) + } else { + const zero: IElement = { + id: getUUID(), + value: ZERO + } + this.draw.spliceElementList(elementList, elementList.length, 0, [zero]) + + const footnoteElementUnderSeparator: IElement = { + value: `${footnoteNumber}`, + type: ElementType.SUPERSCRIPT, + id: elementList[elementList.length - 1]?.id || getUUID() + } + this.draw.spliceElementList(elementList, elementList.length, 0, [ + footnoteElementUnderSeparator + ]) + + this.calculationFootnoteNumbers(startIndex, footnoteElement) + rangeManager.setRange(elementList.length - 1, elementList.length - 1) + this.draw.render({ + curIndex: elementList.length - 1, + isSubmitHistory: true + }) + } + } + + private getNextFootnoteNumber(startIndex: number): number { + this.footnoteCounter = 0 + const elementList = this.draw.getElementList() + let i = 0 + while (i !== startIndex) { + if ( + elementList[i].isFootnote && + elementList[i].type === ElementType.SUPERSCRIPT + ) { + this.footnoteCounter = Number(elementList[i].value) + 1 + } + i++ + } + return this.footnoteCounter || 1 + } + private calculationFootnoteNumbers( + startIndex: number, + footnoteElement: IElement + ) { + const elementList = this.draw.getElementList() + + for (let i = startIndex + 1; i < elementList.length; i++) { + const el = elementList[i] + + if ( + el.type === ElementType.SUPERSCRIPT && + el.isFootnote && + el !== footnoteElement + ) { + el.value = String(Number(el.value) + 1) + } + } + } + private calculationFootnoteUnderSeparatorNumbers( + startIndex: number, + footnoteElement: IElement + ) { + const elementList = this.draw.getElementList() + // let elementIndex = 0 + for (let i = startIndex + 1; i < elementList.length; i++) { + const el = elementList[i] + + if ( + el.type === ElementType.SUPERSCRIPT && + el !== footnoteElement && + !el.isFootnote + ) { + el.value = String(Number(el.value) + 1) + } + } + } + public font(payload: string) { const isDisabled = this.draw.isReadonly() || this.draw.isDisabled() if (isDisabled) return @@ -360,23 +521,13 @@ export class CommandAdapt { }) this.draw.render({ isSetCursor: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] if (enterElement?.value === ZERO) { enterElement.font = payload - } else { - this.range.setDefaultStyle({ - font: payload - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -399,15 +550,6 @@ export class CommandAdapt { if (enterElement?.value === ZERO) { changeElementList.push(enterElement) renderOption = { curIndex: endIndex } - } else { - this.range.setDefaultStyle({ - size: payload - }) - this.draw.render({ - curIndex: endIndex, - isCompute: false, - isSubmitHistory: false - }) } } if (!changeElementList.length) return @@ -430,7 +572,6 @@ export class CommandAdapt { public sizeAdd() { const isDisabled = this.draw.isReadonly() || this.draw.isDisabled() if (isDisabled) return - const { defaultSize, maxSize } = this.options const selection = this.range.getTextLikeSelectionElementList() // 选区设置或设置换行处样式 let renderOption: IDrawOption = {} @@ -445,20 +586,10 @@ export class CommandAdapt { if (enterElement?.value === ZERO) { changeElementList.push(enterElement) renderOption = { curIndex: endIndex } - } else { - const style = this.range.getDefaultStyle() - const anchorSize = style?.size || enterElement.size || defaultSize - this.range.setDefaultStyle({ - size: anchorSize + 2 > maxSize ? maxSize : anchorSize + 2 - }) - this.draw.render({ - curIndex: endIndex, - isCompute: false, - isSubmitHistory: false - }) } } if (!changeElementList.length) return + const { defaultSize, maxSize } = this.options let isExistUpdate = false changeElementList.forEach(el => { if (!el.size) { @@ -480,7 +611,6 @@ export class CommandAdapt { public sizeMinus() { const isDisabled = this.draw.isReadonly() || this.draw.isDisabled() if (isDisabled) return - const { defaultSize, minSize } = this.options const selection = this.range.getTextLikeSelectionElementList() // 选区设置或设置换行处样式 let renderOption: IDrawOption = {} @@ -495,20 +625,10 @@ export class CommandAdapt { if (enterElement?.value === ZERO) { changeElementList.push(enterElement) renderOption = { curIndex: endIndex } - } else { - const style = this.range.getDefaultStyle() - const anchorSize = style?.size || enterElement.size || defaultSize - this.range.setDefaultStyle({ - size: anchorSize - 2 < minSize ? minSize : anchorSize - 2 - }) - this.draw.render({ - curIndex: endIndex, - isCompute: false, - isSubmitHistory: false - }) } } if (!changeElementList.length) return + const { defaultSize, minSize } = this.options let isExistUpdate = false changeElementList.forEach(el => { if (!el.size) { @@ -538,23 +658,13 @@ export class CommandAdapt { }) this.draw.render({ isSetCursor: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] if (enterElement?.value === ZERO) { enterElement.bold = !enterElement.bold - } else { - this.range.setDefaultStyle({ - bold: enterElement.bold ? false : !this.range.getDefaultStyle()?.bold - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -569,25 +679,13 @@ export class CommandAdapt { }) this.draw.render({ isSetCursor: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] if (enterElement?.value === ZERO) { enterElement.italic = !enterElement.italic - } else { - this.range.setDefaultStyle({ - italic: enterElement.italic - ? false - : !this.range.getDefaultStyle()?.italic - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -619,25 +717,13 @@ export class CommandAdapt { isCompute: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] if (enterElement?.value === ZERO) { enterElement.underline = !enterElement.underline - } else { - this.range.setDefaultStyle({ - underline: enterElement?.underline - ? false - : !this.range.getDefaultStyle()?.underline - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -655,25 +741,13 @@ export class CommandAdapt { isCompute: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] if (enterElement?.value === ZERO) { enterElement.strikeout = !enterElement.strikeout - } else { - this.range.setDefaultStyle({ - strikeout: enterElement.strikeout - ? false - : !this.range.getDefaultStyle()?.strikeout - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -752,7 +826,6 @@ export class CommandAdapt { isCompute: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] @@ -762,17 +835,8 @@ export class CommandAdapt { } else { delete enterElement.color } - } else { - this.range.setDefaultStyle({ - color: payload || undefined - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -793,7 +857,6 @@ export class CommandAdapt { isCompute: false }) } else { - let isSubmitHistory = true const { endIndex } = this.range.getRange() const elementList = this.draw.getElementList() const enterElement = elementList[endIndex] @@ -803,17 +866,8 @@ export class CommandAdapt { } else { delete enterElement.highlight } - } else { - this.range.setDefaultStyle({ - highlight: payload || undefined - }) - isSubmitHistory = false + this.draw.render({ curIndex: endIndex, isCompute: false }) } - this.draw.render({ - isSubmitHistory, - curIndex: endIndex, - isCompute: false - }) } } @@ -900,113 +954,797 @@ export class CommandAdapt { if (isDisabled) return const activeControl = this.control.getActiveControl() if (activeControl) return - this.tableOperate.insertTable(row, col) + const { startIndex, endIndex } = this.range.getRange() + if (!~startIndex && !~endIndex) return + const { defaultTrMinHeight } = this.options.table + const elementList = this.draw.getElementList() + let offsetX = 0 + if (elementList[startIndex]?.listId) { + const positionList = this.position.getPositionList() + const { rowIndex } = positionList[startIndex] + const rowList = this.draw.getRowList() + const row = rowList[rowIndex] + offsetX = row?.offsetX || 0 + } + const innerWidth = this.draw.getContextInnerWidth() - offsetX + // colgroup + const colgroup: IColgroup[] = [] + const colWidth = innerWidth / col + for (let c = 0; c < col; c++) { + colgroup.push({ + width: colWidth + }) + } + // trlist + const trList: ITr[] = [] + for (let r = 0; r < row; r++) { + const tdList: ITd[] = [] + const tr: ITr = { + height: defaultTrMinHeight, + tdList + } + for (let c = 0; c < col; c++) { + tdList.push({ + colspan: 1, + rowspan: 1, + value: [] + }) + } + trList.push(tr) + } + const element: IElement = { + type: ElementType.TABLE, + value: '', + colgroup, + trList + } + // 格式化element + formatElementList([element], { + editorOptions: this.options + }) + formatElementContext(elementList, [element], startIndex, { + editorOptions: this.options + }) + const curIndex = startIndex + 1 + this.draw.spliceElementList( + elementList, + curIndex, + startIndex === endIndex ? 0 : endIndex - startIndex, + [element] + ) + this.range.setRange(curIndex, curIndex) + this.draw.render({ curIndex, isSetCursor: false }) } public insertTableTopRow() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.insertTableTopRow() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, trIndex, tableId } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + const curTr = curTrList[trIndex!] + // 之前跨行的增加跨行数 + if (curTr.tdList.length < element.colgroup!.length) { + const curTrNo = curTr.tdList[0].rowIndex! + for (let t = 0; t < trIndex!; t++) { + const tr = curTrList[t] + for (let d = 0; d < tr.tdList.length; d++) { + const td = tr.tdList[d] + if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) { + td.rowspan += 1 + } + } + } + } + // 增加当前行 + const newTrId = getUUID() + const newTr: ITr = { + height: curTr.height, + id: newTrId, + tdList: [] + } + for (let t = 0; t < curTr.tdList.length; t++) { + const curTd = curTr.tdList[t] + const newTdId = getUUID() + newTr.tdList.push({ + id: newTdId, + rowspan: 1, + colspan: curTd.colspan, + value: [ + { + value: ZERO, + size: 16, + tableId, + trId: newTrId, + tdId: newTdId + } + ] + }) + } + curTrList.splice(trIndex!, 0, newTr) + // 重新设置上下文 + this.position.setPositionContext({ + isTable: true, + index, + trIndex, + tdIndex: 0, + tdId: newTr.tdList[0].id, + trId: newTr.id, + tableId + }) + this.range.setRange(0, 0) + // 重新渲染 + this.draw.render({ curIndex: 0 }) + this.tableTool.render() } public insertTableBottomRow() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.insertTableBottomRow() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, trIndex, tableId } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + const curTr = curTrList[trIndex!] + const anchorTr = + curTrList.length - 1 === trIndex ? curTr : curTrList[trIndex! + 1] + // 之前/当前行跨行的增加跨行数 + if (anchorTr.tdList.length < element.colgroup!.length) { + const curTrNo = anchorTr.tdList[0].rowIndex! + for (let t = 0; t < trIndex! + 1; t++) { + const tr = curTrList[t] + for (let d = 0; d < tr.tdList.length; d++) { + const td = tr.tdList[d] + if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) { + td.rowspan += 1 + } + } + } + } + // 增加当前行 + const newTrId = getUUID() + const newTr: ITr = { + height: anchorTr.height, + id: newTrId, + tdList: [] + } + for (let t = 0; t < anchorTr.tdList.length; t++) { + const curTd = anchorTr.tdList[t] + const newTdId = getUUID() + newTr.tdList.push({ + id: newTdId, + rowspan: 1, + colspan: curTd.colspan, + value: [ + { + value: ZERO, + size: 16, + tableId, + trId: newTrId, + tdId: newTdId + } + ] + }) + } + curTrList.splice(trIndex! + 1, 0, newTr) + // 重新设置上下文 + this.position.setPositionContext({ + isTable: true, + index, + trIndex: trIndex! + 1, + tdIndex: 0, + tdId: newTr.tdList[0].id, + trId: newTr.id, + tableId + }) + this.range.setRange(0, 0) + // 重新渲染 + this.draw.render({ curIndex: 0 }) + this.tableTool.render() } public insertTableLeftCol() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.insertTableLeftCol() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, tdIndex, tableId } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + const curTdIndex = tdIndex! + // 增加列 + for (let t = 0; t < curTrList.length; t++) { + const tr = curTrList[t] + const tdId = getUUID() + tr.tdList.splice(curTdIndex, 0, { + id: tdId, + rowspan: 1, + colspan: 1, + value: [ + { + value: ZERO, + size: 16, + tableId, + trId: tr.id, + tdId + } + ] + }) + } + // 重新计算宽度 + const colgroup = element.colgroup! + colgroup.splice(curTdIndex, 0, { + width: this.options.table.defaultColMinWidth + }) + const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0) + const width = this.draw.getOriginalInnerWidth() + if (colgroupWidth > width) { + const adjustWidth = (colgroupWidth - width) / colgroup.length + for (let g = 0; g < colgroup.length; g++) { + const group = colgroup[g] + group.width -= adjustWidth + } + } + // 重新设置上下文 + this.position.setPositionContext({ + isTable: true, + index, + trIndex: 0, + tdIndex: curTdIndex, + tdId: curTrList[0].tdList[curTdIndex].id, + trId: curTrList[0].id, + tableId + }) + this.range.setRange(0, 0) + // 重新渲染 + this.draw.render({ curIndex: 0 }) + this.tableTool.render() } public insertTableRightCol() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.insertTableRightCol() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, tdIndex, tableId } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + const curTdIndex = tdIndex! + 1 + // 增加列 + for (let t = 0; t < curTrList.length; t++) { + const tr = curTrList[t] + const tdId = getUUID() + tr.tdList.splice(curTdIndex, 0, { + id: tdId, + rowspan: 1, + colspan: 1, + value: [ + { + value: ZERO, + size: 16, + tableId, + trId: tr.id, + tdId + } + ] + }) + } + // 重新计算宽度 + const colgroup = element.colgroup! + colgroup.splice(curTdIndex, 0, { + width: this.options.table.defaultColMinWidth + }) + const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0) + const width = this.draw.getOriginalInnerWidth() + if (colgroupWidth > width) { + const adjustWidth = (colgroupWidth - width) / colgroup.length + for (let g = 0; g < colgroup.length; g++) { + const group = colgroup[g] + group.width -= adjustWidth + } + } + // 重新设置上下文 + this.position.setPositionContext({ + isTable: true, + index, + trIndex: 0, + tdIndex: curTdIndex, + tdId: curTrList[0].tdList[curTdIndex].id, + trId: curTrList[0].id, + tableId + }) + this.range.setRange(0, 0) + // 重新渲染 + this.draw.render({ curIndex: 0 }) + this.tableTool.render() } public deleteTableRow() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.deleteTableRow() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, trIndex, tdIndex } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const trList = element.trList! + const curTr = trList[trIndex!] + const curTdRowIndex = curTr.tdList[tdIndex!].rowIndex! + // 如果是最后一行,直接删除整个表格 + if (trList.length <= 1) { + this.deleteTable() + return + } + // 之前行缩小rowspan + for (let r = 0; r < curTdRowIndex; r++) { + const tr = trList[r] + const tdList = tr.tdList + for (let d = 0; d < tdList.length; d++) { + const td = tdList[d] + if (td.rowIndex! + td.rowspan > curTdRowIndex) { + td.rowspan-- + } + } + } + // 补跨行 + for (let d = 0; d < curTr.tdList.length; d++) { + const td = curTr.tdList[d] + if (td.rowspan > 1) { + const tdId = getUUID() + const nextTr = trList[trIndex! + 1] + nextTr.tdList.splice(d, 0, { + id: tdId, + rowspan: td.rowspan - 1, + colspan: td.colspan, + value: [ + { + value: ZERO, + size: 16, + tableId: element.id, + trId: nextTr.id, + tdId + } + ] + }) + } + } + // 删除当前行 + trList.splice(trIndex!, 1) + // 重新设置上下文 + this.position.setPositionContext({ + isTable: false + }) + this.range.clearRange() + // 重新渲染 + this.draw.render({ + curIndex: positionContext.index + }) + this.tableTool.dispose() } public deleteTableCol() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.deleteTableCol() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, tdIndex, trIndex } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + const curTd = curTrList[trIndex!].tdList[tdIndex!] + const curColIndex = curTd.colIndex! + // 如果是最后一列,直接删除整个表格 + const moreTdTr = curTrList.find(tr => tr.tdList.length > 1) + if (!moreTdTr) { + this.deleteTable() + return + } + // 缩小colspan或删除与当前列重叠的单元格 + for (let t = 0; t < curTrList.length; t++) { + const tr = curTrList[t] + for (let d = 0; d < tr.tdList.length; d++) { + const td = tr.tdList[d] + if ( + td.colIndex! <= curColIndex && + td.colIndex! + td.colspan > curColIndex + ) { + if (td.colspan > 1) { + td.colspan-- + } else { + tr.tdList.splice(d, 1) + } + } + } + } + element.colgroup?.splice(curColIndex, 1) + // 重新设置上下文 + this.position.setPositionContext({ + isTable: false + }) + this.range.setRange(0, 0) + // 重新渲染 + this.draw.render({ + curIndex: positionContext.index + }) + this.tableTool.dispose() } public deleteTable() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.deleteTable() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const originalElementList = this.draw.getOriginalElementList() + originalElementList.splice(positionContext.index!, 1) + const curIndex = positionContext.index! - 1 + this.position.setPositionContext({ + isTable: false, + index: curIndex + }) + this.range.setRange(curIndex, curIndex) + this.draw.render({ curIndex }) + this.tableTool.dispose() } public mergeTableCell() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.mergeTableCell() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { + isCrossRowCol, + startTdIndex, + endTdIndex, + startTrIndex, + endTrIndex + } = this.range.getRange() + if (!isCrossRowCol) return + const { index } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + let startTd = curTrList[startTrIndex!].tdList[startTdIndex!] + let endTd = curTrList[endTrIndex!].tdList[endTdIndex!] + // 交换起始位置 + if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) { + // prettier-ignore + [startTd, endTd] = [endTd, startTd] + } + const startColIndex = startTd.colIndex! + const endColIndex = endTd.colIndex! + (endTd.colspan - 1) + const startRowIndex = startTd.rowIndex! + const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1) + // 选区行列 + const rowCol: ITd[][] = [] + for (let t = 0; t < curTrList.length; t++) { + const tr = curTrList[t] + const tdList: ITd[] = [] + for (let d = 0; d < tr.tdList.length; d++) { + const td = tr.tdList[d] + const tdColIndex = td.colIndex! + const tdRowIndex = td.rowIndex! + if ( + tdColIndex >= startColIndex && + tdColIndex <= endColIndex && + tdRowIndex >= startRowIndex && + tdRowIndex <= endRowIndex + ) { + tdList.push(td) + } + } + if (tdList.length) { + rowCol.push(tdList) + } + } + if (!rowCol.length) return + // 是否是矩形 + const lastRow = rowCol[rowCol.length - 1] + const leftTop = rowCol[0][0] + const rightBottom = lastRow[lastRow.length - 1] + const startX = leftTop.x! + const startY = leftTop.y! + const endX = rightBottom.x! + rightBottom.width! + const endY = rightBottom.y! + rightBottom.height! + for (let t = 0; t < rowCol.length; t++) { + const tr = rowCol[t] + for (let d = 0; d < tr.length; d++) { + const td = tr[d] + const tdStartX = td.x! + const tdStartY = td.y! + const tdEndX = tdStartX + td.width! + const tdEndY = tdStartY + td.height! + // 存在不符合项 + if ( + startX > tdStartX || + startY > tdStartY || + endX < tdEndX || + endY < tdEndY + ) { + return + } + } + } + // 合并单元格 + const mergeTdIdList: string[] = [] + const anchorTd = rowCol[0][0] + for (let t = 0; t < rowCol.length; t++) { + const tr = rowCol[t] + for (let d = 0; d < tr.length; d++) { + const td = tr[d] + const isAnchorTd = t === 0 && d === 0 + // 待删除单元id + if (!isAnchorTd) { + mergeTdIdList.push(td.id!) + } + // 列合并 + if (t === 0 && d !== 0) { + anchorTd.colspan += td.colspan + } + // 行合并 + if (t !== 0) { + if (anchorTd.colIndex === td.colIndex) { + anchorTd.rowspan += td.rowspan + } + } + } + } + // 移除多余单元格 + for (let t = 0; t < curTrList.length; t++) { + const tr = curTrList[t] + let d = 0 + while (d < tr.tdList.length) { + const td = tr.tdList[d] + if (mergeTdIdList.includes(td.id!)) { + tr.tdList.splice(d, 1) + d-- + } + d++ + } + } + // 设置上下文信息 + this.position.setPositionContext({ + ...positionContext, + trIndex: anchorTd.trIndex, + tdIndex: anchorTd.tdIndex + }) + const curIndex = anchorTd.value.length - 1 + this.range.setRange(curIndex, curIndex) + // 重新渲染 + this.draw.render() + this.tableTool.render() } public cancelMergeTableCell() { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.cancelMergeTableCell() - } - - public splitVerticalTableCell() { - const isReadonly = this.draw.isReadonly() - if (isReadonly) return - this.tableOperate.splitVerticalTableCell() - } - - public splitHorizontalTableCell() { - const isReadonly = this.draw.isReadonly() - if (isReadonly) return - this.tableOperate.splitHorizontalTableCell() + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index, tdIndex, trIndex } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + const curTrList = element.trList! + const curTr = curTrList[trIndex!]! + const curTd = curTr.tdList[tdIndex!] + if (curTd.rowspan === 1 && curTd.colspan === 1) return + const colspan = curTd.colspan + // 设置跨列 + if (curTd.colspan > 1) { + for (let c = 1; c < curTd.colspan; c++) { + const tdId = getUUID() + curTr.tdList.splice(tdIndex! + c, 0, { + id: tdId, + rowspan: 1, + colspan: 1, + value: [ + { + value: ZERO, + size: 16, + tableId: element.id, + trId: curTr.id, + tdId + } + ] + }) + } + curTd.colspan = 1 + } + // 设置跨行 + if (curTd.rowspan > 1) { + for (let r = 1; r < curTd.rowspan; r++) { + const tr = curTrList[trIndex! + r] + for (let c = 0; c < colspan; c++) { + const tdId = getUUID() + tr.tdList.splice(curTd.colIndex!, 0, { + id: tdId, + rowspan: 1, + colspan: 1, + value: [ + { + value: ZERO, + size: 16, + tableId: element.id, + trId: tr.id, + tdId + } + ] + }) + } + } + curTd.rowspan = 1 + } + // 重新渲染 + const curIndex = curTd.value.length - 1 + this.range.setRange(curIndex, curIndex) + this.draw.render() + this.tableTool.render() } public tableTdVerticalAlign(payload: VerticalAlign) { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.tableTdVerticalAlign(payload) - } - - public tableBorderType(payload: TableBorder) { - const isReadonly = this.draw.isReadonly() - if (isReadonly) return - this.tableOperate.tableBorderType(payload) + const rowCol = this.draw.getTableParticle().getRangeRowCol() + if (!rowCol) return + for (let r = 0; r < rowCol.length; r++) { + const row = rowCol[r] + for (let c = 0; c < row.length; c++) { + const td = row[c] + if ( + !td || + td.verticalAlign === payload || + (!td.verticalAlign && payload === VerticalAlign.TOP) + ) { + continue + } + // 重设垂直对齐方式 + td.verticalAlign = payload + } + } + const { endIndex } = this.range.getRange() + this.draw.render({ + curIndex: endIndex + }) } - public tableBorderColor(payload: string) { + public tableBorderType(payload: TableBorder) { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.tableBorderColor(payload) + const positionContext = this.position.getPositionContext() + if (!positionContext.isTable) return + const { index } = positionContext + const originalElementList = this.draw.getOriginalElementList() + const element = originalElementList[index!] + if ( + (!element.borderType && payload === TableBorder.ALL) || + element.borderType === payload + ) { + return + } + element.borderType = payload + const { endIndex } = this.range.getRange() + this.draw.render({ + curIndex: endIndex + }) } public tableTdBorderType(payload: TdBorder) { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.tableTdBorderType(payload) + const rowCol = this.draw.getTableParticle().getRangeRowCol() + if (!rowCol) return + const tdList = rowCol.flat() + // 存在则设置边框类型,否则取消设置 + const isSetBorderType = tdList.some( + td => !td.borderTypes?.includes(payload) + ) + tdList.forEach(td => { + if (!td.borderTypes) { + td.borderTypes = [] + } + const borderTypeIndex = td.borderTypes.findIndex(type => type === payload) + if (isSetBorderType) { + if (!~borderTypeIndex) { + td.borderTypes.push(payload) + } + } else { + if (~borderTypeIndex) { + td.borderTypes.splice(borderTypeIndex, 1) + } + } + // 不存在边框设置时删除字段 + if (!td.borderTypes.length) { + delete td.borderTypes + } + }) + const { endIndex } = this.range.getRange() + this.draw.render({ + curIndex: endIndex + }) } public tableTdSlashType(payload: TdSlash) { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.tableTdSlashType(payload) + const rowCol = this.draw.getTableParticle().getRangeRowCol() + if (!rowCol) return + const tdList = rowCol.flat() + // 存在则设置单元格斜线类型,否则取消设置 + const isSetTdSlashType = tdList.some( + td => !td.slashTypes?.includes(payload) + ) + tdList.forEach(td => { + if (!td.slashTypes) { + td.slashTypes = [] + } + const slashTypeIndex = td.slashTypes.findIndex(type => type === payload) + if (isSetTdSlashType) { + if (!~slashTypeIndex) { + td.slashTypes.push(payload) + } + } else { + if (~slashTypeIndex) { + td.slashTypes.splice(slashTypeIndex, 1) + } + } + // 不存在斜线设置时删除字段 + if (!td.slashTypes.length) { + delete td.slashTypes + } + }) + const { endIndex } = this.range.getRange() + this.draw.render({ + curIndex: endIndex + }) } public tableTdBackgroundColor(payload: string) { const isReadonly = this.draw.isReadonly() if (isReadonly) return - this.tableOperate.tableTdBackgroundColor(payload) + const rowCol = this.draw.getTableParticle().getRangeRowCol() + if (!rowCol) return + for (let r = 0; r < rowCol.length; r++) { + const row = rowCol[r] + for (let c = 0; c < row.length; c++) { + const col = row[c] + col.backgroundColor = payload + } + } + const { endIndex } = this.range.getRange() + this.range.setRange(endIndex, endIndex) + this.draw.render({ + isCompute: false + }) } public tableSelectAll() { - this.tableOperate.tableSelectAll() + const positionContext = this.position.getPositionContext() + const { index, tableId, isTable } = positionContext + if (!isTable || !tableId) return + const { startIndex, endIndex } = this.range.getRange() + const originalElementList = this.draw.getOriginalElementList() + const trList = originalElementList[index!].trList! + // 最后单元格位置 + const endTrIndex = trList.length - 1 + const endTdIndex = trList[endTrIndex].tdList.length - 1 + this.range.replaceRange({ + startIndex, + endIndex, + tableId, + startTdIndex: 0, + endTdIndex, + startTrIndex: 0, + endTrIndex + }) + this.draw.render({ + isCompute: false, + isSubmitHistory: false + }) } public hyperlink(payload: IElement) { @@ -1208,14 +1946,12 @@ export class CommandAdapt { const isReadonly = this.draw.isReadonly() if (isReadonly) return const options = this.draw.getOptions() - const { color, size, opacity, font, gap } = defaultWatermarkOption + const { color, size, opacity, font } = defaultWatermarkOption options.watermark.data = payload.data options.watermark.color = payload.color || color options.watermark.size = payload.size || size options.watermark.opacity = payload.opacity || opacity options.watermark.font = payload.font || font - options.watermark.repeat = !!payload.repeat - options.watermark.gap = payload.gap || gap this.draw.render({ isSetCursor: false, isSubmitHistory: false, @@ -1237,24 +1973,22 @@ export class CommandAdapt { } } - public image(payload: IDrawImagePayload): string | null { + public image(payload: IDrawImagePayload) { const isDisabled = this.draw.isReadonly() || this.draw.isDisabled() - if (isDisabled) return null + if (isDisabled) return const { startIndex, endIndex } = this.range.getRange() - if (!~startIndex && !~endIndex) return null - const { id, value, width, height, imgDisplay } = payload - const imageId = id || getUUID() + if (!~startIndex && !~endIndex) return + const { value, width, height, imgDisplay } = payload this.insertElementList([ { value, width, height, - id: imageId, + id: getUUID(), type: ElementType.IMAGE, imgDisplay } ]) - return imageId } public search(payload: string | null) { @@ -1291,8 +2025,116 @@ export class CommandAdapt { return this.searchManager.getSearchNavigateInfo() } - public replace(payload: string, option?: IReplaceOption) { - this.draw.getSearch().replace(payload, option) + public replace(payload: string) { + const isReadonly = this.draw.isReadonly() + if (isReadonly) return + if (!payload || new RegExp(`${ZERO}`, 'g').test(payload)) return + const matchList = this.draw.getSearch().getSearchMatchList() + if (!matchList.length) return + // 匹配index变化的差值 + let pageDiffCount = 0 + let tableDiffCount = 0 + // 匹配搜索词的组标识 + let curGroupId = '' + // 表格上下文 + let curTdId = '' + // 搜索值 > 替换值:增加元素;搜索值 < 替换值:减少元素 + let firstMatchIndex = -1 + const elementList = this.draw.getOriginalElementList() + for (let m = 0; m < matchList.length; m++) { + const match = matchList[m] + if (match.type === EditorContext.TABLE) { + const { tableIndex, trIndex, tdIndex, index, tdId } = match + if (curTdId && tdId !== curTdId) { + tableDiffCount = 0 + } + curTdId = tdId! + const curTableIndex = tableIndex! + pageDiffCount + const tableElementList = + elementList[curTableIndex].trList![trIndex!].tdList[tdIndex!].value + // 表格内元素 + const curIndex = index + tableDiffCount + const tableElement = tableElementList[curIndex] + if (curGroupId === match.groupId) { + this.draw.spliceElementList(tableElementList, curIndex, 1) + tableDiffCount-- + continue + } + for (let p = 0; p < payload.length; p++) { + const value = payload[p] + if (p === 0) { + tableElement.value = value + } else { + this.draw.spliceElementList(tableElementList, curIndex + p, 0, [ + { + ...tableElement, + value + } + ]) + tableDiffCount++ + } + } + } else { + const curIndex = match.index + pageDiffCount + const element = elementList[curIndex] + if ( + element.type === ElementType.CONTROL && + element.controlComponent !== ControlComponent.VALUE + ) { + continue + } + if (!~firstMatchIndex) { + firstMatchIndex = m + } + if (curGroupId === match.groupId) { + this.draw.spliceElementList(elementList, curIndex, 1) + pageDiffCount-- + continue + } + for (let p = 0; p < payload.length; p++) { + const value = payload[p] + if (p === 0) { + element.value = value + } else { + this.draw.spliceElementList(elementList, curIndex + p, 0, [ + { + ...element, + value + } + ]) + pageDiffCount++ + } + } + } + curGroupId = match.groupId + } + if (!~firstMatchIndex) return + // 定位-首个被匹配关键词后 + const firstMatch = matchList[firstMatchIndex] + const firstIndex = firstMatch.index + (payload.length - 1) + if (firstMatch.type === EditorContext.TABLE) { + const { tableIndex, trIndex, tdIndex, index } = firstMatch + const element = + elementList[tableIndex!].trList![trIndex!].tdList[tdIndex!].value[index] + this.position.setPositionContext({ + isTable: true, + index: tableIndex, + trIndex, + tdIndex, + tdId: element.tdId, + trId: element.trId, + tableId: element.tableId + }) + } else { + this.position.setPositionContext({ + isTable: false + }) + } + this.range.setRange(firstIndex, firstIndex) + // 重新渲染 + this.draw.render({ + curIndex: firstIndex + }) } public async print() { @@ -1320,6 +2162,8 @@ export class CommandAdapt { const elementList = this.draw.getElementList() const element = elementList[startIndex] if (!element || element.type !== ElementType.IMAGE) return + // 替换图片 + element.id = getUUID() element.value = payload this.draw.render({ isSetCursor: false @@ -1375,12 +2219,6 @@ export class CommandAdapt { return this.draw.getValue(options) } - public getAreaValue( - options?: IGetAreaValueOption - ): IGetAreaValueResult | null { - return this.draw.getArea().getAreaValue(options) - } - public getHTML(): IEditorHTML { const options = this.options const headerElementList = this.draw.getHeaderElementList() @@ -1408,10 +2246,6 @@ export class CommandAdapt { return this.workerManager.getWordCount() } - public getCursorPosition(): IElementPosition | null { - return this.position.getCursorPosition() - } - public getRange(): IRange { return deepClone(this.range.getRange()) } @@ -1511,20 +2345,6 @@ export class CommandAdapt { tableElement = zipElementList([originTableElement])[0] } } - // 标题信息 - let titleId: string | null = null - let titleStartPageNo: number | null = null - let start = startIndex - 1 - while (start > 0) { - const curElement = elementList[start] - const preElement = elementList[start - 1] - if (curElement.titleId && curElement.titleId !== preElement?.titleId) { - titleId = curElement.titleId - titleStartPageNo = positionList[start].pageNo - break - } - start-- - } return deepClone({ isCollapsed, startElement, @@ -1538,9 +2358,7 @@ export class CommandAdapt { tdIndex: tdIndex ?? null, tableElement, selectionText, - selectionElementList, - titleId, - titleStartPageNo + selectionElementList }) } @@ -1558,46 +2376,10 @@ export class CommandAdapt { return this.range.getKeywordRangeList(payload) } - public getKeywordContext(payload: string): ISearchResultContext[] | null { - const rangeList = this.getKeywordRangeList(payload) - if (!rangeList.length) return null - const searchResultContextList: ISearchResultContext[] = [] - const positionList = this.position.getOriginalMainPositionList() - const elementList = this.draw.getOriginalMainElementList() - for (let r = 0; r < rangeList.length; r++) { - const range = rangeList[r] - const { startIndex, endIndex, tableId, startTrIndex, startTdIndex } = - range - let keywordPositionList: IElementPosition[] = positionList - if (range.tableId) { - const tableElement = elementList.find(el => el.id === tableId) - if (tableElement) { - keywordPositionList = - tableElement.trList?.[startTrIndex!]?.tdList?.[startTdIndex!] - ?.positionList || [] - } - } - // 获取关键词始末位置 - const startPosition = deepClone(keywordPositionList[startIndex]) - const endPosition = deepClone(keywordPositionList[endIndex]) - searchResultContextList.push({ - range, - startPosition, - endPosition - }) - } - return searchResultContextList - } - public pageMode(payload: PageMode) { this.draw.setPageMode(payload) } - public pageScale(scale: number) { - if (scale === this.options.scale) return - this.draw.setPageScale(scale) - } - public pageScaleRecovery() { const { scale } = this.options if (scale !== 1) { @@ -1637,22 +2419,6 @@ export class CommandAdapt { return this.draw.setPaperMargin(payload) } - public setMainBadge(payload: IBadge | null) { - this.draw.getBadge().setMainBadge(payload) - this.draw.render({ - isCompute: false, - isSubmitHistory: false - }) - } - - public setAreaBadge(payload: IAreaBadge[]) { - this.draw.getBadge().setAreaBadgeMap(payload) - this.draw.render({ - isCompute: false, - isSubmitHistory: false - }) - } - public insertElementList(payload: IElement[]) { if (!payload.length) return const isDisabled = this.draw.isReadonly() || this.draw.isDisabled() @@ -1679,217 +2445,60 @@ export class CommandAdapt { } public updateElementById(payload: IUpdateElementByIdOption) { - const { id, conceptId } = payload - if (!id && !conceptId) return - const updateElementInfoList: { - elementList: IElement[] - index: number - }[] = [] - function getElementInfoById(elementList: IElement[]) { - let i = 0 - while (i < elementList.length) { - const element = elementList[i] - i++ - if (element.type === ElementType.TABLE) { - const trList = element.trList! - for (let r = 0; r < trList.length; r++) { - const tr = trList[r] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - getElementInfoById(td.value) - } - } - } - if ( - (id && element.id === id) || - (conceptId && element.conceptId === conceptId) - ) { - updateElementInfoList.push({ - elementList, - index: i - 1 - }) + function getElementIndexById(elementList: IElement[]): number { + for (let e = 0; e < elementList.length; e++) { + const element = elementList[e] + if (element.id === payload.id) { + return e } } + return -1 } // 优先正文再页眉页脚 - const data = [ - this.draw.getOriginalMainElementList(), - this.draw.getHeaderElementList(), - this.draw.getFooterElementList() + const getElementListFnList = [ + this.draw.getOriginalMainElementList, + this.draw.getHeaderElementList, + this.draw.getFooterElementList ] - for (const elementList of data) { - getElementInfoById(elementList) - } - // 更新内容 - if (!updateElementInfoList.length) return - for (let i = 0; i < updateElementInfoList.length; i++) { - const { elementList, index } = updateElementInfoList[i] - // 重新格式化元素 - const newElement = zipElementList([ - { - ...elementList[index], + for (const getElementList of getElementListFnList) { + const elementList = getElementList.call(this.draw) + const elementIndex = getElementIndexById(elementList) + if (~elementIndex) { + elementList[elementIndex] = { + ...elementList[elementIndex], ...payload.properties } - ]) - formatElementList(newElement, { - isHandleFirstElement: false, - editorOptions: this.options - }) - elementList[index] = newElement[0] - } - this.draw.render({ - isSetCursor: false - }) - } - - public deleteElementById(payload: IDeleteElementByIdOption) { - const { id, conceptId } = payload - if (!id && !conceptId) return - let isExistDelete = false - function deleteElement(elementList: IElement[]) { - let i = 0 - while (i < elementList.length) { - const element = elementList[i] - if (element.type === ElementType.TABLE) { - const trList = element.trList! - for (let r = 0; r < trList.length; r++) { - const tr = trList[r] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - deleteElement(td.value) - } - } - } - if ( - (id && element.id === id) || - (conceptId && element.conceptId === conceptId) - ) { - isExistDelete = true - elementList.splice(i, 1) - i-- - } - i++ - } - } - // 优先正文再页眉页脚 - const data = [ - this.draw.getOriginalMainElementList(), - this.draw.getHeaderElementList(), - this.draw.getFooterElementList() - ] - for (const elementList of data) { - deleteElement(elementList) - } - if (!isExistDelete) return - this.draw.render({ - isSetCursor: false - }) - } - - public getElementById(payload: IGetElementByIdOption): IElement[] { - const { id, conceptId } = payload - const result: IElement[] = [] - if (!id && !conceptId) return result - const getElement = (elementList: IElement[]) => { - let i = 0 - while (i < elementList.length) { - const element = elementList[i] - i++ - if (element.type === ElementType.TABLE) { - const trList = element.trList! - for (let r = 0; r < trList.length; r++) { - const tr = trList[r] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - getElement(td.value) - } - } - } - if ( - (id && element.id !== id) || - (conceptId && element.conceptId !== conceptId) - ) { - continue - } - result.push(element) + formatElementList([elementList[elementIndex]], { + isHandleFirstElement: false, + editorOptions: this.options + }) + this.draw.render({ + isSetCursor: false + }) + break } } - const data = [ - this.draw.getHeaderElementList(), - this.draw.getOriginalMainElementList(), - this.draw.getFooterElementList() - ] - for (const elementList of data) { - getElement(elementList) - } - return zipElementList(result, { - extraPickAttrs: ['id'] - }) } public setValue(payload: Partial, options?: ISetValueOption) { this.draw.setValue(payload, options) } - public removeControl(payload?: IRemoveControlOption) { - if (payload?.id || payload?.conceptId) { - const { id, conceptId } = payload - let isExistRemove = false - const remove = (elementList: IElement[]) => { - let i = elementList.length - 1 - while (i >= 0) { - const element = elementList[i] - if (element.type === ElementType.TABLE) { - const trList = element.trList! - for (let r = 0; r < trList.length; r++) { - const tr = trList[r] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - remove(td.value) - } - } - } - i-- - if ( - !element.control || - (id && element.controlId !== id) || - (conceptId && element.control.conceptId !== conceptId) - ) { - continue - } - isExistRemove = true - elementList.splice(i + 1, 1) - } - } - const data = [ - this.draw.getHeaderElementList(), - this.draw.getOriginalMainElementList(), - this.draw.getFooterElementList() - ] - for (const elementList of data) { - remove(elementList) - } - if (isExistRemove) { - this.draw.render({ - isSetCursor: false - }) - } - } else { - const { startIndex, endIndex } = this.range.getRange() - if (startIndex !== endIndex) return - const elementList = this.draw.getElementList() - const element = elementList[startIndex] - if (!element.controlId) return - // 删除控件 - const control = this.draw.getControl() - const newIndex = control.removeControl(startIndex) - if (newIndex === null) return - // 重新渲染 - this.range.setRange(newIndex, newIndex) - this.draw.render({ - curIndex: newIndex - }) - } + public removeControl() { + const { startIndex, endIndex } = this.range.getRange() + if (startIndex !== endIndex) return + const elementList = this.draw.getElementList() + const element = elementList[startIndex] + if (!element.controlId) return + // 删除控件 + const control = this.draw.getControl() + const newIndex = control.removeControl(startIndex) + if (newIndex === null) return + // 重新渲染 + this.range.setRange(newIndex, newIndex) + this.draw.render({ + curIndex: newIndex + }) } public setLocale(payload: string) { @@ -1905,7 +2514,7 @@ export class CommandAdapt { } public locationCatalog(titleId: string) { - const elementList = this.draw.getOriginalMainElementList() + const elementList = this.draw.getMainElementList() let newIndex = -1 for (let e = 0; e < elementList.length; e++) { const element = elementList[e] @@ -1918,9 +2527,6 @@ export class CommandAdapt { } } if (!~newIndex) return - this.position.setPositionContext({ - isTable: false - }) this.range.setRange(newIndex, newIndex) this.draw.render({ curIndex: newIndex, @@ -2096,17 +2702,7 @@ export class CommandAdapt { curIndex -= 1 if ( element.controlComponent !== ControlComponent.PLACEHOLDER && - element.controlComponent !== ControlComponent.POSTFIX && - element.controlComponent !== ControlComponent.POST_TEXT - ) { - continue - } - } else { - if ( - (element.controlComponent !== ControlComponent.PREFIX && - element.controlComponent !== ControlComponent.PRE_TEXT) || - elementList[i]?.controlComponent === ControlComponent.PREFIX || - elementList[i]?.controlComponent === ControlComponent.PRE_TEXT + element.controlComponent !== ControlComponent.POSTFIX ) { continue } @@ -2167,8 +2763,7 @@ export class CommandAdapt { const cloneAttr = [ ...TABLE_CONTEXT_ATTR, ...EDITOR_ROW_ATTR, - ...LIST_CONTEXT_ATTR, - ...AREA_CONTEXT_ATTR + ...LIST_CONTEXT_ATTR ] cloneProperty(cloneAttr, copyElement, cloneElement) // 插入控件 @@ -2246,12 +2841,10 @@ export class CommandAdapt { } public getPositionContextByEvent( - evt: MouseEvent, - options: IPositionContextByEventOption = {} - ): IPositionContextByEventResult | null { + evt: MouseEvent + ): IPositionContextByEvent | null { const pageIndex = (evt.target)?.dataset.index if (!pageIndex) return null - const { isMustDirectHit = true } = options const pageNo = Number(pageIndex) const positionContext = this.position.getPositionByXY({ x: evt.offsetX, @@ -2268,14 +2861,8 @@ export class CommandAdapt { zone } = positionContext // 非直接命中或选区不一致时返回空值 - if ( - (isMustDirectHit && !isDirectHit) || - (zone && zone !== this.zone.getZone()) - ) { - return null - } + if (!isDirectHit || (zone && zone !== this.zone.getZone())) return null // 命中元素信息 - let tableInfo: ITableInfoByEvent | null = null let element: IElement | null = null const elementList = this.draw.getOriginalElementList() let position: IElementPosition | null = null @@ -2284,11 +2871,6 @@ export class CommandAdapt { const td = elementList[index!].trList?.[trIndex!].tdList[tdIndex!] element = td?.value[tdValueIndex!] || null position = td?.positionList?.[tdValueIndex!] || null - tableInfo = { - element: elementList[index!], - trIndex: trIndex!, - tdIndex: tdIndex! - } } else { element = elementList[index] || null position = positionList[index] || null @@ -2313,8 +2895,7 @@ export class CommandAdapt { return { pageNo, element, - rangeRect, - tableInfo + rangeRect } } @@ -2330,8 +2911,7 @@ export class CommandAdapt { const cloneAttr = [ ...TABLE_CONTEXT_ATTR, ...EDITOR_ROW_ATTR, - ...LIST_CONTEXT_ATTR, - ...AREA_CONTEXT_ATTR + ...LIST_CONTEXT_ATTR ] cloneElement.valueList?.forEach(valueItem => { cloneProperty(cloneAttr, copyElement, valueItem) @@ -2358,40 +2938,33 @@ export class CommandAdapt { direction: MoveDirection.DOWN }) } + public getParagraphId(): any | null { + const cursorPosition = this.position.getCursorPosition() + if (!cursorPosition) return null + const elementList = this.draw.getOriginalElementList() + const index = cursorPosition.index + const positionList = this.position.getPositionList() + if ((index && index === -1) || index >= elementList.length) return null + const element = elementList[index ? index : index + 1] // для индекса равного 0 прибавляем один + const coordinates = + positionList[elementList.findIndex(elem => elem?.id === element?.id)] + .coordinate + let isList = false + if (element?.listId) { + isList = true + } - public insertArea(payload: IInsertAreaOption) { - return this.draw.getArea().insertArea(payload) - } - - public setAreaProperties(payload: ISetAreaPropertiesOption) { - this.draw.getArea().setAreaProperties(payload) + return element && element.id + ? { currentId: element.id, coordinates, isList } + : elementList[index + 1] && elementList[index + 1].id + ? { currentId: elementList[index + 1].id } + : null } - public locationArea(areaId: string) { - const context = this.draw.getArea().getContextByAreaId(areaId) - if (!context) return - const { - range: { endIndex }, - elementPosition - } = context - this.position.setPositionContext({ - isTable: false - }) - this.range.setRange(endIndex, endIndex) - this.draw.render({ - isSetCursor: false, - isCompute: false, - isSubmitHistory: false - }) - // 移动到可见区域 - const cursor = this.draw.getCursor() - this.position.setCursorPosition(elementPosition) - cursor.drawCursor({ - hitLineStartIndex: endIndex - }) - cursor.moveCursorToVisible({ - cursorPosition: elementPosition, - direction: MoveDirection.UP - }) + public setParagraphIndent( + ids: string | string[], + spacing: { before?: number; after?: number; firstLine?: number } + ) { + this.draw.setParagraphIndentById(ids, spacing) } } diff --git a/src/editor/core/contextmenu/menus/tableMenus.ts b/src/editor/core/contextmenu/menus/tableMenus.ts index bcb5a9756..25f9f9b2e 100644 --- a/src/editor/core/contextmenu/menus/tableMenus.ts +++ b/src/editor/core/contextmenu/menus/tableMenus.ts @@ -13,9 +13,7 @@ const { BORDER, BORDER_ALL, BORDER_EMPTY, - BORDER_DASH, BORDER_EXTERNAL, - BORDER_INTERNAL, BORDER_TD, BORDER_TD_TOP, BORDER_TD_LEFT, @@ -75,15 +73,6 @@ export const tableMenus: IRegisterContextMenu[] = [ command.executeTableBorderType(TableBorder.EMPTY) } }, - { - key: BORDER_DASH, - i18nPath: 'contextmenu.table.borderDash', - icon: 'border-dash', - when: () => true, - callback: (command: Command) => { - command.executeTableBorderType(TableBorder.DASH) - } - }, { key: BORDER_EXTERNAL, i18nPath: 'contextmenu.table.borderExternal', @@ -93,15 +82,6 @@ export const tableMenus: IRegisterContextMenu[] = [ command.executeTableBorderType(TableBorder.EXTERNAL) } }, - { - key: BORDER_INTERNAL, - i18nPath: 'contextmenu.table.borderInternal', - icon: 'border-internal', - when: () => true, - callback: (command: Command) => { - command.executeTableBorderType(TableBorder.INTERNAL) - } - }, { key: BORDER_TD, i18nPath: 'contextmenu.table.borderTd', diff --git a/src/editor/core/cursor/Cursor.ts b/src/editor/core/cursor/Cursor.ts index db08651aa..b01d5feae 100644 --- a/src/editor/core/cursor/Cursor.ts +++ b/src/editor/core/cursor/Cursor.ts @@ -6,7 +6,6 @@ import { ICursorOption } from '../../interface/Cursor' import { IEditorOption } from '../../interface/Editor' import { IElementPosition } from '../../interface/Element' import { findScrollContainer } from '../../utils' -import { isMobile } from '../../utils/ua' import { Draw } from '../draw/Draw' import { CanvasEvent } from '../event/CanvasEvent' import { Position } from '../position/Position' @@ -91,17 +90,6 @@ export class Cursor { } } - public focus() { - // 移动端只读模式禁用聚焦避免唤起输入法,web端允许聚焦避免事件无法捕获 - if (isMobile && this.draw.isReadonly()) return - const agentCursorDom = this.cursorAgent.getAgentCursorDom() - // 光标不聚焦时重新定位 - if (document.activeElement !== agentCursorDom) { - agentCursorDom.focus() - agentCursorDom.setSelectionRange(0, 0) - } - } - public drawCursor(payload?: IDrawCursorOption) { let cursorPosition = this.position.getCursorPosition() if (!cursorPosition) return @@ -141,7 +129,11 @@ export class Cursor { const agentCursorDom = this.cursorAgent.getAgentCursorDom() if (isFocus) { setTimeout(() => { - this.focus() + // 光标不聚焦时重新定位 + if (document.activeElement !== agentCursorDom) { + agentCursorDom.focus() + agentCursorDom.setSelectionRange(0, 0) + } }) } // fillText位置 + 文字基线到底部距离 - 模拟光标偏移量 diff --git a/src/editor/core/draw/Draw.ts b/src/editor/core/draw/Draw.ts index fe8518157..aa0b98a8d 100644 --- a/src/editor/core/draw/Draw.ts +++ b/src/editor/core/draw/Draw.ts @@ -1,4 +1,3 @@ -import { version } from '../../../../package.json' import { ZERO } from '../../dataset/constant/Common' import { RowFlex } from '../../dataset/enum/Row' import { @@ -20,8 +19,8 @@ import { } from '../../interface/Editor' import { IElement, - IElementMetrics, IElementFillRect, + IElementMetrics, IElementStyle } from '../../interface/Element' import { IRow, IRowElement } from '../../interface/Row' @@ -31,6 +30,10 @@ import { CanvasEvent } from '../event/CanvasEvent' import { GlobalEvent } from '../event/GlobalEvent' import { HistoryManager } from '../history/HistoryManager' import { Listener } from '../listener/Listener' +import { + ICursorPositionChange, + IParagraphIndentChange +} from '../../interface/Listener' import { Position } from '../position/Position' import { RangeManager } from '../range/RangeManager' import { Background } from './frame/Background' @@ -50,10 +53,10 @@ import { TableParticle } from './particle/table/TableParticle' import { TableTool } from './particle/table/TableTool' import { HyperlinkParticle } from './particle/HyperlinkParticle' import { Header } from './frame/Header' -import { SuperscriptParticle } from './particle/SuperscriptParticle' -import { SubscriptParticle } from './particle/SubscriptParticle' -import { SeparatorParticle } from './particle/SeparatorParticle' -import { PageBreakParticle } from './particle/PageBreakParticle' +import { SuperscriptParticle } from './particle/Superscript' +import { SubscriptParticle } from './particle/Subscript' +import { SeparatorParticle } from './particle/Separator' +import { PageBreakParticle } from './particle/PageBreak' import { Watermark } from './frame/Watermark' import { EditorComponent, @@ -66,6 +69,7 @@ import { import { Control } from './control/Control' import { deleteSurroundElementList, + formatElementList, getIsBlockElement, getSlimCloneElementList, pickSurroundElementList, @@ -78,7 +82,6 @@ import { ControlComponent, ControlIndentation } from '../../dataset/enum/Control' -import { formatElementList } from '../../utils/element' import { WorkerManager } from '../worker/WorkerManager' import { Previewer } from './particle/previewer/Previewer' import { DateParticle } from './particle/date/DateParticle' @@ -99,7 +102,7 @@ import { EventBus } from '../event/eventbus/EventBus' import { EventBusMap } from '../../interface/EventBus' import { Group } from './interactive/Group' import { Override } from '../override/Override' -import { FlexDirection, ImageDisplay } from '../../dataset/enum/Common' +import { ImageDisplay } from '../../dataset/enum/Common' import { PUNCTUATION_REG } from '../../dataset/constant/Regular' import { LineBreakParticle } from './particle/LineBreakParticle' import { MouseObserver } from '../observer/MouseObserver' @@ -107,9 +110,6 @@ import { LineNumber } from './frame/LineNumber' import { PageBorder } from './frame/PageBorder' import { ITd } from '../../interface/table/Td' import { Actuator } from '../actuator/Actuator' -import { TableOperate } from './particle/table/TableOperate' -import { Area } from './interactive/Area' -import { Badge } from './frame/Badge' export class Draw { private container: HTMLDivElement @@ -117,7 +117,6 @@ export class Draw { private pageList: HTMLCanvasElement[] private ctxList: CanvasRenderingContext2D[] private pageNo: number - private renderCount: number private pagePixelRatio: number | null private mode: EditorMode private options: DeepRequired @@ -135,10 +134,8 @@ export class Draw { private range: RangeManager private margin: Margin private background: Background - private badge: Badge private search: Search private group: Group - private area: Area private underline: Underline private strikeout: Strikeout private highlight: Highlight @@ -149,7 +146,6 @@ export class Draw { private textParticle: TextParticle private tableParticle: TableParticle private tableTool: TableTool - private tableOperate: TableOperate private pageNumber: PageNumber private lineNumber: LineNumber private waterMark: Watermark @@ -184,6 +180,9 @@ export class Draw { private intersectionPageNo: number private lazyRenderIntersectionObserver: IntersectionObserver | null private printModeData: Required | null + public onLastPageReached = () => { + /* empty */ + } constructor( rootContainer: HTMLElement, @@ -197,7 +196,6 @@ export class Draw { this.pageList = [] this.ctxList = [] this.pageNo = 0 - this.renderCount = 0 this.pagePixelRatio = null this.mode = options.mode this.options = options @@ -205,7 +203,6 @@ export class Draw { this.listener = listener this.eventBus = eventBus this.override = override - this._formatContainer() this.pageContainer = this._createPageContainer() this._createPage(0) @@ -217,10 +214,8 @@ export class Draw { this.range = new RangeManager(this) this.margin = new Margin(this) this.background = new Background(this) - this.badge = new Badge(this) this.search = new Search(this) this.group = new Group(this) - this.area = new Area(this) this.underline = new Underline(this) this.strikeout = new Strikeout(this) this.highlight = new Highlight(this) @@ -230,7 +225,6 @@ export class Draw { this.textParticle = new TextParticle(this) this.tableParticle = new TableParticle(this) this.tableTool = new TableTool(this) - this.tableOperate = new TableOperate(this) this.pageNumber = new PageNumber(this) this.lineNumber = new LineNumber(this) this.waterMark = new Watermark(this) @@ -251,7 +245,7 @@ export class Draw { this.control = new Control(this) this.pageBorder = new PageBorder(this) - this.scrollObserver = new ScrollObserver(this) + this.scrollObserver = new ScrollObserver(this, this.onLastPageReached) this.selectionObserver = new SelectionObserver(this) this.imageObserver = new ImageObserver() new MouseObserver(this) @@ -264,7 +258,6 @@ export class Draw { this.workerManager = new WorkerManager(this) new Actuator(this) - const { letterClass } = options this.LETTER_REG = new RegExp(`[${letterClass.join('')}]`) this.WORD_LIKE_REG = new RegExp( @@ -329,9 +322,6 @@ export class Draw { } public isReadonly() { - if (this.area.getActiveAreaId()) { - return this.area.isReadonly() - } switch (this.mode) { case EditorMode.DESIGN: return false @@ -520,10 +510,6 @@ export class Draw { this.pageNo = payload } - public getRenderCount(): number { - return this.renderCount - } - public getPage(pageNo = -1): HTMLCanvasElement { return this.pageList[~pageNo ? pageNo : this.pageNo] } @@ -580,14 +566,6 @@ export class Draw { return this.group } - public getArea(): Area { - return this.area - } - - public getBadge(): Badge { - return this.badge - } - public getHistoryManager(): HistoryManager { return this.historyManager } @@ -668,55 +646,239 @@ export class Draw { return null } - public insertElementList(payload: IElement[]) { + public insertElementList( + payload: IElement[], + isCopied?: boolean, + startIndex2?: number, + endIndex2?: number + ) { + startIndex2 = startIndex2 ?? 0 + endIndex2 = endIndex2 ?? payload.length + console.time('paste') if (!payload.length || !this.range.getIsCanInput()) return + const { startIndex, endIndex } = this.range.getRange() if (!~startIndex && !~endIndex) return + formatElementList(payload, { isHandleFirstElement: false, editorOptions: this.options }) - let curIndex = -1 - // 判断是否在控件内 + + let currentIndex = -1 + let activeControl = this.control.getActiveControl() - // 光标在控件内如果当前没有被激活,需要手动激活 + if (!activeControl && this.control.getIsRangeWithinControl()) { this.control.initControl() activeControl = this.control.getActiveControl() } + if (activeControl && this.control.getIsRangeWithinControl()) { - curIndex = activeControl.setValue(payload, undefined, { + currentIndex = activeControl.setValue(payload, undefined, { isIgnoreDisabledRule: true }) - this.control.emitControlContentChange() } else { const elementList = this.getElementList() const isCollapsed = startIndex === endIndex - const start = startIndex + 1 - if (!isCollapsed) { - this.spliceElementList(elementList, start, endIndex - startIndex) + const insertPosition = startIndex + 1 + const initialStartIndex2 = startIndex2 || 0 + const pageRowList = this.getPageRowList() + const position = this.getPosition() + const positionList = position.getPositionList() + const cursorPosition = position.getCursorPosition() + const marginTop = this.getMainOuterHeight() + const currentPageRows = pageRowList[cursorPosition?.pageNo ?? 0] || [] + + // Вычисляем текущую высоту страницы до места вставки + let currentPageHeight = + currentPageRows.reduce( + (acc, currentRow) => acc + currentRow.height, + 0 + ) + + marginTop + + 50 + + const pageHeight = this.getHeight() + + // Если вставка происходит при копировании, определяем границы вставки + if (isCopied) { + if (!cursorPosition) return + + currentPageHeight -= currentPageRows[cursorPosition.rowIndex]?.height + startIndex2 += 1 + + let rowIndex = cursorPosition.rowIndex + + // Проверяем, пока есть свободное место на странице и элементы для вставки + while (currentPageHeight < pageHeight && startIndex2 < endIndex2) { + const innerWidth = this.getInnerWidth() + const currentRow = currentPageRows[rowIndex] + let availableWidth = innerWidth - (currentRow?.width || 0) + + // Размещение элементов в текущей строке, пока хватает ширины + while (availableWidth > 0 && startIndex2 < endIndex2) { + if (positionList[startIndex2]?.value === ZERO) { + startIndex2++ + break + } + availableWidth -= positionList[startIndex2]?.metrics.width + startIndex2++ + } + rowIndex++ + + if (startIndex2 < endIndex2) { + currentPageHeight += + currentPageRows[positionList[startIndex2].rowIndex].height + } + } + + // Проверяем, находится ли курсор ниже разделителя сноски (если есть) + const footnoteRowIndexInPage = currentPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + + // let isCursorUnderSeparator = false + if (footnoteRowIndexInPage !== -1) { + const cursorRowIndexInPage = + cursorPosition.rowIndex - + pageRowList + .slice(0, cursorPosition.pageNo) + .reduce((acc, pageRows) => acc + pageRows.length, 0) + + if (cursorRowIndexInPage > footnoteRowIndexInPage) { + // isCursorUnderSeparator = true + } + } + } + + if (isCopied) { + // Количество элементов, которые мы можем вставить до окончания места + const elementsToPushBefore = startIndex2 - initialStartIndex2 + + // Если выделение не схлопнуто, сначала удаляем выбранный диапазон + if (!isCollapsed) { + this.spliceElementList( + elementList, + insertPosition, + endIndex - startIndex + ) + } + + // Проверяем позицию разделителя сноски на текущей странице + const footnoteRowIndexInPage = currentPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + + // Подсчитываем количество элементов под разделителем, если страница переполнена + const elementUnderSeparatorAmount = + currentPageRows + .filter( + (_, index) => + index > footnoteRowIndexInPage && currentPageHeight > pageHeight + ) + .reduce( + (sum, currentRow) => sum + currentRow.elementList.length, + 0 + ) + 3 || 0 + + // Если текущая высота превысила высоту страницы, разбиваем вставку + if (currentPageHeight > pageHeight && isCopied) { + // Вставляем часть элементов + this.spliceElementList( + elementList, + insertPosition, + 0, + payload.splice(0, elementsToPushBefore + 1) + ) + + this.spliceElementList( + elementList, + insertPosition + elementsToPushBefore + 1, + 0, + [{ value: ZERO }] + ) + + this.spliceElementList(elementList, elementList.length, 0, [ + { + value: ZERO + } + ]) + + this.spliceElementList( + elementList, + elementList.length, + 0, + payload.slice(elementsToPushBefore, -1) + ) + currentIndex = + startIndex + payload.length + elementUnderSeparatorAmount + } + // const chunkSize = 10000; + // for (let i = 0; i < payload.length; i += chunkSize) { + // const chunk = payload.slice(i, i + chunkSize); + // this.spliceElementList( + // elementList, + // insertPosition, + // 0, + // ...chunk, + // ); + // } + this.spliceElementList(elementList, insertPosition, 0, payload) + currentIndex = startIndex + payload.length + } else { + // Иначе вставляем весь список сразу + this.spliceElementList(elementList, insertPosition, 0, payload) + currentIndex = startIndex + payload.length + } + const rowIndexInElementList = elementList.findLastIndex( + (el, index) => + el?.listId === payload[0]?.listId && + el.value === ZERO && + index <= insertPosition + ) + + const isEmpty = elementList.find( + (el, index) => + index < currentIndex && + index > rowIndexInElementList && + el.type !== ElementType.TAB + ) + + if ( + payload[0]?.type === ElementType.TAB && + !isEmpty && + rowIndexInElementList >= 0 && + rowIndexInElementList < elementList.length + ) { + elementList[rowIndexInElementList].listLevel = + (elementList[rowIndexInElementList].listLevel ?? 0) + 1 } - this.spliceElementList(elementList, start, 0, payload) - curIndex = startIndex + payload.length - // 列表前如有换行符则删除-因为列表内已存在 - const preElement = elementList[start - 1] + + const preElement = elementList[insertPosition - 1] + if ( - payload[0].listId && + payload[0]?.listId && preElement && - !preElement.listId && + !preElement?.listId && preElement?.value === ZERO && - (!preElement.type || preElement.type === ElementType.TEXT) + (!preElement?.type || preElement?.type === ElementType.TEXT) ) { elementList.splice(startIndex, 1) - curIndex -= 1 + currentIndex -= 1 } } - if (~curIndex) { - this.range.setRange(curIndex, curIndex) + if (~currentIndex) { + this.range.setRange(currentIndex, currentIndex) this.render({ - curIndex + curIndex: currentIndex }) } + console.timeEnd('paste') } public appendElementList( @@ -782,7 +944,6 @@ export class Draw { const deleteElement = elementList[deleteIndex] if ( isDesignMode || - deleteElement?.control?.hide || (tdDeletable !== false && deleteElement?.control?.deletable !== false && deleteElement?.title?.deletable !== false) @@ -839,10 +1000,6 @@ export class Draw { return this.tableTool } - public getTableOperate(): TableOperate { - return this.tableOperate - } - public getTableParticle(): TableParticle { return this.tableParticle } @@ -1110,6 +1267,7 @@ export class Draw { public getValue(options: IGetValueOption = {}): IEditorResult { const { pageNo, extraPickAttrs } = options let mainElementList = this.elementList + if ( Number.isInteger(pageNo) && pageNo! >= 0 && @@ -1124,15 +1282,14 @@ export class Draw { extraPickAttrs }), main: zipElementList(mainElementList, { - extraPickAttrs, - isClassifyArea: true + extraPickAttrs }), footer: zipElementList(this.getFooterElementList(), { extraPickAttrs }) } return { - version, + version: '1', data, options: deepClone(this.options) } @@ -1259,7 +1416,9 @@ export class Draw { ) } - public computeRowList(payload: IComputeRowListPayload) { + public computeRowList( + payload: IComputeRowListPayload & { startIndex?: number } + ) { const { innerWidth, elementList, @@ -1271,11 +1430,12 @@ export class Draw { mainOuterHeight = 0, surroundElementList = [] } = payload + const currentStartIndex = payload.startIndex || 0 const { defaultSize, defaultRowMargin, scale, - table: { tdPadding, defaultTrMinHeight }, + table: { tdPadding }, defaultTabWidth } = this.options const defaultBasicRowMarginHeight = this.getDefaultBasicRowMarginHeight() @@ -1284,16 +1444,25 @@ export class Draw { // 计算列表偏移宽度 const listStyleMap = this.listParticle.computeListStyle(ctx, elementList) const rowList: IRow[] = [] - if (elementList.length) { + let rowsCount = -1 + let curRowChunked: IRow | null = null + if ( + currentStartIndex && + elementList[0]?.id === this.elementList[currentStartIndex - 1]?.id + ) { + curRowChunked = this.rowList[this.rowList.length - 1] + } else if (elementList.length) { rowList.push({ width: 0, height: 0, ascent: 0, elementList: [], - startIndex: 0, + startIndex: currentStartIndex, rowIndex: 0, rowFlex: elementList?.[0]?.rowFlex || elementList?.[1]?.rowFlex }) + rowsCount++ + curRowChunked = null } // 起始位置及页码计算 let x = startX @@ -1301,35 +1470,78 @@ export class Draw { let pageNo = 0 // 列表位置 let listId: string | undefined - let listIndex = 0 + const listIndex = 0 + const secondListIndex = 0 + let indexes: number[] = [] // 控件最小宽度 let controlRealWidth = 0 + for (let i = 0; i < elementList.length; i++) { - const curRow: IRow = rowList[rowList.length - 1] + let curRow: IRow = rowList[rowList.length - 1] + if (curRowChunked !== null && rowList.length === 0) { + curRow = curRowChunked + } const element = elementList[i] const rowMargin = defaultBasicRowMarginHeight * (element.rowMargin ?? defaultRowMargin) + const metrics: IElementMetrics = { width: 0, height: 0, boundingBoxAscent: 0, boundingBoxDescent: 0 } + + let spacingBefore = 0 + let spacingAfter = 0 + let firstLine = 0 + + if (curRow.elementList && curRow.elementList.length > 0) { + //отступ слева + const foundElementBefore = curRow.elementList.find( + el => el.spacing?.before + ) + if (foundElementBefore) { + spacingBefore = foundElementBefore.spacing?.before || 0 + } + + // отступ справа + const foundElementAfter = curRow.elementList.find( + el => el.spacing?.after + ) + if (foundElementAfter) { + spacingAfter = foundElementAfter.spacing?.after || 0 + } + // const currentId = curRow.elementList.find(el => el.id)?.id || null + // const isFirstRowInParagraph = rowList.findIndex(row => + // row.elementList.find(el => el.id === currentId) + // ) + // Вычисляем firstLine отступ для первой строки + const foundElementFirstLine = curRow.elementList.find( + el => el.spacing?.firstLine + ) + if (foundElementFirstLine) { + firstLine = foundElementFirstLine?.spacing?.firstLine || 0 + } + } // 实际可用宽度 const offsetX = curRow.offsetX || (element.listId && listStyleMap.get(element.listId)) || 0 - const availableWidth = innerWidth - offsetX + //уменьшаем доступную ширину на величину отступов для переноса элементов на следующую строку + const currentId = curRow.elementList.find(el => el.id)?.id || null + const isFirstRowInParagraph = rowList.findIndex(row => + row.elementList.find(el => el.id === currentId) + ) + let availableWidth = innerWidth - offsetX - spacingBefore - spacingAfter + if (isFirstRowInParagraph === rowsCount) { + availableWidth -= firstLine + availableWidth += spacingBefore + } // 增加起始位置坐标偏移量 - const isStartElement = curRow.elementList.length === 1 - x += isStartElement ? offsetX : 0 - y += isStartElement ? curRow.offsetY || 0 : 0 - if (element.control?.hide && !this.isDesignMode()) { - metrics.height = - curRow.elementList[curRow.elementList.length - 1]?.metrics.height || - this.options.defaultSize * scale - } else if ( + x += curRow.elementList.length === 1 ? offsetX : 0 + if ( element.type === ElementType.IMAGE || element.type === ElementType.LATEX ) { @@ -1388,16 +1600,10 @@ export class Draw { } } element.pagingIndex = element.pagingIndex ?? 0 - const trList = element.trList! - // 计算前移除上一次的高度 - for (let t = 0; t < trList.length; t++) { - const tr = trList[t] - tr.height = tr.minHeight || defaultTrMinHeight - tr.minHeight = tr.height - } // 计算表格行列 this.tableParticle.computeRowColInfo(element) // 计算表格内元素信息 + const trList = element.trList! for (let t = 0; t < trList.length; t++) { const tr = trList[t] for (let d = 0; d < tr.tdList.length; d++) { @@ -1419,11 +1625,6 @@ export class Draw { changeTr.height += extraHeight changeTr.tdList.forEach(changeTd => { changeTd.height! += extraHeight - if (!changeTd.realHeight) { - changeTd.realHeight = changeTd.height! - } else { - changeTd.realHeight! += extraHeight - } }) } // 当前单元格最小高度及真实高度(包含跨列) @@ -1465,7 +1666,6 @@ export class Draw { changeTr.height -= reduceHeight changeTr.tdList.forEach(changeTd => { changeTd.height! -= reduceHeight - changeTd.realHeight! -= reduceHeight }) } } @@ -1482,10 +1682,6 @@ export class Draw { metrics.height = elementHeight metrics.boundingBoxDescent = elementHeight metrics.boundingBoxAscent = -rowMargin - // 后一个元素也是表格则移除行间距 - if (elementList[i + 1]?.type === ElementType.TABLE) { - metrics.boundingBoxAscent -= rowMargin - } // 表格分页处理(拆分表格) if (isPagingMode) { const height = this.getHeight() @@ -1493,21 +1689,20 @@ export class Draw { let curPagePreHeight = marginHeight for (let r = 0; r < rowList.length; r++) { const row = rowList[r] - const rowOffsetY = row.offsetY || 0 if ( - row.height + curPagePreHeight + rowOffsetY > height || + row.height + curPagePreHeight > height || rowList[r - 1]?.isPageBreak ) { - curPagePreHeight = marginHeight + row.height + rowOffsetY + curPagePreHeight = marginHeight + row.height } else { - curPagePreHeight += row.height + rowOffsetY + curPagePreHeight += row.height } } // 当前剩余高度是否能容下当前表格第一行(可拆分)的高度,排除掉表头类型 const rowMarginHeight = rowMargin * 2 * scale - const firstTrHeight = element.trList![0].height! * scale if ( - curPagePreHeight + firstTrHeight + rowMarginHeight > height || + curPagePreHeight + element.trList![0].height! + rowMarginHeight > + height || (element.pagingIndex !== 0 && element.trList![0].pagingRepeat) ) { // 无可拆分行则切换至新页 @@ -1551,12 +1746,11 @@ export class Draw { (pre, cur) => pre + cur.height, 0 ) - const cloneTrRealHeight = cloneTrHeight * scale const pagingId = element.pagingId || getUUID() element.pagingId = pagingId element.height -= cloneTrHeight - metrics.height -= cloneTrRealHeight - metrics.boundingBoxDescent -= cloneTrRealHeight + metrics.height -= cloneTrHeight + metrics.boundingBoxDescent -= cloneTrHeight // 追加拆分表格 const cloneElement = deepClone(element) cloneElement.pagingId = pagingId @@ -1698,13 +1892,16 @@ export class Draw { controlRealWidth += metrics.width } if (rowElement.controlComponent === ControlComponent.POSTFIX) { - // 设置最小宽度控件属性(字符偏移量) - this.control.setMinWidthControlInfo({ - row: curRow, - rowElement, - availableWidth, - controlRealWidth - }) + const extraWidth = rowElement.control.minWidth - controlRealWidth + // 消费超出实际最小宽度的长度 + if (extraWidth > 0) { + // 超出行宽时截断 + const rowRemainingWidth = + availableWidth - curRow.width - metrics.width + const left = Math.min(rowRemainingWidth, extraWidth) * scale + rowElement.left = left + curRow.width += left + } controlRealWidth = 0 } } @@ -1743,12 +1940,38 @@ export class Draw { } // 列表信息 if (element.listId) { + // if (element.listId !== listId) { + // listIndex = 0; + // secondListIndex = 0; + // indexes = [] + // } + // if(element.listLevel >= 1) { + // secondListIndex++ + // }else if (element.value === ZERO && !element.listWrap) { + // secondListIndex = 0 + // listIndex++; + // } + const currentLevel = element.listLevel || 0 + if (element.listId !== listId) { - listIndex = 0 - } else if (element.value === ZERO && !element.listWrap) { - listIndex++ + // Начинаем новый список, сбрасываем `indexes` + indexes = [] + } + + // Убедимся, что `indexes` имеет достаточную длину + while (indexes.length <= currentLevel) { + indexes.push(0) + } + + if (element.value === ZERO && !element.listWrap) { + // Увеличиваем счетчик на текущем уровне + indexes[currentLevel]++ + + // Сбрасываем счетчики более глубоких уровней + indexes = indexes.slice(0, currentLevel + 1) } } + listId = element.listId // 计算四周环绕导致的元素偏移量 const surroundPosition = this.position.setSurroundPosition({ @@ -1777,11 +2000,6 @@ export class Draw { preElement?.imgDisplay === ImageDisplay.INLINE || element.imgDisplay === ImageDisplay.INLINE || preElement?.listId !== element.listId || - preElement?.areaId !== element.areaId || - (element.control?.flexDirection === FlexDirection.COLUMN && - (element.controlComponent === ControlComponent.CHECKBOX || - element.controlComponent === ControlComponent.RADIO) && - preElement?.controlComponent === ControlComponent.VALUE) || (i !== 0 && element.value === ZERO) // 是否宽度不足导致换行 const isWidthNotEnough = curRowWidth > availableWidth @@ -1791,7 +2009,8 @@ export class Draw { const row: IRow = { width: metrics.width, height, - startIndex: i, + startIndex: currentStartIndex + i, + // startIndex: i, elementList: [rowElement], ascent, rowIndex: curRow.rowIndex + 1, @@ -1823,24 +2042,19 @@ export class Draw { // 列表缩进 if (element.listId) { row.isList = true - row.offsetX = listStyleMap.get(element.listId!) + row.offsetX = + listStyleMap.get(element.listId!)! + + (row.elementList[0].listLevel ?? 0 * defaultTabWidth - 6) row.listIndex = listIndex + row.indexes = indexes.slice(0) + row.secondListIndex = secondListIndex } - // Y轴偏移量 - row.offsetY = - !isFromTable && - element.area?.top && - element.areaId !== elementList[i - 1]?.areaId - ? element.area.top * scale - : 0 rowList.push(row) + rowsCount++ } else { curRow.width += metrics.width // 减小块元素前第一行空行行高 - if ( - i === 0 && - (getIsBlockElement(elementList[1]) || !!elementList[1]?.areaId) - ) { + if (i === 0 && getIsBlockElement(elementList[1])) { curRow.height = defaultBasicRowMarginHeight curRow.ascent = defaultBasicRowMarginHeight } else if (curRow.height < height) { @@ -1857,8 +2071,7 @@ export class Draw { if ( !curRow.isSurround && (preElement?.rowFlex === RowFlex.JUSTIFY || - (preElement?.rowFlex === RowFlex.ALIGNMENT && - curRow.isWidthNotEnough)) + (preElement?.rowFlex === RowFlex.ALIGNMENT && isWidthNotEnough)) ) { // 忽略换行符及尾部元素间隔设置 const rowElementList = @@ -1910,6 +2123,7 @@ export class Draw { x += metrics.width } } + return rowList } @@ -1926,10 +2140,7 @@ export class Draw { if (pageMode === PageMode.CONTINUITY) { pageRowList[0] = this.rowList // 重置高度 - pageHeight += this.rowList.reduce( - (pre, cur) => pre + cur.height + (cur.offsetY || 0), - 0 - ) + pageHeight += this.rowList.reduce((pre, cur) => pre + cur.height, 0) const dpr = this.getPagePixelRatio() const pageDom = this.pageList[0] const pageDomHeight = Number(pageDom.style.height.replace('px', '')) @@ -1945,20 +2156,19 @@ export class Draw { } else { for (let i = 0; i < this.rowList.length; i++) { const row = this.rowList[i] - const rowOffsetY = row.offsetY || 0 if ( - row.height + rowOffsetY + pageHeight > height || + row.height + pageHeight > height || this.rowList[i - 1]?.isPageBreak ) { if (Number.isInteger(maxPageNo) && pageNo >= maxPageNo!) { this.elementList = this.elementList.slice(0, row.startIndex) break } - pageHeight = marginHeight + row.height + rowOffsetY + pageHeight = marginHeight + row.height pageRowList.push([row]) pageNo++ } else { - pageHeight += row.height + rowOffsetY + pageHeight += row.height pageRowList[pageNo].push(row) } } @@ -2064,10 +2274,7 @@ export class Draw { } = positionList[curRow.startIndex + j] const preElement = curRow.elementList[j - 1] // 元素绘制 - if (element.control?.hide && !this.isDesignMode()) { - // 控件隐藏时不绘制 - this.textParticle.complete() - } else if (element.type === ElementType.IMAGE) { + if (element.type === ElementType.IMAGE) { this.textParticle.complete() // 浮动图片单独绘制 if ( @@ -2214,9 +2421,10 @@ export class Draw { offsetY = this.subscriptParticle.getOffsetY(element) } // 占位符不参与颜色计算 - const color = element.control?.underline - ? this.options.underlineColor - : element.color + const color = + element.controlComponent === ControlComponent.PLACEHOLDER + ? undefined + : element.color this.underline.recordFillInfo( ctx, x - offsetX, @@ -2425,7 +2633,6 @@ export class Draw { lineNumber, pageBorder } = this.options - const isPrintMode = this.mode === EditorMode.PRINT const innerWidth = this.getInnerWidth() const ctx = this.ctxList[pageNo] // 判断当前激活区域-非正文区域时元素透明度降低 @@ -2433,16 +2640,8 @@ export class Draw { this._clearPage(pageNo) // 绘制背景 this.background.render(ctx, pageNo) - // 绘制区域 - if (!isPrintMode) { - this.area.render(ctx, pageNo) - } - // 绘制水印 - if (pageMode !== PageMode.CONTINUITY && this.options.watermark.data) { - this.waterMark.render(ctx, pageNo) - } // 绘制页边距 - if (!isPrintMode) { + if (this.mode !== EditorMode.PRINT) { this.margin.render(ctx, pageNo) } // 渲染衬于文字下方元素 @@ -2451,9 +2650,7 @@ export class Draw { imgDisplays: [ImageDisplay.FLOAT_BOTTOM] }) // 控件高亮 - if (!isPrintMode) { - this.control.renderHighlightList(ctx, pageNo) - } + this.control.renderHighlightList(ctx, pageNo) // 渲染元素 const index = rowList[0]?.startIndex this.drawRow(ctx, { @@ -2485,9 +2682,13 @@ export class Draw { imgDisplays: [ImageDisplay.FLOAT_TOP, ImageDisplay.SURROUND] }) // 搜索匹配绘制 - if (!isPrintMode && this.search.getSearchKeyword()) { + if (this.search.getSearchKeyword()) { this.search.render(ctx, pageNo) } + // 绘制水印 + if (pageMode !== PageMode.CONTINUITY && this.options.watermark.data) { + this.waterMark.render(ctx) + } // 绘制空白占位符 if (this.elementList.length <= 1 && !this.elementList[0]?.listId) { this.placeholder.render(ctx) @@ -2500,8 +2701,6 @@ export class Draw { if (!pageBorder.disabled) { this.pageBorder.render(ctx) } - // 绘制签章 - this.badge.render(ctx, pageNo) } private _disconnectLazyRender() { @@ -2544,7 +2743,6 @@ export class Draw { } public render(payload?: IDrawOption) { - this.renderCount++ const { header, footer } = this.options const { isSubmitHistory = true, @@ -2558,8 +2756,6 @@ export class Draw { let { curIndex } = payload || {} const innerWidth = this.getInnerWidth() const isPagingMode = this.getIsPagingMode() - // 缓存当前页数信息 - const oldPageSize = this.pageRowList.length // 计算文档信息 if (isCompute) { // 清空浮动元素位置信息 @@ -2582,31 +2778,40 @@ export class Draw { const startX = margins[3] const startY = margins[0] + extraHeight const surroundElementList = pickSurroundElementList(this.elementList) - this.rowList = this.computeRowList({ - startX, - startY, - pageHeight, - mainOuterHeight, - isPagingMode, - innerWidth, - surroundElementList, - elementList: this.elementList - }) + const maxChunkSize = 1000 + const elementListChunks = [] + + for (let i = 0; i < this.elementList.length; i += maxChunkSize) { + elementListChunks.push(this.elementList.slice(i, i + maxChunkSize)) + } + this.rowList = [] + let currentStartIndex = 0 + for (const chunk of elementListChunks) { + const rowListChunk = this.computeRowList({ + startX, + startY, + pageHeight, + mainOuterHeight, + isPagingMode, + innerWidth, + surroundElementList, + elementList: chunk, + startIndex: currentStartIndex + }) + currentStartIndex += chunk.length + this.rowList = this.rowList.concat(rowListChunk) + } // 页面信息 this.pageRowList = this._computePageList() // 位置信息 this.position.computePositionList() - // 区域信息 - this.area.compute() - if (this.mode !== EditorMode.PRINT) { - // 搜索信息 - const searchKeyword = this.search.getSearchKeyword() - if (searchKeyword) { - this.search.compute(searchKeyword) - } - // 控件关键词高亮 - this.control.computeHighlightList() + // 搜索信息 + const searchKeyword = this.search.getSearchKeyword() + if (searchKeyword) { + this.search.compute(searchKeyword) } + // 控件关键词高亮 + this.control.computeHighlightList() } // 清除光标等副作用 this.imageObserver.clearAll() @@ -2637,9 +2842,6 @@ export class Draw { // 光标重绘 if (isSetCursor) { curIndex = this.setCursor(curIndex) - } else if (this.range.getIsSelection()) { - // 存在选区时仅定位避免事件无法捕获 - this.cursor.focus() } // 历史记录用于undo、redo(非首次渲染内容变更 || 第一次存在光标时) if ( @@ -2650,8 +2852,6 @@ export class Draw { } // 信息变动回调 nextTick(() => { - // 选区样式 - this.range.setRangeStyle() // 重新唤起弹窗类控件 if (isCompute && this.control.getActiveControl()) { this.control.reAwakeControl() @@ -2668,14 +2868,12 @@ export class Draw { if (isCompute && !this.zone.isMainActive()) { this.zone.drawZoneIndicator() } - // 页数改变 - if (oldPageSize !== this.pageRowList.length) { - if (this.listener.pageSizeChange) { - this.listener.pageSizeChange(this.pageRowList.length) - } - if (this.eventBus.isSubscribe('pageSizeChange')) { - this.eventBus.emit('pageSizeChange', this.pageRowList.length) - } + // 页面尺寸改变 + if (this.listener.pageSizeChange) { + this.listener.pageSizeChange(this.pageRowList.length) + } + if (this.eventBus.isSubscribe('pageSizeChange')) { + this.eventBus.emit('pageSizeChange', this.pageRowList.length) } // 文档内容改变 if ((isSubmitHistory || isSourceHistory) && !isInit) { @@ -2706,6 +2904,14 @@ export class Draw { this.position.setCursorPosition( curIndex !== undefined ? positionList[curIndex] : null ) + if (curIndex !== undefined) { + const cursorPositionChange: ICursorPositionChange = (index: number) => { + return index + } + cursorPositionChange(curIndex) + + this.eventBus.emit('cursorPositionChange', curIndex) + } } // 定位到图片元素并且位置发生变化 let isShowCursor = true @@ -2774,4 +2980,78 @@ export class Draw { // 日期控件 this.getDateParticle().clearDatePicker() } + + public setParagraphIndentById( + ids: string | string[], + spacing: { before?: number; after?: number; firstLine?: number } + ) { + const isDisabled = this.isReadonly() || this.isDisabled() + if (isDisabled) return + const idArray = Array.isArray(ids) ? ids : [ids] + const elementList = this.getOriginalElementList() + let spacingDiffernce = 0 + const foundElement = elementList.find(el => el.id === ids) + if (spacing.firstLine) + spacingDiffernce = + spacing?.firstLine - (foundElement?.spacing?.firstLine ?? 0) + const updatedElements = elementList.map(element => { + if (element.id && idArray.includes(element.id)) { + const existingSpacing = element.spacing || {} + + return { + ...element, + spacing: { + ...existingSpacing, + before: + spacing.before !== undefined + ? spacing.before + : existingSpacing.before, + after: + spacing.after !== undefined + ? spacing.after + : existingSpacing.after, + firstLine: + spacing.firstLine !== undefined + ? spacing.firstLine + : existingSpacing.firstLine + } + } + } + return element + }) + const positionList = this.position.getPositionList() + let coordinates = null + if (ids !== null) { + if (Array.isArray(ids)) + coordinates = + positionList[elementList.findIndex(elem => elem?.id === ids[0])] + .coordinate + else { + coordinates = + positionList[elementList.findIndex(elem => elem?.id === ids)] + .coordinate + } + } + let posX = 0 + let posY + if (coordinates) { + posX = coordinates.leftTop[0] - 25 + (spacingDiffernce || 0) + posY = (coordinates.leftTop[1] + coordinates.leftBottom[1]) / 2 + 2 + } + if (ids !== undefined) { + const paragraphIndentChange: IParagraphIndentChange = () => { + return ids + } + paragraphIndentChange({ ids, x: posX, y: posY }) + + this.eventBus.emit('paragraphIndentChange', { + ids, + x: posX, + y: posY + }) + } + this.setEditorData({ main: updatedElements }) + this.elementList = updatedElements + this.render() + } } diff --git a/src/editor/core/draw/control/Control.ts b/src/editor/core/draw/control/Control.ts index df45c8d75..cce30d17c 100644 --- a/src/editor/core/draw/control/Control.ts +++ b/src/editor/core/draw/control/Control.ts @@ -1,23 +1,15 @@ -import { - ControlComponent, - ControlState, - ControlType -} from '../../../dataset/enum/Control' +import { ControlComponent, ControlType } from '../../../dataset/enum/Control' import { EditorZone } from '../../../dataset/enum/Editor' import { ElementType } from '../../../dataset/enum/Element' import { DeepRequired } from '../../../interface/Common' import { IControl, - IControlChangeOption, - IControlChangeResult, - IControlContentChangeResult, IControlContext, IControlHighlight, IControlInitOption, IControlInstance, IControlOption, IControlRuleOption, - IDestroyControlOption, IGetControlValueOption, IGetControlValueResult, IInitNextControlOption, @@ -25,18 +17,22 @@ import { IRepaintControlOption, ISetControlExtensionOption, ISetControlProperties, - ISetControlRowFlexOption, ISetControlValueOption } from '../../../interface/Control' import { IEditorData, IEditorOption } from '../../../interface/Editor' import { IElement, IElementPosition } from '../../../interface/Element' import { EventBusMap } from '../../../interface/EventBus' import { IRange } from '../../../interface/Range' -import { deepClone, omitObject, pickObject, splitText } from '../../../utils' +import { + deepClone, + nextTick, + omitObject, + pickObject, + splitText +} from '../../../utils' import { formatElementContext, formatElementList, - getNonHideElementIndex, pickElementAttr, zipElementList } from '../../../utils/element' @@ -51,17 +47,12 @@ import { ControlBorder } from './richtext/Border' import { SelectControl } from './select/SelectControl' import { TextControl } from './text/TextControl' import { DateControl } from './date/DateControl' -import { NumberControl } from './number/NumberControl' import { MoveDirection } from '../../../dataset/enum/Observer' import { - CONTROL_CONTEXT_ATTR, CONTROL_STYLE_ATTR, LIST_CONTEXT_ATTR, TITLE_CONTEXT_ATTR } from '../../../dataset/constant/Element' -import { IRowElement } from '../../../interface/Row' -import { RowFlex } from '../../../dataset/enum/Row' -import { ZERO } from '../../../dataset/constant/Common' interface IMoveCursorResult { newIndex: number @@ -77,7 +68,6 @@ export class Control { private options: DeepRequired private controlOptions: IControlOption private activeControl: IControlInstance | null - private activeControlValue: IElement[] constructor(draw: Draw) { this.controlBorder = new ControlBorder(draw) @@ -91,7 +81,6 @@ export class Control { this.options = draw.getOptions() this.controlOptions = this.options.control this.activeControl = null - this.activeControlValue = [] } // 搜索高亮匹配 @@ -119,7 +108,7 @@ export class Control { // 过滤控件辅助元素(前后缀、背景提示) public filterAssistElement(elementList: IElement[]): IElement[] { - return elementList.filter((element, index) => { + return elementList.filter(element => { if (element.type === ElementType.TABLE) { const trList = element.trList! for (let r = 0; r < trList.length; r++) { @@ -139,42 +128,6 @@ export class Control { element.value = '' return true } - } else { - // 控件存在值时无需过滤前后文本 - if ( - element.control?.preText && - element.controlComponent === ControlComponent.PRE_TEXT - ) { - let isExistValue = false - let start = index + 1 - while (start < elementList.length) { - const nextElement = elementList[start] - if (element.controlId !== nextElement.controlId) break - if (nextElement.controlComponent === ControlComponent.VALUE) { - isExistValue = true - break - } - start++ - } - return isExistValue - } - if ( - element.control?.postText && - element.controlComponent === ControlComponent.POST_TEXT - ) { - let isExistValue = false - let start = index - 1 - while (start < elementList.length) { - const preElement = elementList[start] - if (element.controlId !== preElement.controlId) break - if (preElement.controlComponent === ControlComponent.VALUE) { - isExistValue = true - break - } - start-- - } - return isExistValue - } } return ( element.controlComponent !== ControlComponent.PREFIX && @@ -228,7 +181,7 @@ export class Control { const startElement = elementList[startIndex] const endElement = elementList[endIndex] if ( - startElement?.controlId && + startElement.controlId && startElement.controlId === endElement.controlId && endElement.controlComponent !== ControlComponent.POSTFIX ) { @@ -267,19 +220,6 @@ export class Control { return !!this.activeControl.getElement()?.control?.disabled } - public getIsDisabledPasteControl(context: IControlContext = {}): boolean { - if (this.draw.isDesignMode() || !this.activeControl) return false - const { startIndex, endIndex } = context.range || this.range.getRange() - if (startIndex === endIndex && ~startIndex && ~endIndex) { - const elementList = context.elementList || this.getElementList() - const startElement = elementList[startIndex] - if (startElement.controlComponent === ControlComponent.POSTFIX) { - return false - } - } - return !!this.activeControl.getElement()?.control?.pasteDisabled - } - public getContainer(): HTMLDivElement { return this.draw.getContainer() } @@ -313,38 +253,9 @@ export class Control { return this.activeControl } - public getControlElementList(context: IControlContext = {}): IElement[] { - const elementList = context.elementList || this.getElementList() - const { startIndex } = context.range || this.getRange() - const startElement = elementList[startIndex] - if (!startElement?.controlId) return [] - const data: IElement[] = [] - // 向左查找 - let preIndex = startIndex - while (preIndex > 0) { - const preElement = elementList[preIndex] - if (preElement.controlId !== startElement.controlId) break - data.unshift(preElement) - preIndex-- - } - // 向右查找 - let nextIndex = startIndex + 1 - while (nextIndex < elementList.length) { - const nextElement = elementList[nextIndex] - if (nextElement.controlId !== startElement.controlId) break - data.push(nextElement) - nextIndex++ - } - return data - } - - public updateActiveControlValue() { - if (this.activeControl) { - this.activeControlValue = this.getControlElementList() - } - } - public initControl() { + const isReadonly = this.draw.isReadonly() + if (isReadonly) return const elementList = this.getElementList() const range = this.getRange() const element = elementList[range.startIndex] @@ -362,17 +273,11 @@ export class Control { } } const controlElement = this.activeControl.getElement() - if (element.controlId === controlElement.controlId) { - // 更新缓存控件数据 - this.updateActiveControlValue() - return - } + if (element.controlId === controlElement.controlId) return } // 销毁旧激活控件 this.destroyControl() // 激活控件 - const isReadonly = this.draw.isReadonly() - if (isReadonly) return const control = element.control! if (control.type === ControlType.TEXT) { this.activeControl = new TextControl(element, this) @@ -388,71 +293,52 @@ export class Control { const dateControl = new DateControl(element, this) this.activeControl = dateControl dateControl.awake() - } else if (control.type === ControlType.NUMBER) { - this.activeControl = new NumberControl(element, this) } - // 缓存控件数据 - this.updateActiveControlValue() // 激活控件回调 - const isSubscribeControlChange = this.eventBus.isSubscribe('controlChange') - if (this.listener.controlChange || isSubscribeControlChange) { - let control: IControl - const value = this.activeControlValue - if (value?.length) { - control = zipElementList(value)[0].control! + nextTick(() => { + const controlChangeListener = this.listener.controlChange + const isSubscribeControlChange = + this.eventBus.isSubscribe('controlChange') + if (!controlChangeListener && !isSubscribeControlChange) return + let payload: IControl + const value = this.activeControl?.getValue() + if (value && value.length) { + payload = zipElementList(value)[0].control! } else { - control = pickElementAttr(deepClone(element)).control! - control.value = [] + payload = pickElementAttr(deepClone(element)).control! } - const payload: IControlChangeResult = { - control, - controlId: element.controlId!, - state: ControlState.ACTIVE + if (controlChangeListener) { + controlChangeListener(payload) } - this.listener.controlChange?.(payload) if (isSubscribeControlChange) { this.eventBus.emit('controlChange', payload) } - } + }) } - public destroyControl(options: IDestroyControlOption = {}) { - if (!this.activeControl) return - const { isEmitEvent = true } = options - if ( - this.activeControl instanceof SelectControl || - this.activeControl instanceof DateControl - ) { - this.activeControl.destroy() - } - // 销毁控件回调 - if (isEmitEvent) { - const isSubscribeControlChange = - this.eventBus.isSubscribe('controlChange') - if (this.listener.controlChange || isSubscribeControlChange) { - let control: IControl - const value = this.activeControlValue - const activeElement = this.activeControl.getElement() - if (value?.length) { - control = zipElementList(value)[0].control! - } else { - control = pickElementAttr(deepClone(activeElement)).control! - control.value = [] - } - const payload: IControlChangeResult = { - control, - controlId: activeElement.controlId!, - state: ControlState.INACTIVE + public destroyControl() { + if (this.activeControl) { + if ( + this.activeControl instanceof SelectControl || + this.activeControl instanceof DateControl + ) { + this.activeControl.destroy() + } + this.activeControl = null + // 销毁控件回调 + nextTick(() => { + const controlChangeListener = this.listener.controlChange + const isSubscribeControlChange = + this.eventBus.isSubscribe('controlChange') + if (!controlChangeListener && !isSubscribeControlChange) return + if (controlChangeListener) { + controlChangeListener(null) } - this.listener.controlChange?.(payload) if (isSubscribeControlChange) { - this.eventBus.emit('controlChange', payload) + this.eventBus.emit('controlChange', null) } - } + }) } - // 清空变量 - this.activeControl = null - this.activeControlValue = [] } public repaintControl(options: IRepaintControlOption = {}) { @@ -481,44 +367,6 @@ export class Control { } } - public emitControlContentChange(options?: IControlChangeOption) { - const isSubscribeControlContentChange = this.eventBus.isSubscribe( - 'controlContentChange' - ) - if ( - !isSubscribeControlContentChange && - !this.listener.controlContentChange - ) { - return - } - const controlElement = - options?.controlElement || this.activeControl?.getElement() - if (!controlElement) return - // 控件被删除不触发事件 - const elementList = options?.context?.elementList || this.getElementList() - const { startIndex } = options?.context?.range || this.getRange() - if (!elementList[startIndex]?.controlId) return - // 格式化回调数据 - const controlValue = - options?.controlValue || this.getControlElementList(options?.context) - let control: IControl - if (controlValue?.length) { - control = zipElementList(controlValue)[0].control! - } else { - control = controlElement.control! - control.value = [] - } - if (!control) return - const payload: IControlContentChangeResult = { - control, - controlId: controlElement.controlId! - } - this.listener.controlContentChange?.(payload) - if (isSubscribeControlContentChange) { - this.eventBus.emit('controlContentChange', payload) - } - } - public reAwakeControl() { if (!this.activeControl) return const elementList = this.getElementList() @@ -546,15 +394,6 @@ export class Control { } else { element = elementList[index] } - // 隐藏元素移动光标 - if (element.control?.hide) { - const nonHideIndex = getNonHideElementIndex(elementList, newIndex) - return { - newIndex: nonHideIndex, - newElement: elementList[nonHideIndex] - } - } - // 控件内移动光标 if (element.controlComponent === ControlComponent.VALUE) { // VALUE-无需移动 return { @@ -574,18 +413,14 @@ export class Control { } startIndex++ } - } else if ( - element.controlComponent === ControlComponent.PREFIX || - element.controlComponent === ControlComponent.PRE_TEXT - ) { - // PREFIX或前文本-移动到最后一个前缀字符后 + } else if (element.controlComponent === ControlComponent.PREFIX) { + // PREFIX-移动到最后一个前缀字符后 let startIndex = newIndex + 1 while (startIndex < elementList.length) { const nextElement = elementList[startIndex] if ( nextElement.controlId !== element.controlId || - (nextElement.controlComponent !== ControlComponent.PREFIX && - nextElement.controlComponent !== ControlComponent.PRE_TEXT) + nextElement.controlComponent !== ControlComponent.PREFIX ) { return { newIndex: startIndex - 1, @@ -594,19 +429,14 @@ export class Control { } startIndex++ } - } else if ( - element.controlComponent === ControlComponent.PLACEHOLDER || - element.controlComponent === ControlComponent.POST_TEXT - ) { - // PLACEHOLDER或后文本-移动到第一个前缀或内容后 + } else if (element.controlComponent === ControlComponent.PLACEHOLDER) { + // PLACEHOLDER-移动到第一个前缀后 let startIndex = newIndex - 1 while (startIndex > 0) { const preElement = elementList[startIndex] if ( preElement.controlId !== element.controlId || - preElement.controlComponent === ControlComponent.VALUE || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { return { newIndex: startIndex, @@ -710,7 +540,7 @@ export class Control { const value = placeholderStrList[p] const newElement: IElement = { ...anchorElementStyleAttr, - value: value === '\n' ? ZERO : value, + value, controlId: startElement.controlId, type: ElementType.CONTROL, control: startElement.control, @@ -733,37 +563,6 @@ export class Control { return this.activeControl.setValue(data) } - public setControlProperties( - properties: Partial, - context: IControlContext = {} - ) { - const elementList = context.elementList || this.getElementList() - const { startIndex } = context.range || this.getRange() - const startElement = elementList[startIndex] - // 向左查找 - let preIndex = startIndex - while (preIndex > 0) { - const preElement = elementList[preIndex] - if (preElement.controlId !== startElement.controlId) break - preElement.control = { - ...preElement.control!, - ...properties - } - preIndex-- - } - // 向右查找 - let nextIndex = startIndex + 1 - while (nextIndex < elementList.length) { - const nextElement = elementList[nextIndex] - if (nextElement.controlId !== startElement.controlId) break - nextElement.control = { - ...nextElement.control!, - ...properties - } - nextIndex++ - } - } - public keydown(evt: KeyboardEvent): number | null { if (!this.activeControl) { throw new Error('active control is null') @@ -779,7 +578,7 @@ export class Control { } public getValueById(payload: IGetControlValueOption): IGetControlValueResult { - const { id, conceptId, areaId } = payload + const { id, conceptId } = payload const result: IGetControlValueResult = [] if (!id && !conceptId) return result const getValue = (elementList: IElement[], zone: EditorZone) => { @@ -801,42 +600,30 @@ export class Control { if ( !element.control || (id && element.controlId !== id) || - (conceptId && element.control.conceptId !== conceptId) || - (areaId && element.areaId !== areaId) + (conceptId && element.control.conceptId !== conceptId) ) { continue } const { type, code, valueSets } = element.control let j = i let textControlValue = '' - const textControlElementList = [] while (j < elementList.length) { const nextElement = elementList[j] if (nextElement.controlId !== element.controlId) break if ( - (type === ControlType.TEXT || - type === ControlType.DATE || - type === ControlType.NUMBER) && + (type === ControlType.TEXT || type === ControlType.DATE) && nextElement.controlComponent === ControlComponent.VALUE ) { textControlValue += nextElement.value - textControlElementList.push( - omitObject(nextElement, CONTROL_CONTEXT_ATTR) - ) } j++ } - if ( - type === ControlType.TEXT || - type === ControlType.DATE || - type === ControlType.NUMBER - ) { + if (type === ControlType.TEXT || type === ControlType.DATE) { result.push({ ...element.control, zone, value: textControlValue || null, - innerText: textControlValue || null, - elementList: zipElementList(textControlElementList) + innerText: textControlValue || null }) } else if ( type === ControlType.SELECT || @@ -883,7 +670,7 @@ export class Control { public setValueById(payload: ISetControlValueOption) { let isExistSet = false - const { id, conceptId, areaId, value, isSubmitHistory = true } = payload + const { id, conceptId, value } = payload if (!id && !conceptId) return // 设置值 const setValue = (elementList: IElement[]) => { @@ -905,8 +692,7 @@ export class Control { if ( !element.control || (id && element.controlId !== id) || - (conceptId && element.control.conceptId !== conceptId) || - (areaId && element.areaId !== areaId) + (conceptId && element.control.conceptId !== conceptId) ) { continue } @@ -932,26 +718,19 @@ export class Control { isIgnoreDisabledRule: true } if (type === ControlType.TEXT) { - const formatValue = Array.isArray(value) - ? value - : value - ? [{ value }] - : [] - if (formatValue.length) { - formatElementList(formatValue, { - isHandleFirstElement: false, - editorOptions: this.options - }) - } + const formatValue = [{ value }] + formatElementList(formatValue, { + isHandleFirstElement: false, + editorOptions: this.options + }) const text = new TextControl(element, this) this.activeControl = text - if (formatValue.length) { + if (value) { text.setValue(formatValue, controlContext, controlRule) } else { text.clearValue(controlContext, controlRule) } } else if (type === ControlType.SELECT) { - if (Array.isArray(value)) continue const select = new SelectControl(element, this) this.activeControl = select if (value) { @@ -960,19 +739,16 @@ export class Control { select.clearSelect(controlContext, controlRule) } } else if (type === ControlType.CHECKBOX) { - if (Array.isArray(value)) continue const checkbox = new CheckboxControl(element, this) this.activeControl = checkbox const codes = value ? value.split(',') : [] checkbox.setSelect(codes, controlContext, controlRule) } else if (type === ControlType.RADIO) { - if (Array.isArray(value)) continue const radio = new RadioControl(element, this) this.activeControl = radio const codes = value ? [value] : [] radio.setSelect(codes, controlContext, controlRule) } else if (type === ControlType.DATE) { - if (Array.isArray(value)) continue const date = new DateControl(element, this) this.activeControl = date if (value) { @@ -980,30 +756,7 @@ export class Control { } else { date.clearSelect(controlContext, controlRule) } - } else if (type === ControlType.NUMBER) { - const formatValue = Array.isArray(value) - ? value - : value - ? [{ value }] - : [] - if (formatValue.length) { - formatElementList(formatValue, { - isHandleFirstElement: false, - editorOptions: this.options - }) - } - const text = new NumberControl(element, this) - this.activeControl = text - if (formatValue.length) { - text.setValue(formatValue, controlContext, controlRule) - } else { - text.clearValue(controlContext, controlRule) - } } - // 控件值变更事件 - this.emitControlContentChange({ - context: controlContext - }) // 模拟控件激活后销毁 this.activeControl = null // 修改后控件结束索引 @@ -1017,9 +770,7 @@ export class Control { } } // 销毁旧控件 - this.destroyControl({ - isEmitEvent: false - }) + this.destroyControl() // 页眉、内容区、页脚同时处理 const data = [ this.draw.getHeaderElementList(), @@ -1030,19 +781,14 @@ export class Control { setValue(elementList) } if (isExistSet) { - // 不保存历史时需清空之前记录,避免还原 - if (!isSubmitHistory) { - this.draw.getHistoryManager().recovery() - } this.draw.render({ - isSubmitHistory, isSetCursor: false }) } } public setExtensionById(payload: ISetControlExtensionOption) { - const { id, conceptId, areaId, extension } = payload + const { id, conceptId, extension } = payload if (!id && !conceptId) return const setExtension = (elementList: IElement[]) => { let i = 0 @@ -1063,21 +809,11 @@ export class Control { if ( !element.control || (id && element.controlId !== id) || - (conceptId && element.control.conceptId !== conceptId) || - (areaId && element.areaId !== areaId) + (conceptId && element.control.conceptId !== conceptId) ) { continue } - // 设置值 - this.setControlProperties( - { - extension - }, - { - elementList, - range: { startIndex: i, endIndex: i } - } - ) + element.control.extension = extension // 修改后控件结束索引 let newEndIndex = i while (newEndIndex < elementList.length) { @@ -1099,16 +835,10 @@ export class Control { } public setPropertiesById(payload: ISetControlProperties) { - const { - id, - conceptId, - areaId, - properties, - isSubmitHistory = true - } = payload + const { id, conceptId, properties } = payload if (!id && !conceptId) return let isExistUpdate = false - const setProperties = (elementList: IElement[]) => { + function setProperties(elementList: IElement[]) { let i = 0 while (i < elementList.length) { const element = elementList[i] @@ -1126,24 +856,16 @@ export class Control { if ( !element.control || (id && element.controlId !== id) || - (conceptId && element.control.conceptId !== conceptId) || - (areaId && element.areaId !== areaId) + (conceptId && element.control.conceptId !== conceptId) ) { continue } isExistUpdate = true - // 设置属性 - this.setControlProperties( - { - ...element.control, - ...properties, - value: element.control.value - }, - { - elementList, - range: { startIndex: i, endIndex: i } - } - ) + element.control = { + ...element.control, + ...properties, + value: element.control.value + } // 控件默认样式 CONTROL_STYLE_ATTR.forEach(key => { const controlStyleProperty = properties[key] @@ -1175,9 +897,7 @@ export class Control { // 强制更新 for (const key in pageComponentData) { const pageComponentKey = key - const elementList = zipElementList(pageComponentData[pageComponentKey]!, { - isClassifyArea: true - }) + const elementList = zipElementList(pageComponentData[pageComponentKey]!) pageComponentData[pageComponentKey] = elementList formatElementList(elementList, { editorOptions: this.options, @@ -1185,12 +905,7 @@ export class Control { }) } this.draw.setEditorData(pageComponentData) - // 不保存历史时需清空之前记录,避免还原 - if (!isSubmitHistory) { - this.draw.getHistoryManager().recovery() - } this.draw.render({ - isSubmitHistory, isSetCursor: false }) } @@ -1293,8 +1008,7 @@ export class Control { const nextElement = elementList[nextIndex] if ( nextElement.controlComponent === ControlComponent.VALUE || - nextElement.controlComponent === ControlComponent.PREFIX || - nextElement.controlComponent === ControlComponent.PRE_TEXT + nextElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -1404,9 +1118,7 @@ export class Control { } if ( !element.controlId || - element.controlId === controlElement.controlId || - elementList[e + 1]?.controlComponent === ControlComponent.PREFIX || - elementList[e + 1]?.controlComponent === ControlComponent.PRE_TEXT + element.controlId === controlElement.controlId ) { continue } @@ -1503,60 +1215,4 @@ export class Control { direction }) } - - public setMinWidthControlInfo(option: ISetControlRowFlexOption) { - const { row, rowElement, controlRealWidth, availableWidth } = option - if (!rowElement.control?.minWidth) return - const { scale } = this.options - const controlMinWidth = rowElement.control.minWidth * scale - // 设置首字符偏移量:如果控件内设置对齐方式&&存在设置最小宽度 - let controlFirstElement: IRowElement | null = null - if ( - rowElement.control?.minWidth && - (rowElement.control?.rowFlex === RowFlex.CENTER || - rowElement.control?.rowFlex === RowFlex.RIGHT) - ) { - // 计算当前控件内容宽度是否超出最小宽度设置 - let controlContentWidth = rowElement.metrics.width - let controlElementIndex = row.elementList.length - 1 - while (controlElementIndex >= 0) { - const controlRowElement = row.elementList[controlElementIndex] - controlContentWidth += controlRowElement.metrics.width - // 找到首字符结束循环 - if ( - row.elementList[controlElementIndex - 1]?.controlComponent === - ControlComponent.PREFIX - ) { - controlFirstElement = controlRowElement - break - } - controlElementIndex-- - } - // 计算首字符偏移量 - if (controlFirstElement) { - if (controlContentWidth < controlMinWidth) { - if (rowElement.control.rowFlex === RowFlex.CENTER) { - controlFirstElement.left = - (controlMinWidth - controlContentWidth) / 2 - } else if (rowElement.control.rowFlex === RowFlex.RIGHT) { - // 最小宽度 - 实际宽度 - 后缀元素宽度 - controlFirstElement.left = - controlMinWidth - controlContentWidth - rowElement.metrics.width - } - } - } - } - // 设置后缀偏移量:消费小于实际最小宽度 - const extraWidth = controlMinWidth - controlRealWidth - if (extraWidth > 0) { - const controlFirstElementLeft = controlFirstElement?.left || 0 - // 超出行宽时截断 - const rowRemainingWidth = - availableWidth - row.width - rowElement.metrics.width - const left = Math.min(rowRemainingWidth, extraWidth) - // 后缀偏移量需减去首字符的偏移量,避免重复偏移 - rowElement.left = left - controlFirstElementLeft - row.width += left - controlFirstElementLeft - } - } } diff --git a/src/editor/core/draw/control/checkbox/CheckboxControl.ts b/src/editor/core/draw/control/checkbox/CheckboxControl.ts index 3bb2f928b..a4251ab41 100644 --- a/src/editor/core/draw/control/checkbox/CheckboxControl.ts +++ b/src/editor/core/draw/control/checkbox/CheckboxControl.ts @@ -40,8 +40,7 @@ export class CheckboxControl implements IControlInstance { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -56,8 +55,7 @@ export class CheckboxControl implements IControlInstance { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { break } @@ -95,8 +93,7 @@ export class CheckboxControl implements IControlInstance { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -112,8 +109,7 @@ export class CheckboxControl implements IControlInstance { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { break } @@ -128,9 +124,6 @@ export class CheckboxControl implements IControlInstance { curIndex: startIndex, isSetCursor: false }) - this.control.emitControlContentChange({ - context - }) } public keydown(evt: KeyboardEvent): number | null { diff --git a/src/editor/core/draw/control/date/DateControl.ts b/src/editor/core/draw/control/date/DateControl.ts index bef84bd8b..23f5c98e2 100644 --- a/src/editor/core/draw/control/date/DateControl.ts +++ b/src/editor/core/draw/control/date/DateControl.ts @@ -60,8 +60,7 @@ export class DateControl implements IControlInstance { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -73,8 +72,7 @@ export class DateControl implements IControlInstance { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { break } @@ -129,8 +127,7 @@ export class DateControl implements IControlInstance { const anchorElement = (startElement.type && !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) || - startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT + startElement.controlComponent === ControlComponent.PREFIX ? pickObject(startElement, [ 'control', 'controlId', @@ -227,9 +224,6 @@ export class DateControl implements IControlInstance { this.control.repaintControl({ curIndex: newIndex }) - this.control.emitControlContentChange({ - context - }) this.destroy() } } @@ -263,9 +257,7 @@ export class DateControl implements IControlInstance { } else { if ( startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT || endElement.controlComponent === ControlComponent.POSTFIX || - endElement.controlComponent === ControlComponent.POST_TEXT || startElement.controlComponent === ControlComponent.PLACEHOLDER ) { // 前缀、后缀、占位符 @@ -296,11 +288,9 @@ export class DateControl implements IControlInstance { } else { const endNextElement = elementList[endIndex + 1] if ( - ((startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT) && + (startElement.controlComponent === ControlComponent.PREFIX && endNextElement.controlComponent === ControlComponent.PLACEHOLDER) || endNextElement.controlComponent === ControlComponent.POSTFIX || - endNextElement.controlComponent === ControlComponent.POST_TEXT || startElement.controlComponent === ControlComponent.PLACEHOLDER ) { // 前缀、后缀、占位符 diff --git a/src/editor/core/draw/control/number/NumberControl.ts b/src/editor/core/draw/control/number/NumberControl.ts deleted file mode 100644 index 07ecefb1e..000000000 --- a/src/editor/core/draw/control/number/NumberControl.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { TextControl } from '../text/TextControl' - -export class NumberControl extends TextControl {} diff --git a/src/editor/core/draw/control/radio/RadioControl.ts b/src/editor/core/draw/control/radio/RadioControl.ts index a08443902..1fb09f260 100644 --- a/src/editor/core/draw/control/radio/RadioControl.ts +++ b/src/editor/core/draw/control/radio/RadioControl.ts @@ -28,8 +28,7 @@ export class RadioControl extends CheckboxControl { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -45,8 +44,7 @@ export class RadioControl extends CheckboxControl { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { break } @@ -61,8 +59,5 @@ export class RadioControl extends CheckboxControl { curIndex: startIndex, isSetCursor: false }) - this.control.emitControlContentChange({ - context - }) } } diff --git a/src/editor/core/draw/control/select/SelectControl.ts b/src/editor/core/draw/control/select/SelectControl.ts index f2da16654..fdaa55b98 100644 --- a/src/editor/core/draw/control/select/SelectControl.ts +++ b/src/editor/core/draw/control/select/SelectControl.ts @@ -4,8 +4,7 @@ import { } from '../../../../dataset/constant/Editor' import { CONTROL_STYLE_ATTR, - EDITOR_ELEMENT_STYLE_ATTR, - TEXTLIKE_ELEMENT_TYPE + EDITOR_ELEMENT_STYLE_ATTR } from '../../../../dataset/constant/Element' import { ControlComponent } from '../../../../dataset/enum/Control' import { EditorComponent } from '../../../../dataset/enum/Editor' @@ -19,13 +18,7 @@ import { } from '../../../../interface/Control' import { IEditorOption } from '../../../../interface/Editor' import { IElement } from '../../../../interface/Element' -import { - isArrayEqual, - isNonValue, - omitObject, - pickObject, - splitText -} from '../../../../utils' +import { omitObject, pickObject, splitText } from '../../../../utils' import { formatElementContext } from '../../../../utils/element' import { Control } from '../Control' @@ -35,12 +28,9 @@ export class SelectControl implements IControlInstance { private isPopup: boolean private selectDom: HTMLDivElement | null private options: DeepRequired - private VALUE_DELIMITER = ',' - private DEFAULT_MULTI_SELECT_DELIMITER = ',' constructor(element: IElement, control: Control) { - const draw = control.getDraw() - this.options = draw.getOptions() + this.options = control.getDraw().getOptions() this.element = element this.control = control this.isPopup = false @@ -59,27 +49,8 @@ export class SelectControl implements IControlInstance { return this.isPopup } - public getCodes(): string[] { - return this.element?.control?.code - ? this.element.control.code.split(',') - : [] - } - - public getText(codes: string[]): string | null { - if (!this.element?.control) return null - const control = this.element.control - if (!control.valueSets?.length) return null - const multiSelectDelimiter = - control?.multiSelectDelimiter || this.DEFAULT_MULTI_SELECT_DELIMITER - const valueSets = control.valueSets - const valueList: string[] = [] - codes.forEach(code => { - const valueSet = valueSets.find(v => v.code === code) - if (valueSet && !isNonValue(valueSet.value)) { - valueList.push(valueSet.value) - } - }) - return valueList.join(multiSelectDelimiter) || null + public getCode(): string | null { + return this.element.control?.code || null } public getValue(context: IControlContext = {}): IElement[] { @@ -93,8 +64,7 @@ export class SelectControl implements IControlInstance { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -109,8 +79,7 @@ export class SelectControl implements IControlInstance { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { break } @@ -122,59 +91,8 @@ export class SelectControl implements IControlInstance { return data } - public setValue( - data: IElement[], - context: IControlContext = {}, - options: IControlRuleOption = {} - ): number { - // 校验是否可以设置 - if ( - !this.element.control?.selectExclusiveOptions?.inputAble || - (!options.isIgnoreDisabledRule && - this.control.getIsDisabledControl(context)) - ) { - return -1 - } - const elementList = context.elementList || this.control.getElementList() - const range = context.range || this.control.getRange() - // 收缩边界到Value内 - this.control.shrinkBoundary(context) - const { startIndex, endIndex } = range - const draw = this.control.getDraw() - // 移除选区元素 - if (startIndex !== endIndex) { - draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex) - } else { - // 移除空白占位符 - this.control.removePlaceholder(startIndex, context) - } - // 非文本类元素或前缀过渡掉样式属性 - const startElement = elementList[startIndex] - const anchorElement = - (startElement.type && - !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) || - startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT - ? pickObject(startElement, [ - 'control', - 'controlId', - ...CONTROL_STYLE_ATTR - ]) - : omitObject(startElement, ['type']) - // 插入起始位置 - const start = range.startIndex + 1 - for (let i = 0; i < data.length; i++) { - const newElement: IElement = { - ...anchorElement, - ...data[i], - controlComponent: ControlComponent.VALUE - } - formatElementContext(elementList, [newElement], startIndex, { - editorOptions: this.options - }) - draw.spliceElementList(elementList, start + i, 0, [newElement]) - } - return start + data.length - 1 + public setValue(): number { + return -1 } public keydown(evt: KeyboardEvent): number | null { @@ -196,9 +114,7 @@ export class SelectControl implements IControlInstance { } else { if ( startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT || endElement.controlComponent === ControlComponent.POSTFIX || - endElement.controlComponent === ControlComponent.POST_TEXT || startElement.controlComponent === ControlComponent.PLACEHOLDER ) { // 前缀、后缀、占位符 @@ -216,11 +132,9 @@ export class SelectControl implements IControlInstance { } else { const endNextElement = elementList[endIndex + 1] if ( - ((startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT) && + (startElement.controlComponent === ControlComponent.PREFIX && endNextElement.controlComponent === ControlComponent.PLACEHOLDER) || endNextElement.controlComponent === ControlComponent.POSTFIX || - endNextElement.controlComponent === ControlComponent.POST_TEXT || startElement.controlComponent === ControlComponent.PLACEHOLDER ) { // 前缀、后缀、占位符 @@ -267,8 +181,7 @@ export class SelectControl implements IControlInstance { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { leftIndex = preIndex break @@ -281,8 +194,7 @@ export class SelectControl implements IControlInstance { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { rightIndex = nextIndex - 1 break @@ -297,15 +209,7 @@ export class SelectControl implements IControlInstance { if (isAddPlaceholder) { this.control.addPlaceholder(preIndex, context) } - this.control.setControlProperties( - { - code: null - }, - { - elementList, - range: { startIndex: preIndex, endIndex: preIndex } - } - ) + this.element.control!.code = null return preIndex } @@ -324,16 +228,9 @@ export class SelectControl implements IControlInstance { const elementList = context.elementList || this.control.getElementList() const range = context.range || this.control.getRange() const control = this.element.control! - const newCodes = code?.split(this.VALUE_DELIMITER) || [] - // 缓存旧值 const oldCode = control.code - const oldCodes = control.code?.split(this.VALUE_DELIMITER) || [] // 选项相同时无需重复渲染 - const isMultiSelect = control.isMultiSelect - if ( - (!isMultiSelect && code === oldCode) || - (isMultiSelect && isArrayEqual(oldCodes, newCodes)) - ) { + if (code === oldCode) { this.control.repaintControl({ curIndex: range.startIndex, isCompute: false, @@ -344,23 +241,9 @@ export class SelectControl implements IControlInstance { } const valueSets = control.valueSets if (!Array.isArray(valueSets) || !valueSets.length) return - // 转换文本 - const text = this.getText(newCodes) - if (!text) { - // 之前存在内容时清空文本 - if (oldCode) { - const prefixIndex = this.clearSelect(context) - if (~prefixIndex) { - this.control.repaintControl({ - curIndex: prefixIndex - }) - this.control.emitControlContentChange({ - controlValue: [] - }) - } - } - return - } + // 转换code + const valueSet = valueSets.find(v => v.code === code) + if (!valueSet) return // 样式赋值元素-默认值的第一个字符样式,否则取默认样式 const valueElement = this.getValue(context)[0] const styleElement = valueElement @@ -381,7 +264,7 @@ export class SelectControl implements IControlInstance { EDITOR_ELEMENT_STYLE_ATTR ) const start = prefixIndex + 1 - const data = splitText(text) + const data = splitText(valueSet.value) const draw = this.control.getDraw() for (let i = 0; i < data.length; i++) { const newElement: IElement = { @@ -397,27 +280,14 @@ export class SelectControl implements IControlInstance { draw.spliceElementList(elementList, start + i, 0, [newElement]) } // 设置状态 - this.control.setControlProperties( - { - code - }, - { - elementList, - range: { startIndex: prefixIndex, endIndex: prefixIndex } - } - ) + control.code = code // 重新渲染控件 if (!context.range) { const newIndex = start + data.length - 1 this.control.repaintControl({ curIndex: newIndex }) - this.control.emitControlContentChange({ - context - }) - if (!isMultiSelect) { - this.destroy() - } + this.destroy() } } @@ -435,26 +305,12 @@ export class SelectControl implements IControlInstance { for (let v = 0; v < valueSets.length; v++) { const valueSet = valueSets[v] const li = document.createElement('li') - let codes = this.getCodes() - if (codes.includes(valueSet.code)) { + const code = this.getCode() + if (code === valueSet.code) { li.classList.add('active') } li.onclick = () => { - const codeIndex = codes.findIndex(code => code === valueSet.code) - if (control.isMultiSelect) { - if (~codeIndex) { - codes.splice(codeIndex, 1) - } else { - codes.push(valueSet.code) - } - } else { - if (~codeIndex) { - codes = [] - } else { - codes = [valueSet.code] - } - } - this.setSelect(codes.join(this.VALUE_DELIMITER)) + this.setSelect(valueSet.code) } li.append(document.createTextNode(valueSet.value)) ul.append(li) diff --git a/src/editor/core/draw/control/text/TextControl.ts b/src/editor/core/draw/control/text/TextControl.ts index 51941e49b..7d290e3e7 100644 --- a/src/editor/core/draw/control/text/TextControl.ts +++ b/src/editor/core/draw/control/text/TextControl.ts @@ -22,8 +22,7 @@ export class TextControl implements IControlInstance { private options: DeepRequired constructor(element: IElement, control: Control) { - const draw = control.getDraw() - this.options = draw.getOptions() + this.options = control.getDraw().getOptions() this.element = element this.control = control } @@ -47,8 +46,7 @@ export class TextControl implements IControlInstance { const preElement = elementList[preIndex] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { break } @@ -63,8 +61,7 @@ export class TextControl implements IControlInstance { const nextElement = elementList[nextIndex] if ( nextElement.controlId !== startElement.controlId || - nextElement.controlComponent === ControlComponent.POSTFIX || - nextElement.controlComponent === ControlComponent.POST_TEXT + nextElement.controlComponent === ControlComponent.POSTFIX ) { break } @@ -106,8 +103,7 @@ export class TextControl implements IControlInstance { const anchorElement = (startElement.type && !TEXTLIKE_ELEMENT_TYPE.includes(startElement.type)) || - startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT + startElement.controlComponent === ControlComponent.PREFIX ? pickObject(startElement, [ 'control', 'controlId', @@ -183,9 +179,7 @@ export class TextControl implements IControlInstance { } else { if ( startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT || endElement.controlComponent === ControlComponent.POSTFIX || - endElement.controlComponent === ControlComponent.POST_TEXT || startElement.controlComponent === ControlComponent.PLACEHOLDER ) { // 前缀、后缀、占位符 @@ -216,11 +210,9 @@ export class TextControl implements IControlInstance { } else { const endNextElement = elementList[endIndex + 1] if ( - ((startElement.controlComponent === ControlComponent.PREFIX || - startElement.controlComponent === ControlComponent.PRE_TEXT) && + (startElement.controlComponent === ControlComponent.PREFIX && endNextElement.controlComponent === ControlComponent.PLACEHOLDER) || endNextElement.controlComponent === ControlComponent.POSTFIX || - endNextElement.controlComponent === ControlComponent.POST_TEXT || startElement.controlComponent === ControlComponent.PLACEHOLDER ) { // 前缀、后缀、占位符 diff --git a/src/editor/core/draw/frame/Badge.ts b/src/editor/core/draw/frame/Badge.ts deleted file mode 100644 index 24dac8ff5..000000000 --- a/src/editor/core/draw/frame/Badge.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { IAreaBadge, IBadge } from '../../../interface/Badge' -import { DeepRequired } from '../../../interface/Common' -import { IEditorOption } from '../../../interface/Editor' -import { Draw } from '../Draw' - -export class Badge { - private draw: Draw - private options: DeepRequired - private imageCache: Map - private mainBadge: IBadge | null - private areaBadgeMap: Map - - constructor(draw: Draw) { - this.draw = draw - this.options = draw.getOptions() - this.imageCache = new Map() - this.mainBadge = null - this.areaBadgeMap = new Map() - } - - public setMainBadge(payload: IBadge | null) { - this.mainBadge = payload - } - - public setAreaBadgeMap(payload: IAreaBadge[]) { - this.areaBadgeMap.clear() - payload.forEach(areaBadge => { - this.areaBadgeMap.set(areaBadge.areaId, areaBadge.badge) - }) - } - - private _drawImage( - ctx: CanvasRenderingContext2D, - x: number, - y: number, - width: number, - height: number, - value: string - ) { - if (this.imageCache.has(value)) { - const img = this.imageCache.get(value)! - ctx.drawImage(img, x, y, width, height) - } else { - const img = new Image() - img.setAttribute('crossOrigin', 'Anonymous') - img.src = value - img.onload = () => { - this.imageCache.set(value, img) - ctx.drawImage(img, x, y, width, height) - } - } - } - - public render(ctx: CanvasRenderingContext2D, pageNo: number) { - // 文档签章 - if (pageNo === 0 && this.mainBadge) { - const { scale, badge } = this.options - const { left, top, width, height, value } = this.mainBadge - // 默认从页眉下开始 - const headerTop = - this.draw.getMargins()[0] + this.draw.getHeader().getExtraHeight() - const x = (left || badge.left) * scale - const y = (top || badge.top) * scale + headerTop - this._drawImage(ctx, x, y, width * scale, height * scale, value) - } - // 区域签章 - if (this.areaBadgeMap.size) { - const areaInfo = this.draw.getArea().getAreaInfo() - if (areaInfo.size) { - const { scale, badge } = this.options - for (const areaItem of areaInfo) { - // 忽略非本页区域 - const { positionList } = areaItem[1] - const firstPosition = positionList[0] - if (firstPosition.pageNo !== pageNo) continue - // 忽略未设置签章区域 - const badgeItem = this.areaBadgeMap.get(areaItem[0]) - if (!badgeItem) continue - const { left, top, width, height, value } = badgeItem - const x = (left || badge.left) * scale - const y = - (top || badge.top) * scale + firstPosition.coordinate.leftTop[1] - this._drawImage(ctx, x, y, width * scale, height * scale, value) - } - } - } - } -} diff --git a/src/editor/core/draw/frame/Margin.ts b/src/editor/core/draw/frame/Margin.ts index 124bb825a..74bf333cc 100644 --- a/src/editor/core/draw/frame/Margin.ts +++ b/src/editor/core/draw/frame/Margin.ts @@ -16,7 +16,7 @@ export class Margin { const width = this.draw.getWidth() const height = pageMode === PageMode.CONTINUITY - ? this.draw.getCanvasHeight(pageNo) / this.draw.getPagePixelRatio() + ? this.draw.getCanvasHeight(pageNo) : this.draw.getHeight() const margins = this.draw.getMargins() const marginIndicatorSize = this.draw.getMarginIndicatorSize() diff --git a/src/editor/core/draw/frame/PageNumber.ts b/src/editor/core/draw/frame/PageNumber.ts index a0ac7db1d..fa86c4b87 100644 --- a/src/editor/core/draw/frame/PageNumber.ts +++ b/src/editor/core/draw/frame/PageNumber.ts @@ -1,5 +1,6 @@ import { FORMAT_PLACEHOLDER } from '../../../dataset/constant/PageNumber' import { NumberType } from '../../../dataset/enum/Common' +import { PageMode } from '../../../dataset/enum/Editor' import { RowFlex } from '../../../dataset/enum/Row' import { DeepRequired } from '../../../interface/Common' import { IEditorOption } from '../../../interface/Editor' @@ -15,22 +16,10 @@ export class PageNumber { this.options = draw.getOptions() } - static formatNumberPlaceholder( - text: string, - pageNo: number, - replaceReg: RegExp, - numberType: NumberType - ) { - const pageNoText = - numberType === NumberType.CHINESE - ? convertNumberToChinese(pageNo) - : `${pageNo}` - return text.replace(replaceReg, pageNoText) - } - public render(ctx: CanvasRenderingContext2D, pageNo: number) { const { scale, + pageMode, pageNumber: { size, font, @@ -47,25 +36,28 @@ export class PageNumber { let text = format const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO) if (pageNoReg.test(text)) { - text = PageNumber.formatNumberPlaceholder( - text, - pageNo + startPageNo - fromPageNo, - pageNoReg, - numberType - ) + const realPageNo = pageNo + startPageNo - fromPageNo + const pageNoText = + numberType === NumberType.CHINESE + ? convertNumberToChinese(realPageNo) + : `${realPageNo}` + text = text.replace(pageNoReg, pageNoText) } const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT) if (pageCountReg.test(text)) { - text = PageNumber.formatNumberPlaceholder( - text, - this.draw.getPageCount() - fromPageNo, - pageCountReg, - numberType - ) + const pageCount = this.draw.getPageCount() - fromPageNo + const pageCountText = + numberType === NumberType.CHINESE + ? convertNumberToChinese(pageCount) + : `${pageCount}` + text = text.replace(pageCountReg, pageCountText) } const width = this.draw.getWidth() // 计算y位置 - const height = this.draw.getHeight() + const height = + pageMode === PageMode.CONTINUITY + ? this.draw.getCanvasHeight(pageNo) + : this.draw.getHeight() const pageNumberBottom = this.draw.getPageNumberBottom() const y = height - pageNumberBottom ctx.save() diff --git a/src/editor/core/draw/frame/Watermark.ts b/src/editor/core/draw/frame/Watermark.ts index c4dddccaf..53abcb87c 100644 --- a/src/editor/core/draw/frame/Watermark.ts +++ b/src/editor/core/draw/frame/Watermark.ts @@ -1,8 +1,6 @@ import { IEditorOption } from '../../..' -import { FORMAT_PLACEHOLDER } from '../../../dataset/constant/PageNumber' import { DeepRequired } from '../../../interface/Common' import { Draw } from '../Draw' -import { PageNumber } from './PageNumber' export class Watermark { private draw: Draw @@ -13,89 +11,28 @@ export class Watermark { this.options = >draw.getOptions() } - public render(ctx: CanvasRenderingContext2D, pageNo: number) { + public render(ctx: CanvasRenderingContext2D) { const { - watermark: { data, opacity, font, size, color, repeat, gap, numberType }, + watermark: { data, opacity, font, size, color }, scale } = this.options const width = this.draw.getWidth() const height = this.draw.getHeight() - // 开始绘制 + const x = width / 2 + const y = height / 2 ctx.save() ctx.globalAlpha = opacity ctx.font = `${size * scale}px ${font}` - // 格式化文本 - let text = data - const pageNoReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_NO) - if (pageNoReg.test(text)) { - text = PageNumber.formatNumberPlaceholder( - text, - pageNo + 1, - pageNoReg, - numberType - ) - } - const pageCountReg = new RegExp(FORMAT_PLACEHOLDER.PAGE_COUNT) - if (pageCountReg.test(text)) { - text = PageNumber.formatNumberPlaceholder( - text, - this.draw.getPageCount(), - pageCountReg, - numberType - ) - } - // 测量长度并绘制 - const measureText = ctx.measureText(text) - if (repeat) { - const dpr = this.draw.getPagePixelRatio() - const temporaryCanvas = document.createElement('canvas') - const temporaryCtx = temporaryCanvas.getContext('2d')! - // 勾股定理计算旋转后的宽高对角线尺寸 a^2 + b^2 = c^2 - const textWidth = measureText.width - const textHeight = - measureText.actualBoundingBoxAscent + - measureText.actualBoundingBoxDescent - const diagonalLength = Math.sqrt( - Math.pow(textWidth, 2) + Math.pow(textHeight, 2) - ) - // 加上 gap 间距 - const patternWidth = diagonalLength + 2 * gap[0] * scale - const patternHeight = diagonalLength + 2 * gap[1] * scale - // 宽高设置 - temporaryCanvas.width = patternWidth - temporaryCanvas.height = patternHeight - temporaryCanvas.style.width = `${patternWidth * dpr}px` - temporaryCanvas.style.height = `${patternHeight * dpr}px` - // 旋转45度 - temporaryCtx.translate(patternWidth / 2, patternHeight / 2) - temporaryCtx.rotate((-45 * Math.PI) / 180) - temporaryCtx.translate(-patternWidth / 2, -patternHeight / 2) - // 绘制文本 - temporaryCtx.font = `${size * scale}px ${font}` - temporaryCtx.fillStyle = color - temporaryCtx.fillText( - text, - (patternWidth - textWidth) / 2, - (patternHeight - textHeight) / 2 + measureText.actualBoundingBoxAscent - ) - // 创建平铺模式 - const pattern = ctx.createPattern(temporaryCanvas, 'repeat') - if (pattern) { - ctx.fillStyle = pattern - ctx.fillRect(0, 0, width, height) - } - } else { - const x = width / 2 - const y = height / 2 - ctx.fillStyle = color - ctx.translate(x, y) - ctx.rotate((-45 * Math.PI) / 180) - ctx.fillText( - text, - -measureText.width / 2, - measureText.actualBoundingBoxAscent - size / 2 - ) - } + ctx.fillStyle = color + // 移动到中心位置再旋转 + const measureText = ctx.measureText(data) + ctx.translate(x, y) + ctx.rotate((-45 * Math.PI) / 180) + ctx.fillText( + data, + -measureText.width / 2, + measureText.actualBoundingBoxAscent - size / 2 + ) ctx.restore() } } diff --git a/src/editor/core/draw/interactive/Area.ts b/src/editor/core/draw/interactive/Area.ts deleted file mode 100644 index cc4d668b8..000000000 --- a/src/editor/core/draw/interactive/Area.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { Draw } from '../Draw' -import { deepClone, getUUID, isNonValue } from '../../../utils' -import { ElementType } from '../../../dataset/enum/Element' -import { - IAreaInfo, - IGetAreaValueOption, - IGetAreaValueResult, - IInsertAreaOption, - ISetAreaPropertiesOption -} from '../../../interface/Area' -import { EditorZone } from '../../../dataset/enum/Editor' -import { LocationPosition } from '../../../dataset/enum/Common' -import { RangeManager } from '../../range/RangeManager' -import { Zone } from '../../zone/Zone' -import { Position } from '../../position/Position' -import { zipElementList } from '../../../utils/element' -import { AreaMode } from '../../../dataset/enum/Area' -import { IRange } from '../../../interface/Range' -import { IElementPosition } from '../../../interface/Element' - -export class Area { - private draw: Draw - private zone: Zone - private range: RangeManager - private position: Position - private areaInfoMap = new Map() - - constructor(draw: Draw) { - this.draw = draw - this.zone = draw.getZone() - this.range = draw.getRange() - this.position = draw.getPosition() - } - - public getAreaInfo(): Map { - return this.areaInfoMap - } - - public getActiveAreaId(): string | null { - if (!this.areaInfoMap.size) return null - const { startIndex } = this.range.getRange() - const elementList = this.draw.getElementList() - const element = elementList[startIndex] - return element?.areaId || null - } - - public getActiveAreaInfo(): IAreaInfo | null { - const activeAreaId = this.getActiveAreaId() - if (!activeAreaId) return null - return this.areaInfoMap.get(activeAreaId) || null - } - - public isReadonly() { - const activeAreaInfo = this.getActiveAreaInfo() - if (!activeAreaInfo?.area) return false - switch (activeAreaInfo.area.mode) { - case AreaMode.EDIT: - return false - case AreaMode.READONLY: - return true - case AreaMode.FORM: - return !this.draw.getControl().getIsRangeWithinControl() - default: - return false - } - } - - public insertArea(payload: IInsertAreaOption): string | null { - // 切换至正文 - if (this.zone.getZone() !== EditorZone.MAIN) { - this.zone.setZone(EditorZone.MAIN) - } - // 跳出表格 - this.draw.getPosition().setPositionContext({ - isTable: false - }) - // 设置插入位置 - const { id, value, area, position } = payload - if (position === LocationPosition.BEFORE) { - this.range.setRange(0, 0) - } else { - const elementList = this.draw.getOriginalMainElementList() - const lastIndex = elementList.length - 1 - this.range.setRange(lastIndex, lastIndex) - } - const areaId = id || getUUID() - this.draw.insertElementList([ - { - type: ElementType.AREA, - value: '', - areaId, - valueList: value, - area: deepClone(area) - } - ]) - return areaId - } - - public render(ctx: CanvasRenderingContext2D, pageNo: number) { - if (!this.areaInfoMap.size) return - ctx.save() - const margins = this.draw.getMargins() - const width = this.draw.getInnerWidth() - for (const areaInfoItem of this.areaInfoMap) { - const { area, positionList } = areaInfoItem[1] - if (!area?.backgroundColor && !area?.borderColor) continue - const pagePositionList = positionList.filter(p => p.pageNo === pageNo) - if (!pagePositionList.length) continue - ctx.translate(0.5, 0.5) - const firstPosition = pagePositionList[0] - const lastPosition = pagePositionList[pagePositionList.length - 1] - // 起始位置 - const x = margins[3] - const y = Math.ceil(firstPosition.coordinate.leftTop[1]) - const height = Math.ceil(lastPosition.coordinate.rightBottom[1] - y) - // 背景色 - if (area.backgroundColor) { - ctx.fillStyle = area.backgroundColor - ctx.fillRect(x, y, width, height) - } - // 边框 - if (area.borderColor) { - ctx.strokeStyle = area.borderColor - ctx.strokeRect(x, y, width, height) - } - } - ctx.restore() - } - - public compute() { - this.areaInfoMap.clear() - const elementList = this.draw.getOriginalMainElementList() - const positionList = this.position.getOriginalMainPositionList() - for (let e = 0; e < elementList.length; e++) { - const element = elementList[e] - const areaId = element.areaId - if (areaId) { - const areaInfo = this.areaInfoMap.get(areaId) - if (!areaInfo) { - this.areaInfoMap.set(areaId, { - id: areaId, - area: element.area!, - elementList: [element], - positionList: [positionList[e]] - }) - } else { - areaInfo.elementList.push(element) - areaInfo.positionList.push(positionList[e]) - } - } - } - } - - public getAreaValue( - options: IGetAreaValueOption = {} - ): IGetAreaValueResult | null { - const areaId = options.id || this.getActiveAreaId() - if (!areaId) return null - const areaInfo = this.areaInfoMap.get(areaId) - if (!areaInfo) return null - return { - area: areaInfo.area, - id: areaInfo.id, - startPageNo: areaInfo.positionList[0].pageNo, - endPageNo: areaInfo.positionList[areaInfo.positionList.length - 1].pageNo, - value: zipElementList(areaInfo.elementList) - } - } - - public getContextByAreaId( - areaId: string - ): { range: IRange; elementPosition: IElementPosition } | null { - const elementList = this.draw.getOriginalMainElementList() - for (let e = 0; e < elementList.length; e++) { - const element = elementList[e] - if (element.areaId === areaId) { - const positionList = this.position.getOriginalMainPositionList() - return { - range: { - startIndex: e, - endIndex: e - }, - elementPosition: positionList[e] - } - } - } - return null - } - - public setAreaProperties(payload: ISetAreaPropertiesOption) { - const areaId = payload.id || this.getActiveAreaId() - if (!areaId) return - const areaInfo = this.areaInfoMap.get(areaId) - if (!areaInfo) return - if (!areaInfo.area) { - areaInfo.area = {} - } - // 是否计算 - let isCompute = false - // 修改属性 - if (payload.properties.mode) { - areaInfo.area.mode = payload.properties.mode - } - if (payload.properties.borderColor) { - areaInfo.area.borderColor = payload.properties.borderColor - } - if (payload.properties.backgroundColor) { - areaInfo.area.backgroundColor = payload.properties.backgroundColor - } - if (!isNonValue(payload.properties.top)) { - isCompute = true - areaInfo.area.top = payload.properties.top - } - this.draw.render({ - isCompute, - isSetCursor: false - }) - } -} diff --git a/src/editor/core/draw/interactive/Search.ts b/src/editor/core/draw/interactive/Search.ts index 1002b0216..6b59a551c 100644 --- a/src/editor/core/draw/interactive/Search.ts +++ b/src/editor/core/draw/interactive/Search.ts @@ -5,12 +5,8 @@ import { EditorContext } from '../../../dataset/enum/Editor' import { ElementType } from '../../../dataset/enum/Element' import { IEditorOption } from '../../../interface/Editor' import { IElement, IElementPosition } from '../../../interface/Element' -import { - IReplaceOption, - ISearchResult, - ISearchResultRestArgs -} from '../../../interface/Search' -import { getUUID, isNumber } from '../../../utils' +import { ISearchResult, ISearchResultRestArgs } from '../../../interface/Search' +import { getUUID } from '../../../utils' import { Position } from '../../position/Position' import { Draw } from '../Draw' @@ -215,8 +211,7 @@ export class Search { .map(e => !e.type || (TEXTLIKE_ELEMENT_TYPE.includes(e.type) && - e.controlComponent !== ControlComponent.CHECKBOX && - !e.control?.hide) + e.controlComponent !== ControlComponent.CHECKBOX) ? e.value : ZERO ) @@ -328,146 +323,4 @@ export class Search { } ctx.restore() } - - public replace(payload: string, option?: IReplaceOption) { - const isReadonly = this.draw.isReadonly() - if (isReadonly) return - if (!payload || new RegExp(`${ZERO}`, 'g').test(payload)) return - let matchList = this.getSearchMatchList() - // 替换搜索项 - const replaceIndex = option?.index - if (isNumber(replaceIndex)) { - const matchGroup: ISearchResult[][] = [] - matchList.forEach(match => { - const last = matchGroup[matchGroup.length - 1] - if (!last || last[0].groupId !== match.groupId) { - matchGroup.push([match]) - } else { - last.push(match) - } - }) - matchList = matchGroup[replaceIndex] - } - if (!matchList?.length) return - const isDesignMode = this.draw.isDesignMode() - // 匹配index变化的差值 - let pageDiffCount = 0 - let tableDiffCount = 0 - // 匹配搜索词的组标识 - let curGroupId = '' - // 表格上下文 - let curTdId = '' - // 搜索值 > 替换值:增加元素;搜索值 < 替换值:减少元素 - let firstMatchIndex = -1 - const elementList = this.draw.getOriginalElementList() - for (let m = 0; m < matchList.length; m++) { - const match = matchList[m] - if (match.type === EditorContext.TABLE) { - const { tableIndex, trIndex, tdIndex, index, tdId } = match - if (curTdId && tdId !== curTdId) { - tableDiffCount = 0 - } - curTdId = tdId! - const curTableIndex = tableIndex! + pageDiffCount - const tableElementList = - elementList[curTableIndex].trList![trIndex!].tdList[tdIndex!].value - // 表格内元素 - const curIndex = index + tableDiffCount - const tableElement = tableElementList[curIndex] - // 非设计模式下设置元素不可删除 || 控件结构元素 => 禁止替换 - if ( - !isDesignMode && - (tableElement?.control?.deletable === false || - tableElement?.title?.deletable === false) - ) { - continue - } - if (curGroupId === match.groupId) { - this.draw.spliceElementList(tableElementList, curIndex, 1) - tableDiffCount-- - continue - } - if (!~firstMatchIndex) { - firstMatchIndex = m - } - for (let p = 0; p < payload.length; p++) { - const value = payload[p] - if (p === 0) { - tableElement.value = value - } else { - this.draw.spliceElementList(tableElementList, curIndex + p, 0, [ - { - ...tableElement, - value - } - ]) - tableDiffCount++ - } - } - } else { - const curIndex = match.index + pageDiffCount - const element = elementList[curIndex] - // 非设计模式下设置元素不可删除 || 控件结构元素 => 禁止替换 - if ( - (!isDesignMode && - (element?.control?.deletable === false || - element?.title?.deletable === false)) || - (element.type === ElementType.CONTROL && - element.controlComponent !== ControlComponent.VALUE) - ) { - continue - } - if (!~firstMatchIndex) { - firstMatchIndex = m - } - if (curGroupId === match.groupId) { - this.draw.spliceElementList(elementList, curIndex, 1) - pageDiffCount-- - continue - } - for (let p = 0; p < payload.length; p++) { - const value = payload[p] - if (p === 0) { - element.value = value - } else { - this.draw.spliceElementList(elementList, curIndex + p, 0, [ - { - ...element, - value - } - ]) - pageDiffCount++ - } - } - } - curGroupId = match.groupId - } - if (!~firstMatchIndex) return - // 定位-首个被匹配关键词后 - const firstMatch = matchList[firstMatchIndex] - const firstIndex = firstMatch.index + (payload.length - 1) - if (firstMatch.type === EditorContext.TABLE) { - const { tableIndex, trIndex, tdIndex, index } = firstMatch - const element = - elementList[tableIndex!].trList![trIndex!].tdList[tdIndex!].value[index] - this.position.setPositionContext({ - isTable: true, - index: tableIndex, - trIndex, - tdIndex, - tdId: element.tdId, - trId: element.trId, - tableId: element.tableId - }) - } else { - this.position.setPositionContext({ - isTable: false - }) - } - this.draw.getRange().setRange(firstIndex, firstIndex) - // 重新渲染 - this.draw.render({ - curIndex: firstIndex - }) - } } diff --git a/src/editor/core/draw/particle/ImageParticle.ts b/src/editor/core/draw/particle/ImageParticle.ts index eb55e6dc0..2eff7d6e9 100644 --- a/src/editor/core/draw/particle/ImageParticle.ts +++ b/src/editor/core/draw/particle/ImageParticle.ts @@ -79,8 +79,8 @@ export class ImageParticle { + tileSize * 2 + }" height="${tileSize * 2}" patternUnits="userSpaceOnUse"> @@ -102,20 +102,17 @@ export class ImageParticle { const { scale } = this.options const width = element.width! * scale const height = element.height! * scale - if (this.imageCache.has(element.value)) { - const img = this.imageCache.get(element.value)! + if (this.imageCache.has(element.id!)) { + const img = this.imageCache.get(element.id!)! ctx.drawImage(img, x, y, width, height) } else { - const cacheRenderCount = this.draw.getRenderCount() const imageLoadPromise = new Promise((resolve, reject) => { const img = new Image() img.setAttribute('crossOrigin', 'Anonymous') img.src = element.value img.onload = () => { - this.imageCache.set(element.value, img) + this.imageCache.set(element.id!, img) resolve(element) - // 因图片加载异步,图片加载后可能属于上一次渲染方法 - if (cacheRenderCount !== this.draw.getRenderCount()) return // 衬于文字下方图片需要重新首先绘制 if (element.imgDisplay === ImageDisplay.FLOAT_BOTTOM) { this.draw.render({ @@ -131,7 +128,7 @@ export class ImageParticle { const fallbackImage = this.getFallbackImage(width, height) fallbackImage.onload = () => { ctx.drawImage(fallbackImage, x, y, width, height) - this.imageCache.set(element.value, fallbackImage) + this.imageCache.set(element.id!, fallbackImage) } reject(error) } diff --git a/src/editor/core/draw/particle/ListParticle.ts b/src/editor/core/draw/particle/ListParticle.ts index 24ce6433e..552bfb83c 100644 --- a/src/editor/core/draw/particle/ListParticle.ts +++ b/src/editor/core/draw/particle/ListParticle.ts @@ -6,7 +6,7 @@ import { ListStyle, ListType, UlStyle } from '../../../dataset/enum/List' import { DeepRequired } from '../../../interface/Common' import { IEditorOption } from '../../../interface/Editor' import { IElement, IElementPosition } from '../../../interface/Element' -import { IRow, IRowElement } from '../../../interface/Row' +import { IRow } from '../../../interface/Row' import { getUUID } from '../../../utils' import { RangeManager } from '../../range/RangeManager' import { Draw } from '../Draw' @@ -27,7 +27,11 @@ export class ListParticle { this.options = draw.getOptions() } - public setList(listType: ListType | null, listStyle?: ListStyle) { + public setList( + listType: ListType | null, + listStyle?: ListStyle, + listLevel = 0 + ) { const isReadonly = this.draw.isReadonly() if (isReadonly) return const { startIndex, endIndex } = this.range.getRange() @@ -49,6 +53,7 @@ export class ListParticle { el.listId = listId el.listType = listType el.listStyle = listStyle + el.listLevel = listLevel }) // 光标定位 const isSetCursor = startIndex === endIndex @@ -104,7 +109,7 @@ export class ListParticle { ): Map { const listStyleMap = new Map() let start = 0 - let curListId = elementList[start].listId + let curListId = elementList[start]?.listId let curElementList: IElement[] = [] const elementLength = elementList.length while (start < elementLength) { @@ -160,7 +165,9 @@ export class ListParticle { KeyMap.PERIOD }` const textMetrics = ctx.measureText(text) - return Math.ceil((textMetrics.width + this.LIST_GAP) * scale) + const width = Math.ceil((textMetrics.width + this.LIST_GAP) * scale) + + return width } public drawListStyle( @@ -168,63 +175,45 @@ export class ListParticle { row: IRow, position: IElementPosition ) { - const { elementList, offsetX, listIndex, ascent } = row + const { elementList, offsetX, ascent, indexes } = row const startElement = elementList[0] if (startElement.value !== ZERO || startElement.listWrap) return - // tab width + + const baseIndent = 20 * this.options.scale + + const totalIndent = baseIndent * 0 + let tabWidth = 0 - const { defaultTabWidth, scale, defaultFont, defaultSize } = this.options + const { defaultTabWidth, scale, defaultFont } = this.options for (let i = 1; i < elementList.length; i++) { const element = elementList[i] if (element?.type !== ElementType.TAB) break tabWidth += defaultTabWidth * scale } - // 列表样式渲染 const { coordinate: { leftTop: [startX, startY] } } = position - const x = startX - offsetX! + tabWidth + const x = startX - offsetX! + tabWidth + totalIndent - 5 const y = startY + ascent - // 复选框样式特殊处理 - if (startElement.listStyle === ListStyle.CHECKBOX) { - const { width, height, gap } = this.options.checkbox - const checkboxRowElement: IRowElement = { - ...startElement, - checkbox: { - value: !!startElement.checkbox?.value - }, - metrics: { - ...startElement.metrics, - width: (width + gap * 2) * scale, - height: height * scale - } - } - this.draw.getCheckboxParticle().render({ - ctx, - x: x - gap * scale, - y, - index: 0, - row: { - ...row, - elementList: [checkboxRowElement, ...row.elementList] - } - }) - } else { - let text = '' - if (startElement.listType === ListType.UL) { - text = - ulStyleMapping[(startElement.listStyle)] || - ulStyleMapping[UlStyle.DISC] - } else { - text = `${listIndex! + 1}${KeyMap.PERIOD}` - } - if (!text) return - ctx.save() - ctx.font = `${defaultSize * scale}px ${defaultFont}` - ctx.fillText(text, x, y) - ctx.restore() + let text = '' + if (startElement.listType === ListType.UL) { + text = + ulStyleMapping[(startElement.listStyle)] || + ulStyleMapping[UlStyle.DISC] + } else if (indexes && indexes.length > 0) { + text = `${indexes.join(KeyMap.PERIOD)}${KeyMap.PERIOD}` } + + // else { + // text = `${listIndex!}${KeyMap.PERIOD}`; + // } + if (!text) return + + ctx.save() + ctx.font = `${14.5 * scale}px ${defaultFont}` + ctx.fillText(text, x, y) + ctx.restore() } } diff --git a/src/editor/core/draw/particle/PageBreakParticle.ts b/src/editor/core/draw/particle/PageBreak.ts similarity index 100% rename from src/editor/core/draw/particle/PageBreakParticle.ts rename to src/editor/core/draw/particle/PageBreak.ts diff --git a/src/editor/core/draw/particle/SeparatorParticle.ts b/src/editor/core/draw/particle/Separator.ts similarity index 99% rename from src/editor/core/draw/particle/SeparatorParticle.ts rename to src/editor/core/draw/particle/Separator.ts index a8e8ec58f..bd1093de5 100644 --- a/src/editor/core/draw/particle/SeparatorParticle.ts +++ b/src/editor/core/draw/particle/Separator.ts @@ -2,7 +2,6 @@ import { DeepRequired } from '../../../interface/Common' import { IEditorOption } from '../../../interface/Editor' import { IRowElement } from '../../../interface/Row' import { Draw } from '../Draw' - export class SeparatorParticle { private options: DeepRequired diff --git a/src/editor/core/draw/particle/SubscriptParticle.ts b/src/editor/core/draw/particle/Subscript.ts similarity index 100% rename from src/editor/core/draw/particle/SubscriptParticle.ts rename to src/editor/core/draw/particle/Subscript.ts diff --git a/src/editor/core/draw/particle/SuperscriptParticle.ts b/src/editor/core/draw/particle/Superscript.ts similarity index 100% rename from src/editor/core/draw/particle/SuperscriptParticle.ts rename to src/editor/core/draw/particle/Superscript.ts diff --git a/src/editor/core/draw/particle/block/modules/IFrameBlock.ts b/src/editor/core/draw/particle/block/modules/IFrameBlock.ts index ca73d6fbf..774f26779 100644 --- a/src/editor/core/draw/particle/block/modules/IFrameBlock.ts +++ b/src/editor/core/draw/particle/block/modules/IFrameBlock.ts @@ -1,7 +1,7 @@ import { IRowElement } from '../../../../../interface/Row' export class IFrameBlock { - public static readonly sandbox = ['allow-scripts', 'allow-same-origin'] + private static readonly sandbox = ['allow-scripts', 'allow-same-origin'] private element: IRowElement constructor(element: IRowElement) { diff --git a/src/editor/core/draw/particle/block/modules/VideoBlock.ts b/src/editor/core/draw/particle/block/modules/VideoBlock.ts index 278b6c9de..56a7c1cc2 100644 --- a/src/editor/core/draw/particle/block/modules/VideoBlock.ts +++ b/src/editor/core/draw/particle/block/modules/VideoBlock.ts @@ -15,6 +15,7 @@ export class VideoBlock { video.style.objectFit = 'contain' video.src = block.videoBlock?.src || '' video.controls = true + video.crossOrigin = 'anonymous' blockItemContainer.append(video) } } diff --git a/src/editor/core/draw/particle/date/DateParticle.ts b/src/editor/core/draw/particle/date/DateParticle.ts index f98f1d1c3..da31fd7ad 100644 --- a/src/editor/core/draw/particle/date/DateParticle.ts +++ b/src/editor/core/draw/particle/date/DateParticle.ts @@ -63,7 +63,7 @@ export class DateParticle { if (startElement.type !== ElementType.DATE) return null // 向左查找 let preIndex = startIndex - while (preIndex >= 0) { + while (preIndex > 0) { const preElement = elementList[preIndex] if (preElement.dateId !== startElement.dateId) { leftIndex = preIndex diff --git a/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts b/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts index a29d802c4..b94d45d9a 100644 --- a/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts +++ b/src/editor/core/draw/particle/latex/utils/LaTexUtils.ts @@ -69,8 +69,8 @@ function parseAtom(x: string): Expr { mode: 'math', text: x, chld: [], - // @ts-ignore - bbox: null + + bbox: {} as Bbox } } @@ -81,8 +81,8 @@ function parse(tokens: string[]): Expr { text: '', mode: 'math', chld: [], - // @ts-ignore - bbox: null + + bbox: {} as Bbox } function takeOpt(): Expr | null { @@ -150,8 +150,8 @@ function parse(tokens: string[]): Expr { text: tokens[i], mode: 'math', chld: [], - // @ts-ignore - bbox: null + + bbox: {} as Bbox } if (s) { if (s.arity) { @@ -251,8 +251,7 @@ function computeBbox(exprs: Expr[]): Bbox { function group(exprs: Expr[]): Expr { if (!exprs.length) { - // @ts-ignore - return null + return { bbox: { w: 0, h: 0, x: 0, y: 0 } } as Expr } const bbox: Bbox = computeBbox(exprs) // console.log(exprs,bbox); @@ -288,8 +287,7 @@ function align(exprs: Expr[], alignment = 'center'): void { if (exprs[i].text == '\'') { exprs[i].bbox.y = h } else { - // @ts-ignore - transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0) + transform(exprs[i], CONFIG.SUB_SUP_SCALE, 0, 0, 0) if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) { exprs[i].bbox.y = h - exprs[i].bbox.h } else if (exprs[j].text == '\\int') { @@ -308,8 +306,8 @@ function align(exprs: Expr[], alignment = 'center'): void { j-- } h = exprs[j].bbox.y + exprs[j].bbox.h - // @ts-ignore - transform(exprs[i], CONFIG.SUB_SUP_SCALE, null, 0, 0) + + transform(exprs[i], CONFIG.SUB_SUP_SCALE, 0, 0, 0) if (SYMB[exprs[j].text] && SYMB[exprs[j].text].flags.big) { exprs[i].bbox.y = h } else if (exprs[j].text == '\\int') { @@ -407,7 +405,7 @@ function align(exprs: Expr[], alignment = 'center'): void { for (let i = 0; i < rows.length; i++) { const erow: Expr[] = [] for (let j = 0; j < rows[i].length; j++) { - const e: Expr = group(rows[i][j]) + const e: Expr = group(rows[i][j]) if (e) { colws[j] = colws[j] || 0 colws[j] = Math.max(e.bbox.w + 1, colws[j]) @@ -556,13 +554,13 @@ function plan(expr: Expr, mode = 'math'): void { b.bbox.x = 0 b.bbox.y = 0 const mw: number = Math.max(a.bbox.w, b.bbox.w) * s - // @ts-ignore - transform(a, s, null, (mw - a.bbox.w * s) / 2, 0) + + transform(a, s, 0, (mw - a.bbox.w * s) / 2, 0) transform( b, s, - // @ts-ignore - null, + + 0, (mw - b.bbox.w * s) / 2, a.bbox.h + CONFIG.FRAC_SPACING ) @@ -582,11 +580,16 @@ function plan(expr: Expr, mode = 'math'): void { b.bbox.x = 0 b.bbox.y = 0 const mw: number = Math.max(a.bbox.w, b.bbox.w) - // @ts-ignore - transform(a, 1, null, (mw - a.bbox.w) / 2 + 1, 0) - // @ts-ignore - transform(b, 1, null, (mw - b.bbox.w) / 2 + 1, a.bbox.h) - expr.bbox = { x: 0, y: -a.bbox.h + 1, w: mw + 2, h: a.bbox.h + b.bbox.h } + + transform(a, 1, 0, (mw - a.bbox.w) / 2 + 1, 0) + + transform(b, 1, 0, (mw - b.bbox.w) / 2 + 1, a.bbox.h) + expr.bbox = { + x: 0, + y: -a.bbox.h + 1, + w: mw + 2, + h: a.bbox.h + b.bbox.h + } } else if (expr.text == '\\sqrt') { const e: Expr = expr.chld[0] plan(e) @@ -595,11 +598,11 @@ function plan(expr: Expr, mode = 'math'): void { if (f) { plan(f) pl = Math.max(f.bbox.w * CONFIG.SQRT_MAG_SCALE - 0.5, 0) - // @ts-ignore - transform(f, CONFIG.SQRT_MAG_SCALE, null, 0, 0.5) + + transform(f, CONFIG.SQRT_MAG_SCALE, 0, 0, 0.5) } - // @ts-ignore - transform(e, 1, null, 1 + pl, 0.5) + + transform(e, 1, 0, 1 + pl, 0.5) expr.bbox = { x: 0, y: 2 - e.bbox.h - 0.5, @@ -622,7 +625,7 @@ function plan(expr: Expr, mode = 'math'): void { let mh = 1 for (let i = 0; i < expr.chld.length; i++) { const c: Expr = expr.chld[i] - // @ts-ignore + const spac: number = { '\\quad': 2, @@ -630,7 +633,7 @@ function plan(expr: Expr, mode = 'math'): void { '\\:': (2 * 4) / 18, '\\;': (2 * 5) / 18, '\\!': (2 * -3) / 18 - }[c.text] ?? null + }[c.text] ?? 0 if (c.text == '\\\\') { dy += mh @@ -644,8 +647,8 @@ function plan(expr: Expr, mode = 'math'): void { continue } else { plan(c, tmd) - // @ts-ignore - transform(c, 1, null, dx, dy) + + transform(c, 1, 0, dx, dy) if (c.text == '^' || c.text == '_' || c.text == '\'') { let j: number = i while ( @@ -724,8 +727,7 @@ function plan(expr: Expr, mode = 'math'): void { } for (let i = 0; i < expr.chld.length; i++) { - // @ts-ignore - transform(expr.chld[i], 1, null, -bb.x + (hasLp ? 1.5 : 0), -bb.y) + transform(expr.chld[i], 1, 0, -bb.x + (hasLp ? 1.5 : 0), -bb.y) } expr.bbox = { x: 0, @@ -1104,8 +1106,8 @@ export class LaTexUtils { xmlns="http://www.w3.org/2000/svg" width="${w}" height="${h}" fill="none" stroke="${opt.FG_COLOR ?? 'black'}" stroke-width="${ - opt.STROKE_W ?? 1 - }" + opt.STROKE_W ?? 1 + }" stroke-linecap="round" stroke-linejoin="round" >` if (opt.BG_COLOR) { @@ -1167,7 +1169,12 @@ export class LaTexUtils { const bs: Bbox[] = [] for (let i = 0; i < this._tree.chld.length; i++) { const { x, y, w, h } = this._tree.chld[i].bbox - bs.push({ x: px + x * sclx, y: py + y * scly, w: w * sclx, h: h * scly }) + bs.push({ + x: px + x * sclx, + y: py + y * scly, + w: w * sclx, + h: h * scly + }) } return bs } diff --git a/src/editor/core/draw/particle/previewer/Previewer.ts b/src/editor/core/draw/particle/previewer/Previewer.ts index 283a17a97..b8dbb07a1 100644 --- a/src/editor/core/draw/particle/previewer/Previewer.ts +++ b/src/editor/core/draw/particle/previewer/Previewer.ts @@ -355,7 +355,6 @@ export class Previewer { } previewerContainer.onwheel = evt => { evt.preventDefault() - evt.stopPropagation() if (evt.deltaY < 0) { // 放大 scaleSize += 0.1 @@ -390,7 +389,6 @@ export class Previewer { public _updateResizerRect(width: number, height: number) { const { resizerSize: handleSize, scale } = this.options - const isReadonly = this.draw.isReadonly() this.resizerSelection.style.width = `${width}px` this.resizerSelection.style.height = `${height}px` // handle @@ -399,18 +397,17 @@ export class Previewer { i === 0 || i === 6 || i === 7 ? -handleSize : i === 1 || i === 5 - ? width / 2 - : width - handleSize + ? width / 2 + : width - handleSize const top = i === 0 || i === 1 || i === 2 ? -handleSize : i === 3 || i === 7 - ? height / 2 - handleSize - : height - handleSize + ? height / 2 - handleSize + : height - handleSize this.resizerHandleList[i].style.transform = `scale(${scale})` this.resizerHandleList[i].style.left = `${left}px` this.resizerHandleList[i].style.top = `${top}px` - this.resizerHandleList[i].style.display = isReadonly ? 'none' : 'block' } } diff --git a/src/editor/core/draw/particle/table/TableOperate.ts b/src/editor/core/draw/particle/table/TableOperate.ts deleted file mode 100644 index f0b6d9b18..000000000 --- a/src/editor/core/draw/particle/table/TableOperate.ts +++ /dev/null @@ -1,968 +0,0 @@ -import { ElementType, IElement, TableBorder, VerticalAlign } from '../../../..' -import { ZERO } from '../../../../dataset/constant/Common' -import { TABLE_CONTEXT_ATTR } from '../../../../dataset/constant/Element' -import { TdBorder, TdSlash } from '../../../../dataset/enum/table/Table' -import { DeepRequired } from '../../../../interface/Common' -import { IEditorOption } from '../../../../interface/Editor' -import { IColgroup } from '../../../../interface/table/Colgroup' -import { ITd } from '../../../../interface/table/Td' -import { ITr } from '../../../../interface/table/Tr' -import { cloneProperty, getUUID } from '../../../../utils' -import { - formatElementContext, - formatElementList -} from '../../../../utils/element' -import { Position } from '../../../position/Position' -import { RangeManager } from '../../../range/RangeManager' -import { Draw } from '../../Draw' -import { TableParticle } from './TableParticle' -import { TableTool } from './TableTool' - -export class TableOperate { - private draw: Draw - private range: RangeManager - private position: Position - private tableTool: TableTool - private tableParticle: TableParticle - private options: DeepRequired - - constructor(draw: Draw) { - this.draw = draw - this.range = draw.getRange() - this.position = draw.getPosition() - this.tableTool = draw.getTableTool() - this.tableParticle = draw.getTableParticle() - this.options = draw.getOptions() - } - - public insertTable(row: number, col: number) { - const { startIndex, endIndex } = this.range.getRange() - if (!~startIndex && !~endIndex) return - const { defaultTrMinHeight } = this.options.table - const elementList = this.draw.getElementList() - let offsetX = 0 - if (elementList[startIndex]?.listId) { - const positionList = this.position.getPositionList() - const { rowIndex } = positionList[startIndex] - const rowList = this.draw.getRowList() - const row = rowList[rowIndex] - offsetX = row?.offsetX || 0 - } - const innerWidth = this.draw.getContextInnerWidth() - offsetX - // colgroup - const colgroup: IColgroup[] = [] - const colWidth = innerWidth / col - for (let c = 0; c < col; c++) { - colgroup.push({ - width: colWidth - }) - } - // trlist - const trList: ITr[] = [] - for (let r = 0; r < row; r++) { - const tdList: ITd[] = [] - const tr: ITr = { - height: defaultTrMinHeight, - tdList - } - for (let c = 0; c < col; c++) { - tdList.push({ - colspan: 1, - rowspan: 1, - value: [] - }) - } - trList.push(tr) - } - const element: IElement = { - type: ElementType.TABLE, - value: '', - colgroup, - trList - } - // 格式化element - formatElementList([element], { - editorOptions: this.options - }) - formatElementContext(elementList, [element], startIndex, { - editorOptions: this.options - }) - const curIndex = startIndex + 1 - this.draw.spliceElementList( - elementList, - curIndex, - startIndex === endIndex ? 0 : endIndex - startIndex, - [element] - ) - this.range.setRange(curIndex, curIndex) - this.draw.render({ curIndex, isSetCursor: false }) - } - - public insertTableTopRow() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, trIndex, tableId } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTr = curTrList[trIndex!] - // 之前跨行的增加跨行数 - if (curTr.tdList.length < element.colgroup!.length) { - const curTrNo = curTr.tdList[0].rowIndex! - for (let t = 0; t < trIndex!; t++) { - const tr = curTrList[t] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) { - td.rowspan += 1 - } - } - } - } - // 增加当前行 - const newTrId = getUUID() - const newTr: ITr = { - height: curTr.height, - id: newTrId, - tdList: [] - } - for (let t = 0; t < curTr.tdList.length; t++) { - const curTd = curTr.tdList[t] - const newTdId = getUUID() - newTr.tdList.push({ - id: newTdId, - rowspan: 1, - colspan: curTd.colspan, - value: [ - { - value: ZERO, - size: 16, - tableId, - trId: newTrId, - tdId: newTdId - } - ] - }) - } - curTrList.splice(trIndex!, 0, newTr) - // 重新设置上下文 - this.position.setPositionContext({ - isTable: true, - index, - trIndex, - tdIndex: 0, - tdId: newTr.tdList[0].id, - trId: newTr.id, - tableId - }) - this.range.setRange(0, 0) - // 重新渲染 - this.draw.render({ curIndex: 0 }) - this.tableTool.render() - } - - public insertTableBottomRow() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, trIndex, tableId } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTr = curTrList[trIndex!] - const anchorTr = - curTrList.length - 1 === trIndex ? curTr : curTrList[trIndex! + 1] - // 之前/当前行跨行的增加跨行数 - if (anchorTr.tdList.length < element.colgroup!.length) { - const curTrNo = anchorTr.tdList[0].rowIndex! - for (let t = 0; t < trIndex! + 1; t++) { - const tr = curTrList[t] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - if (td.rowspan > 1 && td.rowIndex! + td.rowspan >= curTrNo + 1) { - td.rowspan += 1 - } - } - } - } - // 增加当前行 - const newTrId = getUUID() - const newTr: ITr = { - height: anchorTr.height, - id: newTrId, - tdList: [] - } - for (let t = 0; t < anchorTr.tdList.length; t++) { - const curTd = anchorTr.tdList[t] - const newTdId = getUUID() - newTr.tdList.push({ - id: newTdId, - rowspan: 1, - colspan: curTd.colspan, - value: [ - { - value: ZERO, - size: 16, - tableId, - trId: newTrId, - tdId: newTdId - } - ] - }) - } - curTrList.splice(trIndex! + 1, 0, newTr) - // 重新设置上下文 - this.position.setPositionContext({ - isTable: true, - index, - trIndex: trIndex! + 1, - tdIndex: 0, - tdId: newTr.tdList[0].id, - trId: newTr.id, - tableId: element.id - }) - this.range.setRange(0, 0) - // 重新渲染 - this.draw.render({ curIndex: 0 }) - } - - public adjustColWidth(element: IElement) { - if (element.type !== ElementType.TABLE) return - const { defaultColMinWidth } = this.options.table - const colgroup = element.colgroup! - const colgroupWidth = colgroup.reduce((pre, cur) => pre + cur.width, 0) - const width = this.draw.getOriginalInnerWidth() - if (colgroupWidth > width) { - // 过滤大于最小宽度的列(可能减少宽度的列) - const greaterMinWidthCol = colgroup.filter( - col => col.width > defaultColMinWidth - ) - // 均分多余宽度 - const adjustWidth = (colgroupWidth - width) / greaterMinWidthCol.length - for (let g = 0; g < colgroup.length; g++) { - const group = colgroup[g] - // 小于最小宽度的列不处理 - if (group.width - adjustWidth >= defaultColMinWidth) { - group.width -= adjustWidth - } - } - } - } - - public insertTableLeftCol() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, tdIndex, tableId } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTdIndex = tdIndex! - // 增加列 - for (let t = 0; t < curTrList.length; t++) { - const tr = curTrList[t] - const tdId = getUUID() - tr.tdList.splice(curTdIndex, 0, { - id: tdId, - rowspan: 1, - colspan: 1, - value: [ - { - value: ZERO, - size: 16, - tableId, - trId: tr.id, - tdId - } - ] - }) - } - // 重新计算宽度 - const { defaultColMinWidth } = this.options.table - const colgroup = element.colgroup! - colgroup.splice(curTdIndex, 0, { - width: defaultColMinWidth - }) - this.adjustColWidth(element) - // 重新设置上下文 - this.position.setPositionContext({ - isTable: true, - index, - trIndex: 0, - tdIndex: curTdIndex, - tdId: curTrList[0].tdList[curTdIndex].id, - trId: curTrList[0].id, - tableId - }) - this.range.setRange(0, 0) - // 重新渲染 - this.draw.render({ curIndex: 0 }) - this.tableTool.render() - } - - public insertTableRightCol() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, tdIndex, tableId } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTdIndex = tdIndex! + 1 - // 增加列 - for (let t = 0; t < curTrList.length; t++) { - const tr = curTrList[t] - const tdId = getUUID() - tr.tdList.splice(curTdIndex, 0, { - id: tdId, - rowspan: 1, - colspan: 1, - value: [ - { - value: ZERO, - size: 16, - tableId, - trId: tr.id, - tdId - } - ] - }) - } - // 重新计算宽度 - const { defaultColMinWidth } = this.options.table - const colgroup = element.colgroup! - colgroup.splice(curTdIndex, 0, { - width: defaultColMinWidth - }) - this.adjustColWidth(element) - // 重新设置上下文 - this.position.setPositionContext({ - isTable: true, - index, - trIndex: 0, - tdIndex: curTdIndex, - tdId: curTrList[0].tdList[curTdIndex].id, - trId: curTrList[0].id, - tableId: element.id - }) - this.range.setRange(0, 0) - // 重新渲染 - this.draw.render({ curIndex: 0 }) - } - - public deleteTableRow() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, trIndex, tdIndex } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const trList = element.trList! - const curTr = trList[trIndex!] - const curTdRowIndex = curTr.tdList[tdIndex!].rowIndex! - // 如果是最后一行,直接删除整个表格 - if (trList.length <= 1) { - this.deleteTable() - return - } - // 之前行缩小rowspan - for (let r = 0; r < curTdRowIndex; r++) { - const tr = trList[r] - const tdList = tr.tdList - for (let d = 0; d < tdList.length; d++) { - const td = tdList[d] - if (td.rowIndex! + td.rowspan > curTdRowIndex) { - td.rowspan-- - } - } - } - // 补跨行 - for (let d = 0; d < curTr.tdList.length; d++) { - const td = curTr.tdList[d] - if (td.rowspan > 1) { - const tdId = getUUID() - const nextTr = trList[trIndex! + 1] - nextTr.tdList.splice(d, 0, { - id: tdId, - rowspan: td.rowspan - 1, - colspan: td.colspan, - value: [ - { - value: ZERO, - size: 16, - tableId: element.id, - trId: nextTr.id, - tdId - } - ] - }) - } - } - // 删除当前行 - trList.splice(trIndex!, 1) - // 重新设置上下文 - this.position.setPositionContext({ - isTable: false - }) - this.range.clearRange() - // 重新渲染 - this.draw.render({ - curIndex: positionContext.index - }) - this.tableTool.dispose() - } - - public deleteTableCol() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, tdIndex, trIndex } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTd = curTrList[trIndex!].tdList[tdIndex!] - const curColIndex = curTd.colIndex! - // 如果是最后一列,直接删除整个表格 - const moreTdTr = curTrList.find(tr => tr.tdList.length > 1) - if (!moreTdTr) { - this.deleteTable() - return - } - // 缩小colspan或删除与当前列重叠的单元格 - for (let t = 0; t < curTrList.length; t++) { - const tr = curTrList[t] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - if ( - td.colIndex! <= curColIndex && - td.colIndex! + td.colspan > curColIndex - ) { - if (td.colspan > 1) { - td.colspan-- - } else { - tr.tdList.splice(d, 1) - } - } - } - } - element.colgroup?.splice(curColIndex, 1) - // 重新设置上下文 - this.position.setPositionContext({ - isTable: false - }) - this.range.setRange(0, 0) - // 重新渲染 - this.draw.render({ - curIndex: positionContext.index - }) - this.tableTool.dispose() - } - - public deleteTable() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const originalElementList = this.draw.getOriginalElementList() - originalElementList.splice(positionContext.index!, 1) - const curIndex = positionContext.index! - 1 - this.position.setPositionContext({ - isTable: false, - index: curIndex - }) - this.range.setRange(curIndex, curIndex) - this.draw.render({ curIndex }) - this.tableTool.dispose() - } - - public mergeTableCell() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { - isCrossRowCol, - startTdIndex, - endTdIndex, - startTrIndex, - endTrIndex - } = this.range.getRange() - if (!isCrossRowCol) return - const { index } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - let startTd = curTrList[startTrIndex!].tdList[startTdIndex!] - let endTd = curTrList[endTrIndex!].tdList[endTdIndex!] - // 交换起始位置 - if (startTd.x! > endTd.x! || startTd.y! > endTd.y!) { - // prettier-ignore - [startTd, endTd] = [endTd, startTd] - } - const startColIndex = startTd.colIndex! - const endColIndex = endTd.colIndex! + (endTd.colspan - 1) - const startRowIndex = startTd.rowIndex! - const endRowIndex = endTd.rowIndex! + (endTd.rowspan - 1) - // 选区行列 - const rowCol: ITd[][] = [] - for (let t = 0; t < curTrList.length; t++) { - const tr = curTrList[t] - const tdList: ITd[] = [] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - const tdColIndex = td.colIndex! - const tdRowIndex = td.rowIndex! - if ( - tdColIndex >= startColIndex && - tdColIndex <= endColIndex && - tdRowIndex >= startRowIndex && - tdRowIndex <= endRowIndex - ) { - tdList.push(td) - } - } - if (tdList.length) { - rowCol.push(tdList) - } - } - if (!rowCol.length) return - // 是否是矩形 - const lastRow = rowCol[rowCol.length - 1] - const leftTop = rowCol[0][0] - const rightBottom = lastRow[lastRow.length - 1] - const startX = leftTop.x! - const startY = leftTop.y! - const endX = rightBottom.x! + rightBottom.width! - const endY = rightBottom.y! + rightBottom.height! - for (let t = 0; t < rowCol.length; t++) { - const tr = rowCol[t] - for (let d = 0; d < tr.length; d++) { - const td = tr[d] - const tdStartX = td.x! - const tdStartY = td.y! - const tdEndX = tdStartX + td.width! - const tdEndY = tdStartY + td.height! - // 存在不符合项 - if ( - startX > tdStartX || - startY > tdStartY || - endX < tdEndX || - endY < tdEndY - ) { - return - } - } - } - // 合并单元格 - const mergeTdIdList: string[] = [] - const anchorTd = rowCol[0][0] - const anchorElement = anchorTd.value[0] - for (let t = 0; t < rowCol.length; t++) { - const tr = rowCol[t] - for (let d = 0; d < tr.length; d++) { - const td = tr[d] - const isAnchorTd = t === 0 && d === 0 - // 缓存待删除单元id并合并单元格内容 - if (!isAnchorTd) { - mergeTdIdList.push(td.id!) - // 复制表格属性后追加 - for (let d = 0; d < td.value.length; d++) { - const tdElement = td.value[d] - cloneProperty( - TABLE_CONTEXT_ATTR, - anchorElement, - tdElement - ) - anchorTd.value.push(tdElement) - } - } - // 列合并 - if (t === 0 && d !== 0) { - anchorTd.colspan += td.colspan - } - // 行合并 - if (t !== 0) { - if (anchorTd.colIndex === td.colIndex) { - anchorTd.rowspan += td.rowspan - } - } - } - } - // 移除多余单元格 - for (let t = 0; t < curTrList.length; t++) { - const tr = curTrList[t] - let d = 0 - while (d < tr.tdList.length) { - const td = tr.tdList[d] - if (mergeTdIdList.includes(td.id!)) { - tr.tdList.splice(d, 1) - d-- - } - d++ - } - } - // 设置上下文信息 - this.position.setPositionContext({ - ...positionContext, - trIndex: anchorTd.trIndex, - tdIndex: anchorTd.tdIndex - }) - const curIndex = anchorTd.value.length - 1 - this.range.setRange(curIndex, curIndex) - // 重新渲染 - this.draw.render() - this.tableTool.render() - } - - public cancelMergeTableCell() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index, tdIndex, trIndex } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTr = curTrList[trIndex!]! - const curTd = curTr.tdList[tdIndex!] - if (curTd.rowspan === 1 && curTd.colspan === 1) return - const colspan = curTd.colspan - // 设置跨列 - if (curTd.colspan > 1) { - for (let c = 1; c < curTd.colspan; c++) { - const tdId = getUUID() - curTr.tdList.splice(tdIndex! + c, 0, { - id: tdId, - rowspan: 1, - colspan: 1, - value: [ - { - value: ZERO, - size: 16, - tableId: element.id, - trId: curTr.id, - tdId - } - ] - }) - } - curTd.colspan = 1 - } - // 设置跨行 - if (curTd.rowspan > 1) { - for (let r = 1; r < curTd.rowspan; r++) { - const tr = curTrList[trIndex! + r] - for (let c = 0; c < colspan; c++) { - const tdId = getUUID() - tr.tdList.splice(curTd.colIndex!, 0, { - id: tdId, - rowspan: 1, - colspan: 1, - value: [ - { - value: ZERO, - size: 16, - tableId: element.id, - trId: tr.id, - tdId - } - ] - }) - } - } - curTd.rowspan = 1 - } - // 重新渲染 - const curIndex = curTd.value.length - 1 - this.range.setRange(curIndex, curIndex) - this.draw.render() - this.tableTool.render() - } - - public splitVerticalTableCell() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - // 暂时忽略跨行列选择 - const range = this.range.getRange() - if (range.isCrossRowCol) return - const { index, tdIndex, trIndex } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTr = curTrList[trIndex!]! - const curTd = curTr.tdList[tdIndex!] - // 增加列属性 - element.colgroup!.splice(tdIndex! + 1, 0, { - width: this.options.table.defaultColMinWidth - }) - // 同行增加td,非同行增加跨列数 - for (let t = 0; t < curTrList.length; t++) { - const tr = curTrList[t] - let d = 0 - while (d < tr.tdList.length) { - const td = tr.tdList[d] - // 非同行:存在交叉时增加跨列数 - if (td.rowIndex !== curTd.rowIndex) { - if ( - td.colIndex! <= curTd.colIndex! && - td.colIndex! + td.colspan > curTd.colIndex! - ) { - td.colspan++ - } - } else { - // 当前单元格:往右插入td - if (td.id === curTd.id) { - const tdId = getUUID() - curTr.tdList.splice(d + curTd.colspan, 0, { - id: tdId, - rowspan: curTd.rowspan, - colspan: 1, - value: [ - { - value: ZERO, - size: 16, - tableId: element.id, - trId: tr.id, - tdId - } - ] - }) - d++ - } - } - d++ - } - } - // 重新渲染 - this.draw.render() - this.tableTool.render() - } - - public splitHorizontalTableCell() { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - // 暂时忽略跨行列选择 - const range = this.range.getRange() - if (range.isCrossRowCol) return - const { index, tdIndex, trIndex } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - const curTrList = element.trList! - const curTr = curTrList[trIndex!]! - const curTd = curTr.tdList[tdIndex!] - // 追加的行跳出循环 - let appendTrIndex = -1 - // 交叉行增加rowspan,当前单元格往下追加一行tr - let t = 0 - while (t < curTrList.length) { - if (t === appendTrIndex) { - t++ - continue - } - const tr = curTrList[t] - let d = 0 - while (d < tr.tdList.length) { - const td = tr.tdList[d] - if (td.id === curTd.id) { - const trId = getUUID() - const tdId = getUUID() - curTrList.splice(t + curTd.rowspan, 0, { - id: trId, - height: this.options.table.defaultTrMinHeight, - tdList: [ - { - id: tdId, - rowspan: 1, - colspan: curTd.colspan, - value: [ - { - value: ZERO, - size: 16, - tableId: element.id, - trId, - tdId - } - ] - } - ] - }) - appendTrIndex = t + curTd.rowspan - } else if ( - td.rowIndex! >= curTd.rowIndex! && - td.rowIndex! < curTd.rowIndex! + curTd.rowspan && - td.rowIndex! + td.rowspan >= curTd.rowIndex! + curTd.rowspan - ) { - // 1. 循环td上方大于等于当前td上方 && 小于当前td的下方=>存在交叉 - // 2. 循环td下方大于或等于当前td下方 - td.rowspan++ - } - d++ - } - t++ - } - // 重新渲染 - this.draw.render() - this.tableTool.render() - } - - public tableTdVerticalAlign(payload: VerticalAlign) { - const rowCol = this.tableParticle.getRangeRowCol() - if (!rowCol) return - for (let r = 0; r < rowCol.length; r++) { - const row = rowCol[r] - for (let c = 0; c < row.length; c++) { - const td = row[c] - if ( - !td || - td.verticalAlign === payload || - (!td.verticalAlign && payload === VerticalAlign.TOP) - ) { - continue - } - // 重设垂直对齐方式 - td.verticalAlign = payload - } - } - const { endIndex } = this.range.getRange() - this.draw.render({ - curIndex: endIndex - }) - } - - public tableBorderType(payload: TableBorder) { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - if ( - (!element.borderType && payload === TableBorder.ALL) || - element.borderType === payload - ) { - return - } - element.borderType = payload - const { endIndex } = this.range.getRange() - this.draw.render({ - curIndex: endIndex - }) - } - - public tableBorderColor(payload: string) { - const positionContext = this.position.getPositionContext() - if (!positionContext.isTable) return - const { index } = positionContext - const originalElementList = this.draw.getOriginalElementList() - const element = originalElementList[index!] - if ( - (!element.borderColor && - payload === this.options.table.defaultBorderColor) || - element.borderColor === payload - ) { - return - } - element.borderColor = payload - const { endIndex } = this.range.getRange() - this.draw.render({ - curIndex: endIndex, - isCompute: false - }) - } - - public tableTdBorderType(payload: TdBorder) { - const rowCol = this.tableParticle.getRangeRowCol() - if (!rowCol) return - const tdList = rowCol.flat() - // 存在则设置边框类型,否则取消设置 - const isSetBorderType = tdList.some( - td => !td.borderTypes?.includes(payload) - ) - tdList.forEach(td => { - if (!td.borderTypes) { - td.borderTypes = [] - } - const borderTypeIndex = td.borderTypes.findIndex(type => type === payload) - if (isSetBorderType) { - if (!~borderTypeIndex) { - td.borderTypes.push(payload) - } - } else { - if (~borderTypeIndex) { - td.borderTypes.splice(borderTypeIndex, 1) - } - } - // 不存在边框设置时删除字段 - if (!td.borderTypes.length) { - delete td.borderTypes - } - }) - const { endIndex } = this.range.getRange() - this.draw.render({ - curIndex: endIndex - }) - } - - public tableTdSlashType(payload: TdSlash) { - const rowCol = this.tableParticle.getRangeRowCol() - if (!rowCol) return - const tdList = rowCol.flat() - // 存在则设置单元格斜线类型,否则取消设置 - const isSetTdSlashType = tdList.some( - td => !td.slashTypes?.includes(payload) - ) - tdList.forEach(td => { - if (!td.slashTypes) { - td.slashTypes = [] - } - const slashTypeIndex = td.slashTypes.findIndex(type => type === payload) - if (isSetTdSlashType) { - if (!~slashTypeIndex) { - td.slashTypes.push(payload) - } - } else { - if (~slashTypeIndex) { - td.slashTypes.splice(slashTypeIndex, 1) - } - } - // 不存在斜线设置时删除字段 - if (!td.slashTypes.length) { - delete td.slashTypes - } - }) - const { endIndex } = this.range.getRange() - this.draw.render({ - curIndex: endIndex - }) - } - - public tableTdBackgroundColor(payload: string) { - const rowCol = this.tableParticle.getRangeRowCol() - if (!rowCol) return - for (let r = 0; r < rowCol.length; r++) { - const row = rowCol[r] - for (let c = 0; c < row.length; c++) { - const col = row[c] - col.backgroundColor = payload - } - } - const { endIndex } = this.range.getRange() - this.range.setRange(endIndex, endIndex) - this.draw.render({ - isCompute: false - }) - } - - public tableSelectAll() { - const positionContext = this.position.getPositionContext() - const { index, tableId, isTable } = positionContext - if (!isTable || !tableId) return - const { startIndex, endIndex } = this.range.getRange() - const originalElementList = this.draw.getOriginalElementList() - const trList = originalElementList[index!].trList! - // 最后单元格位置 - const endTrIndex = trList.length - 1 - const endTdIndex = trList[endTrIndex].tdList.length - 1 - this.range.replaceRange({ - startIndex, - endIndex, - tableId, - startTdIndex: 0, - endTdIndex, - startTrIndex: 0, - endTrIndex - }) - this.draw.render({ - isCompute: false, - isSubmitHistory: false - }) - } -} diff --git a/src/editor/core/draw/particle/table/TableParticle.ts b/src/editor/core/draw/particle/table/TableParticle.ts index c37d7d853..1350ad6f3 100644 --- a/src/editor/core/draw/particle/table/TableParticle.ts +++ b/src/editor/core/draw/particle/table/TableParticle.ts @@ -1,6 +1,5 @@ import { ElementType, IElement, TableBorder } from '../../../..' import { TdBorder, TdSlash } from '../../../../dataset/enum/table/Table' -import { DeepRequired } from '../../../../interface/Common' import { IEditorOption } from '../../../../interface/Editor' import { ITd } from '../../../../interface/table/Td' import { ITr } from '../../../../interface/table/Tr' @@ -20,7 +19,7 @@ interface IDrawTableBorderOption { export class TableParticle { private draw: Draw private range: RangeManager - private options: DeepRequired + private options: Required constructor(draw: Draw) { this.draw = draw @@ -149,29 +148,19 @@ export class TableParticle { startX: number, startY: number ) { - const { colgroup, trList, borderType, borderColor } = element + const { colgroup, trList, borderType } = element if (!colgroup || !trList) return - const { - scale, - table: { defaultBorderColor } - } = this.options + const { scale } = this.options const tableWidth = element.width! * scale const tableHeight = element.height! * scale // 无边框 const isEmptyBorderType = borderType === TableBorder.EMPTY // 仅外边框 const isExternalBorderType = borderType === TableBorder.EXTERNAL - // 内边框 - const isInternalBorderType = borderType === TableBorder.INTERNAL ctx.save() - // 虚线 - if (borderType === TableBorder.DASH) { - ctx.setLineDash([3, 3]) - } ctx.lineWidth = scale - ctx.strokeStyle = borderColor || defaultBorderColor // 渲染边框 - if (!isEmptyBorderType && !isInternalBorderType) { + if (!isEmptyBorderType) { this._drawOuterBorder({ ctx, startX, @@ -227,22 +216,9 @@ export class TableParticle { } // 表格线 if (!isEmptyBorderType && !isExternalBorderType) { - // 右边框 - if ( - !isInternalBorderType || - td.colIndex! + td.colspan < colgroup.length - ) { - ctx.moveTo(x, y) - ctx.lineTo(x, y + height) - } - // 下边框 - if ( - !isInternalBorderType || - td.rowIndex! + td.rowspan < trList.length - ) { - ctx.moveTo(x, y + height) - ctx.lineTo(x - width, y + height) - } + ctx.moveTo(x, y) + ctx.lineTo(x, y + height) + ctx.lineTo(x - width, y + height) ctx.stroke() } ctx.translate(-0.5, -0.5) @@ -313,22 +289,6 @@ export class TableParticle { return data } - public getTdListByRowIndex(trList: ITr[], rowIndex: number) { - const data: ITd[] = [] - for (let r = 0; r < trList.length; r++) { - const tdList = trList[r].tdList - for (let d = 0; d < tdList.length; d++) { - const td = tdList[d] - const min = td.rowIndex! - const max = min + td.rowspan - 1 - if (rowIndex >= min && rowIndex <= max) { - data.push(td) - } - } - } - return data - } - public computeRowColInfo(element: IElement) { const { colgroup, trList } = element if (!colgroup || !trList) return diff --git a/src/editor/core/draw/particle/table/TableTool.ts b/src/editor/core/draw/particle/table/TableTool.ts index 0a13b967e..14e0481be 100644 --- a/src/editor/core/draw/particle/table/TableTool.ts +++ b/src/editor/core/draw/particle/table/TableTool.ts @@ -4,7 +4,6 @@ import { TableOrder } from '../../../../dataset/enum/table/TableTool' import { DeepRequired } from '../../../../interface/Common' import { IEditorOption } from '../../../../interface/Editor' import { Position } from '../../../position/Position' -import { RangeManager } from '../../../range/RangeManager' import { Draw } from '../../Draw' interface IAnchorMouseDown { @@ -19,28 +18,15 @@ export class TableTool { private readonly MIN_TD_WIDTH = 20 // 行列工具相对表格偏移值 private readonly ROW_COL_OFFSET = 18 - // 快速添加行列工具宽度 - private readonly ROW_COL_QUICK_WIDTH = 16 - // 快速添加行列工具偏移值 - private readonly ROW_COL_QUICK_OFFSET = 5 - // 快速添加行列工具相对表格位置 - private readonly ROW_COL_QUICK_POSITION = - this.ROW_COL_OFFSET + (this.ROW_COL_OFFSET - this.ROW_COL_QUICK_WIDTH) / 2 // 边框工具宽/高度 private readonly BORDER_VALUE = 4 - // 快速选择工具偏移值 - private readonly TABLE_SELECT_OFFSET = 20 private draw: Draw private canvas: HTMLCanvasElement private options: DeepRequired private position: Position - private range: RangeManager private container: HTMLDivElement private toolRowContainer: HTMLDivElement | null - private toolRowAddBtn: HTMLDivElement | null - private toolColAddBtn: HTMLDivElement | null - private toolTableSelectBtn: HTMLDivElement | null private toolColContainer: HTMLDivElement | null private toolBorderContainer: HTMLDivElement | null private anchorLine: HTMLDivElement | null @@ -52,13 +38,9 @@ export class TableTool { this.canvas = draw.getPage() this.options = draw.getOptions() this.position = draw.getPosition() - this.range = draw.getRange() this.container = draw.getContainer() // x、y轴 this.toolRowContainer = null - this.toolRowAddBtn = null - this.toolColAddBtn = null - this.toolTableSelectBtn = null this.toolColContainer = null this.toolBorderContainer = null this.anchorLine = null @@ -68,15 +50,9 @@ export class TableTool { public dispose() { this.toolRowContainer?.remove() - this.toolRowAddBtn?.remove() - this.toolColAddBtn?.remove() - this.toolTableSelectBtn?.remove() this.toolColContainer?.remove() this.toolBorderContainer?.remove() this.toolRowContainer = null - this.toolRowAddBtn = null - this.toolColAddBtn = null - this.toolTableSelectBtn = null this.toolColContainer = null this.toolBorderContainer = null } @@ -87,13 +63,11 @@ export class TableTool { if (!isTable) return // 销毁之前工具 this.dispose() + // 渲染所需数据 + const { scale } = this.options const elementList = this.draw.getOriginalElementList() const positionList = this.position.getOriginalPositionList() const element = elementList[index!] - // 表格工具配置禁用又非设计模式时不渲染 - if (element.tableToolDisabled && !this.draw.isDesignMode()) return - // 渲染所需数据 - const { scale } = this.options const position = positionList[index!] const { colgroup, trList } = element const { @@ -107,23 +81,6 @@ export class TableTool { const td = element.trList![trIndex!].tdList[tdIndex!] const rowIndex = td.rowIndex const colIndex = td.colIndex - const tableHeight = element.height! * scale - const tableWidth = element.width! * scale - // 表格选择工具 - const tableSelectBtn = document.createElement('div') - tableSelectBtn.classList.add(`${EDITOR_PREFIX}-table-tool__select`) - tableSelectBtn.style.height = `${tableHeight * scale}` - tableSelectBtn.style.left = `${tableX}px` - tableSelectBtn.style.top = `${tableY}px` - tableSelectBtn.style.transform = `translate(-${ - this.TABLE_SELECT_OFFSET * scale - }px, ${-this.TABLE_SELECT_OFFSET * scale}px)` - // 快捷全选 - tableSelectBtn.onclick = () => { - this.draw.getTableOperate().tableSelectAll() - } - this.container.append(tableSelectBtn) - this.toolTableSelectBtn = tableSelectBtn // 渲染行工具 const rowHeightList = trList!.map(tr => tr.height) const rowContainer = document.createElement('div') @@ -138,39 +95,8 @@ export class TableTool { if (r === rowIndex) { rowItem.classList.add('active') } - // 快捷行选择 - rowItem.onclick = () => { - const tdList = this.draw - .getTableParticle() - .getTdListByRowIndex(trList!, r) - const firstTd = tdList[0] - const lastTd = tdList[tdList.length - 1] - this.position.setPositionContext({ - index, - isTable: true, - trIndex: firstTd.trIndex, - tdIndex: firstTd.tdIndex, - tableId: element.id - }) - this.range.setRange( - 0, - 0, - element.id, - firstTd.tdIndex, - lastTd.tdIndex, - firstTd.trIndex, - lastTd.trIndex - ) - this.draw.render({ - curIndex: 0, - isCompute: false, - isSubmitHistory: false - }) - this._setAnchorActive(rowContainer, r) - } const rowItemAnchor = document.createElement('div') rowItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`) - // 行高度拖拽开始 rowItemAnchor.onmousedown = evt => { this._mousedown({ evt, @@ -187,28 +113,7 @@ export class TableTool { rowContainer.style.top = `${tableY}px` this.container.append(rowContainer) this.toolRowContainer = rowContainer - // 添加行按钮 - const rowAddBtn = document.createElement('div') - rowAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`) - rowAddBtn.style.height = `${tableHeight * scale}` - rowAddBtn.style.left = `${tableX}px` - rowAddBtn.style.top = `${tableY + tableHeight}px` - rowAddBtn.style.transform = `translate(-${ - this.ROW_COL_QUICK_POSITION * scale - }px, ${this.ROW_COL_QUICK_OFFSET * scale}px)` - // 快捷添加行 - rowAddBtn.onclick = () => { - this.position.setPositionContext({ - index, - isTable: true, - trIndex: trList!.length - 1, - tdIndex: 0, - tableId: element.id - }) - this.draw.getTableOperate().insertTableBottomRow() - } - this.container.append(rowAddBtn) - this.toolRowAddBtn = rowAddBtn + // 渲染列工具 const colWidthList = colgroup!.map(col => col.width) const colContainer = document.createElement('div') @@ -223,39 +128,8 @@ export class TableTool { if (c === colIndex) { colItem.classList.add('active') } - // 快捷列选择 - colItem.onclick = () => { - const tdList = this.draw - .getTableParticle() - .getTdListByColIndex(trList!, c) - const firstTd = tdList[0] - const lastTd = tdList[tdList.length - 1] - this.position.setPositionContext({ - index, - isTable: true, - trIndex: firstTd.trIndex, - tdIndex: firstTd.tdIndex, - tableId: element.id - }) - this.range.setRange( - 0, - 0, - element.id, - firstTd.tdIndex, - lastTd.tdIndex, - firstTd.trIndex, - lastTd.trIndex - ) - this.draw.render({ - curIndex: 0, - isCompute: false, - isSubmitHistory: false - }) - this._setAnchorActive(colContainer, c) - } const colItemAnchor = document.createElement('div') colItemAnchor.classList.add(`${EDITOR_PREFIX}-table-tool__anchor`) - // 列高度拖拽开始 colItemAnchor.onmousedown = evt => { this._mousedown({ evt, @@ -272,29 +146,10 @@ export class TableTool { colContainer.style.top = `${tableY}px` this.container.append(colContainer) this.toolColContainer = colContainer - // 添加列按钮 - const colAddBtn = document.createElement('div') - colAddBtn.classList.add(`${EDITOR_PREFIX}-table-tool__quick__add`) - colAddBtn.style.height = `${tableHeight * scale}` - colAddBtn.style.left = `${tableX + tableWidth}px` - colAddBtn.style.top = `${tableY}px` - colAddBtn.style.transform = `translate(${ - this.ROW_COL_QUICK_OFFSET * scale - }px, -${this.ROW_COL_QUICK_POSITION * scale}px)` - // 快捷添加列 - colAddBtn.onclick = () => { - this.position.setPositionContext({ - index, - isTable: true, - trIndex: 0, - tdIndex: trList![0].tdList.length - 1 || 0, - tableId: element.id - }) - this.draw.getTableOperate().insertTableRightCol() - } - this.container.append(colAddBtn) - this.toolColAddBtn = colAddBtn + // 渲染单元格边框拖拽工具 + const tableHeight = element.height! * scale + const tableWidth = element.width! * scale const borderContainer = document.createElement('div') borderContainer.classList.add(`${EDITOR_PREFIX}-table-tool__border`) borderContainer.style.height = `${tableHeight}px` @@ -313,7 +168,6 @@ export class TableTool { (td.y! + td.height!) * scale - this.BORDER_VALUE / 2 }px` rowBorder.style.left = `${td.x! * scale}px` - // 行宽度拖拽开始 rowBorder.onmousedown = evt => { this._mousedown({ evt, @@ -331,7 +185,6 @@ export class TableTool { colBorder.style.left = `${ (td.x! + td.width!) * scale - this.BORDER_VALUE / 2 }px` - // 列高度拖拽开始 colBorder.onmousedown = evt => { this._mousedown({ evt, @@ -347,18 +200,6 @@ export class TableTool { this.toolBorderContainer = borderContainer } - private _setAnchorActive(container: HTMLDivElement, index: number) { - const children = container.children - for (let c = 0; c < children.length; c++) { - const child = children[c] - if (c === index) { - child.classList.add('active') - } else { - child.classList.remove('active') - } - } - } - private _mousedown(payload: IAnchorMouseDown) { const { evt, index, order, element } = payload this.canvas = this.draw.getPage() diff --git a/src/editor/core/event/CanvasEvent.ts b/src/editor/core/event/CanvasEvent.ts index ecfa1c2ed..2ad4a8681 100644 --- a/src/editor/core/event/CanvasEvent.ts +++ b/src/editor/core/event/CanvasEvent.ts @@ -5,7 +5,7 @@ import { Draw } from '../draw/Draw' import { Position } from '../position/Position' import { RangeManager } from '../range/RangeManager' import { threeClick } from '../../utils' -import { IRange, IRangeElementStyle } from '../../interface/Range' +import { IRange } from '../../interface/Range' import { mousedown } from './handlers/mousedown' import { mouseup } from './handlers/mouseup' import { mouseleave } from './handlers/mouseleave' @@ -19,14 +19,12 @@ import click from './handlers/click' import composition from './handlers/composition' import drag from './handlers/drag' import { isIOS } from '../../utils/ua' -import { ICopyOption } from '../../interface/Event' export interface ICompositionInfo { elementList: IElement[] startIndex: number endIndex: number value: string - defaultStyle: IRangeElementStyle | null } export class CanvasEvent { @@ -116,7 +114,7 @@ export class CanvasEvent { selection.forEach(s => { painterStyleKeys.forEach(pKey => { const key = pKey as keyof typeof ElementStyleKey - s[key] = painterStyle[key] as any + s[key] = painterStyle[key] as never }) }) this.draw.render({ isSetCursor: false }) @@ -180,8 +178,8 @@ export class CanvasEvent { cut(this) } - public copy(options?: ICopyOption) { - copy(this, options) + public copy() { + copy(this) } public compositionstart() { diff --git a/src/editor/core/event/GlobalEvent.ts b/src/editor/core/event/GlobalEvent.ts index 1c87d62c8..a6f4b98c6 100644 --- a/src/editor/core/event/GlobalEvent.ts +++ b/src/editor/core/event/GlobalEvent.ts @@ -50,16 +50,20 @@ export class GlobalEvent { private addEvent() { window.addEventListener('blur', this.clearSideEffect) - document.addEventListener('mousedown', this.clearSideEffect) + document.addEventListener('keyup', this.setRangeStyle) + document.addEventListener('click', this.clearSideEffect) document.addEventListener('mouseup', this.setCanvasEventAbility) - document.addEventListener('wheel', this.setPageScale, { passive: false }) + document.addEventListener('wheel', this.setPageScale, { + passive: false + }) document.addEventListener('visibilitychange', this._handleVisibilityChange) this.dprMediaQueryList.addEventListener('change', this._handleDprChange) } public removeEvent() { window.removeEventListener('blur', this.clearSideEffect) - document.removeEventListener('mousedown', this.clearSideEffect) + document.removeEventListener('keyup', this.setRangeStyle) + document.removeEventListener('click', this.clearSideEffect) document.removeEventListener('mouseup', this.setCanvasEventAbility) document.removeEventListener('wheel', this.setPageScale) document.removeEventListener( @@ -79,7 +83,10 @@ export class GlobalEvent { (node: any) => pageList.includes(node), true ) - if (innerEditorDom) return + if (innerEditorDom) { + this.setRangeStyle() + return + } // 编辑器外部组件dom const outerEditorDom = findParent( target, @@ -88,6 +95,7 @@ export class GlobalEvent { true ) if (outerEditorDom) { + this.setRangeStyle() this.watchCursorActive() return } @@ -106,6 +114,10 @@ export class GlobalEvent { this.canvasEvent.setIsAllowSelection(false) } + public setRangeStyle = () => { + this.range.setRangeStyle() + } + public watchCursorActive() { // 选区闭合&实际光标移出光标代理 if (!this.range.getIsCollapsed()) return diff --git a/src/editor/core/event/handlers/copy.ts b/src/editor/core/event/handlers/copy.ts index da70bdb48..300067833 100644 --- a/src/editor/core/event/handlers/copy.ts +++ b/src/editor/core/event/handlers/copy.ts @@ -1,13 +1,12 @@ import { ElementType } from '../../../dataset/enum/Element' import { IElement } from '../../../interface/Element' -import { ICopyOption } from '../../../interface/Event' import { ITr } from '../../../interface/table/Tr' import { writeElementList } from '../../../utils/clipboard' -import { getTextFromElementList, zipElementList } from '../../../utils/element' +import { zipElementList } from '../../../utils/element' import { IOverrideResult } from '../../override/Override' import { CanvasEvent } from '../CanvasEvent' -export function copy(host: CanvasEvent, options?: ICopyOption) { +export function copy(host: CanvasEvent) { const draw = host.getDraw() // 自定义粘贴事件 const { copy } = draw.getOverride() @@ -60,13 +59,11 @@ export function copy(host: CanvasEvent, options?: ICopyOption) { ? rangeManager.getRangeRowElementList() : rangeManager.getSelectionElementList() } - if (options?.isPlainText && copyElementList?.length) { - copyElementList = [ - { - value: getTextFromElementList(copyElementList) - } - ] - } if (!copyElementList?.length) return - writeElementList(copyElementList, draw.getOptions()) + writeElementList( + copyElementList, + draw.getOptions(), + range.startIndex, + range.endIndex + ) } diff --git a/src/editor/core/event/handlers/cut.ts b/src/editor/core/event/handlers/cut.ts index 92a8919b6..41b737c78 100644 --- a/src/editor/core/event/handlers/cut.ts +++ b/src/editor/core/event/handlers/cut.ts @@ -37,7 +37,6 @@ export function cut(host: CanvasEvent) { let curIndex: number if (control.getActiveControl() && control.getIsRangeWithinControl()) { curIndex = control.cut() - control.emitControlContentChange() } else { draw.spliceElementList(elementList, start + 1, end - start) curIndex = start diff --git a/src/editor/core/event/handlers/drag.ts b/src/editor/core/event/handlers/drag.ts index c5cefbfe7..2204b15df 100644 --- a/src/editor/core/event/handlers/drag.ts +++ b/src/editor/core/event/handlers/drag.ts @@ -42,8 +42,7 @@ function dragover(evt: DragEvent | MouseEvent, host: CanvasEvent) { cursor.drawCursor({ width: dragWidth, color: dragColor, - isBlink: false, - isFocus: false + isBlink: false }) } diff --git a/src/editor/core/event/handlers/input.ts b/src/editor/core/event/handlers/input.ts index a6b430fa6..475563c98 100644 --- a/src/editor/core/event/handlers/input.ts +++ b/src/editor/core/event/handlers/input.ts @@ -1,13 +1,9 @@ import { ZERO } from '../../../dataset/constant/Common' -import { - EDITOR_ELEMENT_COPY_ATTR, - EDITOR_ELEMENT_STYLE_ATTR -} from '../../../dataset/constant/Element' +import { EDITOR_ELEMENT_COPY_ATTR } from '../../../dataset/constant/Element' import { ElementType } from '../../../dataset/enum/Element' import { IElement } from '../../../interface/Element' -import { IRangeElementStyle } from '../../../interface/Range' import { splitText } from '../../../utils' -import { formatElementContext } from '../../../utils/element' +import { formatElementContext, getAnchorElement } from '../../../utils/element' import { CanvasEvent } from '../CanvasEvent' export function input(data: string, host: CanvasEvent) { @@ -17,25 +13,22 @@ export function input(data: string, host: CanvasEvent) { const cursorPosition = position.getCursorPosition() if (!data || !cursorPosition) return const isComposing = host.isComposing - // 正在合成文本进行非输入操作 + // Если идет составление текста, не выполняем дополнительные действия if (isComposing && host.compositionInfo?.value === data) return const rangeManager = draw.getRange() if (!rangeManager.getIsCanInput()) return - // 移除合成前,缓存设置的默认样式设置 - const defaultStyle = - rangeManager.getDefaultStyle() || host.compositionInfo?.defaultStyle || null - // 移除合成输入 + // Удаляем составленный ввод removeComposingInput(host) if (!isComposing) { const cursor = draw.getCursor() cursor.clearAgentDomValue() } - const { TEXT, HYPERLINK, SUBSCRIPT, SUPERSCRIPT, DATE, TAB } = ElementType + const { TEXT, HYPERLINK, SUBSCRIPT, SUPERSCRIPT, DATE } = ElementType const text = data.replaceAll(`\n`, ZERO) const { startIndex, endIndex } = rangeManager.getRange() - // 格式化元素 + // Форматирование элементов const elementList = draw.getElementList() - const copyElement = rangeManager.getRangeAnchorStyle(elementList, endIndex) + const copyElement = getAnchorElement(elementList, endIndex) if (!copyElement) return const isDesignMode = draw.isDesignMode() const inputData: IElement[] = splitText(text).map(value => { @@ -47,61 +40,240 @@ export function input(data: string, host: CanvasEvent) { (!copyElement.title?.disabled && !copyElement.control?.disabled) ) { const nextElement = elementList[endIndex + 1] - // 文本、超链接、日期、上下标:复制所有信息(元素类型、样式、特殊属性) if ( !copyElement.type || copyElement.type === TEXT || + copyElement.type === ElementType.PARAGRAPH || (copyElement.type === HYPERLINK && nextElement?.type === HYPERLINK) || (copyElement.type === DATE && nextElement?.type === DATE) || (copyElement.type === SUBSCRIPT && nextElement?.type === SUBSCRIPT) || (copyElement.type === SUPERSCRIPT && nextElement?.type === SUPERSCRIPT) ) { EDITOR_ELEMENT_COPY_ATTR.forEach(attr => { - // 在分组外无需复制分组信息 if (attr === 'groupIds' && !nextElement?.groupIds) return + if (attr === 'type' && copyElement.type !== newElement.type) return + + if (attr === 'id') return const value = copyElement[attr] as never + if (value !== undefined) { newElement[attr] = value } }) } - // 仅复制样式:存在默认样式设置 || 无法匹配文本类元素时(TAB) - if (defaultStyle || copyElement.type === TAB) { - EDITOR_ELEMENT_STYLE_ATTR.forEach(attr => { - const value = - defaultStyle?.[attr as keyof IRangeElementStyle] || - copyElement[attr] - if (value !== undefined) { - newElement[attr] = value as never - } - }) - } if (isComposing) { newElement.underline = true } } return newElement }) - // 控件-移除placeholder + // Обработка вставки новых элементов с учетом условий, аналогичных функции enter const control = draw.getControl() - let curIndex: number + let curIndex = -1 if (control.getActiveControl() && control.getIsRangeWithinControl()) { curIndex = control.setValue(inputData) - if (!isComposing) { - control.emitControlContentChange() - } } else { - const start = startIndex + 1 - if (startIndex !== endIndex) { - draw.spliceElementList(elementList, start, endIndex - startIndex) + const position = draw.getPosition() + const cursorPosition = position.getCursorPosition() + if (!cursorPosition) return + + let cursorElementIndex = cursorPosition.index + const pageHeight = draw.getHeight() + const marginTop = draw.getMainOuterHeight() + const rowList = draw.getRowList() + + const pageRowList = draw.getPageRowList() + const currentPageRows = pageRowList[cursorPosition.pageNo] || [] + let currentPageHeight = + currentPageRows.reduce((acc, current) => acc + current.height, 0) + + marginTop + let elementsToMove: IElement[] = [] + // let previousRowElements: IElement[] = []; + + // Поиск индекса строки с разделителем сносок на текущей странице + const footnoteRowIndexInPage = currentPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + // Определение, находится ли курсор под разделителем + let isCursorUnderSeparator = false + if (footnoteRowIndexInPage !== -1) { + // Получаем индекс строки курсора на текущей странице + const cursorRowIndexInPage = + cursorPosition.rowIndex - + pageRowList + .slice(0, cursorPosition.pageNo) + .reduce((acc, pageRows) => acc + pageRows.length, 0) + + if (cursorRowIndexInPage > footnoteRowIndexInPage) { + isCursorUnderSeparator = true + } + } + if ( + (copyElement && + copyElement.metrics?.width && + rowList[cursorPosition.rowIndex].width + copyElement.metrics.width > + draw.getInnerWidth()) || + rowList[cursorPosition.rowIndex].elementList.length >= 73 + ) { + currentPageHeight += 32 + } + // Если страница переполнена + if (currentPageHeight > pageHeight) { + if (isCursorUnderSeparator && footnoteRowIndexInPage !== -1) { + // Курсор находится под разделителем, перемещаем последнюю строку перед разделителем + + if (footnoteRowIndexInPage > 0) { + const rowToMove = currentPageRows[footnoteRowIndexInPage - 1] + + // Получаем элементы строки для перемещения + elementsToMove = rowToMove.elementList + + // Удаляем элементы строки из текущей позиции + draw.spliceElementList( + elementList, + rowToMove.startIndex, + elementsToMove.length + ) + + // Добавляем элементы на новую страницу (в конец elementList) + draw.spliceElementList( + elementList, + elementList.length, + 0, + elementsToMove + ) + + curIndex = cursorElementIndex + + rangeManager.setRange(curIndex, curIndex) + draw.render({ curIndex }) + + if (isComposing) { + host.compositionInfo = { + elementList, + value: text, + startIndex: curIndex - inputData.length, + endIndex: curIndex + } + } + + return + } + } else { + // Существующая логика обработки переполнения страницы + + // Проверяем, есть ли предыдущая строка перед разделителем + if (footnoteRowIndexInPage !== -1 && footnoteRowIndexInPage > 0) { + const previousRow = currentPageRows[footnoteRowIndexInPage - 1] + + // Нахождение индекса предыдущей строки в общем списке rowList + const previousRowIndex = rowList.findIndex(row => row === previousRow) + + // previousRowElements = elementList.slice( + // previousRow.startIndex, + // previousRow.startIndex + previousRow.elementList.length, + // ); + + elementsToMove = previousRow.elementList.filter( + el => elementList.indexOf(el) > cursorElementIndex + ) + // Вставка новых элементов, если курсор находится в конце предыдущей строки + if (cursorPosition.rowIndex === previousRowIndex) { + elementsToMove.unshift(...inputData) + } + if ( + elementsToMove.length > 1 && + cursorPosition.rowIndex === previousRowIndex + ) { + elementsToMove = [ + previousRow.elementList[previousRow.elementList.length - 1] + ] + } + + // Удаление элементов, которые перемещаются на следующую страницу + const spliceStart = + elementsToMove.length >= 2 + ? previousRow.startIndex + : previousRow.startIndex + previousRow.elementList.length - 1 + const spliceCount = + elementsToMove.length >= 2 + ? elementsToMove.length + : elementsToMove[0] === + previousRow.elementList[previousRow.elementList.length - 1] + ? 1 + : 0 + + draw.spliceElementList(elementList, spliceStart, spliceCount) + + // Вставка элементов в список после текущей позиции + const lastElementOnPage = + currentPageRows[currentPageRows.length - 1]?.elementList.at(-1) + const lastElementIndex = lastElementOnPage + ? elementList.lastIndexOf(lastElementOnPage) + : -1 + cursorElementIndex = + lastElementIndex >= 0 ? lastElementIndex : cursorElementIndex + + cursorElementIndex = elementList.lastIndexOf(lastElementOnPage!) + 1 + elementsToMove.unshift({ value: ZERO }) + draw.spliceElementList( + elementList, + cursorElementIndex, + 0, + elementsToMove + ) + // draw.spliceElementList(elementList,cursorPosition.index,0,...inputData) + + // Удаление первых элементов, если это входящие данные, чтобы избежать дублирования + if ( + elementsToMove + .slice(0, inputData.length) + .every((el, idx) => el === inputData[idx]) + ) { + elementsToMove.splice(0, inputData.length) + } + if ( + startIndex + 1 <= + previousRow.startIndex + previousRow.elementList.length - 1 + ) { + draw.spliceElementList(elementList, startIndex + 1, 0, inputData) + curIndex = cursorPosition.index + inputData.length + curIndex = cursorElementIndex + 1 + curIndex += inputData.length + } else { + curIndex = cursorElementIndex + curIndex += inputData.length + } + } else { + // Вставка новых элементов в позицию курсора + const start = startIndex + 1 + if (startIndex !== endIndex) { + draw.spliceElementList(elementList, start, endIndex - startIndex) + } + formatElementContext(elementList, inputData, startIndex, { + editorOptions: draw.getOptions() + }) + draw.spliceElementList(elementList, start, 0, inputData) + curIndex = startIndex + inputData.length + } + } + } else { + // Страница не переполнена, обычная вставка + const start = startIndex + 1 + if (startIndex !== endIndex) { + draw.spliceElementList(elementList, start, endIndex - startIndex) + } + formatElementContext(elementList, inputData, startIndex, { + editorOptions: draw.getOptions() + }) + draw.spliceElementList(elementList, start, 0, inputData) + curIndex = startIndex + inputData.length } - formatElementContext(elementList, inputData, startIndex, { - editorOptions: draw.getOptions() - }) - draw.spliceElementList(elementList, start, 0, inputData) - curIndex = startIndex + inputData.length } - if (~curIndex) { + + if (~curIndex !== -1) { rangeManager.setRange(curIndex, curIndex) draw.render({ curIndex, @@ -113,8 +285,7 @@ export function input(data: string, host: CanvasEvent) { elementList, value: text, startIndex: curIndex - inputData.length, - endIndex: curIndex, - defaultStyle + endIndex: curIndex } } } diff --git a/src/editor/core/event/handlers/keydown/backspace.ts b/src/editor/core/event/handlers/keydown/backspace.ts index 6cf348c7b..4702b029b 100644 --- a/src/editor/core/event/handlers/keydown/backspace.ts +++ b/src/editor/core/event/handlers/keydown/backspace.ts @@ -1,37 +1,18 @@ +import { ElementType } from '../../../../' import { ZERO } from '../../../../dataset/constant/Common' import { CanvasEvent } from '../../CanvasEvent' +import { IElement } from '../../../../interface/Element' export function backspace(evt: KeyboardEvent, host: CanvasEvent) { const draw = host.getDraw() if (draw.isReadonly()) return - // 可输入性验证 const rangeManager = draw.getRange() if (!rangeManager.getIsCanInput()) return - // 隐藏控件删除 - const control = draw.getControl() - const position = draw.getPosition() - if (rangeManager.getIsCollapsed()) { - const range = rangeManager.getRange() - const elementList = draw.getElementList() - const element = elementList[range.startIndex] - if (element.control?.hide) { - const newIndex = control.removeControl(range.startIndex) - if (newIndex) { - // 更新选区信息 - range.startIndex = newIndex - range.endIndex = newIndex - rangeManager.replaceRange(range) - // 更新位置信息 - const positionList = position.getPositionList() - position.setCursorPosition(positionList[newIndex]) - } - } - } - // 删除操作 const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange() + const control = draw.getControl() let curIndex: number | null + if (isCrossRowCol) { - // 表格跨行列选中时清空单元格内容 const rowCol = draw.getTableParticle().getRangeRowCol() if (!rowCol) return let isDeleted = false @@ -45,29 +26,38 @@ export function backspace(evt: KeyboardEvent, host: CanvasEvent) { } } } - // 删除成功后定位 curIndex = isDeleted ? 0 : null } else if ( control.getActiveControl() && control.getIsRangeCanCaptureEvent() ) { - // 光标在控件内 curIndex = control.keydown(evt) - if (curIndex) { - control.emitControlContentChange() - } } else { - // 普通元素删除 + const position = draw.getPosition() const cursorPosition = position.getCursorPosition() if (!cursorPosition) return const { index } = cursorPosition const isCollapsed = rangeManager.getIsCollapsed() const elementList = draw.getElementList() - // 判断是否允许删除 + + const currentPageNo = cursorPosition.pageNo + const pageRowList = draw.getPageRowList() + const currentPageRows = pageRowList[currentPageNo] || [] + const footnoteRowIndexInPage = currentPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + const firstRowOnPage = currentPageRows[0] + const firstElementIndexOnPage = firstRowOnPage + ? firstRowOnPage.startIndex + : 0 + + const isFirstElementOnPage = index === firstElementIndexOnPage + if (isCollapsed && index === 0) { const firstElement = elementList[index] if (firstElement.value === ZERO) { - // 取消首字符列表设置 if (firstElement.listId) { draw.getListParticle().unsetList() } @@ -75,9 +65,258 @@ export function backspace(evt: KeyboardEvent, host: CanvasEvent) { return } } - // 替换当前行对齐方式 + + const currentElement = elementList[index] + if (currentElement && currentElement.type === ElementType.SEPARATOR) { + evt.preventDefault() + return + } + + if (currentElement && currentElement.type === ElementType.SUPERSCRIPT) { + const superscriptValue = currentElement.value + + if (currentPageRows.length > 0) { + const lastRow = currentPageRows[currentPageRows.length - 1] + const pageEndIndex = lastRow.startIndex + lastRow.elementList.length - 1 + + const elementsBelowOnPage = elementList.slice( + index + 1, + pageEndIndex + 1 + ) + + const footnoteSuperscriptIndexRelative = elementsBelowOnPage.findIndex( + elem => + elem.type === ElementType.SUPERSCRIPT && + elem.value === superscriptValue && + !elem.isFootnote + ) + + if (footnoteSuperscriptIndexRelative !== -1) { + const footnoteIndex = index + 1 + footnoteSuperscriptIndexRelative + + const elementsAfterFootnote = elementList.slice(footnoteIndex + 1) + const nextFootnoteIndexRelative = elementsAfterFootnote.findIndex( + elem => + elem.type === ElementType.SUPERSCRIPT && + Number(elem.value) === Number(superscriptValue) + 1 && + !elem.isFootnote + ) + const deleteUntilIndex = + nextFootnoteIndexRelative !== -1 + ? footnoteIndex + 1 + nextFootnoteIndexRelative + : elementList.length + + draw.spliceElementList(elementList, index, 1) + draw.spliceElementList( + elementList, + footnoteIndex - 1, + deleteUntilIndex - footnoteIndex + ) + + const superscriptValueNumber = Number(superscriptValue) + + for (const elem of elementList) { + if (elem.type === ElementType.SUPERSCRIPT) { + const elemValueNumber = Number(elem.value) + if (elemValueNumber > superscriptValueNumber) { + elem.value = String(elemValueNumber - 1) + } + } + } + + const anySuperscriptsLeft = elementList.some( + elem => elem.type === ElementType.SUPERSCRIPT + ) + + if (!anySuperscriptsLeft) { + const separatorIndex = elementList.findIndex( + elem => elem.type === ElementType.SEPARATOR + ) + if (separatorIndex !== -1) { + draw.spliceElementList(elementList, separatorIndex, 1) + } + } + + curIndex = index - 1 + + rangeManager.setRange(curIndex, curIndex) + draw.render({ curIndex }) + + evt.preventDefault() + return + } + } + } + + if (isCollapsed && isFirstElementOnPage) { + const previousPageNo = currentPageNo - 1 + if (previousPageNo >= 0) { + draw.spliceElementList(elementList, index, 1) + + const updatedPageRowList = draw.getPageRowList() + const updatedCurrentPageRows = updatedPageRowList[currentPageNo] || [] + const updatedPreviousPageRows = updatedPageRowList[previousPageNo] || [] + + const separatorRowIndexInPrevPageUpdated = + updatedPreviousPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + + if (separatorRowIndexInPrevPageUpdated !== -1) { + const separatorRow = + updatedPreviousPageRows[separatorRowIndexInPrevPageUpdated] + const separatorElement = separatorRow.elementList.find( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + const separatorElementIndex = separatorElement + ? elementList.lastIndexOf(separatorElement) + : -1 + + const firstRowOnCurrentPage = updatedCurrentPageRows[0] + const currentRowElements = firstRowOnCurrentPage?.elementList || [] + + const rowBeforeSeparator = + updatedPreviousPageRows[separatorRowIndexInPrevPageUpdated - 1] + + if (rowBeforeSeparator) { + const rowBeforeSeparatorWidth = rowBeforeSeparator.width + let totalWidth = 0 + const currentRowElementsThatCanBeMoved: IElement[] = [] + + for (const el of currentRowElements) { + const elementWidth = el.metrics?.width || 0 + if (el.value === ZERO) continue + if ( + totalWidth + elementWidth <= + draw.getInnerWidth() - rowBeforeSeparatorWidth + ) { + currentRowElementsThatCanBeMoved.push(el) + totalWidth += elementWidth + } else { + break + } + } + + if (currentRowElementsThatCanBeMoved.length > 0) { + const startRemoveIndex = firstRowOnCurrentPage.startIndex + const removeCount = currentRowElementsThatCanBeMoved.length + draw.spliceElementList(elementList, startRemoveIndex, removeCount) + + const insertIndex = + separatorElementIndex > -1 ? separatorElementIndex : 0 + + const isStringEmpty = + currentRowElementsThatCanBeMoved[0].value === ZERO && + currentRowElementsThatCanBeMoved.length === 1 + if (!isStringEmpty) { + draw.spliceElementList( + elementList, + insertIndex, + 0, + currentRowElementsThatCanBeMoved + ) + } + + curIndex = insertIndex - 1 + + rangeManager.setRange(curIndex, curIndex) + draw.render({ curIndex }) + + evt.preventDefault() + return + } else { + curIndex = separatorElementIndex - 1 + + rangeManager.setRange(curIndex, curIndex) + draw.render({ curIndex }) + evt.preventDefault() + + return + } + } else { + curIndex = separatorElementIndex - 1 + + rangeManager.setRange(curIndex, curIndex) + draw.render({ curIndex }) + evt.preventDefault() + return + } + } + } + } + + const separatorRowIndexInCurrentPage = currentPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + + if ( + separatorRowIndexInCurrentPage !== -1 && + cursorPosition.rowIndex < + currentPageRows[separatorRowIndexInCurrentPage].rowIndex + ) { + draw.spliceElementList(elementList, index, 1) + + draw.render({ curIndex: index - 1, isSubmitHistory: false }) + + const updatedPageRowList = draw.getPageRowList() + const nextPageRows = updatedPageRowList[currentPageNo + 1] || [] + + if (nextPageRows.length > 0) { + const firstRowOnNextPage = nextPageRows[0] + const firstRowElements = firstRowOnNextPage.elementList + let totalWidth = 0 + const firstRowElementsThatCanBemoved: IElement[] = [] + + const rowBeforeSeparatorWidth = + currentPageRows[separatorRowIndexInCurrentPage - 1].width + for (const el of firstRowElements) { + const elementWidth = el.metrics?.width || 0 + if (el.value === ZERO) continue + if ( + totalWidth + elementWidth <= + draw.getInnerWidth() - rowBeforeSeparatorWidth + ) { + firstRowElementsThatCanBemoved.push(el) + totalWidth += elementWidth + } else { + break + } + } + + const separatorRow = currentPageRows[separatorRowIndexInCurrentPage] + const separatorElement = separatorRow.elementList.find( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + const separatorElementIndex = separatorElement + ? elementList.lastIndexOf(separatorElement) + : -1 + + const startRemoveIndex = firstRowOnNextPage.startIndex + const removeCount = firstRowElementsThatCanBemoved.length + draw.spliceElementList(elementList, startRemoveIndex + 1, removeCount) + + draw.spliceElementList( + elementList, + separatorElementIndex, + 0, + firstRowElementsThatCanBemoved + ) + + curIndex = index - 1 + + rangeManager.setRange(curIndex, curIndex) + draw.render({ curIndex }) + + evt.preventDefault() + return + } + } const startElement = elementList[startIndex] - if (isCollapsed && startElement.rowFlex && startElement.value === ZERO) { + if (isCollapsed && startElement?.rowFlex && startElement.value === ZERO) { const rowFlexElementList = rangeManager.getRangeRowElementList() if (rowFlexElementList) { const preElement = elementList[startIndex - 1] @@ -86,12 +325,33 @@ export function backspace(evt: KeyboardEvent, host: CanvasEvent) { }) } } + if (!isCollapsed) { draw.spliceElementList(elementList, startIndex + 1, endIndex - startIndex) + curIndex = startIndex } else { - draw.spliceElementList(elementList, index, 1) + const rowIndexInElementList = elementList.findLastIndex( + (el, index) => + el.listId === elementList[index].listId && + el.value === ZERO && + index <= endIndex + ) + if ( + currentElement.type === ElementType.TAB && + elementList[rowIndexInElementList].listLevel && + elementList[rowIndexInElementList].listLevel > 0 + ) { + elementList[rowIndexInElementList].listLevel-- + // draw.getListParticle().unsetList() + } + if ( + separatorRowIndexInCurrentPage === -1 || + footnoteRowIndexInPage <= cursorPosition.rowIndex + ) { + draw.spliceElementList(elementList, index, 1) + } + curIndex = index - 1 } - curIndex = isCollapsed ? index - 1 : startIndex } draw.getGlobalEvent().setCanvasEventAbility() if (curIndex === null) { diff --git a/src/editor/core/event/handlers/keydown/delete.ts b/src/editor/core/event/handlers/keydown/delete.ts index 61ee452b5..28d2f4c8e 100644 --- a/src/editor/core/event/handlers/keydown/delete.ts +++ b/src/editor/core/event/handlers/keydown/delete.ts @@ -7,22 +7,8 @@ export function del(evt: KeyboardEvent, host: CanvasEvent) { const rangeManager = draw.getRange() if (!rangeManager.getIsCanInput()) return const { startIndex, endIndex, isCrossRowCol } = rangeManager.getRange() - // 隐藏控件删除 const elementList = draw.getElementList() const control = draw.getControl() - if (rangeManager.getIsCollapsed()) { - const nextElement = elementList[startIndex + 1] - if (nextElement?.control?.hide) { - const newIndex = control.removeControl(startIndex + 1) - if (newIndex) { - // 更新位置信息 - const position = draw.getPosition() - const positionList = position.getPositionList() - position.setCursorPosition(positionList[newIndex]) - } - } - } - // 删除操作 let curIndex: number | null if (isCrossRowCol) { // 表格跨行列选中时清空单元格内容 @@ -44,9 +30,6 @@ export function del(evt: KeyboardEvent, host: CanvasEvent) { } else if (control.getActiveControl() && control.getIsRangeWithinControl()) { // 光标在控件内 curIndex = control.keydown(evt) - if (curIndex) { - control.emitControlContentChange() - } } else if (elementList[endIndex + 1]?.controlId) { // 光标在控件前 curIndex = control.removeControl(endIndex + 1) diff --git a/src/editor/core/event/handlers/keydown/enter.ts b/src/editor/core/event/handlers/keydown/enter.ts index a879456d8..3c588600c 100644 --- a/src/editor/core/event/handlers/keydown/enter.ts +++ b/src/editor/core/event/handlers/keydown/enter.ts @@ -1,26 +1,31 @@ import { ZERO } from '../../../../dataset/constant/Common' import { - AREA_CONTEXT_ATTR, EDITOR_ELEMENT_STYLE_ATTR, EDITOR_ROW_ATTR } from '../../../../dataset/constant/Element' import { ControlComponent } from '../../../../dataset/enum/Control' +import { ElementType } from '../../../../dataset/enum/Element' import { IElement } from '../../../../interface/Element' -import { omitObject } from '../../../../utils' -import { formatElementContext } from '../../../../utils/element' +import { getUUID } from '../../../../utils' +import { + formatElementContext, + getAnchorElement +} from '../../../../utils/element' import { CanvasEvent } from '../../CanvasEvent' export function enter(evt: KeyboardEvent, host: CanvasEvent) { const draw = host.getDraw() if (draw.isReadonly()) return + const rangeManager = draw.getRange() if (!rangeManager.getIsCanInput()) return + const { startIndex, endIndex } = rangeManager.getRange() const isCollapsed = rangeManager.getIsCollapsed() const elementList = draw.getElementList() const startElement = elementList[startIndex] const endElement = elementList[endIndex] - // 最后一个列表项行首回车取消列表设置 + if ( isCollapsed && endElement.listId && @@ -28,65 +33,309 @@ export function enter(evt: KeyboardEvent, host: CanvasEvent) { elementList[endIndex + 1]?.listId !== endElement.listId ) { draw.getListParticle().unsetList() + const enterText: IElement = { value: ZERO, id: getUUID() } + draw.spliceElementList(elementList, endIndex, 1, [enterText]) return } - // 列表块内换行 - let enterText: IElement = { - value: ZERO - } + + const enterText: IElement = { value: ZERO } + if (evt.shiftKey && startElement.listId) { enterText.listWrap = true } - // 格式化上下文 + formatElementContext(elementList, [enterText], startIndex, { isBreakWhenWrap: true, editorOptions: draw.getOptions() }) - // shift长按 && 最后位置回车无需复制区域上下文 - if ( - evt.shiftKey && - endElement.areaId && - endElement.areaId !== elementList[endIndex + 1]?.areaId - ) { - enterText = omitObject(enterText, AREA_CONTEXT_ATTR) - } - // 标题结尾处回车无需格式化及样式复制 + if ( !( endElement.titleId && endElement.titleId !== elementList[endIndex + 1]?.titleId ) ) { - // 复制样式属性 - const copyElement = rangeManager.getRangeAnchorStyle(elementList, endIndex) - if (copyElement) { - const copyAttr = [...EDITOR_ROW_ATTR] - // 不复制控件后缀样式 - if (copyElement.controlComponent !== ControlComponent.POSTFIX) { - copyAttr.push(...EDITOR_ELEMENT_STYLE_ATTR) + const anchorElement = getAnchorElement(elementList, endIndex) + if (anchorElement) { + const attributesToCopy = [...EDITOR_ROW_ATTR] + + if (anchorElement.controlComponent !== ControlComponent.POSTFIX) { + attributesToCopy.push(...EDITOR_ELEMENT_STYLE_ATTR) } - copyAttr.forEach(attr => { - const value = copyElement[attr] as never + + attributesToCopy.forEach(attr => { + const value = anchorElement[attr] as never if (value !== undefined) { enterText[attr] = value } }) } } - // 控件或文档插入换行元素 + const control = draw.getControl() const activeControl = control.getActiveControl() - let curIndex: number + let cursorIndex = -1 + if (activeControl && control.getIsRangeWithinControl()) { - curIndex = control.setValue([enterText]) - control.emitControlContentChange() + cursorIndex = control.setValue([enterText]) } else { const position = draw.getPosition() const cursorPosition = position.getCursorPosition() if (!cursorPosition) return - const { index } = cursorPosition - if (isCollapsed) { - draw.spliceElementList(elementList, index + 1, 0, [enterText]) + + let cursorElementIndex = cursorPosition.index + const pageHeight = draw.getHeight() + const marginTop = draw.getMainOuterHeight() + const rowList = draw.getRowList() + + const pageRowList = draw.getPageRowList() + const currentPageRows = pageRowList[cursorPosition.pageNo] || [] + const currentPageHeight = + currentPageRows.reduce((acc, current) => acc + current.height, 0) + + marginTop + + 50 + + let elementsToMove: IElement[] = [] + let previousRowElements: IElement[] = [] + + const footnoteRowIndexInPage = currentPageRows.findIndex(row => + row.elementList.some( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + ) + + let isCursorUnderSeparator = false + if (footnoteRowIndexInPage !== -1) { + const cursorRowIndexInPage = + cursorPosition.rowIndex - + pageRowList + .slice(0, cursorPosition.pageNo) + .reduce((acc, pageRows) => acc + pageRows.length, 0) + + if (cursorRowIndexInPage > footnoteRowIndexInPage) { + isCursorUnderSeparator = true + } + } + + if (currentPageHeight > pageHeight) { + if (isCursorUnderSeparator && footnoteRowIndexInPage !== -1) { + if (footnoteRowIndexInPage > 0) { + const rowToMove = currentPageRows[footnoteRowIndexInPage - 1] + + elementsToMove = rowToMove.elementList + + const lastElementOnPage = + currentPageRows[currentPageRows.length - 1]?.elementList.at(-1) + const lastElementIndex = lastElementOnPage + ? elementList.lastIndexOf(lastElementOnPage) + : -1 + cursorElementIndex = + lastElementIndex >= 0 ? lastElementIndex : cursorElementIndex + + const spliceStart = cursorPosition.index + 1 + const spliceCount = + footnoteRowIndexInPage - 1 === + cursorPosition.rowIndex - + pageRowList + .slice(0, cursorPosition.pageNo) + .reduce((acc, pageRows) => acc + pageRows.length, 0) + ? elementsToMove.length - 1 + : elementsToMove.length + + if (spliceCount === elementsToMove.length - 1) + draw.spliceElementList(elementList, spliceStart, spliceCount) + else { + draw.spliceElementList(elementList, spliceStart, 0, [enterText]) + const previousRow = currentPageRows[footnoteRowIndexInPage - 1] + previousRowElements = elementList.slice( + previousRow.startIndex, + previousRow.startIndex + previousRow.elementList.length + ) + draw.spliceElementList( + elementList, + previousRow.startIndex, + spliceCount + ) + } + cursorElementIndex = elementList.lastIndexOf(lastElementOnPage!) + 1 + draw.spliceElementList( + elementList, + cursorElementIndex + 1, + 0, + elementsToMove + ) + + cursorIndex = cursorElementIndex + + rangeManager.setRange(cursorIndex, cursorIndex) + draw.render({ curIndex: cursorIndex }) + + evt.preventDefault() + return + } + } else { + if (footnoteRowIndexInPage !== -1 && footnoteRowIndexInPage > 0) { + const previousRow = currentPageRows[footnoteRowIndexInPage - 1] + + const previousRowIndex = rowList.findIndex(row => row === previousRow) + + previousRowElements = elementList.slice( + previousRow.startIndex, + previousRow.startIndex + previousRow.elementList.length + ) + + elementsToMove = previousRow.elementList.filter( + el => elementList.indexOf(el) > cursorElementIndex + ) + + if (cursorPosition.rowIndex === previousRowIndex) { + elementsToMove.unshift(enterText) + } + } + + let temp = 0 + if (isCollapsed && elementsToMove.length > 0) { + const lastElementOnPage = + currentPageRows[currentPageRows.length - 1]?.elementList.at(-1) + const lastElementIndex = lastElementOnPage + ? elementList.lastIndexOf(lastElementOnPage) + : -1 + cursorElementIndex = + lastElementIndex >= 0 ? lastElementIndex : cursorElementIndex + + const spliceStart = cursorPosition.index + 1 + const spliceCount = + footnoteRowIndexInPage - 1 === + cursorPosition.rowIndex - + pageRowList + .slice(0, cursorPosition.pageNo) + .reduce((acc, pageRows) => acc + pageRows.length, 0) + ? elementsToMove.length - 1 + : elementsToMove.length + + if (spliceCount === elementsToMove.length - 1) + draw.spliceElementList(elementList, spliceStart, spliceCount) + else { + draw.spliceElementList(elementList, spliceStart, 0, [enterText]) + const previousRow = currentPageRows[footnoteRowIndexInPage - 1] + previousRowElements = elementList.slice( + previousRow.startIndex, + previousRow.startIndex + previousRow.elementList.length + ) + draw.spliceElementList( + elementList, + previousRow.startIndex + 1, + spliceCount + ) + } + cursorElementIndex = elementList.lastIndexOf(lastElementOnPage!) + 1 + draw.spliceElementList( + elementList, + cursorElementIndex, + 0, + elementsToMove + ) + if (elementsToMove[0] === enterText) { + elementsToMove.shift() + if (elementsToMove.length === 0) { + temp++ + } + } + + const expectedElements = previousRowElements.filter( + el => elementList.indexOf(el) > cursorElementIndex + ) + if ( + JSON.stringify(expectedElements) !== JSON.stringify(elementsToMove) + ) { + cursorElementIndex = cursorPosition.index + 1 + // draw.spliceElementList(elementList, cursorElementIndex, 0, enterText) + } else { + const footnoteElement = currentPageRows[ + footnoteRowIndexInPage + ]?.elementList.find( + elem => elem.type === ElementType.SEPARATOR && elem.isFootnote + ) + const footnoteElementIndex = footnoteElement + ? elementList.lastIndexOf(footnoteElement) + : -1 + cursorElementIndex = footnoteElementIndex + if (!elementList.find(elem => elem?.id === enterText?.id)) { + draw.spliceElementList( + elementList, + cursorElementIndex - + previousRowElements.length + + elementsToMove.length, + 1, + [enterText] + ) + } + cursorElementIndex = elementList.lastIndexOf(lastElementOnPage!) + 1 + } + } else if (isCollapsed) { + draw.spliceElementList(elementList, cursorElementIndex + 1, 0, [ + enterText + ]) + cursorIndex = cursorElementIndex + 1 + } else { + draw.spliceElementList( + elementList, + startIndex + 1, + endIndex - startIndex, + [enterText] + ) + cursorIndex = startIndex + 1 + } + + if (elementsToMove.length === 0) { + cursorIndex = cursorElementIndex + 1 - temp + } else { + cursorIndex = cursorElementIndex + } + } + } else if (isCollapsed) { + const TabElementIndex = rowList[ + cursorPosition.rowIndex + ].elementList.findIndex(el => (el.listLevel ?? 0) > 0) + const listLevel = + (rowList[cursorPosition.rowIndex]?.elementList?.[0]?.listLevel ?? 0) + 1 + if ( + TabElementIndex !== -1 && + rowList[cursorPosition.rowIndex].elementList[ + TabElementIndex + listLevel + ] + ) { + enterText.listLevel = + rowList[cursorPosition.rowIndex].elementList[0].listLevel || 0 + const tabsArray = [] + for (let i = 0; i < enterText.listLevel; i++) { + tabsArray.push( + rowList[cursorPosition.rowIndex].elementList[TabElementIndex + 1] + ) + } + draw.spliceElementList(elementList, cursorElementIndex + 1, 0, [ + enterText, + ...tabsArray + ]) + cursorIndex = cursorElementIndex + tabsArray.length + 1 + } else if (TabElementIndex !== -1) { + const listLevel = + (rowList[cursorPosition.rowIndex]?.elementList?.[0]?.listLevel ?? 0) - + 1 + enterText.listLevel = listLevel + draw.spliceElementList( + elementList, + cursorElementIndex - (listLevel - 1), + 2, + [enterText] + ) + cursorIndex = cursorElementIndex - 1 + } else { + draw.spliceElementList(elementList, cursorElementIndex + 1, 0, [ + enterText + ]) + cursorIndex = cursorElementIndex + 1 + } } else { draw.spliceElementList( elementList, @@ -94,12 +343,14 @@ export function enter(evt: KeyboardEvent, host: CanvasEvent) { endIndex - startIndex, [enterText] ) + cursorIndex = startIndex + 1 + } + + if (cursorIndex >= 0) { + rangeManager.setRange(cursorIndex, cursorIndex) + draw.render({ curIndex: cursorIndex }) } - curIndex = index + 1 - } - if (~curIndex) { - rangeManager.setRange(curIndex, curIndex) - draw.render({ curIndex }) } + evt.preventDefault() } diff --git a/src/editor/core/event/handlers/keydown/left.ts b/src/editor/core/event/handlers/keydown/left.ts index 66bd67ec8..97eaae0f1 100644 --- a/src/editor/core/event/handlers/keydown/left.ts +++ b/src/editor/core/event/handlers/keydown/left.ts @@ -2,7 +2,6 @@ import { EditorMode } from '../../../..' import { ControlComponent } from '../../../../dataset/enum/Control' import { ElementType } from '../../../../dataset/enum/Element' import { MoveDirection } from '../../../../dataset/enum/Observer' -import { getNonHideElementIndex } from '../../../../utils/element' import { isMod } from '../../../../utils/hotkey' import { CanvasEvent } from '../../CanvasEvent' @@ -25,8 +24,7 @@ export function left(evt: KeyboardEvent, host: CanvasEvent) { if ( draw.getMode() === EditorMode.FORM && control.getActiveControl() && - (elementList[index]?.controlComponent === ControlComponent.PREFIX || - elementList[index]?.controlComponent === ControlComponent.PRE_TEXT) + elementList[index]?.controlComponent === ControlComponent.PREFIX ) { control.initNextControl({ direction: MoveDirection.UP @@ -131,7 +129,7 @@ export function left(evt: KeyboardEvent, host: CanvasEvent) { tdIndex: preTdIndex, tdId: preTd.id, trId: preTr.id, - tableId: element.tableId + tableId: element.id }) anchorStartIndex = preTd.value.length - 1 anchorEndIndex = anchorStartIndex @@ -145,11 +143,6 @@ export function left(evt: KeyboardEvent, host: CanvasEvent) { } // 执行跳转 if (!~anchorStartIndex || !~anchorEndIndex) return - // 隐藏元素跳过 - const newElementList = draw.getElementList() - anchorStartIndex = getNonHideElementIndex(newElementList, anchorStartIndex) - anchorEndIndex = getNonHideElementIndex(newElementList, anchorEndIndex) - // 设置上下文 rangeManager.setRange(anchorStartIndex, anchorEndIndex) const isAnchorCollapsed = anchorStartIndex === anchorEndIndex draw.render({ diff --git a/src/editor/core/event/handlers/keydown/right.ts b/src/editor/core/event/handlers/keydown/right.ts index 1bf2f5aef..1452f112f 100644 --- a/src/editor/core/event/handlers/keydown/right.ts +++ b/src/editor/core/event/handlers/keydown/right.ts @@ -1,9 +1,7 @@ -import { LocationPosition } from '../../../../dataset/enum/Common' import { ControlComponent } from '../../../../dataset/enum/Control' import { EditorMode } from '../../../../dataset/enum/Editor' import { ElementType } from '../../../../dataset/enum/Element' import { MoveDirection } from '../../../../dataset/enum/Observer' -import { getNonHideElementIndex } from '../../../../utils/element' import { isMod } from '../../../../utils/hotkey' import { CanvasEvent } from '../../CanvasEvent' @@ -27,8 +25,7 @@ export function right(evt: KeyboardEvent, host: CanvasEvent) { if ( draw.getMode() === EditorMode.FORM && control.getActiveControl() && - (elementList[index + 1]?.controlComponent === ControlComponent.POSTFIX || - elementList[index + 1]?.controlComponent === ControlComponent.POST_TEXT) + elementList[index + 1]?.controlComponent === ControlComponent.POSTFIX ) { control.initNextControl({ direction: MoveDirection.DOWN @@ -133,7 +130,7 @@ export function right(evt: KeyboardEvent, host: CanvasEvent) { tdIndex: nextTdIndex, tdId: preTd.id, trId: preTr.id, - tableId: element.tableId + tableId: element.id }) anchorStartIndex = 0 anchorEndIndex = anchorStartIndex @@ -153,19 +150,6 @@ export function right(evt: KeyboardEvent, host: CanvasEvent) { ) { return } - // 隐藏元素跳过 - const newElementList = draw.getElementList() - anchorStartIndex = getNonHideElementIndex( - newElementList, - anchorStartIndex, - LocationPosition.AFTER - ) - anchorEndIndex = getNonHideElementIndex( - newElementList, - anchorEndIndex, - LocationPosition.AFTER - ) - // 设置上下文 rangeManager.setRange(anchorStartIndex, anchorEndIndex) const isAnchorCollapsed = anchorStartIndex === anchorEndIndex draw.render({ diff --git a/src/editor/core/event/handlers/keydown/tab.ts b/src/editor/core/event/handlers/keydown/tab.ts index 02412c413..5c71ca4cd 100644 --- a/src/editor/core/event/handlers/keydown/tab.ts +++ b/src/editor/core/event/handlers/keydown/tab.ts @@ -1,8 +1,6 @@ -import { EDITOR_ELEMENT_STYLE_ATTR } from '../../../../dataset/constant/Element' import { ElementType } from '../../../../dataset/enum/Element' import { MoveDirection } from '../../../../dataset/enum/Observer' import { IElement } from '../../../../interface/Element' -import { pickObject } from '../../../../utils' import { formatElementContext } from '../../../../utils/element' import { CanvasEvent } from '../../CanvasEvent' @@ -19,20 +17,14 @@ export function tab(evt: KeyboardEvent, host: CanvasEvent) { direction: evt.shiftKey ? MoveDirection.UP : MoveDirection.DOWN }) } else { - const rangeManager = draw.getRange() - const elementList = draw.getElementList() - const { startIndex, endIndex } = rangeManager.getRange() // 插入tab符 - const anchorStyle = rangeManager.getRangeAnchorStyle(elementList, endIndex) - // 仅复制样式 - const copyStyle = anchorStyle - ? pickObject(anchorStyle, EDITOR_ELEMENT_STYLE_ATTR) - : null const tabElement: IElement = { - ...copyStyle, type: ElementType.TAB, value: '' } + const rangeManager = draw.getRange() + const { startIndex } = rangeManager.getRange() + const elementList = draw.getElementList() formatElementContext(elementList, [tabElement], startIndex, { editorOptions: draw.getOptions() }) diff --git a/src/editor/core/event/handlers/keydown/updown.ts b/src/editor/core/event/handlers/keydown/updown.ts index 0354ab3ea..05b46e2a6 100644 --- a/src/editor/core/event/handlers/keydown/updown.ts +++ b/src/editor/core/event/handlers/keydown/updown.ts @@ -124,8 +124,8 @@ export function updown(evt: KeyboardEvent, host: CanvasEvent) { index, trIndex: preTrIndex, tdIndex: preTdIndex, - tdId: preTd.id, - trId: preTr.id, + tdId: preTr.id, + trId: preTd.id, tableId }) anchorStartIndex = preTd.value.length - 1 @@ -173,8 +173,8 @@ export function updown(evt: KeyboardEvent, host: CanvasEvent) { index, trIndex: nexTrIndex, tdIndex: nextTdIndex, - tdId: nextTd.id, - trId: nextTr.id, + tdId: nextTr.id, + trId: nextTd.id, tableId }) anchorStartIndex = nextTd.value.length - 1 diff --git a/src/editor/core/event/handlers/mouseup.ts b/src/editor/core/event/handlers/mouseup.ts index 5535d8492..6893f4fb6 100644 --- a/src/editor/core/event/handlers/mouseup.ts +++ b/src/editor/core/event/handlers/mouseup.ts @@ -292,18 +292,6 @@ export function mouseup(evt: MouseEvent, host: CanvasEvent) { draw.render({ isSetCursor: false }) - // 控件值变更回调 - if (activeControl) { - control.emitControlContentChange() - } else if (cacheStartElement.controlId) { - control.emitControlContentChange({ - context: { - range: cacheRange, - elementList: cacheElementList - }, - controlElement: cacheStartElement - }) - } // 拖拽后渲染图片工具 if (imgElement) { if ( diff --git a/src/editor/core/event/handlers/paste.ts b/src/editor/core/event/handlers/paste.ts index f692a201a..cb386f399 100644 --- a/src/editor/core/event/handlers/paste.ts +++ b/src/editor/core/event/handlers/paste.ts @@ -14,20 +14,20 @@ import { } from '../../../utils/element' import { CanvasEvent } from '../CanvasEvent' import { IOverrideResult } from '../../override/Override' -import { normalizeLineBreak } from '../../../utils' +import { getUUID } from '../../../utils' -export function pasteElement(host: CanvasEvent, elementList: IElement[]) { +export function pasteElement( + host: CanvasEvent, + elementList: IElement[], + startIndex2?: number, + endIndex?: number +) { const draw = host.getDraw() - if ( - draw.isReadonly() || - draw.isDisabled() || - draw.getControl().getIsDisabledPasteControl() - ) { - return - } + if (draw.isReadonly() || draw.isDisabled()) return const rangeManager = draw.getRange() const { startIndex } = rangeManager.getRange() const originalElementList = draw.getElementList() + // 全选粘贴无需格式化上下文 if (~startIndex && !rangeManager.getIsSelectAll()) { // 如果是复制到虚拟元素里,则粘贴列表的虚拟元素需扁平化处理,避免产生新的虚拟元素 @@ -61,7 +61,12 @@ export function pasteElement(host: CanvasEvent, elementList: IElement[]) { editorOptions: draw.getOptions() }) } - draw.insertElementList(elementList) + elementList.forEach(el => { + if (el.type === ElementType.PARAGRAPH) { + el.id = getUUID() + } + }) + draw.insertElementList(elementList, true, startIndex2, endIndex) } export function pasteHTML(host: CanvasEvent, htmlText: string) { @@ -120,13 +125,13 @@ export function pasteByEvent(host: CanvasEvent, evt: ClipboardEvent) { if (!getIsClipboardContainFile(clipboardData)) { const clipboardText = clipboardData.getData('text') const editorClipboardData = getClipboardData() - // 不同系统间默认换行符不同 windows:\r\n mac:\n - if ( - editorClipboardData && - normalizeLineBreak(clipboardText) === - normalizeLineBreak(editorClipboardData.text) - ) { - pasteElement(host, editorClipboardData.elementList) + if (clipboardText === editorClipboardData?.text) { + pasteElement( + host, + editorClipboardData.elementList, + editorClipboardData.startIndex, + editorClipboardData.endIndex + ) return } } diff --git a/src/editor/core/i18n/lang/en.json b/src/editor/core/i18n/lang/en.json index 5020d3201..f0107a7ab 100644 --- a/src/editor/core/i18n/lang/en.json +++ b/src/editor/core/i18n/lang/en.json @@ -46,9 +46,7 @@ "border": "Table border", "borderAll": "All", "borderEmpty": "Empty", - "borderDash": "Dash", "borderExternal": "External", - "borderInternal": "Internal", "borderTd": "Table cell border", "borderTdTop": "Top", "borderTdRight": "Right", diff --git a/src/editor/core/i18n/lang/zh-CN.json b/src/editor/core/i18n/lang/zh-CN.json index cb2b14487..6d72b65e2 100644 --- a/src/editor/core/i18n/lang/zh-CN.json +++ b/src/editor/core/i18n/lang/zh-CN.json @@ -46,9 +46,7 @@ "border": "表格边框", "borderAll": "所有框线", "borderEmpty": "无框线", - "borderDash": "虚框线", "borderExternal": "外侧框线", - "borderInternal": "内侧框线", "borderTd": "单元格边框", "borderTdTop": "上边框", "borderTdRight": "右边框", diff --git a/src/editor/core/listener/Listener.ts b/src/editor/core/listener/Listener.ts index bfdd403e0..27a7d69c9 100644 --- a/src/editor/core/listener/Listener.ts +++ b/src/editor/core/listener/Listener.ts @@ -1,7 +1,6 @@ import { IContentChange, IControlChange, - IControlContentChange, IIntersectionPageNoChange, IPageModeChange, IPageScaleChange, @@ -21,7 +20,6 @@ export class Listener { public saved: ISaved | null public contentChange: IContentChange | null public controlChange: IControlChange | null - public controlContentChange: IControlContentChange | null public pageModeChange: IPageModeChange | null public zoneChange: IZoneChange | null @@ -34,7 +32,6 @@ export class Listener { this.saved = null this.contentChange = null this.controlChange = null - this.controlContentChange = null this.pageModeChange = null this.zoneChange = null } diff --git a/src/editor/core/observer/MouseObserver.ts b/src/editor/core/observer/MouseObserver.ts index 85f6cf156..cf8c8c953 100644 --- a/src/editor/core/observer/MouseObserver.ts +++ b/src/editor/core/observer/MouseObserver.ts @@ -19,9 +19,6 @@ export class MouseObserver { 'mouseleave', this._mouseleave.bind(this) ) - this.pageContainer.addEventListener('mousedown', this._mousedown.bind(this)) - this.pageContainer.addEventListener('mouseup', this._mouseup.bind(this)) - this.pageContainer.addEventListener('click', this._click.bind(this)) } private _mousemove(evt: MouseEvent) { @@ -38,19 +35,4 @@ export class MouseObserver { if (!this.eventBus.isSubscribe('mouseleave')) return this.eventBus.emit('mouseleave', evt) } - - private _mousedown(evt: MouseEvent) { - if (!this.eventBus.isSubscribe('mousedown')) return - this.eventBus.emit('mousedown', evt) - } - - private _mouseup(evt: MouseEvent) { - if (!this.eventBus.isSubscribe('mouseup')) return - this.eventBus.emit('mouseup', evt) - } - - private _click(evt: MouseEvent) { - if (!this.eventBus.isSubscribe('click')) return - this.eventBus.emit('click', evt) - } } diff --git a/src/editor/core/observer/ScrollObserver.ts b/src/editor/core/observer/ScrollObserver.ts index 82ec56677..48d63a35a 100644 --- a/src/editor/core/observer/ScrollObserver.ts +++ b/src/editor/core/observer/ScrollObserver.ts @@ -15,11 +15,13 @@ export class ScrollObserver { private draw: Draw private options: Required private scrollContainer: Element | Document + private onLastPageVisibleCallback?: () => void - constructor(draw: Draw) { + constructor(draw: Draw, onLastPageVisibleCallback?: () => void) { this.draw = draw this.options = draw.getOptions() this.scrollContainer = this.getScrollContainer() + this.onLastPageVisibleCallback = onLastPageVisibleCallback // 监听滚轮 setTimeout(() => { if (!window.scrollY) { @@ -84,5 +86,17 @@ export class ScrollObserver { const { intersectionPageNo, visiblePageNoList } = this.getPageVisibleInfo() this.draw.setIntersectionPageNo(intersectionPageNo) this.draw.setVisiblePageNoList(visiblePageNoList) + this.loadVisibleElements(visiblePageNoList) }, 150) + private loadVisibleElements(visiblePageNoList: number[]) { + const pageCount = this.draw.getPageCount() + if (pageCount <= 1) return + const isLastPageVisible = visiblePageNoList.includes(pageCount - 1) + + if (isLastPageVisible) { + if (this.onLastPageVisibleCallback) { + this.onLastPageVisibleCallback() + } + } + } } diff --git a/src/editor/core/position/Position.ts b/src/editor/core/position/Position.ts index 4c13563e0..d29e57d00 100644 --- a/src/editor/core/position/Position.ts +++ b/src/editor/core/position/Position.ts @@ -121,44 +121,91 @@ export class Position { innerWidth, zone } = payload + const { scale, table: { tdPadding } } = this.options + let x = startX let y = startY let index = startIndex for (let i = 0; i < rowList.length; i++) { const curRow = rowList[i] - // 行存在环绕的可能性均不设置行布局 + + let leftIndent = 0 + let firstLineIndent = 0 + let rightIndent = 0 + let rowX = x + + const currentId = curRow.elementList.find(el => el.id)?.id || null + const isFirstRowInParagraph = rowList.findIndex(row => + row.elementList.find(el => el.id === currentId) + ) + for (const element of curRow.elementList) { + leftIndent = element.spacing?.before || leftIndent + firstLineIndent = element.spacing?.firstLine || firstLineIndent + rightIndent = element.spacing?.after || rightIndent + if (leftIndent || firstLineIndent || rightIndent) { + break + } + } + rowX = startX + leftIndent + if (isFirstRowInParagraph === i) { + rowX += firstLineIndent - leftIndent + } + if (!curRow.isSurround) { - // 计算行偏移量(行居中、居右) const curRowWidth = curRow.width + (curRow.offsetX || 0) if (curRow.rowFlex === RowFlex.CENTER) { - x += (innerWidth - curRowWidth) / 2 + rowX += (innerWidth - curRowWidth) / 2 } else if (curRow.rowFlex === RowFlex.RIGHT) { - x += innerWidth - curRowWidth + rowX += innerWidth - curRowWidth } } - // 当前行X/Y轴偏移量 - x += curRow.offsetX || 0 - y += curRow.offsetY || 0 - // 当前td所在位置 - const tablePreX = x + + rowX += curRow.offsetX || 0 + const tablePreX = rowX const tablePreY = y + for (let j = 0; j < curRow.elementList.length; j++) { const element = curRow.elementList[j] const metrics = element.metrics + if (element.type === ElementType.SEPARATOR && element.isFootnote) { + const pageHeight = this.draw.getHeight() + const margins = this.draw.getMargins() // [top, right, bottom, left] + const headerHeight = this.draw.getHeader().getHeight() + const footerHeight = this.draw.getFooter().getHeight() + const extraHeight = this.draw.getHeader().getExtraHeight() + + const availableHeight = + pageHeight - + margins[0] - + margins[2] - + headerHeight - + footerHeight - + extraHeight + + const maxY = + margins[0] + + headerHeight + + extraHeight + + availableHeight - + metrics.height + + const contentBelowHeight = rowList + .slice(i + 1) + .reduce((sum, row) => sum + row.height, 0) + + y = maxY - contentBelowHeight + } const offsetY = (element.imgDisplay !== ImageDisplay.INLINE && element.type === ElementType.IMAGE) || element.type === ElementType.LATEX ? curRow.ascent - metrics.height : curRow.ascent - // 偏移量 - if (element.left) { - x += element.left - } + const positionItem: IElementPosition = { pageNo, index, @@ -172,25 +219,23 @@ export class Position { isFirstLetter: j === 0, isLastLetter: j === curRow.elementList.length - 1, coordinate: { - leftTop: [x, y], - leftBottom: [x, y + curRow.height], - rightTop: [x + metrics.width, y], - rightBottom: [x + metrics.width, y + curRow.height] + leftTop: [rowX, y], + leftBottom: [rowX, y + curRow.height], + rightTop: [rowX + metrics.width, y], + rightBottom: [rowX + metrics.width, y + curRow.height] } } - // 缓存浮动元素信息 + if ( element.imgDisplay === ImageDisplay.SURROUND || element.imgDisplay === ImageDisplay.FLOAT_TOP || element.imgDisplay === ImageDisplay.FLOAT_BOTTOM ) { - // 浮动元素使用上一位置信息 const prePosition = positionList[positionList.length - 1] if (prePosition) { positionItem.metrics = prePosition.metrics positionItem.coordinate = prePosition.coordinate } - // 兼容浮动元素初始坐标为空的情况-默认使用左上坐标 if (!element.imgFloatPosition) { element.imgFloatPosition = { x, @@ -210,73 +255,87 @@ export class Position { zone }) } + positionList.push(positionItem) index++ - x += metrics.width - // 计算表格内元素位置 - if (element.type === ElementType.TABLE) { - const tdPaddingWidth = tdPadding[1] + tdPadding[3] - const tdPaddingHeight = tdPadding[0] + tdPadding[2] - for (let t = 0; t < element.trList!.length; t++) { - const tr = element.trList![t] - for (let d = 0; d < tr.tdList!.length; d++) { - const td = tr.tdList[d] - td.positionList = [] - const rowList = td.rowList! - const drawRowResult = this.computePageRowPosition({ - positionList: td.positionList, - rowList, - pageNo, - startRowIndex: 0, - startIndex: 0, - startX: (td.x! + tdPadding[3]) * scale + tablePreX, - startY: (td.y! + tdPadding[0]) * scale + tablePreY, - innerWidth: (td.width! - tdPaddingWidth) * scale, - isTable: true, - index: index - 1, - tdIndex: d, - trIndex: t, - zone - }) - // 垂直对齐方式 - if ( - td.verticalAlign === VerticalAlign.MIDDLE || - td.verticalAlign === VerticalAlign.BOTTOM - ) { - const rowsHeight = rowList.reduce( - (pre, cur) => pre + cur.height, - 0 - ) - const blankHeight = - (td.height! - tdPaddingHeight) * scale - rowsHeight - const offsetHeight = - td.verticalAlign === VerticalAlign.MIDDLE - ? blankHeight / 2 - : blankHeight - if (Math.floor(offsetHeight) > 0) { - td.positionList.forEach(tdPosition => { - const { - coordinate: { leftTop, leftBottom, rightBottom, rightTop } - } = tdPosition - leftTop[1] += offsetHeight - leftBottom[1] += offsetHeight - rightBottom[1] += offsetHeight - rightTop[1] += offsetHeight - }) + rowX += metrics.width + } + + if ( + curRow.elementList.some(element => element.type === ElementType.TABLE) + ) { + for (let j = 0; j < curRow.elementList.length; j++) { + const element = curRow.elementList[j] + if (element.type === ElementType.TABLE) { + const tdPaddingWidth = tdPadding[1] + tdPadding[3] + const tdPaddingHeight = tdPadding[0] + tdPadding[2] + for (let t = 0; t < element.trList!.length; t++) { + const tr = element.trList![t] + for (let d = 0; d < tr.tdList!.length; d++) { + const td = tr.tdList[d] + td.positionList = [] + const rowList = td.rowList! + const drawRowResult = this.computePageRowPosition({ + positionList: td.positionList, + rowList, + pageNo, + startRowIndex: 0, + startIndex: 0, + startX: (td.x! + tdPadding[3]) * scale + tablePreX, + startY: (td.y! + tdPadding[0]) * scale + tablePreY, + innerWidth: (td.width! - tdPaddingWidth) * scale, + isTable: true, + index: index - 1, + tdIndex: d, + trIndex: t, + zone + }) + + if ( + td.verticalAlign === VerticalAlign.MIDDLE || + td.verticalAlign === VerticalAlign.BOTTOM + ) { + const rowsHeight = rowList.reduce( + (pre, cur) => pre + cur.height, + 0 + ) + const blankHeight = + (td.height! - tdPaddingHeight) * scale - rowsHeight + const offsetHeight = + td.verticalAlign === VerticalAlign.MIDDLE + ? blankHeight / 2 + : blankHeight + if (Math.floor(offsetHeight) > 0) { + td.positionList.forEach(tdPosition => { + const { + coordinate: { + leftTop, + leftBottom, + rightBottom, + rightTop + } + } = tdPosition + leftTop[1] += offsetHeight + leftBottom[1] += offsetHeight + rightBottom[1] += offsetHeight + rightTop[1] += offsetHeight + }) + } } + x = drawRowResult.x + y = drawRowResult.y } - x = drawRowResult.x - y = drawRowResult.y } + x = tablePreX + y = tablePreY } - // 恢复初始x、y - x = tablePreX - y = tablePreY } } + x = startX y += curRow.height } + return { x, y, index } } @@ -531,8 +590,8 @@ export class Position { const headPosition = positionList[headIndex] // 是否在头部 const headStartX = - headElement.listStyle === ListStyle.CHECKBOX - ? this.draw.getMargins()[3] + headElement?.listStyle === ListStyle.CHECKBOX + ? this.options.margins[3] : headPosition.coordinate.leftTop[0] if (x < headStartX) { // 头部元素为空元素时无需选中 @@ -598,7 +657,7 @@ export class Position { } // 正文上-循环首行 const margins = this.draw.getMargins() - if (y <= margins[0]) { + if (y <= margins[1]) { for (let p = 0; p < positionList.length; p++) { const position = positionList[p] if (position.pageNo !== positionNo || position.rowNo !== 0) continue @@ -777,6 +836,7 @@ export class Position { surroundElementList, availableWidth } = payload + let x = rowElementRect.x let rowIncreaseWidth = 0 if ( diff --git a/src/editor/core/range/RangeManager.ts b/src/editor/core/range/RangeManager.ts index 29f29e368..490ed12d5 100644 --- a/src/editor/core/range/RangeManager.ts +++ b/src/editor/core/range/RangeManager.ts @@ -10,7 +10,6 @@ import { EventBusMap } from '../../interface/EventBus' import { IRangeStyle } from '../../interface/Listener' import { IRange, - IRangeElementStyle, IRangeParagraphInfo, RangeRowArray, RangeRowMap @@ -30,7 +29,6 @@ export class RangeManager { private eventBus: EventBus private position: Position private historyManager: HistoryManager - private defaultStyle: IRangeElementStyle | null constructor(draw: Draw) { this.draw = draw @@ -43,7 +41,6 @@ export class RangeManager { startIndex: -1, endIndex: -1 } - this.defaultStyle = null } public getRange(): IRange { @@ -54,68 +51,21 @@ export class RangeManager { this.setRange(-1, -1) } - public setDefaultStyle(style: IRangeElementStyle | null) { - if (!style) { - this.defaultStyle = null - } else { - this.defaultStyle = { - ...this.defaultStyle, - ...style - } - } - } - - public getDefaultStyle(): IRangeElementStyle | null { - return this.defaultStyle - } - - public getRangeAnchorStyle( - elementList: IElement[], - anchorIndex: number - ): IElement | null { - const anchorElement = getAnchorElement(elementList, anchorIndex) - if (!anchorElement) return null - return { - ...anchorElement, - ...this.defaultStyle - } - } - - public getIsRangeChange( - startIndex: number, - endIndex: number, - tableId?: string, - startTdIndex?: number, - endTdIndex?: number, - startTrIndex?: number, - endTrIndex?: number - ): boolean { - return ( - this.range.startIndex !== startIndex || - this.range.endIndex !== endIndex || - this.range.tableId !== tableId || - this.range.startTdIndex !== startTdIndex || - this.range.endTdIndex !== endTdIndex || - this.range.startTrIndex !== startTrIndex || - this.range.endTrIndex !== endTrIndex - ) - } - public getIsCollapsed(): boolean { const { startIndex, endIndex } = this.range return startIndex === endIndex } - public getIsSelection(): boolean { - const { startIndex, endIndex } = this.range - if (!~startIndex && !~endIndex) return false - return startIndex !== endIndex - } - public getSelection(): IElement[] | null { const { startIndex, endIndex } = this.range if (startIndex === endIndex) return null const elementList = this.draw.getElementList() + + const rangeElementList = elementList.slice(startIndex + 1, endIndex + 1) + const uniqueIds = Array.from( + new Set(rangeElementList.map(el => el.id)) + ).filter(Boolean) as string[] + this.eventBus.emit('selectionChange', uniqueIds) return elementList.slice(startIndex + 1, endIndex + 1) } @@ -361,7 +311,7 @@ export class RangeManager { } else { const { type, groupId, tableId, index, tdIndex, trIndex } = searchMatch const range: IRange = { - startIndex: index, + startIndex: index - 1, endIndex: index } if (type === EditorContext.TABLE) { @@ -384,16 +334,9 @@ export class RangeManager { public getIsCanInput(): boolean { const { startIndex, endIndex } = this.getRange() if (!~startIndex && !~endIndex) return false + if (startIndex === endIndex) return true const elementList = this.draw.getElementList() const startElement = elementList[startIndex] - if (startIndex === endIndex) { - return ( - (startElement.controlComponent !== ControlComponent.PRE_TEXT || - elementList[startIndex + 1]?.controlComponent !== - ControlComponent.PRE_TEXT) && - startElement.controlComponent !== ControlComponent.POST_TEXT - ) - } const endElement = elementList[endIndex] // 选区前后不是控件 || 选区前不是控件或是后缀&&选区后不是控件或是后缀 || 选区在控件内 return ( @@ -404,8 +347,6 @@ export class RangeManager { endElement.controlComponent === ControlComponent.POSTFIX)) || (!!startElement.controlId && endElement.controlId === startElement.controlId && - endElement.controlComponent !== ControlComponent.PRE_TEXT && - endElement.controlComponent !== ControlComponent.POST_TEXT && endElement.controlComponent !== ControlComponent.POSTFIX) ) } @@ -419,32 +360,19 @@ export class RangeManager { startTrIndex?: number, endTrIndex?: number ) { - // 判断光标是否改变 - const isChange = this.getIsRangeChange( - startIndex, - endIndex, - tableId, - startTdIndex, - endTdIndex, - startTrIndex, + this.range.startIndex = startIndex + this.range.endIndex = endIndex + this.range.tableId = tableId + this.range.startTdIndex = startTdIndex + this.range.endTdIndex = endTdIndex + this.range.startTrIndex = startTrIndex + this.range.endTrIndex = endTrIndex + this.range.isCrossRowCol = !!( + startTdIndex || + endTdIndex || + startTrIndex || endTrIndex ) - if (isChange) { - this.range.startIndex = startIndex - this.range.endIndex = endIndex - this.range.tableId = tableId - this.range.startTdIndex = startTdIndex - this.range.endTdIndex = endTdIndex - this.range.startTrIndex = startTrIndex - this.range.endTrIndex = endTrIndex - this.range.isCrossRowCol = !!( - startTdIndex || - endTdIndex || - startTrIndex || - endTrIndex - ) - this.setDefaultStyle(null) - } this.range.zone = this.draw.getZone().getZone() // 激活控件 const control = this.draw.getControl() @@ -489,7 +417,7 @@ export class RangeManager { const index = ~endIndex ? endIndex : 0 // 行首以第一个非换行符元素定位 const elementList = this.draw.getElementList() - curElement = this.getRangeAnchorStyle(elementList, index) + curElement = getAnchorElement(elementList, index) } if (!curElement) return // 选取元素列表 @@ -610,8 +538,7 @@ export class RangeManager { const preElement = elementList[index] if ( preElement.controlId !== startElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { range.startIndex = index range.endIndex = index @@ -631,8 +558,7 @@ export class RangeManager { const preElement = elementList[index] if ( preElement.controlId !== endElement.controlId || - preElement.controlComponent === ControlComponent.PREFIX || - preElement.controlComponent === ControlComponent.PRE_TEXT + preElement.controlComponent === ControlComponent.PREFIX ) { range.startIndex = index range.endIndex = index diff --git a/src/editor/core/worker/WorkerManager.ts b/src/editor/core/worker/WorkerManager.ts index 6114e3d26..c740e34ad 100644 --- a/src/editor/core/worker/WorkerManager.ts +++ b/src/editor/core/worker/WorkerManager.ts @@ -1,7 +1,7 @@ import { Draw } from '../draw/Draw' -import WordCountWorker from './works/wordCount?worker&inline' -import CatalogWorker from './works/catalog?worker&inline' -import GroupWorker from './works/group?worker&inline' +import WordCountWorker from './works/wordCount.worker?worker&inline' +import CatalogWorker from './works/catalog.worker?worker&inline' +import GroupWorker from './works/group.worker?worker&inline' import { ICatalog } from '../../interface/Catalog' export class WorkerManager { @@ -12,9 +12,9 @@ export class WorkerManager { constructor(draw: Draw) { this.draw = draw - this.wordCountWorker = new WordCountWorker() - this.catalogWorker = new CatalogWorker() - this.groupWorker = new GroupWorker() + this.wordCountWorker = new WordCountWorker() as Worker + this.catalogWorker = new CatalogWorker() as Worker + this.groupWorker = new GroupWorker() as Worker } public getWordCount(): Promise { @@ -28,6 +28,11 @@ export class WorkerManager { } const elementList = this.draw.getOriginalMainElementList() + + if (!Array.isArray(elementList)) { + console.error('elementList is not an array:', elementList) + return + } this.wordCountWorker.postMessage(elementList) }) } @@ -43,11 +48,12 @@ export class WorkerManager { } const elementList = this.draw.getOriginalMainElementList() - const positionList = this.draw.getPosition().getOriginalMainPositionList() - this.catalogWorker.postMessage({ - elementList, - positionList - }) + + if (!Array.isArray(elementList)) { + console.error('elementList is not an array:', elementList) + return + } + this.catalogWorker.postMessage(elementList) }) } @@ -62,6 +68,11 @@ export class WorkerManager { } const elementList = this.draw.getOriginalMainElementList() + + if (!Array.isArray(elementList)) { + console.error('elementList is not an array:', elementList) + return + } this.groupWorker.postMessage(elementList) }) } diff --git a/src/editor/core/worker/works/catalog.ts b/src/editor/core/worker/works/catalog.ts index fa1fc97f3..f93f484de 100644 --- a/src/editor/core/worker/works/catalog.ts +++ b/src/editor/core/worker/works/catalog.ts @@ -1,6 +1,6 @@ import { ICatalog, ICatalogItem } from '../../../interface/Catalog' import { IElement, IElementPosition } from '../../../interface/Element' - +import { ElementType as ElementType2 } from '../../../dataset/enum/Element' interface IGetCatalogPayload { elementList: IElement[] positionList: IElementPosition[] @@ -28,7 +28,8 @@ enum ElementType { BLOCK = 'block', TITLE = 'title', AREA = 'area', - LIST = 'list' + LIST = 'list', + PARAGRAPH = 'paragraph' } enum TitleLevel { @@ -75,7 +76,7 @@ function getCatalog(payload: IGetCatalogPayload): ICatalog | null { const titleId = element.titleId const level = element.level const titleElement: ICatalogElement = { - type: ElementType.TITLE, + type: ElementType2.TITLE, value: '', level, titleId, @@ -117,7 +118,6 @@ function getCatalog(payload: IGetCatalogPayload): ICatalog | null { id: title.titleId!, name: title.value, level: title.level!, - pageNo: title.pageNo, subCatalog: [] }) } @@ -138,7 +138,6 @@ function getCatalog(payload: IGetCatalogPayload): ICatalog | null { id: title.titleId!, name: title.value, level: title.level!, - pageNo: title.pageNo, subCatalog: [] }) } diff --git a/src/editor/core/worker/works/group.ts b/src/editor/core/worker/works/group.ts index 67ae7afee..3b78799f9 100644 --- a/src/editor/core/worker/works/group.ts +++ b/src/editor/core/worker/works/group.ts @@ -31,4 +31,4 @@ onmessage = evt => { const elementList = evt.data const groupIds = getGroupIds(elementList) postMessage(groupIds) -} +} \ No newline at end of file diff --git a/src/editor/core/zone/Zone.ts b/src/editor/core/zone/Zone.ts index f1ff5a3f8..5b19d9190 100644 --- a/src/editor/core/zone/Zone.ts +++ b/src/editor/core/zone/Zone.ts @@ -48,13 +48,6 @@ export class Zone { } public setZone(payload: EditorZone) { - const { header, footer } = this.options - if ( - (!header.editable && payload === EditorZone.HEADER) || - (!footer.editable && payload === EditorZone.FOOTER) - ) { - return - } if (this.currentZone === payload) return this.currentZone = payload this.draw.getRange().clearRange() diff --git a/src/editor/dataset/constant/Badge.ts b/src/editor/dataset/constant/Badge.ts deleted file mode 100644 index 661436316..000000000 --- a/src/editor/dataset/constant/Badge.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IBadgeOption } from '../../interface/Badge' - -export const defaultBadgeOption: Readonly> = { - top: 0, - left: 5 -} diff --git a/src/editor/dataset/constant/ContextMenu.ts b/src/editor/dataset/constant/ContextMenu.ts index 493478380..303a68156 100644 --- a/src/editor/dataset/constant/ContextMenu.ts +++ b/src/editor/dataset/constant/ContextMenu.ts @@ -32,9 +32,7 @@ export const INTERNAL_CONTEXT_MENU_KEY = { BORDER: 'border', BORDER_ALL: 'tableBorderAll', BORDER_EMPTY: 'tableBorderEmpty', - BORDER_DASH: 'tableBorderDash', BORDER_EXTERNAL: 'tableBorderExternal', - BORDER_INTERNAL: 'tableBorderInternal', BORDER_TD: 'tableBorderTd', BORDER_TD_TOP: 'tableBorderTdTop', BORDER_TD_RIGHT: 'tableBorderTdRight', diff --git a/src/editor/dataset/constant/Element.ts b/src/editor/dataset/constant/Element.ts index 034161d9e..664e4d876 100644 --- a/src/editor/dataset/constant/Element.ts +++ b/src/editor/dataset/constant/Element.ts @@ -29,7 +29,6 @@ export const EDITOR_ELEMENT_COPY_ATTR: Array = [ 'strikeout', 'rowFlex', 'url', - 'areaId', 'hyperlinkId', 'dateId', 'dateFormat', @@ -53,7 +52,6 @@ export const EDITOR_ELEMENT_ZIP_ATTR: Array = [ 'dashArray', 'trList', 'borderType', - 'borderColor', 'width', 'height', 'url', @@ -76,8 +74,7 @@ export const EDITOR_ELEMENT_ZIP_ATTR: Array = [ 'textDecoration', 'extension', 'externalId', - 'areaId', - 'area' + 'isFootnote' ] export const TABLE_TD_ZIP_ATTR: Array = [ @@ -101,11 +98,19 @@ export const TITLE_CONTEXT_ATTR: Array = [ 'titleId', 'title' ] +export const PARAGRAPH_CONTEXT_ATTR: Array = [ + 'r', + 'id', + 'value', + 'type', + 'spacing' +] export const LIST_CONTEXT_ATTR: Array = [ 'listId', 'listType', - 'listStyle' + 'listStyle', + 'listLevel' ] export const CONTROL_CONTEXT_ATTR: Array = [ @@ -123,13 +128,11 @@ export const CONTROL_STYLE_ATTR: Array = [ 'strikeout' ] -export const AREA_CONTEXT_ATTR: Array = ['areaId', 'area'] - export const EDITOR_ELEMENT_CONTEXT_ATTR: Array = [ ...TABLE_CONTEXT_ATTR, ...TITLE_CONTEXT_ATTR, ...LIST_CONTEXT_ATTR, - ...AREA_CONTEXT_ATTR + ...PARAGRAPH_CONTEXT_ATTR ] export const TEXTLIKE_ELEMENT_TYPE: ElementType[] = [ @@ -157,5 +160,6 @@ export const INLINE_NODE_NAME: string[] = ['HR', 'TABLE', 'UL', 'OL'] export const VIRTUAL_ELEMENT_TYPE: ElementType[] = [ ElementType.TITLE, - ElementType.LIST + ElementType.LIST, + ElementType.PARAGRAPH ] diff --git a/src/editor/dataset/constant/Footer.ts b/src/editor/dataset/constant/Footer.ts index a0697d274..abf6255c1 100644 --- a/src/editor/dataset/constant/Footer.ts +++ b/src/editor/dataset/constant/Footer.ts @@ -4,6 +4,5 @@ import { MaxHeightRatio } from '../enum/Common' export const defaultFooterOption: Readonly> = { bottom: 30, maxHeightRadio: MaxHeightRatio.HALF, - disabled: false, - editable: true + disabled: false } diff --git a/src/editor/dataset/constant/Header.ts b/src/editor/dataset/constant/Header.ts index f304b8959..ccaa376ca 100644 --- a/src/editor/dataset/constant/Header.ts +++ b/src/editor/dataset/constant/Header.ts @@ -4,6 +4,5 @@ import { MaxHeightRatio } from '../enum/Common' export const defaultHeaderOption: Readonly> = { top: 30, maxHeightRadio: MaxHeightRatio.HALF, - disabled: false, - editable: true + disabled: false } diff --git a/src/editor/dataset/constant/Table.ts b/src/editor/dataset/constant/Table.ts index 62b969e98..04aa9a4e1 100644 --- a/src/editor/dataset/constant/Table.ts +++ b/src/editor/dataset/constant/Table.ts @@ -3,6 +3,5 @@ import { ITableOption } from '../../interface/table/Table' export const defaultTableOption: Readonly> = { tdPadding: [0, 5, 5, 5], defaultTrMinHeight: 42, - defaultColMinWidth: 40, - defaultBorderColor: '#000000' + defaultColMinWidth: 40 } diff --git a/src/editor/dataset/constant/Watermark.ts b/src/editor/dataset/constant/Watermark.ts index 82f0b0fb8..8c66939c0 100644 --- a/src/editor/dataset/constant/Watermark.ts +++ b/src/editor/dataset/constant/Watermark.ts @@ -1,13 +1,9 @@ import { IWatermark } from '../../interface/Watermark' -import { NumberType } from '../enum/Common' export const defaultWatermarkOption: Readonly> = { data: '', color: '#AEB5C0', opacity: 0.3, size: 200, - font: 'Microsoft YaHei', - repeat: false, - gap: [10, 10], - numberType: NumberType.ARABIC + font: 'Microsoft YaHei' } diff --git a/src/editor/dataset/enum/Area.ts b/src/editor/dataset/enum/Area.ts deleted file mode 100644 index 40fc53e88..000000000 --- a/src/editor/dataset/enum/Area.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum AreaMode { - EDIT = 'edit', // 编辑模式(文档可编辑、辅助元素均存在) - READONLY = 'readonly', // 只读模式(文档不可编辑) - FORM = 'form' // 表单模式(仅控件内可编辑) -} diff --git a/src/editor/dataset/enum/Common.ts b/src/editor/dataset/enum/Common.ts index 56f4628d6..7973bd8b7 100644 --- a/src/editor/dataset/enum/Common.ts +++ b/src/editor/dataset/enum/Common.ts @@ -21,8 +21,3 @@ export enum LocationPosition { BEFORE = 'before', AFTER = 'after' } - -export enum FlexDirection { - ROW = 'row', - COLUMN = 'column' -} diff --git a/src/editor/dataset/enum/Control.ts b/src/editor/dataset/enum/Control.ts index b894c13fb..c88d26369 100644 --- a/src/editor/dataset/enum/Control.ts +++ b/src/editor/dataset/enum/Control.ts @@ -3,15 +3,12 @@ export enum ControlType { SELECT = 'select', CHECKBOX = 'checkbox', RADIO = 'radio', - DATE = 'date', - NUMBER = 'number' + DATE = 'date' } export enum ControlComponent { PREFIX = 'prefix', POSTFIX = 'postfix', - PRE_TEXT = 'preText', - POST_TEXT = 'postText', PLACEHOLDER = 'placeholder', VALUE = 'value', CHECKBOX = 'checkbox', @@ -23,9 +20,3 @@ export enum ControlIndentation { ROW_START = 'rowStart', // 从行起始位置缩进 VALUE_START = 'valueStart' // 从值起始位置缩进 } - -// 控件状态 -export enum ControlState { - ACTIVE = 'active', - INACTIVE = 'inactive' -} diff --git a/src/editor/dataset/enum/Element.ts b/src/editor/dataset/enum/Element.ts index d37e76d9a..c08cc3906 100644 --- a/src/editor/dataset/enum/Element.ts +++ b/src/editor/dataset/enum/Element.ts @@ -8,7 +8,6 @@ export enum ElementType { SEPARATOR = 'separator', PAGE_BREAK = 'pageBreak', CONTROL = 'control', - AREA = 'area', CHECKBOX = 'checkbox', RADIO = 'radio', LATEX = 'latex', @@ -16,5 +15,6 @@ export enum ElementType { DATE = 'date', BLOCK = 'block', TITLE = 'title', - LIST = 'list' + LIST = 'list', + PARAGRAPH = 'paragraph' } diff --git a/src/editor/dataset/enum/table/Table.ts b/src/editor/dataset/enum/table/Table.ts index c5bb6f741..ca176b450 100644 --- a/src/editor/dataset/enum/table/Table.ts +++ b/src/editor/dataset/enum/table/Table.ts @@ -1,9 +1,7 @@ export enum TableBorder { ALL = 'all', EMPTY = 'empty', - EXTERNAL = 'external', - INTERNAL = 'internal', - DASH = 'dash' + EXTERNAL = 'external' } export enum TdBorder { diff --git a/src/editor/index.ts b/src/editor/index.ts index 1354c7779..c7f60a3e4 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -6,11 +6,7 @@ import { Command } from './core/command/Command' import { CommandAdapt } from './core/command/CommandAdapt' import { Listener } from './core/listener/Listener' import { RowFlex } from './dataset/enum/Row' -import { - FlexDirection, - ImageDisplay, - LocationPosition -} from './dataset/enum/Common' +import { ImageDisplay, LocationPosition } from './dataset/enum/Common' import { ElementType } from './dataset/enum/Element' import { formatElementList } from './utils/element' import { Register } from './core/register/Register' @@ -28,13 +24,9 @@ import { WordBreak, RenderMode } from './dataset/enum/Editor' -import { EDITOR_CLIPBOARD, EDITOR_COMPONENT } from './dataset/constant/Editor' +import { EDITOR_COMPONENT } from './dataset/constant/Editor' import { IWatermark } from './interface/Watermark' -import { - ControlIndentation, - ControlState, - ControlType -} from './dataset/enum/Control' +import { ControlIndentation, ControlType } from './dataset/enum/Control' import { INavigateInfo } from './core/draw/interactive/Search' import { Shortcut } from './core/shortcut/Shortcut' import { KeyMap } from './dataset/enum/KeyMap' @@ -57,18 +49,10 @@ import { LETTER_CLASS } from './dataset/constant/Common' import { INTERNAL_CONTEXT_MENU_KEY } from './dataset/constant/ContextMenu' import { IRange } from './interface/Range' import { deepClone, splitText } from './utils' -import { - createDomFromElementList, - getElementListByHTML, - getTextFromElementList, - type IGetElementListByHTMLOption -} from './utils/element' import { BackgroundRepeat, BackgroundSize } from './dataset/enum/Background' import { TextDecorationStyle } from './dataset/enum/Text' import { mergeOption } from './utils/option' import { LineNumberType } from './dataset/enum/LineNumber' -import { AreaMode } from './dataset/enum/Area' -import { IBadge } from './interface/Badge' export default class Editor { public command: Command @@ -153,20 +137,10 @@ export default class Editor { } // 对外方法 -export { - splitText, - createDomFromElementList, - getElementListByHTML, - getTextFromElementList -} +export { splitText } // 对外常量 -export { - EDITOR_COMPONENT, - LETTER_CLASS, - INTERNAL_CONTEXT_MENU_KEY, - EDITOR_CLIPBOARD -} +export { EDITOR_COMPONENT, LETTER_CLASS, INTERNAL_CONTEXT_MENU_KEY } // 对外枚举 export { @@ -199,10 +173,7 @@ export { BackgroundSize, TextDecorationStyle, LineNumberType, - LocationPosition, - AreaMode, - ControlState, - FlexDirection + LocationPosition } // 对外类型 @@ -220,7 +191,5 @@ export type { ICatalog, ICatalogItem, IRange, - IRangeStyle, - IBadge, - IGetElementListByHTMLOption + IRangeStyle } diff --git a/src/editor/interface/Area.ts b/src/editor/interface/Area.ts deleted file mode 100644 index e66315bcc..000000000 --- a/src/editor/interface/Area.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { AreaMode } from '../dataset/enum/Area' -import { LocationPosition } from '../dataset/enum/Common' -import { IElement, IElementPosition } from './Element' - -export interface IAreaBasic { - extension?: unknown -} - -export interface IAreaStyle { - top?: number - borderColor?: string - backgroundColor?: string -} - -export interface IAreaRule { - mode?: AreaMode -} - -export type IArea = IAreaBasic & IAreaStyle & IAreaRule - -export interface IInsertAreaOption { - id?: string - area: IArea - value: IElement[] - position?: LocationPosition -} - -export interface ISetAreaPropertiesOption { - id?: string - properties: IArea -} - -export interface IGetAreaValueOption { - id?: string -} - -export interface IGetAreaValueResult { - id?: string - area: IArea - startPageNo: number - endPageNo: number - value: IElement[] -} - -export interface IAreaInfo { - id: string - area: IArea - elementList: IElement[] - positionList: IElementPosition[] -} diff --git a/src/editor/interface/Badge.ts b/src/editor/interface/Badge.ts deleted file mode 100644 index 3c9d116f3..000000000 --- a/src/editor/interface/Badge.ts +++ /dev/null @@ -1,17 +0,0 @@ -export interface IBadge { - top?: number - left?: number - width: number - height: number - value: string -} - -export interface IBadgeOption { - top?: number - left?: number -} - -export interface IAreaBadge { - areaId: string - badge: IBadge -} diff --git a/src/editor/interface/Catalog.ts b/src/editor/interface/Catalog.ts index f1ac61803..2a0701379 100644 --- a/src/editor/interface/Catalog.ts +++ b/src/editor/interface/Catalog.ts @@ -4,7 +4,6 @@ export interface ICatalogItem { id: string name: string level: TitleLevel - pageNo: number subCatalog: ICatalogItem[] } diff --git a/src/editor/interface/Common.ts b/src/editor/interface/Common.ts index 1914ddb44..c2e9b285c 100644 --- a/src/editor/interface/Common.ts +++ b/src/editor/interface/Common.ts @@ -12,24 +12,24 @@ export type Builtin = Primitive | Function | Date | Error | RegExp export type DeepRequired = T extends Error ? Required : T extends Builtin - ? T - : T extends Map - ? Map, DeepRequired> - : T extends ReadonlyMap - ? ReadonlyMap, DeepRequired> - : T extends WeakMap - ? WeakMap, DeepRequired> - : T extends Set - ? Set> - : T extends ReadonlySet - ? ReadonlySet> - : T extends WeakSet - ? WeakSet> - : T extends Promise - ? Promise> - : T extends {} - ? { [K in keyof T]-?: DeepRequired } - : Required + ? T + : T extends Map + ? Map, DeepRequired> + : T extends ReadonlyMap + ? ReadonlyMap, DeepRequired> + : T extends WeakMap + ? WeakMap, DeepRequired> + : T extends Set + ? Set> + : T extends ReadonlySet + ? ReadonlySet> + : T extends WeakSet + ? WeakSet> + : T extends Promise + ? Promise> + : T extends {} + ? { [K in keyof T]-?: DeepRequired } + : Required export type DeepPartial = { [P in keyof T]?: DeepPartial diff --git a/src/editor/interface/Control.ts b/src/editor/interface/Control.ts index 82f272a6b..8fb745485 100644 --- a/src/editor/interface/Control.ts +++ b/src/editor/interface/Control.ts @@ -1,17 +1,11 @@ -import { FlexDirection, LocationPosition } from '../dataset/enum/Common' -import { - ControlType, - ControlIndentation, - ControlState -} from '../dataset/enum/Control' +import { LocationPosition } from '../dataset/enum/Common' +import { ControlType, ControlIndentation } from '../dataset/enum/Control' import { EditorZone } from '../dataset/enum/Editor' import { MoveDirection } from '../dataset/enum/Observer' -import { RowFlex } from '../dataset/enum/Row' import { IDrawOption } from './Draw' import { IElement } from './Element' import { IPositionContext } from './Position' import { IRange } from './Range' -import { IRow, IRowElement } from './Row' export interface IValueSet { value: string @@ -21,24 +15,17 @@ export interface IValueSet { export interface IControlSelect { code: string | null valueSets: IValueSet[] - isMultiSelect?: boolean - multiSelectDelimiter?: string - selectExclusiveOptions?: { - inputAble?: boolean - } } export interface IControlCheckbox { code: string | null min?: number max?: number - flexDirection: FlexDirection valueSets: IValueSet[] } export interface IControlRadio { code: string | null - flexDirection: FlexDirection valueSets: IValueSet[] } @@ -61,7 +48,6 @@ export interface IControlHighlight { export interface IControlRule { deletable?: boolean disabled?: boolean - pasteDisabled?: boolean hide?: boolean } @@ -77,9 +63,6 @@ export interface IControlBasic { border?: boolean extension?: unknown indentation?: ControlIndentation - rowFlex?: RowFlex - preText?: string - postText?: string } export interface IControlStyle { @@ -124,7 +107,7 @@ export interface IControlInitResult { export interface IControlInstance { setElement(element: IElement): void getElement(): IElement - getValue(context?: IControlContext): IElement[] + getValue(): IElement[] setValue( data: IElement[], context?: IControlContext, @@ -147,28 +130,23 @@ export interface IControlRuleOption { export interface IGetControlValueOption { id?: string conceptId?: string - areaId?: string } export type IGetControlValueResult = (Omit & { value: string | null innerText: string | null zone: EditorZone - elementList?: IElement[] })[] export interface ISetControlValueOption { id?: string conceptId?: string - areaId?: string - value: string | IElement[] | null - isSubmitHistory?: boolean + value: string } export interface ISetControlExtensionOption { id?: string conceptId?: string - areaId?: string extension: unknown } @@ -177,9 +155,7 @@ export type ISetControlHighlightOption = IControlHighlight[] export type ISetControlProperties = { id?: string conceptId?: string - areaId?: string properties: Partial> - isSubmitHistory?: boolean } export type IRepaintControlOption = Pick< @@ -187,12 +163,6 @@ export type IRepaintControlOption = Pick< 'curIndex' | 'isCompute' | 'isSubmitHistory' | 'isSetCursor' > -export interface IControlChangeOption { - context?: IControlContext - controlElement?: IElement - controlValue?: IElement[] -} - export interface INextControlContext { positionContext: IPositionContext nextIndex: number @@ -205,30 +175,3 @@ export interface IInitNextControlOption { export interface ILocationControlOption { position: LocationPosition } - -export interface ISetControlRowFlexOption { - row: IRow - rowElement: IRowElement - availableWidth: number - controlRealWidth: number -} - -export interface IControlChangeResult { - state: ControlState - control: IControl - controlId: string -} - -export interface IControlContentChangeResult { - control: IControl - controlId: string -} - -export interface IDestroyControlOption { - isEmitEvent?: boolean -} - -export interface IRemoveControlOption { - id?: string - conceptId?: string -} diff --git a/src/editor/interface/Draw.ts b/src/editor/interface/Draw.ts index 4b642ecaa..594ce9425 100644 --- a/src/editor/interface/Draw.ts +++ b/src/editor/interface/Draw.ts @@ -19,7 +19,6 @@ export interface IForceUpdateOption { } export interface IDrawImagePayload { - id?: string width: number height: number value: string diff --git a/src/editor/interface/Editor.ts b/src/editor/interface/Editor.ts index c93dfc06e..2897da722 100644 --- a/src/editor/interface/Editor.ts +++ b/src/editor/interface/Editor.ts @@ -26,7 +26,6 @@ import { ISeparatorOption } from './Separator' import { ITableOption } from './table/Table' import { ILineNumberOption } from './LineNumber' import { IPageBorderOption } from './PageBorder' -import { IBadgeOption } from './Badge' export interface IEditorData { header?: IElement[] @@ -85,6 +84,7 @@ export interface IEditorOption { radio?: IRadioOption cursor?: ICursorOption title?: ITitleOption + // paragraph?: IParagraphOption placeholder?: IPlaceholder group?: IGroup pageBreak?: IPageBreak @@ -94,7 +94,6 @@ export interface IEditorOption { separator?: ISeparatorOption lineNumber?: ILineNumberOption pageBorder?: IPageBorderOption - badge?: IBadgeOption } export interface IEditorResult { diff --git a/src/editor/interface/Element.ts b/src/editor/interface/Element.ts index ed431fbb2..ec3480ffd 100644 --- a/src/editor/interface/Element.ts +++ b/src/editor/interface/Element.ts @@ -5,7 +5,6 @@ import { ListStyle, ListType } from '../dataset/enum/List' import { RowFlex } from '../dataset/enum/Row' import { TitleLevel } from '../dataset/enum/Title' import { TableBorder } from '../dataset/enum/table/Table' -import { IArea } from './Area' import { IBlock } from './Block' import { ICheckbox } from './Checkbox' import { IControl } from './Control' @@ -26,6 +25,7 @@ export interface IElementBasic { export interface IElementStyle { font?: string size?: number + metrics?: IElementMetrics width?: number height?: number bold?: boolean @@ -44,6 +44,29 @@ export interface IElementGroup { groupIds?: string[] } +export interface IParagraph { + id?: string | undefined + v?: string[] // ID вариативностей + r?: IElement[] // Элементы (runs) внутри параграфа + size?: number + bold?: boolean + spacing?: { + before?: number + after?: number + firstLine?: number //для первой строки + } + rowFlex?: RowFlex // Дополнительные стили параграфа +} + +export interface IFootnote { + isFootnote?: boolean +} + +// Элемент параграфа +export interface IParagraphElement { + r: IElement[] +} + export interface ITitleElement { valueList?: IElement[] level?: TitleLevel @@ -57,17 +80,13 @@ export interface IListElement { listStyle?: ListStyle listId?: string listWrap?: boolean + listLevel?: number } export interface ITableAttr { colgroup?: IColgroup[] trList?: ITr[] borderType?: TableBorder - borderColor?: string -} - -export interface ITableRule { - tableToolDisabled?: boolean } export interface ITableElement { @@ -79,7 +98,7 @@ export interface ITableElement { pagingIndex?: number // 拆分的表格索引 } -export type ITable = ITableAttr & ITableRule & ITableElement +export type ITable = ITableAttr & ITableElement export interface IHyperlinkElement { valueList?: IElement[] @@ -131,12 +150,6 @@ export interface IBlockElement { block?: IBlock } -export interface IAreaElement { - valueList?: IElement[] - areaId?: string - area?: IArea -} - export type IElement = IElementBasic & IElementStyle & IElementGroup & @@ -153,7 +166,8 @@ export type IElement = IElementBasic & IBlockElement & ITitleElement & IListElement & - IAreaElement + IParagraph & + IFootnote export interface IElementMetrics { width: number @@ -190,17 +204,6 @@ export interface IElementFillRect { } export interface IUpdateElementByIdOption { - id?: string - conceptId?: string + id: string properties: Omit, 'id'> } - -export interface IDeleteElementByIdOption { - id?: string - conceptId?: string -} - -export interface IGetElementByIdOption { - id?: string - conceptId?: string -} diff --git a/src/editor/interface/Event.ts b/src/editor/interface/Event.ts index c72c19103..dc537bb36 100644 --- a/src/editor/interface/Event.ts +++ b/src/editor/interface/Event.ts @@ -5,23 +5,8 @@ export interface IPasteOption { isPlainText: boolean } -export interface ITableInfoByEvent { - element: IElement - trIndex: number - tdIndex: number -} - -export interface IPositionContextByEventResult { +export interface IPositionContextByEvent { pageNo: number element: IElement | null rangeRect: RangeRect | null - tableInfo: ITableInfoByEvent | null -} - -export interface IPositionContextByEventOption { - isMustDirectHit?: boolean -} - -export interface ICopyOption { - isPlainText: boolean } diff --git a/src/editor/interface/EventBus.ts b/src/editor/interface/EventBus.ts index f0413e747..c02a243c5 100644 --- a/src/editor/interface/EventBus.ts +++ b/src/editor/interface/EventBus.ts @@ -1,7 +1,7 @@ import { IContentChange, IControlChange, - IControlContentChange, + ICursorPositionChange, IIntersectionPageNoChange, IMouseEventChange, IPageModeChange, @@ -11,7 +11,9 @@ import { IRangeStyleChange, ISaved, IVisiblePageNoListChange, - IZoneChange + IZoneChange, + ISelectionChange, + IParagraphIndentChange } from './Listener' export interface EventBusMap { @@ -23,14 +25,13 @@ export interface EventBusMap { saved: ISaved contentChange: IContentChange controlChange: IControlChange - controlContentChange: IControlContentChange pageModeChange: IPageModeChange zoneChange: IZoneChange mousemove: IMouseEventChange mouseleave: IMouseEventChange mouseenter: IMouseEventChange - mousedown: IMouseEventChange - mouseup: IMouseEventChange - click: IMouseEventChange positionContextChange: IPositionContextChange + cursorPositionChange: ICursorPositionChange + paragraphIndentChange: IParagraphIndentChange + selectionChange: ISelectionChange } diff --git a/src/editor/interface/Footer.ts b/src/editor/interface/Footer.ts index 65cd496cc..f7beaffe3 100644 --- a/src/editor/interface/Footer.ts +++ b/src/editor/interface/Footer.ts @@ -4,5 +4,4 @@ export interface IFooter { bottom?: number maxHeightRadio?: MaxHeightRatio disabled?: boolean - editable?: boolean } diff --git a/src/editor/interface/Header.ts b/src/editor/interface/Header.ts index 342a7ad8f..c59daa233 100644 --- a/src/editor/interface/Header.ts +++ b/src/editor/interface/Header.ts @@ -4,5 +4,4 @@ export interface IHeader { top?: number maxHeightRadio?: MaxHeightRatio disabled?: boolean - editable?: boolean } diff --git a/src/editor/interface/Listener.ts b/src/editor/interface/Listener.ts index 8c42eb74a..a4e7eee61 100644 --- a/src/editor/interface/Listener.ts +++ b/src/editor/interface/Listener.ts @@ -7,7 +7,7 @@ import { TitleLevel } from '..' import { RowFlex } from '../dataset/enum/Row' -import { IControlChangeResult, IControlContentChangeResult } from './Control' +import { IControl } from './Control' import { IEditorResult } from './Editor' import { IPositionContext } from './Position' import { ITextDecoration } from './Text' @@ -50,11 +50,7 @@ export type ISaved = (payload: IEditorResult) => void export type IContentChange = () => void -export type IControlChange = (payload: IControlChangeResult) => void - -export type IControlContentChange = ( - payload: IControlContentChangeResult -) => void +export type IControlChange = (payload: IControl | null) => void export type IPageModeChange = (payload: PageMode) => void @@ -66,7 +62,16 @@ export interface IPositionContextChangePayload { value: IPositionContext oldValue: IPositionContext } - export type IPositionContextChange = ( payload: IPositionContextChangePayload ) => void + +export type ICursorPositionChange = (index: number) => void + +export type IParagraphIndentChange = (payload: { + x?: number + y?: number + ids?: string | string[] +}) => void + +export type ISelectionChange = (ids: string[] | null) => void diff --git a/src/editor/interface/Range.ts b/src/editor/interface/Range.ts index 8f250c4d4..fe54a6141 100644 --- a/src/editor/interface/Range.ts +++ b/src/editor/interface/Range.ts @@ -1,5 +1,5 @@ import { EditorZone } from '../dataset/enum/Editor' -import { IElement, IElementFillRect, IElementStyle } from './Element' +import { IElement, IElementFillRect } from './Element' export interface IRange { startIndex: number @@ -33,23 +33,9 @@ export type RangeContext = { tableElement: IElement | null selectionText: string | null selectionElementList: IElement[] - titleId: string | null - titleStartPageNo: number | null } export interface IRangeParagraphInfo { elementList: IElement[] startIndex: number } - -export type IRangeElementStyle = Pick< - IElementStyle, - | 'bold' - | 'color' - | 'highlight' - | 'font' - | 'size' - | 'italic' - | 'underline' - | 'strikeout' -> diff --git a/src/editor/interface/Row.ts b/src/editor/interface/Row.ts index f62b6b2a7..2880a07a6 100644 --- a/src/editor/interface/Row.ts +++ b/src/editor/interface/Row.ts @@ -16,10 +16,11 @@ export interface IRow { isPageBreak?: boolean isList?: boolean listIndex?: number + secondListIndex?: number offsetX?: number - offsetY?: number elementList: IRowElement[] isWidthNotEnough?: boolean rowIndex: number isSurround?: boolean + indexes?: number[] } diff --git a/src/editor/interface/Search.ts b/src/editor/interface/Search.ts index de2e7c03a..b995c8af4 100644 --- a/src/editor/interface/Search.ts +++ b/src/editor/interface/Search.ts @@ -1,6 +1,4 @@ import { EditorContext } from '../dataset/enum/Editor' -import { IElementPosition } from './Element' -import { IRange } from './Range' export interface ISearchResultBasic { type: EditorContext @@ -18,13 +16,3 @@ export interface ISearchResultRestArgs { } export type ISearchResult = ISearchResultBasic & ISearchResultRestArgs - -export interface ISearchResultContext { - range: IRange - startPosition: IElementPosition - endPosition: IElementPosition -} - -export interface IReplaceOption { - index?: number -} diff --git a/src/editor/interface/Watermark.ts b/src/editor/interface/Watermark.ts index 2107a53d6..bf1c395c2 100644 --- a/src/editor/interface/Watermark.ts +++ b/src/editor/interface/Watermark.ts @@ -1,12 +1,7 @@ -import { NumberType } from '../dataset/enum/Common' - export interface IWatermark { data: string color?: string opacity?: number size?: number font?: string - repeat?: boolean - numberType?: NumberType - gap?: [horizontal: number, vertical: number] } diff --git a/src/editor/interface/table/Table.ts b/src/editor/interface/table/Table.ts index 0b2442894..d10086c07 100644 --- a/src/editor/interface/table/Table.ts +++ b/src/editor/interface/table/Table.ts @@ -4,5 +4,4 @@ export interface ITableOption { tdPadding?: IPadding defaultTrMinHeight?: number defaultColMinWidth?: number - defaultBorderColor?: string } diff --git a/src/editor/types/index.d.ts b/src/editor/types/index.d.ts index 8c465970d..71e3ec38c 100644 --- a/src/editor/types/index.d.ts +++ b/src/editor/types/index.d.ts @@ -3,3 +3,10 @@ interface CanvasRenderingContext2D { letterSpacing: string wordSpacing: string } + +declare module '*?worker&inline' { + class WorkerConstructor extends Worker { + constructor() + } + export default WorkerConstructor +} diff --git a/src/editor/utils/clipboard.ts b/src/editor/utils/clipboard.ts index cad8259ce..dd5db01d9 100644 --- a/src/editor/utils/clipboard.ts +++ b/src/editor/utils/clipboard.ts @@ -6,6 +6,8 @@ import { createDomFromElementList, zipElementList } from './element' export interface IClipboardData { text: string elementList: IElement[] + startIndex?: number + endIndex?: number } export function setClipboardData(data: IClipboardData) { @@ -13,7 +15,9 @@ export function setClipboardData(data: IClipboardData) { EDITOR_CLIPBOARD, JSON.stringify({ text: data.text, - elementList: data.elementList + elementList: data.elementList, + startIndex: data.startIndex, + endIndex: data.endIndex }) ) } @@ -30,13 +34,14 @@ export function removeClipboardData() { export function writeClipboardItem( text: string, html: string, - elementList: IElement[] + elementList: IElement[], + startIndex?: number, + endIndex?: number ) { if (!text && !html && !elementList.length) return const plainText = new Blob([text], { type: 'text/plain' }) const htmlText = new Blob([html], { type: 'text/html' }) if (window.ClipboardItem) { - // @ts-ignore const item = new ClipboardItem({ [plainText.type]: plainText, [htmlText.type]: htmlText @@ -62,12 +67,14 @@ export function writeClipboardItem( fakeElement.remove() } // 编辑器结构化数据 - setClipboardData({ text, elementList }) + setClipboardData({ text, elementList, startIndex, endIndex }) } export function writeElementList( elementList: IElement[], - options: DeepRequired + options: DeepRequired, + startIndex?: number, + endIndex?: number ) { const clipboardDom = createDomFromElementList(elementList, options) // 写入剪贴板 @@ -77,7 +84,13 @@ export function writeElementList( clipboardDom.remove() const html = clipboardDom.innerHTML if (!text && !html && !elementList.length) return - writeClipboardItem(text, html, zipElementList(elementList)) + writeClipboardItem( + text, + html, + zipElementList(elementList), + startIndex, + endIndex + ) } export function getIsClipboardContainFile(clipboardData: DataTransfer) { diff --git a/src/editor/utils/element.ts b/src/editor/utils/element.ts index 031044b44..8a4ffa8e6 100644 --- a/src/editor/utils/element.ts +++ b/src/editor/utils/element.ts @@ -9,7 +9,6 @@ import { splitText } from '.' import { - BlockType, EditorMode, ElementType, IEditorOption, @@ -17,16 +16,13 @@ import { ImageDisplay, ListStyle, ListType, - LocationPosition, RowFlex, TableBorder, TdBorder } from '..' -import { IFrameBlock } from '../core/draw/particle/block/modules/IFrameBlock' import { LaTexParticle } from '../core/draw/particle/latex/LaTexParticle' import { NON_BREAKING_SPACE, ZERO } from '../dataset/constant/Common' import { - AREA_CONTEXT_ATTR, BLOCK_ELEMENT_TYPE, CONTROL_STYLE_ATTR, EDITOR_ELEMENT_CONTEXT_ATTR, @@ -56,7 +52,7 @@ import { IControlSelect } from '../interface/Control' import { IRowElement } from '../interface/Row' import { ITd } from '../interface/table/Td' import { ITr } from '../interface/table/Tr' -import { mergeOption } from './option' +import { IParagraph } from '../interface/Element' export function unzipElementList(elementList: IElement[]): IElement[] { const result: IElement[] = [] @@ -102,6 +98,57 @@ export function formatElementList( while (i < elementList.length) { let el = elementList[i] // 优先处理虚拟元素 + if (el.type === ElementType.PARAGRAPH && !el.listId) { + elementList.splice(i, 1) + const paragraphProperties: Partial = { + spacing: el.spacing, + rowFlex: el.rowFlex, + id: el.id + } + + const valueList = el.r || [] + formatElementList(valueList, { + ...options, + isHandleFirstElement: false, + isForceCompensation: false + }) + + if (valueList.length) { + for (let v = 0; v < valueList.length; v++) { + const value = valueList[v] + + Object.assign(value, paragraphProperties) + elementList.splice(i, 0, value) + i++ + } + if ( + i !== elementList.length && + elementList[i]?.r?.[0]?.type !== ElementType.SEPARATOR && + elementList[i]?.r?.[0]?.type !== ElementType.TABLE && + elementList[i]?.r?.[0]?.type !== ElementType.LIST + ) { + elementList.splice(i, 0, { + value: ZERO, + id: elementList[i]?.id + }) + i++ + } + } else { + if ( + i !== elementList.length && + elementList[i]?.r?.[0]?.type !== ElementType.SEPARATOR && + elementList[i]?.r?.[0]?.type !== ElementType.TABLE && + elementList[i]?.r?.[0]?.type !== ElementType.LIST + ) { + elementList.splice(i, 0, { + value: ZERO, + id: elementList[i]?.id + }) + } + i++ + } + i-- + } if (el.type === ElementType.TITLE) { // 移除父节点 elementList.splice(i, 1) @@ -114,7 +161,7 @@ export function formatElementList( }) // 追加节点 if (valueList.length) { - const titleId = el.titleId || getUUID() + const titleId = getUUID() const titleOptions = editorOptions.title for (let v = 0; v < valueList.length; v++) { const value = valueList[v] @@ -150,8 +197,46 @@ export function formatElementList( // 追加节点 if (valueList.length) { const listId = getUUID() + const listLevel = 0 for (let v = 0; v < valueList.length; v++) { const value = valueList[v] + if ( + valueList[v + 1] && + valueList[v + 1].type === ElementType.TAB && + v !== 0 && + (value.value === ZERO || value.type === ElementType.TAB) + ) { + if ( + valueList[ + valueList.findLastIndex( + (el: IElement, index: number) => + el.value === ZERO && + valueList[v + 1].type === ElementType.TAB && + index <= v + ) + ].listLevel + ) { + const lastIndex = valueList.findLastIndex( + (el: IElement, index: number) => + el.value === ZERO && + valueList[v + 1]?.type === ElementType.TAB && + index <= v + ) + + if (lastIndex !== -1) { + valueList[lastIndex].listLevel = + (valueList[lastIndex].listLevel || 0) + 1 + } + } else + valueList[ + valueList.findLastIndex( + (el: IElement, index: number) => + el.value === ZERO && + valueList[v + 1].type === ElementType.TAB && + index <= v + ) + ].listLevel = 1 + } else value.listLevel = listLevel value.listId = listId value.listType = el.listType value.listStyle = el.listStyle @@ -160,50 +245,14 @@ export function formatElementList( } } i-- - } else if (el.type === ElementType.AREA) { - // 移除父节点 - elementList.splice(i, 1) - // 格式化元素 - const valueList = el?.valueList || [] - formatElementList(valueList, { - ...options, - isHandleFirstElement: true, - isForceCompensation: false - }) - if (valueList.length) { - const areaId = getUUID() - for (let v = 0; v < valueList.length; v++) { - const value = valueList[v] - value.areaId = el.areaId || areaId - value.area = el.area - if (value.type === ElementType.TABLE) { - const trList = value.trList! - for (let r = 0; r < trList.length; r++) { - const tr = trList[r] - for (let d = 0; d < tr.tdList.length; d++) { - const td = tr.tdList[d] - const tdValueList = td.value - for (let t = 0; t < tdValueList.length; t++) { - const tdValue = tdValueList[t] - tdValue.areaId = el.areaId || areaId - tdValue.area = el.area - } - } - } - } - elementList.splice(i, 0, value) - i++ - } - } - i-- } else if (el.type === ElementType.TABLE) { - const tableId = el.id || getUUID() + const tableId = getUUID() el.id = tableId if (el.trList) { const { defaultTrMinHeight } = editorOptions.table for (let t = 0; t < el.trList.length; t++) { const tr = el.trList[t] - const trId = tr.id || getUUID() + const trId = getUUID() tr.id = trId if (!tr.minHeight || tr.minHeight < defaultTrMinHeight) { tr.minHeight = defaultTrMinHeight @@ -213,7 +262,7 @@ export function formatElementList( } for (let d = 0; d < tr.tdList.length; d++) { const td = tr.tdList[d] - const tdId = td.id || getUUID() + const tdId = getUUID() td.id = tdId formatElementList(td.value, { ...options, @@ -271,17 +320,8 @@ export function formatElementList( i++ continue } - const { - prefix, - postfix, - preText, - postText, - value, - placeholder, - code, - type, - valueSets - } = el.control + const { prefix, postfix, value, placeholder, code, type, valueSets } = + el.control const { editorOptions: { control: controlOption, @@ -289,7 +329,7 @@ export function formatElementList( radio: radioOption } } = options - const controlId = el.controlId || getUUID() + const controlId = getUUID() // 移除父节点 elementList.splice(i, 1) // 控件上下文提取(压缩后的控件上下文无法提取) @@ -322,23 +362,6 @@ export function formatElementList( }) i++ } - // 前文本 - if (preText) { - const preTextStrList = splitText(preText) - for (let p = 0; p < preTextStrList.length; p++) { - const value = preTextStrList[p] - elementList.splice(i, 0, { - ...controlContext, - ...controlDefaultStyle, - controlId, - value, - type: el.type, - control: el.control, - controlComponent: ControlComponent.PRE_TEXT - }) - i++ - } - } // 值 if ( (value && value.length) || @@ -346,7 +369,7 @@ export function formatElementList( type === ControlType.RADIO || (type === ControlType.SELECT && code && (!value || !value.length)) ) { - let valueList: IElement[] = value ? deepClone(value) : [] + let valueList: IElement[] = value || [] if (type === ControlType.CHECKBOX) { const codeList = code ? code.split(',') : [] if (Array.isArray(valueSets) && valueSets.length) { @@ -499,23 +522,6 @@ export function formatElementList( i++ } } - // 后文本 - if (postText) { - const postTextStrList = splitText(postText) - for (let p = 0; p < postTextStrList.length; p++) { - const value = postTextStrList[p] - elementList.splice(i, 0, { - ...controlContext, - ...controlDefaultStyle, - controlId, - value, - type: el.type, - control: el.control, - controlComponent: ControlComponent.POST_TEXT - }) - i++ - } - } // 后缀 const postfixStrList = splitText(postfix || controlOption.postfix) for (let p = 0; p < postfixStrList.length; p++) { @@ -534,7 +540,7 @@ export function formatElementList( i-- } else if ( (!el.type || TEXTLIKE_ELEMENT_TYPE.includes(el.type)) && - el.value?.length > 1 + el.value.length > 1 ) { elementList.splice(i, 1) const valueList = splitText(el.value) @@ -546,15 +552,18 @@ export function formatElementList( if (el.value === '\n' || el.value == '\r\n') { el.value = ZERO } + if (el.value === '\t') { + el.type = ElementType.TAB + } if (el.type === ElementType.IMAGE || el.type === ElementType.BLOCK) { - el.id = el.id || getUUID() + el.id = getUUID() } if (el.type === ElementType.LATEX) { const { svg, width, height } = LaTexParticle.convertLaTextToSVG(el.value) el.width = el.width || width el.height = el.height || height el.laTexSVG = svg - el.id = el.id || getUUID() + el.id = getUUID() } i++ } @@ -566,11 +575,30 @@ export function isSameElementExceptValue( ): boolean { const sourceKeys = Object.keys(source) const targetKeys = Object.keys(target) - if (sourceKeys.length !== targetKeys.length) return false - for (let s = 0; s < sourceKeys.length; s++) { - const key = sourceKeys[s] as never + if ( + sourceKeys.length !== targetKeys.length && + !targetKeys.find(el => el === 'type') + ) + return false + if ( + targetKeys.find(el => el === 'type') && + target.type !== 'text' && + (sourceKeys.length !== targetKeys.length - 1 || + target.type === ElementType.SUPERSCRIPT) + ) + return false + const count = + sourceKeys.length > targetKeys.length + ? sourceKeys.length + : targetKeys.length + for (let s = 0; s < count; s++) { + // const key = sourceKeys[s] as never; + const key = (sourceKeys[s] ? sourceKeys[s] : targetKeys[s]) as never // 值不需要校验 if (key === 'value') continue + if (key === 'type') continue + if (key === 'bold') continue + if (key === 'listLevel') continue // groupIds数组需特殊校验数组是否相等 if ( key === 'groupIds' && @@ -586,9 +614,11 @@ export function isSameElementExceptValue( } return true } + interface IPickElementOption { extraPickAttrs?: Array } + export function pickElementAttr( payload: IElement, option: IPickElementOption = {} @@ -612,13 +642,13 @@ export function pickElementAttr( interface IZipElementListOption { extraPickAttrs?: Array - isClassifyArea?: boolean } + export function zipElementList( payload: IElement[], options: IZipElementListOption = {} ): IElement[] { - const { extraPickAttrs, isClassifyArea = false } = options + const { extraPickAttrs } = options const elementList = deepClone(payload) const zipElementListData: IElement[] = [] let e = 0 @@ -633,40 +663,79 @@ export function zipElementList( ) { e++ continue - } - // 优先处理虚拟元素,后表格、超链接、日期、控件特殊处理 - if (element.areaId && element.area) { - const areaId = element.areaId - const area = element.area - // 收集并压缩数据 - const valueList: IElement[] = [] - while (e < elementList.length) { - const areaE = elementList[e] - if (areaId !== areaE.areaId) { - e-- - break + } else if (element.type === ElementType.PARAGRAPH) { + zipElementListData.push(element) + e++ + continue + } else if ( + (element.titleId && !element.level) || + (element.listId && !element.listType) + ) { + const valueList = [] + let valueListItem = pickElementAttr(element, { extraPickAttrs }) + if ( + elementList[e + 1] && + elementList[e + 1]?.listId === element?.listId + ) { + valueListItem = pickElementAttr(elementList[e + 1], { + extraPickAttrs + }) + } + let combinedValueListItems = '' + while (elementList[e]) { + let zerosCount = 0 + while (e < elementList.length && elementList[e]) { + if (zerosCount <= 1) { + if ( + elementList[e].value === ZERO && + !(elementList[e].type === ElementType.TAB) + ) { + zerosCount += 1 + if (zerosCount === 2) { + e-- + break + } + combinedValueListItems += '\n' + } else if (elementList[e].type === ElementType.TAB) { + combinedValueListItems += '\t' + } else { + combinedValueListItems += elementList[e].value + } + e++ + } else { + break + } + } + + const valueListElement = { + ...valueListItem, + value: combinedValueListItems } - delete areaE.area - delete areaE.areaId - valueList.push(areaE) + + valueList.push(valueListElement) + + combinedValueListItems = '' e++ - } - const areaElementList = zipElementList(valueList, options) - // 不归类区域元素 - if (isClassifyArea) { - const areaElement: IElement = { - type: ElementType.AREA, - value: '', - areaId, - area + if (e < elementList.length) { + if ( + elementList[e + 1] && + elementList[e + 1]?.listId === element?.listId + ) { + valueListItem = pickElementAttr(elementList[e + 1], { + extraPickAttrs + }) + } else + valueListItem = pickElementAttr(elementList[e], { + extraPickAttrs + }) } - areaElement.valueList = areaElementList - element = areaElement - } else { - zipElementListData.splice(e, 0, ...areaElementList) - continue } - } else if (element.titleId && element.level) { + zipElementListData.push(...valueList) + + continue + } + // 优先处理虚拟元素,后表格、超链接、日期、控件特殊处理 + if (element.titleId && element.level) { // 标题处理 const titleId = element.titleId if (titleId) { @@ -674,14 +743,13 @@ export function zipElementList( const titleElement: IElement = { type: ElementType.TITLE, title: element.title, - titleId, value: '', level } const valueList: IElement[] = [] - while (e < elementList.length) { + while (e <= elementList.length) { const titleE = elementList[e] - if (titleId !== titleE.titleId) { + if (titleE === undefined || titleId !== titleE.titleId) { e-- break } @@ -693,18 +761,23 @@ export function zipElementList( titleElement.valueList = zipElementList(valueList, options) element = titleElement } + // Заголовки } else if (element.listId && element.listType) { // 列表处理 const listId = element.listId if (listId) { const listType = element.listType const listStyle = element.listStyle + const id = element.id || getUUID() + const listLevel = element.listLevel || 0 const listElement: IElement = { type: ElementType.LIST, value: '', + id, listId, listType, - listStyle + listStyle, + listLevel } const valueList: IElement[] = [] while (e < elementList.length) { @@ -748,10 +821,7 @@ export function zipElementList( const zipTd: ITd = { colspan: td.colspan, rowspan: td.rowspan, - value: zipElementList(td.value, { - ...options, - isClassifyArea: false - }) + value: zipElementList(td.value, options) } // 压缩单元格属性 TABLE_TD_ZIP_ATTR.forEach(attr => { @@ -764,7 +834,7 @@ export function zipElementList( } } } - } else if (element.type === ElementType.HYPERLINK) { + } else if (element.hyperlinkId && element.url) { // 超链接处理 const hyperlinkId = element.hyperlinkId if (hyperlinkId) { @@ -788,6 +858,18 @@ export function zipElementList( hyperlinkElement.valueList = zipElementList(valueList, options) element = hyperlinkElement } + } else if (element.hyperlinkId && !element.url) { + let value = '' + while (elementList[e]) { + value += elementList[e].value + e++ + } + // Copy properties and attributes, and check for different attributes to split into elements + const hyperLinkValueListElement = { + value + } + zipElementListData.push(hyperLinkValueListElement) + continue } else if (element.type === ElementType.DATE) { const dateId = element.dateId if (dateId) { @@ -812,90 +894,110 @@ export function zipElementList( element = dateElement } } else if (element.controlId) { + // 控件处理 const controlId = element.controlId - // 控件包含前后缀则转换为控件 - if (element.controlComponent === ControlComponent.PREFIX) { + if (controlId) { + // Update control default style based on prefix + const controlDefaultStyle = ( + (pickObject(element, CONTROL_STYLE_ATTR)) + ) + const control = { + ...element.control!, + ...controlDefaultStyle + } + const controlElement: IElement = { + ...pickObject(element, EDITOR_ROW_ATTR), + type: ElementType.CONTROL, + value: '', + control, + controlId + } const valueList: IElement[] = [] - let isFull = false - let start = e - while (start < elementList.length) { - const controlE = elementList[start] - if (controlId !== controlE.controlId) break + while (e < elementList.length) { + const controlE = elementList[e] + if (controlId !== controlE.controlId) { + e-- + break + } if (controlE.controlComponent === ControlComponent.VALUE) { delete controlE.control delete controlE.controlId valueList.push(controlE) } - if (controlE.controlComponent === ControlComponent.POSTFIX) { - isFull = true - } - start++ - } - if (isFull) { - // 以前缀为基准更新控件默认样式 - const controlDefaultStyle = ( - (pickObject(element, CONTROL_STYLE_ATTR)) - ) - const control = { - ...element.control!, - ...controlDefaultStyle - } - const controlElement: IElement = { - ...pickObject(element, EDITOR_ROW_ATTR), - type: ElementType.CONTROL, - value: '', - control, - controlId - } - controlElement.control!.value = zipElementList(valueList, options) - element = pickElementAttr(controlElement, { extraPickAttrs }) - // 控件元素数量 - 1(当前元素) - e += start - e - 1 - } - } - // 不完整的控件元素不转化为控件,如果不是文本则直接忽略 - if (element.controlComponent) { - delete element.control - delete element.controlId - if ( - element.controlComponent !== ControlComponent.VALUE && - element.controlComponent !== ControlComponent.PRE_TEXT && - element.controlComponent !== ControlComponent.POST_TEXT - ) { e++ - continue } + controlElement.control!.value = zipElementList(valueList, options) + element = pickElementAttr(controlElement, { extraPickAttrs }) } } - // 组合元素 - const pickElement = pickElementAttr(element, { extraPickAttrs }) - if ( - !element.type || - element.type === ElementType.TEXT || - element.type === ElementType.SUBSCRIPT || - element.type === ElementType.SUPERSCRIPT + let nextIndex = e + 1 + let id: string | undefined + + if (element.id) { + id = element.id + } else if ( + element.valueList && + elementList[e - element.valueList[0]?.value?.length]?.value === ZERO + ) { + id = getUUID() + } else if ( + e > 0 && + elementList[e - 1].value !== ZERO && + elementList[e - 1].type !== ElementType.TABLE && + element.type !== ElementType.SEPARATOR ) { - while (e < elementList.length) { - const nextElement = elementList[e + 1] + id = zipElementListData[zipElementListData.length - 1]?.id || getUUID() + } else { + id = getUUID() + } + + // Initialize object with current element attributes + const rItem = pickElementAttr(element, { extraPickAttrs }) + let combinedValue = '' + if (rItem.value !== '\n' && element.type !== ElementType.SEPARATOR) + combinedValue = rItem.value + + // Check if an element with the same id already exists + const existingElement = zipElementListData.find(el => el.id === id) + + // Combine consecutive elements with the same attributes + while (nextIndex < elementList.length) { + const nextElement = elementList[nextIndex] + const nextRItem = pickElementAttr(nextElement, { extraPickAttrs }) + // Check if attributes match except for the value + if ( + isSameElementExceptValue(rItem, nextRItem) && + nextRItem.value !== '\n' + ) { + combinedValue += nextRItem.value e++ - if ( - nextElement && - isSameElementExceptValue( - pickElement, - pickElementAttr(nextElement, { extraPickAttrs }) - ) - ) { - const nextValue = - nextElement.value === ZERO ? '\n' : nextElement.value - pickElement.value += nextValue - } else { - break - } + } else { + break } + + nextIndex++ + } + + rItem.value = combinedValue + + if (existingElement) { + delete rItem.rowFlex + existingElement.r?.push(rItem) } else { - e++ + delete rItem.rowFlex + const newElement = { + type: ElementType.PARAGRAPH, + id, + r: rItem.value === '' && !rItem.type ? [rItem] : [rItem], + v: [] as string[], + value: '', + spacing: element.spacing, + rowFlex: element.rowFlex + } + + zipElementListData.push(newElement) } - zipElementListData.push(pickElement) + e++ } return zipElementListData } @@ -951,12 +1053,11 @@ export function getAnchorElement( const anchorElement = elementList[anchorIndex] if (!anchorElement) return null const anchorNextElement = elementList[anchorIndex + 1] - // 非列表元素 && 当前元素是换行符 && 下一个元素不是换行符 && 区域相同 => 则以下一个元素作为参考元素 + // 非列表元素 && 当前元素是换行符 && 下一个元素不是换行符 则以下一个元素作为参考元素 return !anchorElement.listId && anchorElement.value === ZERO && anchorNextElement && - anchorNextElement.value !== ZERO && - anchorElement.areaId === anchorNextElement.areaId + anchorNextElement.value !== ZERO ? anchorNextElement : anchorElement } @@ -997,15 +1098,13 @@ export function formatElementContext( isBreakWarped || (!copyElement.listId && targetElement.type === ElementType.LIST) ) { - const cloneAttr = [ - ...TABLE_CONTEXT_ATTR, - ...EDITOR_ROW_ATTR, - ...AREA_CONTEXT_ATTR - ] + const cloneAttr = [...TABLE_CONTEXT_ATTR, ...EDITOR_ROW_ATTR] cloneProperty(cloneAttr, copyElement!, targetElement) targetElement.valueList?.forEach(valueItem => { cloneProperty(cloneAttr, copyElement!, valueItem) }) + if (targetElement.value === ZERO && !targetElement.id) + targetElement.id = getUUID() continue } if (targetElement.valueList?.length) { @@ -1015,13 +1114,28 @@ export function formatElementContext( anchorIndex, options ) + } else if (targetElement.r?.length) { + formatElementContext( + sourceElementList, + targetElement.r, + anchorIndex, + options + ) } // 非块类元素,需处理行属性 const cloneAttr = [...EDITOR_ELEMENT_CONTEXT_ATTR] if (!getIsBlockElement(targetElement)) { cloneAttr.push(...EDITOR_ROW_ATTR) } - cloneProperty(cloneAttr, copyElement, targetElement) + if (copyElement.listId) + cloneProperty(cloneAttr, copyElement, targetElement) + if (!targetElement.id) { + targetElement.id = copyElement.id || getUUID() + } + if (!(targetElement.type === ElementType.PARAGRAPH)) { + targetElement.spacing = copyElement.spacing + targetElement.rowFlex = copyElement.rowFlex + } } } @@ -1143,9 +1257,8 @@ export function groupElementListByRowFlex( export function createDomFromElementList( elementList: IElement[], - options?: IEditorOption + options: DeepRequired ) { - const editorOptions = mergeOption(options) function buildDom(payload: IElement[]): HTMLDivElement { const clipboardDom = document.createElement('div') for (let e = 0; e < payload.length; e++) { @@ -1251,37 +1364,6 @@ export function createDomFromElementList( img.height = element.height! } clipboardDom.append(img) - } else if (element.type === ElementType.BLOCK) { - if (element.block?.type === BlockType.VIDEO) { - const src = element.block.videoBlock?.src - if (src) { - const video = document.createElement('video') - video.style.display = 'block' - video.controls = true - video.src = src - video.width = element.width! || options?.width || window.innerWidth - video.height = element.height! - clipboardDom.append(video) - } - } else if (element.block?.type === BlockType.IFRAME) { - const { src, srcdoc } = element.block.iframeBlock || {} - if (src || srcdoc) { - const iframe = document.createElement('iframe') - iframe.sandbox.add(...IFrameBlock.sandbox) - iframe.style.display = 'block' - iframe.style.border = 'none' - if (src) { - iframe.src = src - } else if (srcdoc) { - iframe.srcdoc = srcdoc - } - iframe.width = `${ - element.width || options?.width || window.innerWidth - }` - iframe.height = `${element.height!}` - clipboardDom.append(iframe) - } - } } else if (element.type === ElementType.SEPARATOR) { const hr = document.createElement('hr') clipboardDom.append(hr) @@ -1320,7 +1402,7 @@ export function createDomFromElementList( text = element.value } if (!text) continue - const dom = convertElementToDom(element, editorOptions) + const dom = convertElementToDom(element, options) // 前一个元素是标题,移除首行换行符 if (payload[e - 1]?.type === ElementType.TITLE) { text = text.replace(/^\n/, '') @@ -1331,6 +1413,7 @@ export function createDomFromElementList( } return clipboardDom } + // 按行布局分类创建dom const clipboardDom = document.createElement('div') const groupElementList = groupElementListByRowFlex(elementList) @@ -1414,7 +1497,7 @@ export function convertTextNodeToElement( return element } -export interface IGetElementListByHTMLOption { +interface IGetElementListByHTMLOption { innerWidth: number } @@ -1423,6 +1506,7 @@ export function getElementListByHTML( options: IGetElementListByHTMLOption ): IElement[] { const elementList: IElement[] = [] + function findTextNode(dom: Element | Node) { if (dom.nodeType === 3) { const element = convertTextNodeToElement(dom) @@ -1516,39 +1600,6 @@ export function getElementListByHTML( type: ElementType.IMAGE }) } - } else if (node.nodeName === 'VIDEO') { - const { src, width, height } = node as HTMLVideoElement - if (src && width && height) { - elementList.push({ - value: '', - type: ElementType.BLOCK, - block: { - type: BlockType.VIDEO, - videoBlock: { - src - } - }, - width, - height - }) - } - } else if (node.nodeName === 'IFRAME') { - const { src, srcdoc, width, height } = node as HTMLIFrameElement - if ((src || srcdoc) && width && height) { - elementList.push({ - value: '', - type: ElementType.BLOCK, - block: { - type: BlockType.IFRAME, - iframeBlock: { - src, - srcdoc - } - }, - width: parseInt(width), - height: parseInt(height) - }) - } } else if (node.nodeName === 'TABLE') { const tableElement = node as HTMLTableElement const element: IElement = { @@ -1634,6 +1685,7 @@ export function getElementListByHTML( } } } + // 追加dom const clipboardDom = document.createElement('div') clipboardDom.innerHTML = htmlText @@ -1704,12 +1756,7 @@ export function getTextFromElementList(elementList: IElement[]) { ) { let textLike = '' if (element.type === ElementType.CONTROL) { - const controlValue = element.control!.value?.[0]?.value || '' - textLike = controlValue - ? `${element.control?.preText || ''}${controlValue}${ - element.control?.postText || '' - }` - : '' + textLike = element.control!.value?.[0]?.value || '' } else if (element.type === ElementType.DATE) { textLike = element.valueList?.map(v => v.value).join('') || '' } else { @@ -1720,6 +1767,7 @@ export function getTextFromElementList(elementList: IElement[]) { } return text } + return buildText(zipElementList(elementList)) } @@ -1774,29 +1822,8 @@ export function deleteSurroundElementList( } } -export function getNonHideElementIndex( - elementList: IElement[], - index: number, - position: LocationPosition = LocationPosition.BEFORE -) { - if (!elementList[index]?.control?.hide) return index - let i = index - if (position === LocationPosition.BEFORE) { - i = index - 1 - while (i > 0) { - if (!elementList[i]?.control?.hide) { - return i - } - i-- - } - } else { - i = index + 1 - while (i < elementList.length) { - if (!elementList[i]?.control?.hide) { - return i - } - i++ - } - } - return i +export function isParagraph( + element: IElement +): element is IElement & IParagraph { + return 'r' in element && Array.isArray((element as IParagraph).r) } diff --git a/src/editor/utils/index.ts b/src/editor/utils/index.ts index 6c6101332..11d3c2d08 100644 --- a/src/editor/utils/index.ts +++ b/src/editor/utils/index.ts @@ -56,9 +56,6 @@ export function deepCloneOmitKeys(obj: T, omitKeys: (keyof K)[]): T { } export function deepClone(obj: T): T { - if (typeof structuredClone === 'function') { - return structuredClone(obj) - } if (!obj || typeof obj !== 'object') { return obj } @@ -183,10 +180,6 @@ export function isArray(type: unknown): type is Array { return Array.isArray(type) } -export function isNumber(type: unknown): type is Array { - return Object.prototype.toString.call(type) === '[object Number]' -} - export function mergeObject(source: T, target: T): T { if (isObject(source) && isObject(target)) { const objectTarget = >target @@ -265,6 +258,9 @@ export function cloneProperty( ) { for (let i = 0; i < properties.length; i++) { const property = properties[i] + if (property === 'value') continue + if (property === 'type') continue + if (property === 'r') continue const value = sourceElement[property] if (value !== undefined) { targetElement[property] = value @@ -357,11 +353,3 @@ export function isRectIntersect( } return true } - -export function isNonValue(value: unknown): boolean { - return value === undefined || value === null -} - -export function normalizeLineBreak(text: string): string { - return text.replace(/\r\n|\r/g, '\n') -} diff --git a/src/editor/utils/option.ts b/src/editor/utils/option.ts index 6da471268..c4a14a51a 100644 --- a/src/editor/utils/option.ts +++ b/src/editor/utils/option.ts @@ -46,8 +46,6 @@ import { RenderMode, WordBreak } from '../dataset/enum/Editor' -import { defaultBadgeOption } from '../dataset/constant/Badge' -import { IBadgeOption } from '../interface/Badge' export function mergeOption( options: IEditorOption = {} @@ -128,10 +126,6 @@ export function mergeOption( ...defaultPageBorderOption, ...options.pageBorder } - const badgeOptions: Required = { - ...defaultBadgeOption, - ...options.badge - } return { mode: EditorMode.EDIT, @@ -193,7 +187,6 @@ export function mergeOption( lineBreak: lineBreakOptions, separator: separatorOptions, lineNumber: lineNumberOptions, - pageBorder: pageBorderOptions, - badge: badgeOptions + pageBorder: pageBorderOptions } } diff --git a/src/editor/utils/print.ts b/src/editor/utils/print.ts index 7a9ef04e1..19709b8f5 100644 --- a/src/editor/utils/print.ts +++ b/src/editor/utils/print.ts @@ -77,8 +77,8 @@ export function printImageBase64( @page { margin: 0; size: ${paperSize.size} ${ - direction === PaperDirection.HORIZONTAL ? `landscape` : `portrait` - }; + direction === PaperDirection.HORIZONTAL ? `landscape` : `portrait` + }; }` style.append(document.createTextNode(stylesheet)) setTimeout(() => { diff --git a/src/editor/utils/ua.ts b/src/editor/utils/ua.ts index 7ca658963..f00193be0 100644 --- a/src/editor/utils/ua.ts +++ b/src/editor/utils/ua.ts @@ -3,8 +3,3 @@ export const isApple = export const isIOS = typeof navigator !== 'undefined' && /iPad|iPhone/.test(navigator.userAgent) - -export const isMobile = - /Mobile|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent - ) diff --git a/src/main.ts b/src/main.ts index 83faaae2f..6f5cfc0ae 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,6 @@ import prism from 'prismjs' import Editor, { BlockType, Command, - ControlState, ControlType, EditorMode, EditorZone, @@ -46,26 +45,16 @@ window.onload = function () { value: '\n门诊病历', size: 18, rowFlex: RowFlex.CENTER - }, - { - value: '\n', - type: ElementType.SEPARATOR } ], main: data, - footer: [ - { - value: 'canvas-editor', - size: 12 - } - ] + footer: [] }, options ) - console.log('实例: ', instance) + ;`实例: ${instance}` // cypress使用 Reflect.set(window, 'editor', instance) - // 菜单弹窗销毁 window.addEventListener( 'click', @@ -78,19 +67,18 @@ window.onload = function () { capture: true } ) - // 2. | 撤销 | 重做 | 格式刷 | 清除格式 | const undoDom = document.querySelector('.menu-item__undo')! undoDom.title = `撤销(${isApple ? '⌘' : 'Ctrl'}+Z)` undoDom.onclick = function () { - console.log('undo') + ('undo') instance.command.executeUndo() } const redoDom = document.querySelector('.menu-item__redo')! redoDom.title = `重做(${isApple ? '⌘' : 'Ctrl'}+Y)` redoDom.onclick = function () { - console.log('redo') + ('redo') instance.command.executeRedo() } @@ -104,7 +92,7 @@ window.onload = function () { if (isFirstClick) { isFirstClick = false painterTimeout = window.setTimeout(() => { - console.log('painter-click') + ('painter-click') isFirstClick = true instance.command.executePainter({ isDblclick: false @@ -116,7 +104,7 @@ window.onload = function () { } painterDom.ondblclick = function () { - console.log('painter-dblclick') + ('painter-dblclick') isFirstClick = true window.clearTimeout(painterTimeout) instance.command.executePainter({ @@ -126,7 +114,7 @@ window.onload = function () { document.querySelector('.menu-item__format')!.onclick = function () { - console.log('format') + ('format') instance.command.executeFormat() } @@ -135,7 +123,7 @@ window.onload = function () { const fontSelectDom = fontDom.querySelector('.select')! const fontOptionDom = fontDom.querySelector('.options')! fontDom.onclick = function () { - console.log('font') + ('font') fontOptionDom.classList.toggle('visible') } fontOptionDom.onclick = function (evt) { @@ -148,7 +136,7 @@ window.onload = function () { const sizeOptionDom = sizeSetDom.querySelector('.options')! sizeSetDom.title = `设置字号` sizeSetDom.onclick = function () { - console.log('size') + ('size') sizeOptionDom.classList.toggle('visible') } sizeOptionDom.onclick = function (evt) { @@ -161,7 +149,7 @@ window.onload = function () { )! sizeAddDom.title = `增大字号(${isApple ? '⌘' : 'Ctrl'}+[)` sizeAddDom.onclick = function () { - console.log('size-add') + ('size-add') instance.command.executeSizeAdd() } @@ -170,14 +158,14 @@ window.onload = function () { )! sizeMinusDom.title = `减小字号(${isApple ? '⌘' : 'Ctrl'}+])` sizeMinusDom.onclick = function () { - console.log('size-minus') + ('size-minus') instance.command.executeSizeMinus() } const boldDom = document.querySelector('.menu-item__bold')! boldDom.title = `加粗(${isApple ? '⌘' : 'Ctrl'}+B)` boldDom.onclick = function () { - console.log('bold') + ('bold') instance.command.executeBold() } @@ -185,7 +173,7 @@ window.onload = function () { document.querySelector('.menu-item__italic')! italicDom.title = `斜体(${isApple ? '⌘' : 'Ctrl'}+I)` italicDom.onclick = function () { - console.log('italic') + ('italic') instance.command.executeItalic() } @@ -200,7 +188,7 @@ window.onload = function () { underlineOptionDom.classList.toggle('visible') } underlineDom.querySelector('i')!.onclick = function () { - console.log('underline') + ('underline') instance.command.executeUnderline() underlineOptionDom.classList.remove('visible') } @@ -219,7 +207,7 @@ window.onload = function () { '.menu-item__strikeout' )! strikeoutDom.onclick = function () { - console.log('strikeout') + ('strikeout') instance.command.executeStrikeout() } @@ -228,7 +216,7 @@ window.onload = function () { )! superscriptDom.title = `上标(${isApple ? '⌘' : 'Ctrl'}+Shift+,)` superscriptDom.onclick = function () { - console.log('superscript') + ('superscript') instance.command.executeSuperscript() } @@ -237,7 +225,7 @@ window.onload = function () { )! subscriptDom.title = `下标(${isApple ? '⌘' : 'Ctrl'}+Shift+.)` subscriptDom.onclick = function () { - console.log('subscript') + ('subscript') instance.command.executeSubscript() } @@ -248,7 +236,7 @@ window.onload = function () { const colorDom = document.querySelector('.menu-item__color')! const colorSpanDom = colorDom.querySelector('span')! colorDom.onclick = function () { - console.log('color') + ('color') colorControlDom.click() } @@ -262,7 +250,7 @@ window.onload = function () { )! const highlightSpanDom = highlightDom.querySelector('span')! highlightDom.onclick = function () { - console.log('highlight') + ('highlight') highlightControlDom?.click() } @@ -274,7 +262,7 @@ window.onload = function () { }) titleDom.onclick = function () { - console.log('title') + ('title') titleOptionDom.classList.toggle('visible') } titleOptionDom.onclick = function (evt) { @@ -286,7 +274,7 @@ window.onload = function () { const leftDom = document.querySelector('.menu-item__left')! leftDom.title = `左对齐(${isApple ? '⌘' : 'Ctrl'}+L)` leftDom.onclick = function () { - console.log('left') + ('left') instance.command.executeRowFlex(RowFlex.LEFT) } @@ -294,23 +282,32 @@ window.onload = function () { document.querySelector('.menu-item__center')! centerDom.title = `居中对齐(${isApple ? '⌘' : 'Ctrl'}+E)` centerDom.onclick = function () { - console.log('center') + ('center') instance.command.executeRowFlex(RowFlex.CENTER) } const rightDom = document.querySelector('.menu-item__right')! rightDom.title = `右对齐(${isApple ? '⌘' : 'Ctrl'}+R)` rightDom.onclick = function () { - console.log('right') + ('right') instance.command.executeRowFlex(RowFlex.RIGHT) } + const footnoteDom = document.querySelector( + '.menu-item__footnote' + )! + footnoteDom.title = `Сноска(${isApple ? '⌘' : 'Ctrl'}+N)` + footnoteDom.onclick = function () { + ('footnote') + instance.command.executeFootnote() + } + const alignmentDom = document.querySelector( '.menu-item__alignment' )! alignmentDom.title = `两端对齐(${isApple ? '⌘' : 'Ctrl'}+J)` alignmentDom.onclick = function () { - console.log('alignment') + ('alignment') instance.command.executeRowFlex(RowFlex.ALIGNMENT) } @@ -319,7 +316,7 @@ window.onload = function () { )! justifyDom.title = `分散对齐(${isApple ? '⌘' : 'Ctrl'}+Shift+J)` justifyDom.onclick = function () { - console.log('justify') + ('justify') instance.command.executeRowFlex(RowFlex.JUSTIFY) } @@ -328,7 +325,7 @@ window.onload = function () { )! const rowOptionDom = rowMarginDom.querySelector('.options')! rowMarginDom.onclick = function () { - console.log('row-margin') + ('row-margin') rowOptionDom.classList.toggle('visible') } rowOptionDom.onclick = function (evt) { @@ -340,7 +337,7 @@ window.onload = function () { listDom.title = `列表(${isApple ? '⌘' : 'Ctrl'}+Shift+U)` const listOptionDom = listDom.querySelector('.options')! listDom.onclick = function () { - console.log('list') + ('list') listOptionDom.classList.toggle('visible') } listOptionDom.onclick = function (evt) { @@ -396,7 +393,7 @@ window.onload = function () { tablePanelContainer.style.display = 'none' } tableDom.onclick = function () { - console.log('table') + ('table') tablePanelContainer!.style.display = 'block' } tablePanel.onmousemove = function (evt) { @@ -457,7 +454,7 @@ window.onload = function () { '.menu-item__hyperlink' )! hyperlinkDom.onclick = function () { - console.log('hyperlink') + ('hyperlink') new Dialog({ title: '超链接', data: [ @@ -501,7 +498,7 @@ window.onload = function () { const separatorOptionDom = separatorDom.querySelector('.options')! separatorDom.onclick = function () { - console.log('separator') + ('separator') separatorOptionDom.classList.toggle('visible') } separatorOptionDom.onmousedown = function (evt) { @@ -521,7 +518,7 @@ window.onload = function () { '.menu-item__page-break' )! pageBreakDom.onclick = function () { - console.log('pageBreak') + ('pageBreak') instance.command.executePageBreak() } @@ -531,7 +528,7 @@ window.onload = function () { const watermarkOptionDom = watermarkDom.querySelector('.options')! watermarkDom.onclick = function () { - console.log('watermark') + ('watermark') watermarkOptionDom.classList.toggle('visible') } watermarkOptionDom.onmousedown = function (evt) { @@ -562,67 +559,22 @@ window.onload = function () { name: 'size', required: true, value: '120' - }, - { - type: 'number', - label: '透明度', - name: 'opacity', - required: true, - value: '0.3' - }, - { - type: 'select', - label: '重复', - name: 'repeat', - value: '0', - required: false, - options: [ - { - label: '不重复', - value: '0' - }, - { - label: '重复', - value: '1' - } - ] - }, - { - type: 'number', - label: '水平间隔', - name: 'horizontalGap', - required: false, - value: '10' - }, - { - type: 'number', - label: '垂直间隔', - name: 'verticalGap', - required: false, - value: '10' } ], onConfirm: payload => { const nullableIndex = payload.findIndex(p => !p.value) if (~nullableIndex) return - const watermark = payload.reduce((pre, cur) => { - pre[cur.name] = cur.value - return pre - }, {}) - const repeat = watermark.repeat === '1' + const watermark = payload.reduce( + (pre, cur) => { + pre[cur.name] = cur.value + return pre + }, + {} + ) instance.command.executeAddWatermark({ data: watermark.data, color: watermark.color, - size: Number(watermark.size), - opacity: Number(watermark.opacity), - repeat, - gap: - repeat && watermark.horizontalGap && watermark.verticalGap - ? [ - Number(watermark.horizontalGap), - Number(watermark.verticalGap) - ] - : undefined + size: Number(watermark.size) }) } }) @@ -635,7 +587,7 @@ window.onload = function () { '.menu-item__codeblock' )! codeblockDom.onclick = function () { - console.log('codeblock') + ('codeblock') new Dialog({ title: '代码块', data: [ @@ -686,7 +638,7 @@ window.onload = function () { )! const controlOptionDom = controlDom.querySelector('.options')! controlDom.onclick = function () { - console.log('control') + ('control') controlOptionDom.classList.toggle('visible') } controlOptionDom.onmousedown = function (evt) { @@ -718,21 +670,23 @@ window.onload = function () { )?.value if (!placeholder) return const value = payload.find(p => p.name === 'value')?.value || '' - instance.command.executeInsertControl({ - type: ElementType.CONTROL, - value: '', - control: { - type, - value: value - ? [ - { - value - } - ] - : null, - placeholder + instance.command.executeInsertElementList([ + { + type: ElementType.CONTROL, + value: '', + control: { + type, + value: value + ? [ + { + value + } + ] + : null, + placeholder + } } - }) + ]) } }) break @@ -770,17 +724,19 @@ window.onload = function () { const valueSets = payload.find(p => p.name === 'valueSets')?.value if (!valueSets) return const code = payload.find(p => p.name === 'code')?.value - instance.command.executeInsertControl({ - type: ElementType.CONTROL, - value: '', - control: { - type, - code, - value: null, - placeholder, - valueSets: JSON.parse(valueSets) + instance.command.executeInsertElementList([ + { + type: ElementType.CONTROL, + value: '', + control: { + type, + code, + value: null, + placeholder, + valueSets: JSON.parse(valueSets) + } } - }) + ]) } }) break @@ -807,16 +763,18 @@ window.onload = function () { const valueSets = payload.find(p => p.name === 'valueSets')?.value if (!valueSets) return const code = payload.find(p => p.name === 'code')?.value - instance.command.executeInsertControl({ - type: ElementType.CONTROL, - value: '', - control: { - type, - code, - value: null, - valueSets: JSON.parse(valueSets) + instance.command.executeInsertElementList([ + { + type: ElementType.CONTROL, + value: '', + control: { + type, + code, + value: null, + valueSets: JSON.parse(valueSets) + } } - }) + ]) } }) break @@ -843,16 +801,18 @@ window.onload = function () { const valueSets = payload.find(p => p.name === 'valueSets')?.value if (!valueSets) return const code = payload.find(p => p.name === 'code')?.value - instance.command.executeInsertControl({ - type: ElementType.CONTROL, - value: '', - control: { - type, - code, - value: null, - valueSets: JSON.parse(valueSets) + instance.command.executeInsertElementList([ + { + type: ElementType.CONTROL, + value: '', + control: { + type, + code, + value: null, + valueSets: JSON.parse(valueSets) + } } - }) + ]) } }) break @@ -899,64 +859,24 @@ window.onload = function () { const value = payload.find(p => p.name === 'value')?.value || '' const dateFormat = payload.find(p => p.name === 'dateFormat')?.value || '' - instance.command.executeInsertControl({ - type: ElementType.CONTROL, - value: '', - control: { - type, - dateFormat, - value: value - ? [ - { - value - } - ] - : null, - placeholder - } - }) - } - }) - break - case ControlType.NUMBER: - new Dialog({ - title: '数值控件', - data: [ - { - type: 'text', - label: '占位符', - name: 'placeholder', - required: true, - placeholder: '请输入占位符' - }, - { - type: 'text', - label: '默认值', - name: 'value', - placeholder: '请输入默认值' - } - ], - onConfirm: payload => { - const placeholder = payload.find( - p => p.name === 'placeholder' - )?.value - if (!placeholder) return - const value = payload.find(p => p.name === 'value')?.value || '' - instance.command.executeInsertControl({ - type: ElementType.CONTROL, - value: '', - control: { - type, - value: value - ? [ - { - value - } - ] - : null, - placeholder + instance.command.executeInsertElementList([ + { + type: ElementType.CONTROL, + value: '', + control: { + type, + dateFormat, + value: value + ? [ + { + value + } + ] + : null, + placeholder + } } - }) + ]) } }) break @@ -969,7 +889,7 @@ window.onload = function () { '.menu-item__checkbox' )! checkboxDom.onclick = function () { - console.log('checkbox') + ('checkbox') instance.command.executeInsertElementList([ { type: ElementType.CHECKBOX, @@ -983,7 +903,7 @@ window.onload = function () { const radioDom = document.querySelector('.menu-item__radio')! radioDom.onclick = function () { - console.log('radio') + ('radio') instance.command.executeInsertElementList([ { type: ElementType.RADIO, @@ -997,7 +917,7 @@ window.onload = function () { const latexDom = document.querySelector('.menu-item__latex')! latexDom.onclick = function () { - console.log('LaTeX') + ('LaTeX') new Dialog({ title: 'LaTeX', data: [ @@ -1024,7 +944,7 @@ window.onload = function () { const dateDom = document.querySelector('.menu-item__date')! const dateDomOptionDom = dateDom.querySelector('.options')! dateDom.onclick = function () { - console.log('date') + ('date') dateDomOptionDom.classList.toggle('visible') // 定位调整 const bodyRect = document.body.getBoundingClientRect() @@ -1071,7 +991,7 @@ window.onload = function () { const blockDom = document.querySelector('.menu-item__block')! blockDom.onclick = function () { - console.log('block') + ('block') new Dialog({ title: '内容块', data: [ @@ -1184,7 +1104,7 @@ window.onload = function () { } } searchDom.onclick = function () { - console.log('search') + ('search') searchCollapseDom.style.display = 'block' const bodyRect = document.body.getBoundingClientRect() const searchRect = searchDom.getBoundingClientRect() @@ -1237,7 +1157,7 @@ window.onload = function () { const printDom = document.querySelector('.menu-item__print')! printDom.title = `打印(${isApple ? '⌘' : 'Ctrl'}+P)` printDom.onclick = function () { - console.log('print') + ('print') instance.command.executePrint() } @@ -1335,19 +1255,19 @@ window.onload = function () { document.querySelector('.page-scale-percentage')!.onclick = function () { - console.log('page-scale-recovery') + ('page-scale-recovery') instance.command.executePageScaleRecovery() } document.querySelector('.page-scale-minus')!.onclick = function () { - console.log('page-scale-minus') + ('page-scale-minus') instance.command.executePageScaleMinus() } document.querySelector('.page-scale-add')!.onclick = function () { - console.log('page-scale-add') + ('page-scale-add') instance.command.executePageScaleAdd() } @@ -1463,7 +1383,7 @@ window.onload = function () { fullscreenDom.classList.toggle('exist') }) function toggleFullscreen() { - console.log('fullscreen') + ('fullscreen') if (!document.fullscreenElement) { document.documentElement.requestFullscreen() } else { @@ -1749,9 +1669,8 @@ window.onload = function () { } instance.listener.pageSizeChange = function (payload) { - document.querySelector( - '.page-size' - )!.innerText = `${payload}` + document.querySelector('.page-size')!.innerText = + `${payload}` } instance.listener.intersectionPageNoChange = function (payload) { @@ -1779,7 +1698,7 @@ window.onload = function () { const menuDom = document.querySelector( `.menu-item__${menu}` )! - payload.state === ControlState.ACTIVE + payload ? menuDom.classList.add('disable') : menuDom.classList.remove('disable') }) @@ -1815,8 +1734,9 @@ window.onload = function () { instance.listener.contentChange = debounce(handleContentChange, 200) handleContentChange() - instance.listener.saved = function (payload) { - console.log('elementList: ', payload) + instance.listener.saved = function () { + instance.command.getValue() + // ('elementList: ', payload); } // 9. 右键菜单注册 diff --git a/src/mock.ts b/src/mock.ts index c74a257aa..aa9267d95 100644 --- a/src/mock.ts +++ b/src/mock.ts @@ -1,471 +1,70 @@ -import { - ControlType, - ElementType, - IEditorOption, - IElement, - ListType, - TitleLevel -} from './editor' - -const text = `主诉:\n发热三天,咳嗽五天。\n现病史:\n患者于三天前无明显诱因,感冒后发现面部水肿,无皮疹,尿量减少,出现乏力,在外治疗无好转,现来我院就诊。\n既往史:\n有糖尿病10年,有高血压2年,有传染性疾病1年。报告其他既往疾病。\n流行病史:\n否认14天内接触过确诊患者、疑似患者、无症状感染者及其密切接触者;否认14天内去过以下场所:水产、肉类批发市场,农贸市场,集市,大型超市,夜市;否认14天内与以下场所工作人员密切接触:水产、肉类批发市场,农贸市场,集市,大型超市;否认14天内周围(如家庭、办公室)有2例以上聚集性发病;否认14天内接触过有发热或呼吸道症状的人员;否认14天内自身有发热或呼吸道症状;否认14天内接触过纳入隔离观察的人员及其他可能与新冠肺炎关联的情形;陪同家属无以上情况。\n体格检查:\nT:39.5℃,P:80bpm,R:20次/分,BP:120/80mmHg;\n辅助检查:\n2020年6月10日,普放:血细胞比容36.50%(偏低)40~50;单核细胞绝对值0.75*10/L(偏高)参考值:0.1~0.6;\n门诊诊断:处置治疗:电子签名:【】\n其他记录:` - -// 模拟标题 -const titleText = [ - '主诉:', - '现病史:', - '既往史:', - '流行病史:', - '体格检查:', - '辅助检查:', - '门诊诊断:', - '处置治疗:', - '电子签名:', - '其他记录:' -] -const titleMap: Map = new Map() -for (let t = 0; t < titleText.length; t++) { - const value = titleText[t] - const i = text.indexOf(value) - if (~i) { - titleMap.set(i, value) - } -} +import { ElementType, IEditorOption, IElement } from './editor' // 模拟颜色字 -const colorText = ['传染性疾病'] -const colorIndex: number[] = colorText - .map(b => { - const i = text.indexOf(b) - return ~i - ? Array(b.length) - .fill(i) - .map((_, j) => i + j) - : [] - }) - .flat() // 模拟高亮字 -const highlightText = ['血细胞比容'] -const highlightIndex: number[] = highlightText - .map(b => { - const i = text.indexOf(b) - return ~i - ? Array(b.length) - .fill(i) - .map((_, j) => i + j) - : [] - }) - .flat() const elementList: IElement[] = [] -// 组合纯文本数据 -const textList = text.split('') -let index = 0 -while (index < textList.length) { - const value = textList[index] - const title = titleMap.get(index) - if (title) { - elementList.push({ - value: '', - type: ElementType.TITLE, - level: TitleLevel.FIRST, - valueList: [ - { - value: title, - size: 18 - } - ] - }) - index += title.length - 1 - } else if (colorIndex.includes(index)) { - elementList.push({ - value, - color: '#FF0000', - size: 16 - }) - } else if (highlightIndex.includes(index)) { - elementList.push({ - value, - highlight: '#F2F27F', - groupIds: ['1'] // 模拟批注 - }) - } else { - elementList.push({ - value, - size: 16 - }) - } - index++ -} - -// 模拟文本控件 -elementList.splice(12, 0, { - type: ElementType.CONTROL, - value: '', - control: { - conceptId: '1', - type: ControlType.TEXT, - value: null, - placeholder: '其他补充', - prefix: '{', - postfix: '}' - } -}) -// 模拟下拉控件 -elementList.splice(94, 0, { - type: ElementType.CONTROL, - value: '', - control: { - conceptId: '2', - type: ControlType.SELECT, - value: null, - code: null, - placeholder: '有无', - prefix: '{', - postfix: '}', - valueSets: [ - { - value: '有', - code: '98175' - }, - { - value: '无', - code: '98176' - }, - { - value: '不详', - code: '98177' - } - ] - } -}) +// elementList.push({ +// type: ElementType.TABLE, +// value: '', +// height: 42, +// width: 554, +// colgroup: [ +// { width: 138.5 }, +// { width: 138.5 }, +// { width: 138.5 }, +// { width: 138.5 } +// ], +// trList: [ +// { +// height: 42, +// minHeight: 42, +// tdList: [ +// { colspan: 1, rowspan: 1, value: [{ value: '1' }] }, +// { colspan: 1, rowspan: 1, value: [{ value: '2' }] }, +// { colspan: 1, rowspan: 1, value: [{ value: '3' }] }, +// { colspan: 1, rowspan: 1, value: [{ value: '4' }] } +// ] +// } +// ] +// }) -// 模拟超链接 -elementList.splice(116, 0, { - type: ElementType.HYPERLINK, - value: '', - valueList: [ - { - value: '新', - size: 16 - }, - { - value: '冠', - size: 16 - }, - { - value: '肺', - size: 16 - }, - { - value: '炎', - size: 16 - } - ], - url: 'https://hufe.club/canvas-editor' -}) - -// 模拟文本控件(前后文本) -elementList.splice(335, 0, { - type: ElementType.CONTROL, - value: '', - control: { - conceptId: '6', - type: ControlType.TEXT, - value: null, - placeholder: '内容', - preText: '其他:', - postText: '。' - } -}) - -// 模拟下标 -elementList.splice(346, 0, { - value: '∆', - color: '#FF0000', - type: ElementType.SUBSCRIPT -}) - -// 模拟上标 -elementList.splice(430, 0, { - value: '9', - type: ElementType.SUPERSCRIPT -}) - -// 模拟列表 -elementList.splice(451, 0, { - value: '', - type: ElementType.LIST, - listType: ListType.OL, - valueList: [ - { - value: '高血压\n糖尿病\n病毒性感冒\n过敏性鼻炎\n过敏性鼻息肉' - } - ] -}) - -elementList.splice(453, 0, { +elementList.push({ + type: ElementType.PARAGRAPH, value: '', - type: ElementType.LIST, - listType: ListType.OL, - valueList: [ + id: 'para1', + r: [ + // { + // value: 'This is the first part of the paragraph.', + // size: 16, + // id: '1' + // }, + // { value: 'And this is the second part.', size: 16, bold: true, id: '1' }, { value: - '超声引导下甲状腺细针穿刺术;\n乙型肝炎表面抗体测定;\n膜式病变细胞采集术、后颈皮下肤层;' + 'computePageRowPositioncomputePageRowPositioncomputePageRowPosition', + size: 18, + id: '1' } ] }) - -// 模拟图片 -elementList.splice(456, 0, { - value: `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAAA+CAYAAACLDZH2AAAMPmlDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWnltSIbTQpYTeBJEaQEoILYD0ItgISYBQYgwEFTuyqODaxQI2dFVEsQNiR+wsir0viKgo62LBrrxJAV33le/N982d//5z5j9nzp259w4A6ie5YnEuqgFAnqhAEhcayBiTksogPQUEYAr0ABloc3n5YlZMTCSAZbD9e3l3EyCy9pqjTOuf/f+1aPIF+TwAkBiI0/n5vDyIDwKAV/HEkgIAiDLeYkqBWIZhBdoSGCDEC2Q4U4GrZDhdgffKbRLi2BC3AEBW5XIlmQCoXYE8o5CXCTXU+iB2FvGFIgDUGRD75eVN4kOcBrEttBFDLNNnpv+gk/k3zfQhTS43cwgr5iIv5CBhvjiXO+3/TMf/Lnm50kEf1rCqZknC4mRzhnm7nTMpQoZVIe4VpUdFQ6wF8QchX24PMUrNkoYlKuxRI14+G+YM6ELszOcGRUBsBHGIKDcqUsmnZwhDOBDDFYJOFRZwEiDWh3iBID84XmmzSTIpTukLrc+QsFlK/jxXIvcr8/VQmpPIUuq/zhJwlPqYWlFWQjLEVIgtC4VJURCrQeyUnxMfobQZVZTFjhq0kUjjZPFbQhwnEIUGKvSxwgxJSJzSviwvf3C+2KYsISdKifcXZCWEKfKDtfC48vjhXLArAhErcVBHkD8mcnAufEFQsGLu2DOBKDFeqfNBXBAYpxiLU8W5MUp73FyQGyrjzSF2yy+MV47FkwrgglTo4xnigpgERZx4UTY3PEYRD74URAI2CAIMIIU1HUwC2UDY1tvQC+8UPSGACyQgEwiAo5IZHJEs7xHBazwoAn9CJAD5Q+MC5b0CUAj5r0Os4uoIMuS9hfIROeAJxHkgAuTCe6l8lGjIWxJ4DBnhP7xzYeXBeHNhlfX/e36Q/c6wIBOpZKSDHhnqg5bEYGIQMYwYQrTDDXE/3AePhNcAWF1wJu41OI/v9oQnhHbCI8INQgfhzkRhseSnKEeDDqgfosxF+o+5wK2hpjseiPtCdaiM6+KGwBF3g35YuD/07A5ZtjJuWVYYP2n/bQY/PA2lHcWZglL0KAEU259HqtmruQ+pyHL9Y34UsaYP5Zs91POzf/YP2efDNuJnS2wBdgA7h53CLmBHsQbAwE5gjVgrdkyGh1bXY/nqGvQWJ48nB+oI/+Fv8MnKMpnvXOvc4/xF0VcgmCp7RwP2JPE0iTAzq4DBgl8EAYMj4jkNZ7g4u7gCIPu+KF5fb2Ll3w1Et/U7N+8PAHxPDAwMHPnOhZ8AYJ8n3P6Hv3O2TPjpUAHg/GGeVFKo4HDZhQDfEupwpxkAE2ABbOF8XIAH8AEBIBiEg2iQAFLABBh9FlznEjAFzABzQSkoB0vBKrAObARbwA6wG+wHDeAoOAXOgkvgCrgB7sHV0w1egD7wDnxGEISE0BA6YoCYIlaIA+KCMBE/JBiJROKQFCQNyUREiBSZgcxDypHlyDpkM1KD7EMOI6eQC0g7cgfpRHqQ18gnFENVUW3UGLVGR6BMlIVGoAnoeDQTnYwWoSXoYnQNWo3uQuvRU+gl9Abagb5A+zGAqWC6mBnmiDExNhaNpWIZmASbhZVhFVg1Voc1wed8DevAerGPOBGn4wzcEa7gMDwR5+GT8Vn4InwdvgOvx1vwa3gn3od/I9AIRgQHgjeBQxhDyCRMIZQSKgjbCIcIZ+Be6ia8IxKJukQboifciynEbOJ04iLieuIe4kliO7GL2E8ikQxIDiRfUjSJSyoglZLWknaRTpCukrpJH8gqZFOyCzmEnEoWkYvJFeSd5OPkq+Sn5M8UDYoVxZsSTeFTplGWULZSmiiXKd2Uz1RNqg3Vl5pAzabOpa6h1lHPUO9T36ioqJireKnEqghV5qisUdmrcl6lU+WjqpaqvSpbdZyqVHWx6nbVk6p3VN/QaDRrWgAtlVZAW0yroZ2mPaR9UKOrOalx1Phqs9Uq1erVrqq9VKeoW6mz1CeoF6lXqB9Qv6zeq0HRsNZga3A1ZmlUahzWuKXRr0nXHKkZrZmnuUhzp+YFzWdaJC1rrWAtvlaJ1hat01pddIxuQWfTefR59K30M/RubaK2jTZHO1u7XHu3dpt2n46WjptOks5UnUqdYzodupiutS5HN1d3ie5+3Zu6n/SM9Vh6Ar2FenV6V/Xe6w/TD9AX6Jfp79G/of/JgGEQbJBjsMygweCBIW5obxhrOMVwg+EZw95h2sN8hvGGlQ3bP+yuEWpkbxRnNN1oi1GrUb+xiXGosdh4rfFp414TXZMAk2yTlSbHTXpM6aZ+pkLTlaYnTJ8zdBgsRi5jDaOF0WdmZBZmJjXbbNZm9tncxjzRvNh8j/kDC6oF0yLDYqVFs0WfpanlaMsZlrWWd60oVkyrLKvVVues3lvbWCdbz7dusH5mo2/DsSmyqbW5b0uz9bedbFtte92OaMe0y7Fbb3fFHrV3t8+yr7S/7IA6eDgIHdY7tA8nDPcaLhpePfyWo6ojy7HQsdax00nXKdKp2KnB6eUIyxGpI5aNODfim7O7c67zVud7I7VGho8sHtk08rWLvQvPpdLluivNNcR1tmuj6ys3BzeB2wa32+5099Hu892b3b96eHpIPOo8ejwtPdM8qzxvMbWZMcxFzPNeBK9Ar9leR70+ent4F3jv9/7Lx9Enx2enz7NRNqMEo7aO6vI19+X6bvbt8GP4pflt8uvwN/Pn+lf7PwqwCOAHbAt4yrJjZbN2sV4GOgdKAg8Fvmd7s2eyTwZhQaFBZUFtwVrBicHrgh+GmIdkhtSG9IW6h04PPRlGCIsIWxZ2i2PM4XFqOH3hnuEzw1siVCPiI9ZFPIq0j5RENo1GR4ePXjH6fpRVlCiqIRpEc6JXRD+IsYmZHHMklhgbE1sZ+yRuZNyMuHPx9PiJ8Tvj3yUEJixJuJdomyhNbE5STxqXVJP0PjkoeXlyx5gRY2aOuZRimCJMaUwlpSalbkvtHxs8dtXY7nHu40rH3RxvM37q+AsTDCfkTjg2UX0id+KBNEJactrOtC/caG41tz+dk16V3sdj81bzXvAD+Cv5PQJfwXLB0wzfjOUZzzJ9M1dk9mT5Z1Vk9QrZwnXCV9lh2Ruz3+dE52zPGchNzt2TR85Lyzss0hLliFommUyaOqld7CAuFXdM9p68anKfJEKyLR/JH5/fWKANf+RbpbbSX6SdhX6FlYUfpiRNOTBVc6poaus0+2kLpz0tCin6bTo+nTe9eYbZjLkzOmeyZm6ehcxKn9U822J2yezuOaFzdsylzs2Z+3uxc/Hy4rfzkuc1lRiXzCnp+iX0l9pStVJJ6a35PvM3LsAXCBe0LXRduHbhtzJ+2cVy5/KK8i+LeIsu/jry1zW/DizOWNy2xGPJhqXEpaKlN5f5L9uxXHN50fKuFaNX1K9krCxb+XbVxFUXKtwqNq6mrpau7lgTuaZxreXapWu/rMtad6MysHJPlVHVwqr36/nrr24I2FC30Xhj+cZPm4Sbbm8O3VxfbV1dsYW4pXDLk61JW8/9xvytZpvhtvJtX7eLtnfsiNvRUuNZU7PTaOeSWrRWWtuza9yuK7uDdjfWOdZt3qO7p3wv2Cvd+3xf2r6b+yP2Nx9gHqg7aHWw6hD9UFk9Uj+tvq8hq6GjMaWx/XD44eYmn6ZDR5yObD9qdrTymM6xJcepx0uOD5woOtF/Unyy91Tmqa7mic33To85fb0ltqXtTMSZ82dDzp4+xzp34rzv+aMXvC8cvsi82HDJ41J9q3vrod/dfz/U5tFWf9nzcuMVrytN7aPaj1/1v3rqWtC1s9c51y/diLrRfjPx5u1b42513ObffnYn986ru4V3P9+bc59wv+yBxoOKh0YPq/+w+2NPh0fHsc6gztZH8Y/udfG6XjzOf/ylu+QJ7UnFU9OnNc9cnh3tCem58nzs8+4X4hefe0v/1Pyz6qXty4N/BfzV2jemr/uV5NXA60VvDN5sf+v2trk/pv/hu7x3n9+XfTD4sOMj8+O5T8mfnn6e8oX0Zc1Xu69N3yK+3R/IGxgQcyVc+a8ABiuakQHA6+0A0FIAoMPzGXWs4vwnL4jizCpH4D9hxRlRXjwAqIP/77G98O/mFgB7t8LjF9RXHwdADA2ABC+AuroO1cGzmvxcKStEeA7YFP01PS8d/JuiOHP+EPfPLZCpuoGf238Bw1F8YKne048AAAA4ZVhJZk1NACoAAAAIAAGHaQAEAAAAAQAAABoAAAAAAAKgAgAEAAAAAQAAALCgAwAEAAAAAQAAAD4AAAAA/UM7vwAADO1JREFUeAHtXQXoFM8Xf3Z3N3Y3tlgYWKjYLYoioqiILQp2Y2KAiYig2N2J3YHd3d26//eZPzO/ufvenff9fndv9+67D+52dnd25s2bd7Mv5+IZDOSCS4EwpUD8MMXbRdulgKBA2DKw++JwORgUCEsGnjBhAsWPH5/69OnjzmIcp0DYMfD169dp1KhRYtrcVTiOcy8PP+wYeNy4cWrWunXrpsrehSNHjlCjRo1o//793rfc8wiiQLxwskLcvn2bChYsKMhfrFgxunr1qs+pwMpcpEgRunnzJtWpU4f27dvns557MfwpEFYrsL6aBlp9z507J5gX05MhQwb69u0b/fz5M/xnyx1BFAokjHLFwRcOHTqksIN48P79e7pz5w7dunVLfCAfX7lyhS5duqTqrV27li5evCgYesSIEQQF0IXIoUDYMPC7d+9oy5YtivJVqlShT58+qfNABYgSgM+fPweq5t4LQwo4loE/fPhAp0+fpqNHj9KuXbvoxIkTHuQNhnnz5ctH48ePp79//1KyZMmoXLlyHm24JxFAAShxToKZM2capUqVgns74IeVOKN3797GkiVLjLNnzxpv3rwRw2jatKl6btmyZU4amtGvXz8DeM+bN89ReIUzMuQ05HnVVAyoMzEmXp4PHTrUJ9os+6o6OXPmNFhx81nPjovfv39XuGEcEydOtAONiOvTcSLE+vXraefOnfT06VPKmjUrwVxWu3Ztevv2LeXNm5fnnvxaFGbMmCHu42v06NGUKFEidW534c+fPx4oQKHs2bMnZcyY0eO6exI9CjiOgUuXLk34eMOvX7/UJV/K2IMHD2jFihWiTubMmalz586qvhMLhQoVIm+mdiKeTsfJcQzsj2ApUqRQt3wpcLNnz1b3sfomTZpUnaPw+/dvevHihbAJp0+fnvAJJfC726O7bdu2UZYsWTyuuSfRp0BYeeLixYsnRgixQvfCsQKnXsWpUqWie/fu0fnz52nPnj3iCFvx3bt3PagD23GBAgU8rll5grcGcJPw48cPSpw4sTx1jzGkQNiswBgfGPfatWvi8/XrV0qePLkY9oIFC9TwsToHI1dCpg4lwJSng8u8OjViXg4rBq5Ro4ZgXgwXHjfEO0Dpmzp1akAKQN6sVKkSlS1bVsjXJUuWpEyZMgV8xuyb3gxsdvtxtb2wYuCKFSvSwoULxVxBSZMeNu/Jw6u6Xbt21KxZM6pZsyalTJnSu0rIz71l4JAjEKEdhhUDp02bVk2DN/Oy3Zc6dOhA7MigypUrU8KEzhqavgLrsrAakFuIEQWcNct+hoAwSgThLF++PEqNatWq0aBBgwTjOo1pdWR1kxnc2jGBZ8+eUZIkSUJuQYkJriF7xsmuGbYeGD169PDwYDFhxDmLEMaZM2cE+mwjNo4dO2awZu/Y4TDzqXGwnTpoPOHBW7dundGgQQP1PIeLBv18pFd0nCsZBGczmNGrVy81YZJp+dVrjBkzxnjy5InHvCC2AHUGDhzocd1JJ8BZjgPu8n8BK6nGkCFDDIxZPiePHOD0r8fjzH1HMTBHoBmc7xZlwrBiIWjny5cvPicGTC0nF6uxE+HRo0cKR7aK+ESRQ0YNBCCxDK/qynHh2LhxY/Gm8fmwQy5yTLaYK8SrTJs2zWCzpqWYOYKB2UsmJg6Mqk8YymBOdgIEJAJWXvnc/fv3A9a16ybeKhJHBCZJgIiwefNmo02bNuq+rCePrVu3FhF38hmnHLFYXLhwwVi8eLHBGTIGAqgkzvLYokULS9G1nYEPHjzoM3wSk8beM4/BYwXGSuYNrOApwnEyp/dtR5yzIqpwRLgo8ORtAXyKCJh8iA7sEjc4xsMR+AOJly9fGtu3bxeLCucaqvFIZvV1xDisBFsZeMCAAVGIgNWJc9+ijBm/9lq1aon6UIh0WLRokWpnzZo1+i3HlI8fP65w9DXR8hrGuHr1aoPz+GzDnU1+YqFgV7wxZ84co3v37oa/MFeJt68jJxAYGzZssHQctprR9HBH/qXSlClTRIihL3PYyJEjiVdrgr03Xbp0TK//QD+HZ44VJpEvlyZNGkJWBlzQhQsX/u8Bi0sIHGJRRuTmIatk9+7dhERTf4AxIbSyY8eOlD9/fn/VYnUdOPHbS9jHYcZDLAaCmxC2ig9o9vjxY7px4waxRSdafWHuKlSoIDydZcqUoeLFi1PRokWjBFRFq9FgK1v68/hH4zB7wfyF1xLHJvitDTMSj0d8oORIgIKA1cqf0iOfwRGvPDPNTxy6abAN2sAqA+UKVhNkg+ANovfrrwx5n+3XYvxsI5ZDMv0I+gJPf3hE9zpWYsjrkyZNMrZu3WpA58CKbRfYKkIEM2gQRyp3UBIgSkDT9WVmC2YyduzYEUy3AesgfSmYvvzVAUNZybQ68jFlXsiu+NFDQcaicerUKcstCjrewZZtFSF4gv8JCJtk5UHU69Spk3g1I4jHH/CEEcvEIlINEWdICmU5ToVTdu3aVbQRU28Y+oVbGAFC3u5sHSeILYjdwAfJpMBZusIhOmFvt1BA9erVA4oEePUDN2wYg/BSiFw4Yj+NcADHM/DevXsVHVu1akWbNm1S5yggaKd///6ENHsAQiwhgwGQglS+fHnq0qWLcDVDtsOPYdWqVULmFJVi8IVwzcuXL4s0f8i6CO3MlSuXmHz0mT17dkqQIIFHy7yiqHN+i6iy1QW44KtWrUqc+CrkXjAq9AEwKVK2wh6CXartqqe7UCFOcCC6wVFmBgzlkL8k4JXHkyHkPXlNP/LmJuq1D1nVDgB++EBudsEcCjh+Bb7H2RUAaOrIyMDKsXHjRnFN/4JIgGB2fHwB217FConMDGRr2AnsvLCz+4jqOzSCWCxIBvMPAAwcCGTM7/Pnz4ltwYLJDx8+TB8/flSPSRMVzEWyXXUzBAWYmwAuA5tHbMevwNImrIcj6sPHPmjIRpY5b5Bx27dvr1ehvn370qxZs0iXPWW7HhUtPpFvCXejQfMI7XgGRuYutH04BFhqEmIEVrCVK1cKa0MgB4EkE0erCWXu4cOH4hIsBHaAzINzGdg86juegbNly6ZGi4BuiAWDBw8WXiN1QyvAvDV//nxhjUC2MrxN2GcN+XRylZaihPZYSIoyCRXbvbpgDgUcz8AwSUnIkSOHLKoj7L6855gwp+EizER169ZV91GAmYsN8uqa3OFHXQhRQYot/hTNEKERUd04Xonz57RA7hv2/YWjom3btmpSvFPqISMjG5lD/lSdPHnyqHIoC/pmKxCHXIg9BRzPwGA+HWCNgDODY2gJpjGALlNKDxIYBKIEtqny9pjVr19fbzJkZd37pyuUIUMgAjtyvAhRokQJD7JjF3Z9myncfP36taoDV+irV6+Ic+k8NsSWFcD03m3Ke1YfdfcxGFgqdVb3G8ntO34FhuIDf70E3a4rr8GdKwGODzCovpu7tL+iDsIWfQHMdIhxsBL0VVd/a1jZZ6S37XgGxgQ0b95czQNigr0BO1NKwBarMvgHjAtRQyptOEcwjzcgNhamNQTbIIXfKtB/fOjThdhTwDYGhscMDofp06f/c+Vr2bKlGimCw3UAI/hiaogKsBFjZZV/+oL/mNNXY9kOzFqQk2EdGDZsmLxs+lFnYF2cML2juNSgOSEV0W/lwIEDUMPFJ5gt92VcKzOgiKVFfhz+jkDGCsu2cBw+fLjIYGZ3sQowRyYwm9P8IqoHoiNoyAoA7sAPRxfMoYBtAe1gJp358PcAgYBlWsXwLOcaY8eOVeeSeVlWFlmysh2OJVYMgyi2QKBvoMIrcaCqMb4n8USguAvmUMA2EQImJQ6J5Dn9PyDW19fO6/J+kyZNCPItHBJwbsjgHdzHJn68otPJkyc9dneHDRkmN7ihEcUWCKSXDHWsUOZ07xtilF0wiQLm/A5i1gpWOuRY8VDEB6n0rKkH3RjL0VF26Qn6Ya+KDRs2VHhYke6D9Hg5TuwD4YI5FLBNhJDo86qpJhYTjI0wQp1SDnFGyqes/EnUTD1iAxCMD/2wMmdq23G5MdtECJ5MAcgZQ6ijBN5HQJjN8DeyoYKlS5eqQHj+AVnSberUqUW7kydP9mkJsaTTuNCoU369c+fO9ViJoeDxHg+Wo4dN93RlEn+aaBVERzyyCodIa9d2EUInKP8xt3qV8+IhGBqWBbYVi1w4va4ZZXY5GzCvyb448N2MZt02QkgBRzEwxg2m0k1akrnMtp2yiCKSK2X7UCatMp+FcD7jXFeO/ZstZE8gt4031CCUsb8BOy6Y32IP8N7Vq1ePeIM90RjcyLzhCeXOnTv2jbsthJQCjmVgK6mAvcBkcDz+ngB/jCiVLCv7dds2nwJxkoFBRhmWiQ1JXAhfCsRZBg7fKXMx1ylgux1YR8YtuxSILgVcBo4uxdz6jqKAy8COmg4XmehS4H9f7COrHME8MAAAAABJRU5ErkJggg==`, - width: 89, - height: 32, - id: 'signature', - type: ElementType.IMAGE -}) - -// 模拟表格 elementList.push({ - type: ElementType.TABLE, + type: ElementType.PARAGRAPH, value: '', - colgroup: [ - { - width: 180 - }, - { - width: 80 - }, - { - width: 130 - }, - { - width: 130 - } - ], - trList: [ - { - height: 40, - tdList: [ - { - colspan: 1, - rowspan: 2, - value: [ - { value: `1`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 1, - rowspan: 1, - value: [ - { value: `2`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 2, - rowspan: 1, - value: [ - { value: `3`, size: 16 }, - { value: '.', size: 16 } - ] - } - ] - }, - { - height: 40, - tdList: [ - { - colspan: 1, - rowspan: 1, - value: [ - { value: `4`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 1, - rowspan: 1, - value: [ - { value: `5`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 1, - rowspan: 1, - value: [ - { value: `6`, size: 16 }, - { value: '.', size: 16 } - ] - } - ] - }, - { - height: 40, - tdList: [ - { - colspan: 1, - rowspan: 1, - value: [ - { value: `7`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 1, - rowspan: 1, - value: [ - { value: `8`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 1, - rowspan: 1, - value: [ - { value: `9`, size: 16 }, - { value: '.', size: 16 } - ] - }, - { - colspan: 1, - rowspan: 1, - value: [ - { value: `1`, size: 16 }, - { value: `0`, size: 16 }, - { value: '.', size: 16 } - ] - } - ] - } + id: 'para2', + v: [], + r: [ + // { + // value: 'This is the first part of the paragraph.', + // size: 16, + // id: '2' + // }, + // { value: 'And this is the second part.', size: 20, bold: true, id: '2' } + { value: '2', size: 20, bold: true, id: '2' } ] }) - -// 模拟checkbox -elementList.push( - ...([ - { - value: '是否同意以上内容:' - }, - { - type: ElementType.CONTROL, - control: { - conceptId: '3', - type: ControlType.CHECKBOX, - code: '98175', - value: '', - valueSets: [ - { - value: '同意', - code: '98175' - }, - { - value: '否定', - code: '98176' - } - ] - }, - value: '' - }, - { - value: '\n' - } - ]) -) - -// LaTex公式 -elementList.push( - ...([ - { - value: '医学公式:' - }, - { - value: `{E_k} = hv - {W_0}`, - type: ElementType.LATEX - }, - { - value: '\n' - } - ]) -) - -// 日期选择 -elementList.push( - ...([ - { - value: '签署日期:' - }, - { - type: ElementType.CONTROL, - value: '', - control: { - conceptId: '5', - type: ControlType.DATE, - value: [ - { - value: `2022-08-10 17:30:01` - } - ], - placeholder: '签署日期' - } - }, - { - value: '\n' - } - ]) -) - -// 模拟固定长度下划线 -elementList.push( - ...[ - { - value: '患者签名:' - }, - { - type: ElementType.CONTROL, - value: '', - control: { - conceptId: '4', - type: ControlType.TEXT, - value: null, - placeholder: '', - prefix: '\u200c', - postfix: '\u200c', - minWidth: 160, - underline: true - } - } - ] -) - -// 模拟结尾文本 -elementList.push( - ...[ - { - value: '\n' - }, - { - value: '', - type: ElementType.TAB - }, - { - value: 'E', - size: 16 - }, - { - value: 'O', - size: 16 - }, - { - value: 'F', - size: 16 - } - ] -) - export const data: IElement[] = elementList interface IComment { diff --git a/src/plugins/copy/index.ts b/src/plugins/copy/index.ts index fee3fe4f0..cbf019a01 100644 --- a/src/plugins/copy/index.ts +++ b/src/plugins/copy/index.ts @@ -18,7 +18,6 @@ export function copyWithCopyrightPlugin( if (!rangeText) return const text = `${rangeText}${copyrightText}` const plainText = new Blob([text], { type: 'text/plain' }) - // @ts-ignore const item = new ClipboardItem({ [plainText.type]: plainText }) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a..000000000 --- a/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/yarn.lock b/yarn.lock index 6387dc3ab..d666b92aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@algolia/autocomplete-core@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz" integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== dependencies: "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" @@ -12,45 +12,45 @@ "@algolia/autocomplete-plugin-algolia-insights@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz" integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== dependencies: "@algolia/autocomplete-shared" "1.9.3" "@algolia/autocomplete-preset-algolia@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz" integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== dependencies: "@algolia/autocomplete-shared" "1.9.3" "@algolia/autocomplete-shared@1.9.3": version "1.9.3" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz" integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== "@algolia/cache-browser-local-storage@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz#b9e0da012b2f124f785134a4d468ee0841b2399d" + resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.3.tgz" integrity sha512-hWH1yCxgG3+R/xZIscmUrWAIBnmBFHH5j30fY/+aPkEZWt90wYILfAHIOZ1/Wxhho5SkPfwFmT7ooX2d9JeQBw== dependencies: "@algolia/cache-common" "4.14.3" "@algolia/cache-common@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.14.3.tgz#a78e9faee3dfec018eab7b0996e918e06b476ac7" + resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.14.3.tgz" integrity sha512-oZJofOoD9FQOwiGTzyRnmzvh3ZP8WVTNPBLH5xU5JNF7drDbRT0ocVT0h/xB2rPHYzOeXRrLaQQBwRT/CKom0Q== "@algolia/cache-in-memory@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz#96cefb942aeb80e51e6a7e29f25f4f7f3439b736" + resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.14.3.tgz" integrity sha512-ES0hHQnzWjeioLQf5Nq+x1AWdZJ50znNPSH3puB/Y4Xsg4Av1bvLmTJe7SY2uqONaeMTvL0OaVcoVtQgJVw0vg== dependencies: "@algolia/cache-common" "4.14.3" "@algolia/client-account@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.14.3.tgz#6d7d032a65c600339ce066505c77013d9a9e4966" + resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.14.3.tgz" integrity sha512-PBcPb0+f5Xbh5UfLZNx2Ow589OdP8WYjB4CnvupfYBrl9JyC1sdH4jcq/ri8osO/mCZYjZrQsKAPIqW/gQmizQ== dependencies: "@algolia/client-common" "4.14.3" @@ -59,7 +59,7 @@ "@algolia/client-analytics@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.14.3.tgz#ca409d00a8fff98fdcc215dc96731039900055dc" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.14.3.tgz" integrity sha512-eAwQq0Hb/aauv9NhCH5Dp3Nm29oFx28sayFN2fdOWemwSeJHIl7TmcsxVlRsO50fsD8CtPcDhtGeD3AIFLNvqw== dependencies: "@algolia/client-common" "4.14.3" @@ -69,24 +69,35 @@ "@algolia/client-common@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.14.3.tgz#c44e48652b2121a20d7a40cfd68d095ebb4191a8" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.14.3.tgz" integrity sha512-jkPPDZdi63IK64Yg4WccdCsAP4pHxSkr4usplkUZM5C1l1oEpZXsy2c579LQ0rvwCs5JFmwfNG4ahOszidfWPw== dependencies: "@algolia/requester-common" "4.14.3" "@algolia/transporter" "4.14.3" +"@algolia/client-common@5.20.3": + version "5.20.3" + "@algolia/client-personalization@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.14.3.tgz#8f71325035aa2a5fa7d1d567575235cf1d6c654f" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.14.3.tgz" integrity sha512-UCX1MtkVNgaOL9f0e22x6tC9e2H3unZQlSUdnVaSKpZ+hdSChXGaRjp2UIT7pxmPqNCyv51F597KEX5WT60jNg== dependencies: "@algolia/client-common" "4.14.3" "@algolia/requester-common" "4.14.3" "@algolia/transporter" "4.14.3" +"@algolia/client-search@>= 4.9.1 < 6": + version "5.20.3" + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-browser-xhr" "5.20.3" + "@algolia/requester-fetch" "5.20.3" + "@algolia/requester-node-http" "5.20.3" + "@algolia/client-search@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.14.3.tgz#cf1e77549f5c3e73408ffe6441ede985fde69da0" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.14.3.tgz" integrity sha512-I2U7xBx5OPFdPLA8AXKUPPxGY3HDxZ4r7+mlZ8ZpLbI8/ri6fnu6B4z3wcL7sgHhDYMwnAE8Xr0AB0h3Hnkp4A== dependencies: "@algolia/client-common" "4.14.3" @@ -95,38 +106,53 @@ "@algolia/logger-common@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.14.3.tgz#87d4725e7f56ea5a39b605771b7149fff62032a7" + resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.14.3.tgz" integrity sha512-kUEAZaBt/J3RjYi8MEBT2QEexJR2kAE2mtLmezsmqMQZTV502TkHCxYzTwY2dE7OKcUTxi4OFlMuS4GId9CWPw== "@algolia/logger-console@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.14.3.tgz#1f19f8f0a5ef11f01d1f9545290eb6a89b71fb8a" + resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.14.3.tgz" integrity sha512-ZWqAlUITktiMN2EiFpQIFCJS10N96A++yrexqC2Z+3hgF/JcKrOxOdT4nSCQoEPvU4Ki9QKbpzbebRDemZt/hw== dependencies: "@algolia/logger-common" "4.14.3" "@algolia/requester-browser-xhr@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz#bcf55cba20f58fd9bc95ee55793b5219f3ce8888" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.3.tgz" integrity sha512-AZeg2T08WLUPvDncl2XLX2O67W5wIO8MNaT7z5ii5LgBTuk/rU4CikTjCe2xsUleIZeFl++QrPAi4Bdxws6r/Q== dependencies: "@algolia/requester-common" "4.14.3" +"@algolia/requester-browser-xhr@5.20.3": + version "5.20.3" + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-common@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.14.3.tgz#2d02fbe01afb7ae5651ae8dfe62d6c089f103714" + resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.14.3.tgz" integrity sha512-RrRzqNyKFDP7IkTuV3XvYGF9cDPn9h6qEDl595lXva3YUk9YSS8+MGZnnkOMHvjkrSCKfoLeLbm/T4tmoIeclw== +"@algolia/requester-fetch@5.20.3": + version "5.20.3" + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/requester-node-http@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz#72389e1c2e5d964702451e75e368eefe85a09d8f" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.14.3.tgz" integrity sha512-O5wnPxtDRPuW2U0EaOz9rMMWdlhwP0J0eSL1Z7TtXF8xnUeeUyNJrdhV5uy2CAp6RbhM1VuC3sOJcIR6Av+vbA== dependencies: "@algolia/requester-common" "4.14.3" +"@algolia/requester-node-http@5.20.3": + version "5.20.3" + dependencies: + "@algolia/client-common" "5.20.3" + "@algolia/transporter@4.14.3": version "4.14.3" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.14.3.tgz#5593036bd9cf2adfd077fdc3e81d2e6118660a7a" + resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.14.3.tgz" integrity sha512-2qlKlKsnGJ008exFRb5RTeTOqhLZj0bkMCMVskxoqWejs2Q2QtWmsiH98hDfpw0fmnyhzHEt0Z7lqxBYp8bW2w== dependencies: "@algolia/cache-common" "4.14.3" @@ -135,38 +161,33 @@ "@babel/code-frame@7.12.11": version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== dependencies: "@babel/highlight" "^7.10.4" "@babel/helper-validator-identifier@^7.16.7": version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== "@babel/highlight@^7.10.4": version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz" integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== dependencies: "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.4": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" - integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== - "@babel/parser@^7.20.15", "@babel/parser@^7.21.3": version "7.22.7" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== "@cypress/request@^3.0.0": version "3.0.1" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + resolved "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz" integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== dependencies: aws-sign2 "~0.7.0" @@ -190,20 +211,20 @@ "@cypress/xvfb@^1.2.4": version "1.2.4" - resolved "https://registry.yarnpkg.com/@cypress/xvfb/-/xvfb-1.2.4.tgz#2daf42e8275b39f4aa53c14214e557bd14e7748a" + resolved "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz" integrity sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q== dependencies: debug "^3.1.0" lodash.once "^4.1.1" -"@docsearch/css@3.5.1", "@docsearch/css@^3.5.1": +"@docsearch/css@^3.5.1", "@docsearch/css@3.5.1": version "3.5.1" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.1.tgz#4adf9884735bbfea621c3716e80ea97baa419b73" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz" integrity sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA== "@docsearch/js@^3.5.1": version "3.5.1" - resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.5.1.tgz#6d8de3b4fcf7de94462c0e592e333efa9ebbbabd" + resolved "https://registry.npmjs.org/@docsearch/js/-/js-3.5.1.tgz" integrity sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw== dependencies: "@docsearch/react" "3.5.1" @@ -211,7 +232,7 @@ "@docsearch/react@3.5.1": version "3.5.1" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.1.tgz#35f4a75f948211d8bb6830d2147c575f96a85274" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz" integrity sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ== dependencies: "@algolia/autocomplete-core" "1.9.3" @@ -219,131 +240,26 @@ "@docsearch/css" "3.5.1" algoliasearch "^4.0.0" -"@esbuild/android-arm64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz#9e00eb6865ed5f2dbe71a1e96f2c52254cd92903" - integrity sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg== - -"@esbuild/android-arm@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.17.tgz#1aa013b65524f4e9f794946b415b32ae963a4618" - integrity sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg== - -"@esbuild/android-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.17.tgz#c2bd0469b04ded352de011fae34a7a1d4dcecb79" - integrity sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw== - -"@esbuild/darwin-arm64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz#0c21a59cb5bd7a2cec66c7a42431dca42aefeddd" - integrity sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g== - -"@esbuild/darwin-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz#92f8763ff6f97dff1c28a584da7b51b585e87a7b" - integrity sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g== - -"@esbuild/freebsd-arm64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz#934f74bdf4022e143ba2f21d421b50fd0fead8f8" - integrity sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ== - -"@esbuild/freebsd-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz#16b6e90ba26ecc865eab71c56696258ec7f5d8bf" - integrity sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA== - -"@esbuild/linux-arm64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz#179a58e8d4c72116eb068563629349f8f4b48072" - integrity sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ== - -"@esbuild/linux-arm@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz#9d78cf87a310ae9ed985c3915d5126578665c7b5" - integrity sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg== - -"@esbuild/linux-ia32@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz#6fed202602d37361bca376c9d113266a722a908c" - integrity sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg== - -"@esbuild/linux-loong64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz#cdc60304830be1e74560c704bfd72cab8a02fa06" - integrity sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg== - -"@esbuild/linux-mips64el@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz#c367b2855bb0902f5576291a2049812af2088086" - integrity sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ== - -"@esbuild/linux-ppc64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz#7fdc0083d42d64a4651711ee0a7964f489242f45" - integrity sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ== - -"@esbuild/linux-riscv64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz#5198a417f3f5b86b10c95647b8bc032e5b6b2b1c" - integrity sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g== - -"@esbuild/linux-s390x@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz#7459c2fecdee2d582f0697fb76a4041f4ad1dd1e" - integrity sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg== - -"@esbuild/linux-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz#948cdbf46d81c81ebd7225a7633009bc56a4488c" - integrity sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ== - -"@esbuild/netbsd-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz#6bb89668c0e093c5a575ded08e1d308bd7fd63e7" - integrity sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ== - -"@esbuild/openbsd-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz#abac2ae75fef820ef6c2c48da4666d092584c79d" - integrity sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA== - -"@esbuild/sunos-x64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz#74a45fe1db8ea96898f1a9bb401dcf1dadfc8371" - integrity sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g== - -"@esbuild/win32-arm64@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz#fd95ffd217995589058a4ed8ac17ee72a3d7f615" - integrity sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw== - -"@esbuild/win32-ia32@0.18.17": - version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz#9b7ef5d0df97593a80f946b482e34fcba3fa4aaf" - integrity sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg== - "@esbuild/win32-x64@0.18.17": version "0.18.17" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz#bcb2e042631b3c15792058e189ed879a22b2968b" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz" integrity sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^0.4.3": version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== dependencies: ajv "^6.12.4" @@ -358,7 +274,7 @@ "@humanwhocodes/config-array@^0.5.0": version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== dependencies: "@humanwhocodes/object-schema" "^1.2.0" @@ -367,30 +283,30 @@ "@humanwhocodes/object-schema@^1.2.0": version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -398,7 +314,7 @@ "@rollup/plugin-typescript@^10.0.1": version "10.0.1" - resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz#270b515b116ea28320e6bb62451c4767d49072d6" + resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz" integrity sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A== dependencies: "@rollup/pluginutils" "^5.0.1" @@ -406,7 +322,7 @@ "@rollup/pluginutils@^5.0.1": version "5.0.2" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz#012b8f53c71e4f6f9cb317e311df1404f56e7a33" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz" integrity sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA== dependencies: "@types/estree" "^1.0.0" @@ -415,66 +331,63 @@ "@types/estree@^1.0.0": version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== "@types/json-schema@^7.0.9": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== -"@types/node@*": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== - -"@types/node@16.18.96": - version "16.18.96" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.96.tgz#eb0012d23ff53d14d64ec8a352bf89792de6aade" - integrity sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ== +"@types/node@*", "@types/node@^22.13.4", "@types/node@>= 14": + version "22.13.4" + resolved "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz" + integrity sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg== + dependencies: + undici-types "~6.20.0" "@types/node@^18.17.5": version "18.18.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.13.tgz#ae0f76c0bfe79d8fad0f910b78ae3e59b333c6e8" + resolved "https://registry.npmjs.org/@types/node/-/node-18.18.13.tgz" integrity sha512-vXYZGRrSCreZmq1rEjMRLXJhiy8MrIeVasx+PCVlP414N7CJLHnMf+juVvjdprHyH+XRy3zKZLHeNueOpJCn0g== dependencies: undici-types "~5.26.4" "@types/prismjs@^1.26.0": version "1.26.0" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.0.tgz#a1c3809b0ad61c62cac6d4e0c56d610c910b7654" + resolved "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz" integrity sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ== "@types/semver@^7.3.12": version "7.5.8" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/sinonjs__fake-timers@8.1.1": version "8.1.1" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3" + resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz" integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/sizzle@^2.3.2": version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" + resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== "@types/web-bluetooth@^0.0.17": version "0.0.17" - resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz#5c9f3c617f64a9735d7b72a7cc671e166d900c40" + resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz" integrity sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA== "@types/yauzl@^2.9.1": version "2.9.2" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.9.2.tgz#c48e5d56aff1444409e39fa164b0b4d4552a7b7a" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz" integrity sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA== dependencies: "@types/node" "*" "@typescript-eslint/eslint-plugin@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" @@ -488,9 +401,9 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@5.62.0": +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: "@typescript-eslint/scope-manager" "5.62.0" @@ -500,7 +413,7 @@ "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: "@typescript-eslint/types" "5.62.0" @@ -508,7 +421,7 @@ "@typescript-eslint/type-utils@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: "@typescript-eslint/typescript-estree" "5.62.0" @@ -518,12 +431,12 @@ "@typescript-eslint/types@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: "@typescript-eslint/types" "5.62.0" @@ -536,7 +449,7 @@ "@typescript-eslint/utils@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -550,7 +463,7 @@ "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: "@typescript-eslint/types" "5.62.0" @@ -558,22 +471,12 @@ "@vitejs/plugin-vue@^4.2.3": version "4.2.3" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz#ee0b6dfcc62fe65364e6395bf38fa2ba10bb44b6" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.2.3.tgz" integrity sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw== -"@vue/compiler-core@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b" - integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.45" - estree-walker "^2.0.2" - source-map "^0.6.1" - "@vue/compiler-core@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.4.tgz#7fbf591c1c19e1acd28ffd284526e98b4f581128" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz" integrity sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g== dependencies: "@babel/parser" "^7.21.3" @@ -581,41 +484,17 @@ estree-walker "^2.0.2" source-map-js "^1.0.2" -"@vue/compiler-dom@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce" - integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw== - dependencies: - "@vue/compiler-core" "3.2.45" - "@vue/shared" "3.2.45" - "@vue/compiler-dom@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz#f56e09b5f4d7dc350f981784de9713d823341151" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz" integrity sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w== dependencies: "@vue/compiler-core" "3.3.4" "@vue/shared" "3.3.4" -"@vue/compiler-sfc@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70" - integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.45" - "@vue/compiler-dom" "3.2.45" - "@vue/compiler-ssr" "3.2.45" - "@vue/reactivity-transform" "3.2.45" - "@vue/shared" "3.2.45" - estree-walker "^2.0.2" - magic-string "^0.25.7" - postcss "^8.1.10" - source-map "^0.6.1" - "@vue/compiler-sfc@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz#b19d942c71938893535b46226d602720593001df" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz" integrity sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ== dependencies: "@babel/parser" "^7.20.15" @@ -629,17 +508,9 @@ postcss "^8.1.10" source-map-js "^1.0.2" -"@vue/compiler-ssr@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2" - integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ== - dependencies: - "@vue/compiler-dom" "3.2.45" - "@vue/shared" "3.2.45" - "@vue/compiler-ssr@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz#9d1379abffa4f2b0cd844174ceec4a9721138777" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz" integrity sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ== dependencies: "@vue/compiler-dom" "3.3.4" @@ -647,23 +518,12 @@ "@vue/devtools-api@^6.5.0": version "6.5.0" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz" integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== -"@vue/reactivity-transform@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d" - integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.45" - "@vue/shared" "3.2.45" - estree-walker "^2.0.2" - magic-string "^0.25.7" - "@vue/reactivity-transform@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz#52908476e34d6a65c6c21cd2722d41ed8ae51929" + resolved "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz" integrity sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw== dependencies: "@babel/parser" "^7.20.15" @@ -672,83 +532,46 @@ estree-walker "^2.0.2" magic-string "^0.30.0" -"@vue/reactivity@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0" - integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A== - dependencies: - "@vue/shared" "3.2.45" - "@vue/reactivity@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.4.tgz#a27a29c6cd17faba5a0e99fbb86ee951653e2253" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz" integrity sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ== dependencies: "@vue/shared" "3.3.4" -"@vue/runtime-core@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz#7ad7ef9b2519d41062a30c6fa001ec43ac549c7f" - integrity sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A== - dependencies: - "@vue/reactivity" "3.2.45" - "@vue/shared" "3.2.45" - "@vue/runtime-core@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.4.tgz#4bb33872bbb583721b340f3088888394195967d1" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz" integrity sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA== dependencies: "@vue/reactivity" "3.3.4" "@vue/shared" "3.3.4" -"@vue/runtime-dom@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz#1a2ef6ee2ad876206fbbe2a884554bba2d0faf59" - integrity sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA== - dependencies: - "@vue/runtime-core" "3.2.45" - "@vue/shared" "3.2.45" - csstype "^2.6.8" - "@vue/runtime-dom@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz#992f2579d0ed6ce961f47bbe9bfe4b6791251566" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz" integrity sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ== dependencies: "@vue/runtime-core" "3.3.4" "@vue/shared" "3.3.4" csstype "^3.1.1" -"@vue/server-renderer@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz#ca9306a0c12b0530a1a250e44f4a0abac6b81f3f" - integrity sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g== - dependencies: - "@vue/compiler-ssr" "3.2.45" - "@vue/shared" "3.2.45" - "@vue/server-renderer@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.4.tgz#ea46594b795d1536f29bc592dd0f6655f7ea4c4c" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz" integrity sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ== dependencies: "@vue/compiler-ssr" "3.3.4" "@vue/shared" "3.3.4" -"@vue/shared@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" - integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== - "@vue/shared@3.3.4": version "3.3.4" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz" integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ== -"@vueuse/core@10.2.1", "@vueuse/core@^10.2.1": +"@vueuse/core@^10.2.1", "@vueuse/core@10.2.1": version "10.2.1" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.2.1.tgz#a62b54cdaf1496138a9f8a7df7f9d644892b421f" + resolved "https://registry.npmjs.org/@vueuse/core/-/core-10.2.1.tgz" integrity sha512-c441bfMbkAwTNwVRHQ0zdYZNETK//P84rC01aP2Uy/aRFCiie9NE/k9KdIXbno0eDYP5NPUuWv0aA/I4Unr/7w== dependencies: "@types/web-bluetooth" "^0.0.17" @@ -758,7 +581,7 @@ "@vueuse/integrations@^10.2.1": version "10.2.1" - resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.2.1.tgz#abc44b35f909f6b5e1a66a2d69a257bb4b087536" + resolved "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.2.1.tgz" integrity sha512-FDP5lni+z9FjHE9H3xuvwSjoRV9U8jmDvJpmHPCBjUgPGYRynwb60eHWXCFJXLUtb4gSIHy0e+iaEbrKdalCkQ== dependencies: "@vueuse/core" "10.2.1" @@ -767,29 +590,29 @@ "@vueuse/metadata@10.2.1": version "10.2.1" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.2.1.tgz#0865066def62ed97629c417ec79678d508d22934" + resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.2.1.tgz" integrity sha512-3Gt68mY/i6bQvFqx7cuGBzrCCQu17OBaGWS5JdwISpMsHnMKKjC2FeB5OAfMcCQ0oINfADP3i9A4PPRo0peHdQ== "@vueuse/shared@10.2.1": version "10.2.1" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.2.1.tgz#0fd0a5dd014b7713b7fe03347b30fad69bb15b30" + resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-10.2.1.tgz" integrity sha512-QWHq2bSuGptkcxx4f4M/fBYC3Y8d3M2UYyLsyzoPgEoVzJURQ0oJeWXu79OiLlBb8gTKkqe4mO85T/sf39mmiw== dependencies: vue-demi ">=0.14.5" acorn-jsx@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^7.4.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -797,7 +620,7 @@ aggregate-error@^3.0.0: ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -807,7 +630,7 @@ ajv@^6.10.0, ajv@^6.12.4: ajv@^8.0.1: version "8.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz" integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw== dependencies: fast-deep-equal "^3.1.1" @@ -815,9 +638,9 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" -algoliasearch@^4.0.0: +algoliasearch@^4.0.0, "algoliasearch@>= 4.9.1 < 6": version "4.14.3" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.14.3.tgz#f02a77a4db17de2f676018938847494b692035e7" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.14.3.tgz" integrity sha512-GZTEuxzfWbP/vr7ZJfGzIl8fOsoxN916Z6FY2Egc9q2TmZ6hvq5KfAxY89pPW01oW/2HDEKA8d30f9iAH9eXYg== dependencies: "@algolia/cache-browser-local-storage" "4.14.3" @@ -837,134 +660,134 @@ algoliasearch@^4.0.0: ansi-colors@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-sequence-parser@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz#e0aa1cdcbc8f8bb0b5bca625aac41f5f056973cf" + resolved "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz" integrity sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" arch@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" + resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== argparse@^1.0.7: version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" -assert-plus@1.0.0, assert-plus@^1.0.0: +assert-plus@^1.0.0, assert-plus@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= astral-regex@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.0: version "3.2.3" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" + resolved "https://registry.npmjs.org/async/-/async-3.2.3.tgz" integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= at-least-node@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" blob-util@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb" + resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz" integrity sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ== bluebird@^3.7.2: version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== body-scroll-lock@4.0.0-beta.0: version "4.0.0-beta.0" - resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz#4f78789d10e6388115c0460cd6d7d4dd2bbc4f7e" + resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz" integrity sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -972,19 +795,19 @@ brace-expansion@^1.1.7: braces@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" buffer-crc32@~0.2.3: version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -992,12 +815,12 @@ buffer@^5.6.0: cachedir@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== call-bind@^1.0.0: version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz" integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: function-bind "^1.1.2" @@ -1006,17 +829,17 @@ call-bind@^1.0.0: callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= chalk@^2.0.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1025,7 +848,7 @@ chalk@^2.0.0: chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1033,29 +856,29 @@ chalk@^4.0.0, chalk@^4.1.0: check-more-types@^2.24.0: version "2.24.0" - resolved "https://registry.yarnpkg.com/check-more-types/-/check-more-types-2.24.0.tgz#1420ffb10fd444dcfc79b43891bbfffd32a84600" + resolved "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz" integrity sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA= ci-info@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.0.tgz#b4ed1fb6818dea4803a55c623041f9165d2066b2" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz" integrity sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw== clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" cli-table3@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz" integrity sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA== dependencies: string-width "^4.2.0" @@ -1064,7 +887,7 @@ cli-table3@~0.6.1: cli-truncate@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== dependencies: slice-ansi "^3.0.0" @@ -1072,92 +895,87 @@ cli-truncate@^2.1.0: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + colorette@^2.0.16: version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== colors@1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== common-tags@^1.8.0: version "1.8.2" - resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" -csstype@^2.6.8: - version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" - integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== - csstype@^3.1.1: version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== cypress-file-upload@^5.0.8: version "5.0.8" - resolved "https://registry.yarnpkg.com/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz#d8824cbeaab798e44be8009769f9a6c9daa1b4a1" + resolved "https://registry.npmjs.org/cypress-file-upload/-/cypress-file-upload-5.0.8.tgz" integrity sha512-+8VzNabRk3zG6x8f8BWArF/xA/W0VK4IZNx3MV0jFWrJS/qKn8eHfa5nU73P9fOQAgwHFJx7zjg4lwOnljMO8g== -cypress@13.6.0: +cypress@>3.0.0, cypress@13.6.0: version "13.6.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.6.0.tgz#b98b7b837679012ed09c7ecee5565bf7b31d4982" + resolved "https://registry.npmjs.org/cypress/-/cypress-13.6.0.tgz" integrity sha512-quIsnFmtj4dBUEJYU4OH0H12bABJpSujvWexC24Ju1gTlKMJbeT6tTO0vh7WNfiBPPjoIXLN+OUqVtiKFs6SGw== dependencies: "@cypress/request" "^3.0.0" @@ -1206,45 +1024,38 @@ cypress@13.6.0: dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" dayjs@^1.10.4: version "1.10.8" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.8.tgz#267df4bc6276fcb33c04a6735287e3f429abec41" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.8.tgz" integrity sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow== debug@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.3.4: +debug@^4.0.1, debug@^4.1.1, debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.1.1: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== define-data-property@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz" integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== dependencies: get-intrinsic "^1.2.1" @@ -1253,26 +1064,26 @@ define-data-property@^1.1.1: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" @@ -1280,111 +1091,31 @@ ecc-jsbn@~0.1.1: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== end-of-stream@^1.1.0: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enquirer@^2.3.5, enquirer@^2.3.6: +enquirer@^2.3.5, enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: ansi-colors "^4.1.1" -esbuild-android-arm64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.13.tgz#da07b5fb2daf7d83dcd725f7cf58a6758e6e702a" - integrity sha512-T02aneWWguJrF082jZworjU6vm8f4UQ+IH2K3HREtlqoY9voiJUwHLRL6khRlsNLzVglqgqb7a3HfGx7hAADCQ== - -esbuild-darwin-64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.13.13.tgz#e94e9fd3b4b5455a2e675cd084a19a71b6904bbf" - integrity sha512-wkaiGAsN/09X9kDlkxFfbbIgR78SNjMOfUhoel3CqKBDsi9uZhw7HBNHNxTzYUK8X8LAKFpbODgcRB3b/I8gHA== - -esbuild-darwin-arm64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.13.tgz#8c320eafbb3ba2c70d8062128c5b71503e342471" - integrity sha512-b02/nNKGSV85Gw9pUCI5B48AYjk0vFggDeom0S6QMP/cEDtjSh1WVfoIFNAaLA0MHWfue8KBwoGVsN7rBshs4g== - -esbuild-freebsd-64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.13.tgz#ce0ca5b8c4c274cfebc9326f9b316834bd9dd151" - integrity sha512-ALgXYNYDzk9YPVk80A+G4vz2D22Gv4j4y25exDBGgqTcwrVQP8rf/rjwUjHoh9apP76oLbUZTmUmvCMuTI1V9A== - -esbuild-freebsd-arm64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.13.tgz#463da17562fdcfdf03b3b94b28497d8d8dcc8f62" - integrity sha512-uFvkCpsZ1yqWQuonw5T1WZ4j59xP/PCvtu6I4pbLejhNo4nwjW6YalqnBvBSORq5/Ifo9S/wsIlVHzkzEwdtlw== - -esbuild-linux-32@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.13.13.tgz#2035793160da2c4be48a929e5bafb14a31789acc" - integrity sha512-yxR9BBwEPs9acVEwTrEE2JJNHYVuPQC9YGjRfbNqtyfK/vVBQYuw8JaeRFAvFs3pVJdQD0C2BNP4q9d62SCP4w== - -esbuild-linux-64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.13.13.tgz#fbe4802a8168c6d339d0749f977b099449b56f22" - integrity sha512-kzhjlrlJ+6ESRB/n12WTGll94+y+HFeyoWsOrLo/Si0s0f+Vip4b8vlnG0GSiS6JTsWYAtGHReGczFOaETlKIw== - -esbuild-linux-arm64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.13.tgz#f08d98df28d436ed4aad1529615822bb74d4d978" - integrity sha512-KMrEfnVbmmJxT3vfTnPv/AiXpBFbbyExH13BsUGy1HZRPFMi5Gev5gk8kJIZCQSRfNR17aqq8sO5Crm2KpZkng== - -esbuild-linux-arm@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.13.13.tgz#6f968c3a98b64e30c80b212384192d0cfcb32e7f" - integrity sha512-hXub4pcEds+U1TfvLp1maJ+GHRw7oizvzbGRdUvVDwtITtjq8qpHV5Q5hWNNn6Q+b3b2UxF03JcgnpzCw96nUQ== - -esbuild-linux-mips64le@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.13.tgz#690c78dc4725efe7d06a1431287966fbf7774c7f" - integrity sha512-cJT9O1LYljqnnqlHaS0hdG73t7hHzF3zcN0BPsjvBq+5Ad47VJun+/IG4inPhk8ta0aEDK6LdP+F9299xa483w== - -esbuild-linux-ppc64le@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.13.tgz#7ec9048502de46754567e734aae7aebd2df6df02" - integrity sha512-+rghW8st6/7O6QJqAjVK3eXzKkZqYAw6LgHv7yTMiJ6ASnNvghSeOcIvXFep3W2oaJc35SgSPf21Ugh0o777qQ== - -esbuild-netbsd-64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.13.tgz#439bdaefffa03a8fa84324f5d83d636f548a2de3" - integrity sha512-A/B7rwmzPdzF8c3mht5TukbnNwY5qMJqes09ou0RSzA5/jm7Jwl/8z853ofujTFOLhkNHUf002EAgokzSgEMpQ== - -esbuild-openbsd-64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.13.tgz#c9958e5291a00a3090c1ec482d6bcdf2d5b5d107" - integrity sha512-szwtuRA4rXKT3BbwoGpsff6G7nGxdKgUbW9LQo6nm0TVCCjDNDC/LXxT994duIW8Tyq04xZzzZSW7x7ttDiw1w== - -esbuild-sunos-64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.13.13.tgz#ac9ead8287379cd2f6d00bd38c5997fda9c1179e" - integrity sha512-ihyds9O48tVOYF48iaHYUK/boU5zRaLOXFS+OOL3ceD39AyHo46HVmsJLc7A2ez0AxNZCxuhu+P9OxfPfycTYQ== - -esbuild-windows-32@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.13.13.tgz#a3820fc86631ca594cb7b348514b5cc3f058cfd6" - integrity sha512-h2RTYwpG4ldGVJlbmORObmilzL8EECy8BFiF8trWE1ZPHLpECE9//J3Bi+W3eDUuv/TqUbiNpGrq4t/odbayUw== - esbuild-windows-64@0.13.13: version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.13.13.tgz#1da748441f228d75dff474ddb7d584b81887323c" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.13.tgz" integrity sha512-oMrgjP4CjONvDHe7IZXHrMk3wX5Lof/IwFEIbwbhgbXGBaN2dke9PkViTiXC3zGJSGpMvATXVplEhlInJ0drHA== -esbuild-windows-arm64@0.13.13: - version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.13.tgz#06dfa52a6b178a5932a9a6e2fdb240c09e6da30c" - integrity sha512-6fsDfTuTvltYB5k+QPah/x7LrI2+OLAJLE3bWLDiZI6E8wXMQU+wLqtEO/U/RvJgVY1loPs5eMpUBpVajczh1A== - esbuild@^0.13.2: version "0.13.13" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.13.13.tgz#0b5399c20f219f663c8c1048436fb0f59ab17a41" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.13.13.tgz" integrity sha512-Z17A/R6D0b4s3MousytQ/5i7mTCbaF+Ua/yPfoe71vdTv4KBvVAvQ/6ytMngM2DwGJosl8WxaD75NOQl2QF26Q== optionalDependencies: esbuild-android-arm64 "0.13.13" @@ -1407,7 +1138,7 @@ esbuild@^0.13.2: esbuild@^0.18.10: version "0.18.17" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.17.tgz#2aaf6bc6759b0c605777fdc435fea3969e091cad" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz" integrity sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg== optionalDependencies: "@esbuild/android-arm" "0.18.17" @@ -1435,17 +1166,17 @@ esbuild@^0.18.10: escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-scope@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -1453,29 +1184,34 @@ eslint-scope@^5.1.1: eslint-utils@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: +eslint-visitor-keys@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint-visitor-keys@^3.3.0: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@7.32.0: +eslint@*, "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@7.32.0: version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== dependencies: "@babel/code-frame" "7.12.11" @@ -1521,7 +1257,7 @@ eslint@7.32.0: espree@^7.3.0, espree@^7.3.1: version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== dependencies: acorn "^7.4.0" @@ -1530,51 +1266,56 @@ espree@^7.3.0, espree@^7.3.1: esprima@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter2@6.4.7: version "6.4.7" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.7.tgz#a7f6c4d7abf28a14c1ef3442f21cb306a054271d" + resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz" integrity sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg== execa@4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" + resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== dependencies: cross-spawn "^7.0.0" @@ -1589,19 +1330,19 @@ execa@4.1.0: executable@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c" + resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg== dependencies: pify "^2.2.0" extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extract-zip@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== dependencies: debug "^4.1.1" @@ -1610,24 +1351,19 @@ extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@1.3.0: +extsprintf@^1.2.0, extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.9: version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1638,52 +1374,52 @@ fast-glob@^3.2.9: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" fd-slicer@~1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" figures@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" flat-cache@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== dependencies: flatted "^3.1.0" @@ -1691,24 +1427,24 @@ flat-cache@^3.0.4: flatted@^3.1.0: version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -focus-trap@^7.5.2: +focus-trap@*, focus-trap@^7.5.2: version "7.5.2" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.2.tgz#e5ee678d10a18651f2591ffb66c949fb098d57cf" + resolved "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz" integrity sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw== dependencies: tabbable "^6.2.0" forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -1717,7 +1453,7 @@ form-data@~2.3.2: fs-extra@^9.1.0: version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== dependencies: at-least-node "^1.0.0" @@ -1727,32 +1463,22 @@ fs-extra@^9.1.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function-bind@^1.1.2: +function-bind@^1.1.1, function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz" integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: function-bind "^1.1.2" @@ -1762,35 +1488,35 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@ get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" getos@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5" + resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== dependencies: async "^3.2.0" getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@^7.1.3: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -1802,21 +1528,21 @@ glob@^7.1.3: global-dirs@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" + resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz" integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== dependencies: ini "2.0.0" globals@^13.6.0, globals@^13.9.0: version "13.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" + resolved "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz" integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== dependencies: type-fest "^0.20.2" globby@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1828,65 +1554,65 @@ globby@^11.1.0: gopd@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== dependencies: get-intrinsic "^1.1.3" graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.9" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz" integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: get-intrinsic "^1.2.2" has-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== has-symbols@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" hasown@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz" integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: function-bind "^1.1.2" http-signature@~1.3.6: version "1.3.6" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== dependencies: assert-plus "^1.0.0" @@ -1895,27 +1621,27 @@ http-signature@~1.3.6: human-signals@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^4.0.6: version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== ignore@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1923,17 +1649,17 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" @@ -1941,55 +1667,48 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== is-ci@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== dependencies: ci-info "^3.2.0" -is-core-module@^2.2.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== - dependencies: - has "^1.0.3" - is-core-module@^2.9.0: version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-installed-globally@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" + resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== dependencies: global-dirs "^3.0.0" @@ -1997,47 +1716,47 @@ is-installed-globally@~0.4.0: is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-stream@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" @@ -2045,42 +1764,42 @@ js-yaml@^3.13.1: jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema-traverse@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= jsonc-parser@^3.2.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== jsonfile@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: universalify "^2.0.0" @@ -2089,7 +1808,7 @@ jsonfile@^6.0.1: jsprim@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== dependencies: assert-plus "1.0.0" @@ -2099,12 +1818,12 @@ jsprim@^2.0.2: lazy-ass@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/lazy-ass/-/lazy-ass-1.6.0.tgz#7999655e8646c17f089fdd187d150d3324d54513" + resolved "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz" integrity sha1-eZllXoZGwX8In90YfRUNMyTVRRM= levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -2112,7 +1831,7 @@ levn@^0.4.1: listr2@^3.8.3: version "3.14.0" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" + resolved "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz" integrity sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g== dependencies: cli-truncate "^2.1.0" @@ -2126,27 +1845,27 @@ listr2@^3.8.3: lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash.once@^4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= lodash.truncate@^4.4.2: version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" @@ -2154,7 +1873,7 @@ log-symbols@^4.0.0: log-update@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" + resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== dependencies: ansi-escapes "^4.3.0" @@ -2164,43 +1883,36 @@ log-update@^4.0.0: lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - magic-string@^0.30.0: version "0.30.1" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.1.tgz#ce5cd4b0a81a5d032bd69aab4522299b2166284d" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz" integrity sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" mark.js@8.11.1: version "8.11.1" - resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" @@ -2208,102 +1920,87 @@ micromatch@^4.0.4: mime-db@1.51.0: version "1.51.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz" integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: mime-db "1.51.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimatch@^3.0.4: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimist@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== minisearch@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.1.0.tgz#6e74e743dbd0e88fa5ca52fef2391e0aa7055252" + resolved "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz" integrity sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg== -ms@2.1.2: +ms@^2.1.1, ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nanoid@^3.1.30: - version "3.1.30" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.30.tgz#63f93cc548d2a113dc5dfbc63bfa09e2b9b64362" - integrity sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ== - -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - nanoid@^3.3.6: version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== natural-compare-lite@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= npm-run-path@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" object-inspect@^1.9.0: version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^5.1.0: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" optionator@^0.9.1: version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== dependencies: deep-is "^0.1.3" @@ -2315,89 +2012,71 @@ optionator@^0.9.1: ospath@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + resolved "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz" integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6, path-parse@^1.0.7: +path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pend@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -postcss@^8.1.10: - version "8.4.20" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" - integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.3.8: - version "8.3.11" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.3.11.tgz#c3beca7ea811cd5e1c4a3ec6d2e7599ef1f8f858" - integrity sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA== - dependencies: - nanoid "^3.1.30" - picocolors "^1.0.0" - source-map-js "^0.6.2" - -postcss@^8.4.26: +postcss@^8.1.10, postcss@^8.3.8, postcss@^8.4.26: version "8.4.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz" integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ== dependencies: nanoid "^3.3.6" @@ -2406,47 +2085,47 @@ postcss@^8.4.26: preact@^10.0.0: version "10.11.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" + resolved "https://registry.npmjs.org/preact/-/preact-10.11.3.tgz" integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== pretty-bytes@^5.6.0: version "5.6.0" - resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== prismjs@^1.27.0: version "1.27.0" - resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz" integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== process@^0.11.10: version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== progress@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== proxy-from-env@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= psl@^1.1.33: version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -2454,64 +2133,56 @@ pump@^3.0.0: punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@6.10.4: version "6.10.4" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + resolved "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz" integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== dependencies: side-channel "^1.0.4" querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== regexpp@^3.1.0: version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== request-progress@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-3.0.0.tgz#4ca754081c7fec63f505e4faa825aa06cd669dbe" + resolved "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz" integrity sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4= dependencies: throttleit "^1.0.0" require-from-string@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^1.22.1: +resolve@^1.20.0, resolve@^1.22.1: version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: is-core-module "^2.9.0" @@ -2520,7 +2191,7 @@ resolve@^1.22.1: restore-cursor@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== dependencies: onetime "^5.1.0" @@ -2528,83 +2199,72 @@ restore-cursor@^3.1.0: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" -rollup@^2.57.0: +rollup@^1.20.0||^2.0.0||^3.0.0, rollup@^2.14.0||^3.0.0, rollup@^2.57.0: version "2.60.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.60.0.tgz#4ee60ab7bdd0356763f87d7099f413e5460fc193" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.60.0.tgz" integrity sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ== optionalDependencies: fsevents "~2.3.2" rollup@^3.25.2: version "3.26.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.26.3.tgz#bbc8818cadd0aebca348dbb3d68d296d220967b8" + resolved "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz" integrity sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ== optionalDependencies: fsevents "~2.3.2" run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" rxjs@^7.5.1: version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz" integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: tslib "^2.1.0" safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -semver@^7.2.1: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" +"search-insights@>= 1 < 3": + version "2.17.3" -semver@^7.3.7: +semver@^7.2.1, semver@^7.3.7, semver@^7.5.3: version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" -semver@^7.5.3: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - set-function-length@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz" integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== dependencies: define-data-property "^1.1.1" @@ -2614,19 +2274,19 @@ set-function-length@^1.1.1: shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shiki@^0.14.3: version "0.14.3" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.14.3.tgz#d1a93c463942bdafb9866d74d619a4347d0bbf64" + resolved "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz" integrity sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g== dependencies: ansi-sequence-parser "^1.1.0" @@ -2636,7 +2296,7 @@ shiki@^0.14.3: side-channel@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== dependencies: call-bind "^1.0.0" @@ -2645,22 +2305,22 @@ side-channel@^1.0.4: signal-exit@^3.0.2: version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== simple-git-hooks@^2.8.1: version "2.8.1" - resolved "https://registry.yarnpkg.com/simple-git-hooks/-/simple-git-hooks-2.8.1.tgz#05e8306f3211d7eee9f5fdb5cc42521280ee82a9" + resolved "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.8.1.tgz" integrity sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog== slash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== slice-ansi@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== dependencies: ansi-styles "^4.0.0" @@ -2669,41 +2329,26 @@ slice-ansi@^3.0.0: slice-ansi@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== dependencies: ansi-styles "^4.0.0" astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -source-map-js@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" - integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== - source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - sprintf-js@~1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.14.1: version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== dependencies: asn1 "~0.2.3" @@ -2718,7 +2363,7 @@ sshpk@^1.14.1: string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -2727,55 +2372,55 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tabbable@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== table@^6.0.9: version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz" integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" @@ -2786,36 +2431,36 @@ table@^6.0.9: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= throttleit@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + resolved "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= through@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= tmp@~0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== dependencies: rimraf "^3.0.0" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tough-cookie@^4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" @@ -2823,87 +2468,92 @@ tough-cookie@^4.1.3: universalify "^0.2.0" url-parse "^1.5.3" +tslib@*, tslib@^2.1.0: + version "2.3.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + tslib@^1.8.1: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - tsutils@^3.21.0: version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@4.9.5: - version "4.9.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== +typescript@^5.7.3, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=3.7.0: + version "5.7.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz" + integrity sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw== undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + universalify@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== untildify@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -2911,17 +2561,17 @@ url-parse@^1.5.3: uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" @@ -2930,12 +2580,12 @@ verror@1.10.0: vite-plugin-css-injected-by-js@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-2.1.1.tgz#a79275241c61f1c8d55d228f5b2dded450a580e4" + resolved "https://registry.npmjs.org/vite-plugin-css-injected-by-js/-/vite-plugin-css-injected-by-js-2.1.1.tgz" integrity sha512-gjIG6iFWde32oRr/bK9CsfN+jdbura2y4GlDzeOiEm6py38ud8dXzFl9zwmHjOjZdr8XEgQ9TovzVGNzp47esw== -vite@^2.4.2: +vite@^2.4.2, vite@>2.0.0-0: version "2.6.14" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.6.14.tgz#35c09a15e4df823410819a2a239ab11efb186271" + resolved "https://registry.npmjs.org/vite/-/vite-2.6.14.tgz" integrity sha512-2HA9xGyi+EhY2MXo0+A2dRsqsAG3eFNEVIo12olkWhOmc8LfiM+eMdrXf+Ruje9gdXgvSqjLI9freec1RUM5EA== dependencies: esbuild "^0.13.2" @@ -2945,9 +2595,9 @@ vite@^2.4.2: optionalDependencies: fsevents "~2.3.2" -vite@^4.4.6: +vite@^4.0.0, vite@^4.4.6: version "4.4.7" - resolved "https://registry.yarnpkg.com/vite/-/vite-4.4.7.tgz#71b8a37abaf8d50561aca084dbb77fa342824154" + resolved "https://registry.npmjs.org/vite/-/vite-4.4.7.tgz" integrity sha512-6pYf9QJ1mHylfVh39HpuSfMPojPSKVxZvnclX1K1FyZ1PXDOcLBibdq5t1qxJSnL63ca8Wf4zts6mD8u8oc9Fw== dependencies: esbuild "^0.18.10" @@ -2958,7 +2608,7 @@ vite@^4.4.6: vitepress@1.0.0-beta.6: version "1.0.0-beta.6" - resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.0.0-beta.6.tgz#f5439bcbb53ab9a51f6f2b2a57d1bfad19cff476" + resolved "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-beta.6.tgz" integrity sha512-xK/ulKgQpKZVbvlL4+/vW49VG7ySi5nmSoKUNH1G4kM+Cj9JwYM+PDJO7jSJROv8zW99G0ise+maDYnaLlbGBQ== dependencies: "@docsearch/css" "^3.5.1" @@ -2977,33 +2627,22 @@ vitepress@1.0.0-beta.6: vscode-oniguruma@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz#439bfad8fe71abd7798338d1cd3dc53a8beea94b" + resolved "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz" integrity sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA== vscode-textmate@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-8.0.0.tgz#2c7a3b1163ef0441097e0b5d6389cd5504b59e5d" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz" integrity sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg== vue-demi@>=0.14.5: version "0.14.5" - resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.5.tgz#676d0463d1a1266d5ab5cba932e043d8f5f2fbd9" + resolved "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz" integrity sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA== -vue@^3.2.45: - version "3.2.45" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8" - integrity sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA== - dependencies: - "@vue/compiler-dom" "3.2.45" - "@vue/compiler-sfc" "3.2.45" - "@vue/runtime-dom" "3.2.45" - "@vue/server-renderer" "3.2.45" - "@vue/shared" "3.2.45" - -vue@^3.3.4: +"vue@^3.0.0-0 || ^2.6.0", vue@^3.2.25, vue@^3.2.45, vue@^3.3.4, vue@3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.4.tgz#8ed945d3873667df1d0fcf3b2463ada028f88bd6" + resolved "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz" integrity sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw== dependencies: "@vue/compiler-dom" "3.3.4" @@ -3014,19 +2653,19 @@ vue@^3.3.4: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" word-wrap@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== wrap-ansi@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: ansi-styles "^4.0.0" @@ -3035,7 +2674,7 @@ wrap-ansi@^6.2.0: wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -3044,17 +2683,17 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yauzl@^2.10.0: version "2.10.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: buffer-crc32 "~0.2.3"