diff --git a/.pnpm-debug.log b/.pnpm-debug.log new file mode 100644 index 000000000..0476c8925 --- /dev/null +++ b/.pnpm-debug.log @@ -0,0 +1,23 @@ +{ + "0 debug pnpm:scope": { + "selected": 1 + }, + "1 info pnpm": { + "err": { + "name": "Error", + "message": "not found: o", + "code": "ENOENT", + "stack": "Error: not found: o\n at getNotFoundError (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:41689:51)\n at Function.whichSync [as sync] (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:41766:13)\n at getCommandAbsolutePathSync (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:43331:44)\n at default_1 (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:43340:32)\n at /Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:179453:39" + } + }, + "2 error pnpm": { + "code": "ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL", + "prefix": "/Users/lx/Desktop/project/标准/dt-react-component", + "err": { + "name": "pnpm", + "message": "not found: o", + "code": "ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL", + "stack": "Error: not found: o\n at getNotFoundError (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:41689:51)\n at Function.whichSync [as sync] (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:41766:13)\n at getCommandAbsolutePathSync (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:43331:44)\n at default_1 (/Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:43340:32)\n at /Users/lx/.cache/node/corepack/pnpm/6.32.12/dist/pnpm.cjs:179453:39" + } + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 52da6cf54..bf3472587 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [5.1.0](https://github.com/DTStack/dt-react-component/compare/v5.0.0...v5.1.0) (2026-05-28) + +### Features + +- [#580](https://github.com/DTStack/dt-react-component/issues/580), upgrade dt-utils to v2.1.0 and refresh lockfile ([#639](https://github.com/DTStack/dt-react-component/issues/639)) ([26741e8](https://github.com/DTStack/dt-react-component/commit/26741e8b9c746865d92670c93db2d1ccf8d1b80b)) +- **chat:** support multiple conversation ([#623](https://github.com/DTStack/dt-react-component/issues/623)) ([c67e2fc](https://github.com/DTStack/dt-react-component/commit/c67e2fcc58358c2e034bdf790a8995e9ff3d312e)) +- support AI quick command feat and upgrade lock file ([#600](https://github.com/DTStack/dt-react-component/issues/600)) ([a367535](https://github.com/DTStack/dt-react-component/commit/a3675352e5dd20d1a7cd02acc29e3dae71e39f21)) + +### Bug Fixes + +- **dropdown:** optimize Dropdown.Select ([#635](https://github.com/DTStack/dt-react-component/issues/635)) ([368e331](https://github.com/DTStack/dt-react-component/commit/368e331bc0a341f59ca701b6cd511b4d8dfee921)) +- **modal:** add loading default value ([#628](https://github.com/DTStack/dt-react-component/issues/628)) ([b36ab2e](https://github.com/DTStack/dt-react-component/commit/b36ab2ec91ce909e6b92c43c444b4454f794b56a)), closes [#627](https://github.com/DTStack/dt-react-component/issues/627) +- remove deprecated code ([2a43252](https://github.com/DTStack/dt-react-component/commit/2a43252fca871a3709c2e09eb8638a73183800be)) +- **tinyTag:** via getComputedTextLength api to measure svg text element ([#636](https://github.com/DTStack/dt-react-component/issues/636)) ([db846be](https://github.com/DTStack/dt-react-component/commit/db846bea3f331f419d8933963de0c9935ffa19a2)) + ## [5.0.0](https://github.com/DTStack/dt-react-component/compare/v4.3.1...v5.0.0) (2025-11-17) ### Features diff --git a/jest.config.js b/jest.config.js index dc69c746a..50b4d5e82 100644 --- a/jest.config.js +++ b/jest.config.js @@ -14,5 +14,6 @@ module.exports = { '^lodash-es$': 'lodash', 'react-markdown': '/node_modules/react-markdown/react-markdown.min.js', '@dtinsight/react-icons': '/tests/iconMock.js', + '@dtinsight/dt-utils': '/tests/dtUtilsMock.js', }, }; diff --git a/package.json b/package.json index e46dbf8f2..74c49f24a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dt-react-component", - "version": "5.0.0", + "version": "5.1.0", "description": "react-component", "repository": "https://github.com/DTStack/dt-react-component", "main": "lib/index.js", @@ -107,15 +107,16 @@ "resize-observer-polyfill": "^1.5.1", "standard-version": "^9.5.0", "stylelint": "^14.9.1", - "ts-jest": "^29.0.3", + "ts-jest": "29.0.3", "typescript": "~4.5.2" }, "dependencies": { - "@dtinsight/dt-utils": "^1.3.1", + "@dtinsight/dt-utils": "^2.1.0", "@dtinsight/react-icons": "^1.0.0", "@handsontable/react": "2.1.0", "antd": "4.22.5", "classnames": "^2.2.6", + "dayjs": "^1.11.19", "handsontable": "6.2.2", "highlight.js": "^10.5.0", "immer": "~10.1.1", @@ -126,8 +127,9 @@ "react-markdown": "~8.0.6", "react-resizable": "^3.0.5", "react-syntax-highlighter": "~15.5.0", + "rehype-raw": "^6.0.0", "remark-gfm": "~3.0.1", - "shortid": "^2.2.16", + "shortid": "2.2.16", "showdown": "^1.9.0" }, "config": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 57da62ed5..53c110590 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ overrides: specifiers: '@commitlint/cli': ^17.1.2 '@commitlint/config-conventional': ^17.1.0 - '@dtinsight/dt-utils': ^1.3.1 + '@dtinsight/dt-utils': ^2.1.0 '@dtinsight/react-icons': ^1.0.0 '@faker-js/faker': ^7.6.0 '@handsontable/react': 2.1.0 @@ -27,6 +27,7 @@ specifiers: babel-plugin-import: ^1.13.8 classnames: ^2.2.6 cz-conventional-changelog: ^3.3.0 + dayjs: ^1.11.19 dumi: ^2.2.12 eslint: ^8.23.0 father: ~4.1.0 @@ -51,21 +52,23 @@ specifiers: react-resizable: ^3.0.5 react-syntax-highlighter: ~15.5.0 react-test-renderer: ^18.2.0 + rehype-raw: ^6.0.0 remark-gfm: ~3.0.1 resize-observer-polyfill: ^1.5.1 - shortid: ^2.2.16 + shortid: 2.2.16 showdown: ^1.9.0 standard-version: ^9.5.0 stylelint: ^14.9.1 - ts-jest: ^29.0.3 + ts-jest: 29.0.3 typescript: ~4.5.2 dependencies: - '@dtinsight/dt-utils': 1.3.1 + '@dtinsight/dt-utils': 2.1.0 '@dtinsight/react-icons': 1.2.0 '@handsontable/react': registry.npmmirror.com/@handsontable/react/2.1.0_handsontable@6.2.2 antd: registry.npmmirror.com/antd/4.22.5_react-dom@18.2.0+react@18.2.0 classnames: registry.npmmirror.com/classnames/2.3.2 + dayjs: 1.11.21 handsontable: registry.npmmirror.com/handsontable/6.2.2 highlight.js: registry.npmmirror.com/highlight.js/10.7.3 immer: 10.1.1 @@ -76,6 +79,7 @@ dependencies: react-markdown: 8.0.7_d51bdd6a322172e118eec6adc1172a28 react-resizable: 3.0.5_react-dom@18.2.0+react@18.2.0 react-syntax-highlighter: 15.5.0_react@18.2.0 + rehype-raw: 6.1.1 remark-gfm: 3.0.1 shortid: 2.2.16 showdown: registry.npmmirror.com/showdown/1.9.1 @@ -116,19 +120,11 @@ devDependencies: resize-observer-polyfill: 1.5.1 standard-version: registry.npmmirror.com/standard-version/9.5.0 stylelint: registry.npmmirror.com/stylelint/14.16.1 - ts-jest: registry.npmmirror.com/ts-jest/29.1.1_jest@29.7.0+typescript@4.5.5 + ts-jest: 29.0.3_jest@29.7.0+typescript@4.5.5 typescript: registry.npmmirror.com/typescript/4.5.5 packages: - /@babel/code-frame/7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - dev: false - /@babel/helper-module-imports/7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} engines: {node: '>=6.9.0'} @@ -144,15 +140,7 @@ packages: /@babel/helper-validator-identifier/7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - - /@babel/highlight/7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: false + dev: true /@babel/runtime/7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} @@ -201,12 +189,16 @@ packages: dev: true optional: true - /@dtinsight/dt-utils/1.3.1: - resolution: {integrity: sha512-bV3xfCUthEtPkBpsCV/798J/Fz9xhxq9QybAaXhOtfGlZRuqPrb4Irdp2ySj7UaFB4VmmDg0wTIyxv0HMyGctQ==} + /@dtinsight/dt-utils/2.1.0: + resolution: {integrity: sha512-ATFHzbPzS55zeqrcPifPGKPNyJDl6qPqe7hXvpT2Sz9aGXJdO+s65r2nPopSSXnrpNxibACjOzC0ZLBC1WmpmA==} dependencies: - dayjs: 1.11.10 - lodash: 4.17.21 - standard-version: 9.5.0 + dayjs: 1.11.21 + idb: 8.0.3 + js-base64: 3.7.8 + js-cookie: 3.0.7 + lodash-es: 4.17.21 + nanoid: 5.1.11 + ua-parser-js: 1.0.40 dev: false /@dtinsight/react-icons/1.2.0: @@ -613,10 +605,28 @@ packages: dev: true optional: true - /@hutson/parse-repository-url/3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - dev: false + /@jest/schemas/29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/types/29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.2 + '@types/node': 20.8.3 + '@types/yargs': 17.0.28 + chalk: 4.1.2 + dev: true + + /@sinclair/typebox/0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true /@swc/core-darwin-arm64/1.3.72: resolution: {integrity: sha512-oNSI5hVfZ+1xpj+dH1g4kQqA0VsGtqd8S9S+cDqkHZiOOVOevw9KN6dzVtmLOcPtlULVypVc0TVvsB55KdVZhQ==} @@ -717,7 +727,22 @@ packages: resolution: {integrity: sha512-47rJE80oqPmFdVDCD7IheXBrVdwuBgsYwoczFvKmwfo2Mzsnt+V9OONsYauFmICb6lQPpCuXYJWejBNs4pDJRg==} dependencies: '@types/unist': 2.0.8 - dev: false + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.1: + resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.2: + resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + dependencies: + '@types/istanbul-lib-report': 3.0.1 + dev: true /@types/lodash-es/4.17.12: resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} @@ -734,16 +759,15 @@ packages: dependencies: '@types/unist': 2.0.8 - /@types/minimist/1.2.3: - resolution: {integrity: sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==} - dev: false - /@types/ms/0.7.32: resolution: {integrity: sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==} - /@types/normalize-package-data/2.4.2: - resolution: {integrity: sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==} - dev: false + /@types/node/20.8.3: + resolution: {integrity: sha512-jxiZQFpb+NlH5kjW49vXxvxTjeeqlbsnTAdBTKpzEdPs9itay7MscYXz3Fo9VYFEsfQ6LJFitHad3faerLAjCw==} + dev: true + + /@types/parse5/6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} /@types/prop-types/15.7.8: resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==} @@ -779,6 +803,16 @@ packages: /@types/unist/2.0.8: resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + /@types/yargs-parser/21.0.1: + resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} + dev: true + + /@types/yargs/17.0.28: + resolution: {integrity: sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==} + dependencies: + '@types/yargs-parser': 21.0.1 + dev: true + /@umijs/es-module-parser-darwin-arm64/0.0.7: resolution: {integrity: sha512-1QeNupekuVYVvL4UHyCRq4ISP2PNk4rDd9UOPONW+KpqTyP9p7RfgGpwB0VLPaFSu2ADtm0XZyIaYEGPY6zuDw==} engines: {node: '>= 10'} @@ -860,36 +894,12 @@ packages: dev: true optional: true - /JSONStream/1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: false - - /add-stream/1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: false - - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false - - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: false - /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false + dev: true /ant-design-testing/1.1.0_a0d231a90a97d3adec3c82905128da0d: resolution: {integrity: sha512-gyjKZGde6Ql59FQ82/G2tAGVrMnWunCu7lYccClcJIPRVyZkVy1OHHSbUhKmscOYua/70/hRtIKVcwBtPLe0qg==} @@ -902,15 +912,6 @@ packages: antd: registry.npmmirror.com/antd/4.22.5_react-dom@18.2.0+react@18.2.0 dev: true - /array-ify/1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: false - - /arrify/1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: false - /babel-plugin-import/1.13.8: resolution: {integrity: sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==} dependencies: @@ -920,46 +921,23 @@ packages: /bail/2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false - - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false - - /camelcase-keys/6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: false - - /camelcase/5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: false + fast-json-stable-stringify: 2.1.0 + dev: true /ccount/2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - /chalk/2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: false + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true /character-entities-legacy/1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -976,42 +954,29 @@ packages: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} dev: false + /ci-info/3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + /classnames/2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - /cliui/7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - /clsx/1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} dev: false - /color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: false - /color-convert/2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: false - - /color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false + dev: true /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false + dev: true /comma-separated-tokens/1.0.8: resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} @@ -1019,7 +984,6 @@ packages: /comma-separated-tokens/2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false /commander/2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1037,211 +1001,12 @@ packages: dev: true optional: true - /compare-func/2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: false - - /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false - - /concat-stream/2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.2 - typedarray: 0.0.6 - dev: false - - /conventional-changelog-angular/5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: false - - /conventional-changelog-atom/2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: false - - /conventional-changelog-codemirror/2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: false - - /conventional-changelog-config-spec/2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - dev: false - - /conventional-changelog-conventionalcommits/4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: false - - /conventional-changelog-core/4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} - dependencies: - add-stream: 1.0.0 - conventional-changelog-writer: 5.0.1 - conventional-commits-parser: 3.2.4 - dateformat: 3.0.3 - get-pkg-repo: 4.2.1 - git-raw-commits: 2.0.11 - git-remote-origin-url: 2.0.0 - git-semver-tags: 4.1.1 - lodash: 4.17.21 - normalize-package-data: 3.0.3 - q: 1.5.1 - read-pkg: 3.0.0 - read-pkg-up: 3.0.0 - through2: 4.0.2 - dev: false - - /conventional-changelog-ember/2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: false - - /conventional-changelog-eslint/3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: false - - /conventional-changelog-express/2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: false - - /conventional-changelog-jquery/3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} - dependencies: - q: 1.5.1 - dev: false - - /conventional-changelog-jshint/2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: false - - /conventional-changelog-preset-loader/2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} - dev: false - - /conventional-changelog-writer/5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - conventional-commits-filter: 2.0.7 - dateformat: 3.0.3 - handlebars: 4.7.8 - json-stringify-safe: 5.0.1 - lodash: 4.17.21 - meow: 8.1.2 - semver: 6.3.1 - split: 1.0.1 - through2: 4.0.2 - dev: false - - /conventional-changelog/3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} - dependencies: - conventional-changelog-angular: 5.0.13 - conventional-changelog-atom: 2.0.8 - conventional-changelog-codemirror: 2.0.8 - conventional-changelog-conventionalcommits: 4.6.3 - conventional-changelog-core: 4.2.4 - conventional-changelog-ember: 2.0.9 - conventional-changelog-eslint: 3.0.9 - conventional-changelog-express: 2.0.6 - conventional-changelog-jquery: 3.0.11 - conventional-changelog-jshint: 2.0.9 - conventional-changelog-preset-loader: 2.3.4 - dev: false - - /conventional-commits-filter/2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} - dependencies: - lodash.ismatch: 4.4.0 - modify-values: 1.0.1 - dev: false - - /conventional-commits-parser/3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - is-text-path: 1.0.1 - JSONStream: 1.3.5 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: false - - /conventional-recommended-bump/6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - concat-stream: 2.0.0 - conventional-changelog-preset-loader: 2.3.4 - conventional-commits-filter: 2.0.7 - conventional-commits-parser: 3.2.4 - git-raw-commits: 2.0.11 - git-semver-tags: 4.1.1 - meow: 8.1.2 - q: 1.5.1 - dev: false - - /core-util-is/1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - /csstype/3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true - /dargs/7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: false - - /dateformat/3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: false - - /dayjs/1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + /dayjs/1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} dev: false /debug/3.2.7: @@ -1267,19 +1032,6 @@ packages: dependencies: ms: 2.1.2 - /decamelize-keys/1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: false - - /decamelize/1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: false - /decode-named-character-reference/1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: @@ -1289,39 +1041,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - /detect-indent/6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: false - - /detect-newline/3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: false - /diff/5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} - /dot-prop/5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: false - - /dotgitignore/2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} - dependencies: - find-up: 3.0.0 - minimatch: 3.1.2 - dev: false - - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - /errno/0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -1331,22 +1054,6 @@ packages: dev: true optional: true - /error-ex/1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: false - - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false - - /escape-string-regexp/1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: false - /escape-string-regexp/5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} @@ -1354,49 +1061,16 @@ packages: /extend/3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + /fault/1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} dependencies: format: 0.2.2 dev: false - /figures/3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: false - - /find-up/2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - dependencies: - locate-path: 2.0.0 - dev: false - - /find-up/3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - dev: false - - /find-up/4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: false - - /find-up/5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: false - /format/0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} @@ -1410,91 +1084,59 @@ packages: dev: true optional: true - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true - /get-pkg-repo/4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true - dependencies: - '@hutson/parse-repository-url': 3.0.2 - hosted-git-info: 4.1.0 - through2: 2.0.5 - yargs: 16.2.0 - dev: false + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true - /git-raw-commits/2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true + /hast-util-from-parse5/7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: false + '@types/hast': 2.3.6 + '@types/unist': 2.0.8 + hastscript: 7.2.0 + property-information: 6.3.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 - /git-remote-origin-url/2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} - dependencies: - gitconfiglocal: 1.0.0 - pify: 2.3.0 + /hast-util-parse-selector/2.2.5: + resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} dev: false - /git-semver-tags/4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} - hasBin: true + /hast-util-parse-selector/3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} dependencies: - meow: 8.1.2 - semver: 6.3.1 - dev: false + '@types/hast': 2.3.6 - /gitconfiglocal/1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + /hast-util-raw/7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} dependencies: - ini: 1.3.8 - dev: false - - /graceful-fs/4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + '@types/hast': 2.3.6 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 - /handlebars/4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + /hast-util-to-parse5/7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.17.4 - dev: false - - /hard-rejection/2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: false - - /has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false - - /has/1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - dev: false - - /hast-util-parse-selector/2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} - dev: false + '@types/hast': 2.3.6 + comma-separated-tokens: 2.0.3 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 /hast-util-whitespace/2.0.1: resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} @@ -1510,19 +1152,24 @@ packages: space-separated-tokens: 1.1.5 dev: false + /hastscript/7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.6 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + /highlight.js/10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} dev: false - /hosted-git-info/2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: false + /html-void-elements/2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - /hosted-git-info/4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 + /idb/8.0.3: + resolution: {integrity: sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==} dev: false /image-size/0.5.5: @@ -1537,19 +1184,6 @@ packages: resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==} dev: false - /indent-string/4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: false - - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false - - /ini/1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false - /inline-style-parser/0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false @@ -1565,20 +1199,10 @@ packages: is-decimal: 1.0.4 dev: false - /is-arrayish/0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false - /is-buffer/2.0.5: resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} engines: {node: '>=4'} - /is-core-module/2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.4 - dev: false - /is-decimal/1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} dev: false @@ -1587,64 +1211,50 @@ packages: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} dev: true - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false - /is-hexadecimal/1.0.4: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} dev: false - /is-obj/2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: false - - /is-plain-obj/1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: false - /is-plain-obj/4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - /is-text-path/1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + /jest-util/29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - text-extensions: 1.9.0 + '@jest/types': 29.6.3 + '@types/node': 20.8.3 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /js-base64/3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} dev: false - /isarray/1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + /js-cookie/3.0.7: + resolution: {integrity: sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==} + engines: {node: '>=20'} dev: false /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - /json-parse-better-errors/1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: false - - /json-parse-even-better-errors/2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false - - /json-stringify-safe/5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false - - /jsonparse/1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + /json5/1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist/1.2.8 + dev: true - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: false + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} @@ -1722,60 +1332,17 @@ packages: dev: true optional: true - /lines-and-columns/1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false - - /load-json-file/4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - dependencies: - graceful-fs: 4.2.11 - parse-json: 4.0.0 - pify: 3.0.0 - strip-bom: 3.0.0 - dev: false - - /locate-path/2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - dependencies: - p-locate: 2.0.0 - path-exists: 3.0.0 - dev: false - - /locate-path/3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: false - - /locate-path/5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: false - - /locate-path/6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: false - /lodash-es/4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false - /lodash.ismatch/4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: false + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true /longest-streak/3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} @@ -1793,12 +1360,25 @@ packages: highlight.js: 10.7.3 dev: false + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: registry.npmmirror.com/pseudomap/1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: false + dev: true /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} @@ -1810,15 +1390,9 @@ packages: dev: true optional: true - /map-obj/1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: false - - /map-obj/4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: false + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true /markdown-table/3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} @@ -1943,23 +1517,6 @@ packages: dependencies: '@types/mdast': 3.0.13 - /meow/8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.3 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: false - /micromark-core-commonmark/1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: @@ -2187,35 +1744,6 @@ packages: dev: true optional: true - /min-indent/1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: false - - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimist-options/4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: false - - /minimist/1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /modify-values/1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: false - /moment/2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} requiresBuild: true @@ -2243,6 +1771,12 @@ packages: hasBin: true dev: true + /nanoid/5.1.11: + resolution: {integrity: sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==} + engines: {node: ^18 || >=20} + hasBin: true + dev: false + /needle/3.2.0: resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==} engines: {node: '>= 4.4.x'} @@ -2257,92 +1791,10 @@ packages: dev: true optional: true - /neo-async/2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false - - /normalize-package-data/2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.6 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 - dev: false - - /normalize-package-data/3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.13.0 - semver: 7.5.4 - validate-npm-package-license: 3.0.4 - dev: false - /object-assign/4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /p-limit/1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - dependencies: - p-try: 1.0.0 - dev: false - - /p-limit/2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: false - - /p-limit/3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: false - - /p-locate/2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - dependencies: - p-limit: 1.3.0 - dev: false - - /p-locate/3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 - dev: false - - /p-locate/4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: false - - /p-locate/5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: false - - /p-try/1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: false - - /p-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: false - /parse-entities/2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} dependencies: @@ -2354,54 +1806,13 @@ packages: is-hexadecimal: 1.0.4 dev: false - /parse-json/4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - dependencies: - error-ex: 1.3.2 - json-parse-better-errors: 1.0.2 - dev: false - - /parse-json/5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.13 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: false - - /path-exists/3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: false - - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false - - /path-parse/1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - /path-type/3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: false - - /pify/2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false - - /pify/3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: false + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true /prismjs/1.27.0: resolution: {integrity: sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==} @@ -2413,10 +1824,6 @@ packages: engines: {node: '>=6'} dev: false - /process-nextick-args/2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false - /prop-types/15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: @@ -2432,17 +1839,6 @@ packages: /property-information/6.3.0: resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} - dev: false - - /q/1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: false - - /quick-lru/4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: false /react-dom/16.13.1_react@16.13.1: resolution: {integrity: sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==} @@ -2553,71 +1949,6 @@ packages: loose-envify: 1.4.0 dev: true - /read-pkg-up/3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: false - - /read-pkg-up/7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: false - - /read-pkg/3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - dependencies: - load-json-file: 4.0.0 - normalize-package-data: 2.5.0 - path-type: 3.0.0 - dev: false - - /read-pkg/5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.2 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: false - - /readable-stream/2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - - /readable-stream/3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /redent/3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: false - /refractor/3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} dependencies: @@ -2629,6 +1960,14 @@ packages: /regenerator-runtime/0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + /rehype-raw/6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} + dependencies: + '@types/hast': 2.3.6 + hast-util-raw: 7.2.3 + unified: 10.1.2 + dev: false + /remark-gfm/3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: @@ -2658,37 +1997,15 @@ packages: unified: 10.1.2 dev: false - /require-directory/2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - /resize-observer-polyfill/1.5.1: resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - /resolve/1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: false - /sade/1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} dependencies: mri: 1.2.0 - /safe-buffer/5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /safe-buffer/5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - /scheduler/0.19.1: resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} dependencies: @@ -2699,11 +2016,12 @@ packages: /semver/5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true + dev: true /semver/6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: false + dev: true /semver/7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -2711,7 +2029,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: false + dev: true /shortid/2.2.16: resolution: {integrity: sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==} @@ -2722,6 +2040,7 @@ packages: /source-map/0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: true /source-map/0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} @@ -2734,107 +2053,6 @@ packages: /space-separated-tokens/2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false - - /spdx-correct/3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 - dev: false - - /spdx-exceptions/2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: false - - /spdx-expression-parse/3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 - dev: false - - /spdx-license-ids/3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: false - - /split/1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - dependencies: - through: 2.3.8 - dev: false - - /split2/3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.2 - dev: false - - /standard-version/9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - chalk: 2.4.2 - conventional-changelog: 3.1.25 - conventional-changelog-config-spec: 2.1.0 - conventional-changelog-conventionalcommits: 4.6.3 - conventional-recommended-bump: 6.1.0 - detect-indent: 6.1.0 - detect-newline: 3.1.0 - dotgitignore: 2.1.0 - figures: 3.2.0 - find-up: 5.0.0 - git-semver-tags: 4.1.1 - semver: 7.5.4 - stringify-package: 1.0.1 - yargs: 16.2.0 - dev: false - - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string_decoder/1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false - - /string_decoder/1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /stringify-package/1.0.1: - resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} - deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - dev: false - - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-bom/3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false - - /strip-indent/3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: false /style-to-object/0.4.2: resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} @@ -2842,39 +2060,12 @@ packages: inline-style-parser: 0.1.1 dev: false - /supports-color/5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: false - - /supports-preserve-symlinks-flag/1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false - - /text-extensions/1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: false - - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false - - /through2/2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - dev: false - - /through2/4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: - readable-stream: 3.6.2 - dev: false + has-flag: 4.0.0 + dev: true /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -2885,31 +2076,45 @@ packages: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false - /trim-newlines/3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: false - /trough/2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - /type-fest/0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: false - - /type-fest/0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: false - - /type-fest/0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: false + /ts-jest/29.0.3_jest@29.7.0+typescript@4.5.5: + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: registry.npmmirror.com/jest/29.7.0 + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: registry.npmmirror.com/typescript/4.5.5 + yargs-parser: 21.1.1 + dev: true - /typedarray/0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + /ua-parser-js/1.0.40: + resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} + hasBin: true dev: false /uglify-js/3.17.4: @@ -2917,6 +2122,7 @@ packages: engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true + dev: true optional: true /unified/10.1.2: @@ -2943,7 +2149,6 @@ packages: resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: '@types/unist': 2.0.8 - dev: false /unist-util-stringify-position/3.0.3: resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} @@ -2963,10 +2168,6 @@ packages: unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - /util-deprecate/1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - /uvu/0.5.6: resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} engines: {node: '>=8'} @@ -2977,12 +2178,11 @@ packages: kleur: 4.1.5 sade: 1.8.1 - /validate-npm-package-license/3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + /vfile-location/4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - dev: false + '@types/unist': 2.0.8 + vfile: 5.3.7 /vfile-message/3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} @@ -2998,55 +2198,35 @@ packages: unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - /wordwrap/1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: false - - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: false + /web-namespaces/2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} /xtend/4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} dev: false - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false + dev: true /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: false - - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: false + dev: true - /yocto-queue/0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: false + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true /zwitch/2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3174,8 +2354,8 @@ packages: convert-source-map: registry.npmmirror.com/convert-source-map/1.9.0 debug: registry.npmmirror.com/debug/4.3.4 gensync: registry.npmmirror.com/gensync/1.0.0-beta.2 - json5: registry.npmmirror.com/json5/2.2.3 - semver: registry.npmmirror.com/semver/6.3.1 + json5: 2.2.3 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -3199,8 +2379,8 @@ packages: convert-source-map: registry.npmmirror.com/convert-source-map/2.0.0 debug: registry.npmmirror.com/debug/4.3.4 gensync: registry.npmmirror.com/gensync/1.0.0-beta.2 - json5: registry.npmmirror.com/json5/2.2.3 - semver: registry.npmmirror.com/semver/6.3.1 + json5: 2.2.3 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -3219,7 +2399,7 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals': registry.npmmirror.com/@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1 eslint: registry.npmmirror.com/eslint/8.51.0 eslint-visitor-keys: registry.npmmirror.com/eslint-visitor-keys/2.1.0 - semver: registry.npmmirror.com/semver/6.3.1 + semver: 6.3.1 dev: true registry.npmmirror.com/@babel/generator/7.23.0: @@ -3252,8 +2432,8 @@ packages: '@babel/compat-data': registry.npmmirror.com/@babel/compat-data/7.22.20 '@babel/helper-validator-option': registry.npmmirror.com/@babel/helper-validator-option/7.22.15 browserslist: registry.npmmirror.com/browserslist/4.22.1 - lru-cache: registry.npmmirror.com/lru-cache/5.1.1 - semver: registry.npmmirror.com/semver/6.3.1 + lru-cache: 5.1.1 + semver: 6.3.1 dev: true registry.npmmirror.com/@babel/helper-environment-visitor/7.22.20: @@ -4639,7 +3819,7 @@ packages: '@types/node': registry.npmmirror.com/@types/node/20.8.3 chalk: registry.npmmirror.com/chalk/4.1.2 jest-message-util: registry.npmmirror.com/jest-message-util/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 slash: registry.npmmirror.com/slash/3.0.0 dev: true @@ -4778,7 +3958,7 @@ packages: istanbul-lib-source-maps: registry.npmmirror.com/istanbul-lib-source-maps/4.0.1 istanbul-reports: registry.npmmirror.com/istanbul-reports/3.1.6 jest-message-util: registry.npmmirror.com/jest-message-util/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 jest-worker: registry.npmmirror.com/jest-worker/29.7.0 slash: registry.npmmirror.com/slash/3.0.0 string-length: registry.npmmirror.com/string-length/4.0.2 @@ -4844,11 +4024,11 @@ packages: babel-plugin-istanbul: registry.npmmirror.com/babel-plugin-istanbul/6.1.1 chalk: registry.npmmirror.com/chalk/4.1.2 convert-source-map: registry.npmmirror.com/convert-source-map/2.0.0 - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 + fast-json-stable-stringify: 2.1.0 graceful-fs: registry.npmmirror.com/graceful-fs/4.2.11 jest-haste-map: registry.npmmirror.com/jest-haste-map/29.7.0 jest-regex-util: registry.npmmirror.com/jest-regex-util/29.6.3 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 micromatch: registry.npmmirror.com/micromatch/4.0.5 pirates: registry.npmmirror.com/pirates/4.0.6 slash: registry.npmmirror.com/slash/3.0.0 @@ -4865,9 +4045,9 @@ packages: dependencies: '@types/istanbul-lib-coverage': registry.npmmirror.com/@types/istanbul-lib-coverage/2.0.4 '@types/istanbul-reports': registry.npmmirror.com/@types/istanbul-reports/3.0.2 - '@types/node': registry.npmmirror.com/@types/node/20.8.3 + '@types/node': 20.8.3 '@types/yargs': registry.npmmirror.com/@types/yargs/16.0.6 - chalk: registry.npmmirror.com/chalk/4.1.2 + chalk: 4.1.2 dev: true registry.npmmirror.com/@jest/types/29.6.3: @@ -5725,7 +4905,7 @@ packages: name: '@types/keyv' version: 3.1.4 dependencies: - '@types/node': registry.npmmirror.com/@types/node/20.8.3 + '@types/node': 20.8.3 dev: true registry.npmmirror.com/@types/mdast/3.0.13: @@ -5778,12 +4958,6 @@ packages: version: 4.0.0 dev: true - registry.npmmirror.com/@types/parse5/6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/parse5/-/parse5-6.0.3.tgz} - name: '@types/parse5' - version: 6.0.3 - dev: true - registry.npmmirror.com/@types/prop-types/15.7.8: resolution: {integrity: sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.8.tgz} name: '@types/prop-types' @@ -5827,7 +5001,7 @@ packages: name: '@types/responselike' version: 1.0.1 dependencies: - '@types/node': registry.npmmirror.com/@types/node/20.8.3 + '@types/node': 20.8.3 dev: true registry.npmmirror.com/@types/sax/1.2.5: @@ -5958,7 +5132,7 @@ packages: graphemer: registry.npmmirror.com/graphemer/1.4.0 ignore: registry.npmmirror.com/ignore/5.2.4 natural-compare-lite: registry.npmmirror.com/natural-compare-lite/1.4.0 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 tsutils: registry.npmmirror.com/tsutils/3.21.0_typescript@4.5.5 typescript: registry.npmmirror.com/typescript/4.5.5 transitivePeerDependencies: @@ -6107,7 +5281,7 @@ packages: debug: registry.npmmirror.com/debug/4.3.4 globby: registry.npmmirror.com/globby/11.1.0 is-glob: registry.npmmirror.com/is-glob/4.0.3 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 tsutils: registry.npmmirror.com/tsutils/3.21.0_typescript@4.5.5 typescript: registry.npmmirror.com/typescript/4.5.5 transitivePeerDependencies: @@ -6131,7 +5305,7 @@ packages: debug: registry.npmmirror.com/debug/4.3.4 globby: registry.npmmirror.com/globby/11.1.0 is-glob: registry.npmmirror.com/is-glob/4.0.3 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 tsutils: registry.npmmirror.com/tsutils/3.21.0_typescript@4.5.5 typescript: registry.npmmirror.com/typescript/4.5.5 transitivePeerDependencies: @@ -6176,7 +5350,7 @@ packages: '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree/5.62.0_typescript@4.5.5 eslint: registry.npmmirror.com/eslint/8.22.0 eslint-scope: registry.npmmirror.com/eslint-scope/5.1.1 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -6199,7 +5373,7 @@ packages: '@typescript-eslint/typescript-estree': registry.npmmirror.com/@typescript-eslint/typescript-estree/5.62.0_typescript@4.5.5 eslint: registry.npmmirror.com/eslint/8.51.0 eslint-scope: registry.npmmirror.com/eslint-scope/5.1.1 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript @@ -7776,15 +6950,6 @@ packages: update-browserslist-db: registry.npmmirror.com/update-browserslist-db/1.0.13_browserslist@4.22.1 dev: true - registry.npmmirror.com/bs-logger/0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bs-logger/-/bs-logger-0.2.6.tgz} - name: bs-logger - version: 0.2.6 - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 - dev: true - registry.npmmirror.com/bser/2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bser/-/bser-2.1.1.tgz} name: bser @@ -7862,7 +7027,7 @@ packages: name: builtins version: 5.0.1 dependencies: - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 dev: true registry.npmmirror.com/bundle-name/3.0.0: @@ -7883,7 +7048,7 @@ packages: chownr: registry.npmmirror.com/chownr/1.1.4 glob: registry.npmmirror.com/glob/7.2.3 graceful-fs: 4.2.11 - lru-cache: registry.npmmirror.com/lru-cache/4.1.5 + lru-cache: 4.1.5 mississippi: registry.npmmirror.com/mississippi/2.0.0 mkdirp: registry.npmmirror.com/mkdirp/0.5.6 move-concurrently: registry.npmmirror.com/move-concurrently/1.0.1 @@ -7903,7 +7068,7 @@ packages: chownr: registry.npmmirror.com/chownr/1.1.4 glob: registry.npmmirror.com/glob/7.2.3 graceful-fs: 4.2.11 - lru-cache: registry.npmmirror.com/lru-cache/4.1.5 + lru-cache: 4.1.5 mississippi: registry.npmmirror.com/mississippi/1.3.1 mkdirp: registry.npmmirror.com/mkdirp/0.5.6 move-concurrently: registry.npmmirror.com/move-concurrently/1.0.1 @@ -8692,7 +7857,7 @@ packages: json-stringify-safe: registry.npmmirror.com/json-stringify-safe/5.0.1 lodash: 4.17.21 meow: registry.npmmirror.com/meow/8.1.2 - semver: registry.npmmirror.com/semver/6.3.1 + semver: 6.3.1 split: registry.npmmirror.com/split/1.0.1 through2: registry.npmmirror.com/through2/4.0.2 dev: true @@ -8952,7 +8117,7 @@ packages: exit: registry.npmmirror.com/exit/0.1.2 graceful-fs: registry.npmmirror.com/graceful-fs/4.2.11 jest-config: registry.npmmirror.com/jest-config/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 prompts: registry.npmmirror.com/prompts/2.4.2 transitivePeerDependencies: - '@types/node' @@ -8972,7 +8137,7 @@ packages: name: cross-spawn version: 5.1.0 dependencies: - lru-cache: registry.npmmirror.com/lru-cache/4.1.5 + lru-cache: 4.1.5 shebang-command: registry.npmmirror.com/shebang-command/1.2.0 which: registry.npmmirror.com/which/1.3.1 dev: true @@ -9338,12 +8503,6 @@ packages: version: 3.0.3 dev: true - registry.npmmirror.com/dayjs/1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz} - name: dayjs - version: 1.11.10 - dev: false - registry.npmmirror.com/debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz} name: debug @@ -10022,7 +9181,7 @@ packages: engines: {node: '>=0.8'} dependencies: errlop: registry.npmmirror.com/errlop/2.2.0 - semver: registry.npmmirror.com/semver/6.3.1 + semver: 6.3.1 dev: true registry.npmmirror.com/electron-to-chromium/1.4.544: @@ -10748,7 +9907,7 @@ packages: object.values: registry.npmmirror.com/object.values/1.1.7 prop-types: 15.8.1 resolve: registry.npmmirror.com/resolve/2.0.0-next.4 - semver: registry.npmmirror.com/semver/6.3.1 + semver: 6.3.1 string.prototype.matchall: registry.npmmirror.com/string.prototype.matchall/4.0.10 dev: true @@ -12336,13 +11495,13 @@ packages: name: hast-util-from-parse5 version: 7.1.2 dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 '@types/unist': 2.0.8 - hastscript: registry.npmmirror.com/hastscript/7.2.0 - property-information: registry.npmmirror.com/property-information/6.3.0 - vfile: registry.npmmirror.com/vfile/5.3.7 - vfile-location: registry.npmmirror.com/vfile-location/4.1.0 - web-namespaces: registry.npmmirror.com/web-namespaces/2.0.1 + hastscript: 7.2.0 + property-information: 6.3.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 dev: true registry.npmmirror.com/hast-util-has-property/2.0.1: @@ -12356,7 +11515,7 @@ packages: name: hast-util-heading-rank version: 2.1.1 dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 dev: true registry.npmmirror.com/hast-util-is-conditional-comment/2.0.0: @@ -12364,7 +11523,7 @@ packages: name: hast-util-is-conditional-comment version: 2.0.0 dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 dev: true registry.npmmirror.com/hast-util-is-element/2.1.3: @@ -12376,32 +11535,6 @@ packages: '@types/unist': registry.npmmirror.com/@types/unist/2.0.8 dev: true - registry.npmmirror.com/hast-util-parse-selector/3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz} - name: hast-util-parse-selector - version: 3.1.1 - dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 - dev: true - - registry.npmmirror.com/hast-util-raw/7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-7.2.3.tgz} - name: hast-util-raw - version: 7.2.3 - dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 - '@types/parse5': registry.npmmirror.com/@types/parse5/6.0.3 - hast-util-from-parse5: registry.npmmirror.com/hast-util-from-parse5/7.1.2 - hast-util-to-parse5: registry.npmmirror.com/hast-util-to-parse5/7.1.0 - html-void-elements: registry.npmmirror.com/html-void-elements/2.0.1 - parse5: registry.npmmirror.com/parse5/6.0.1 - unist-util-position: registry.npmmirror.com/unist-util-position/4.0.4 - unist-util-visit: registry.npmmirror.com/unist-util-visit/4.1.2 - vfile: 5.3.7 - web-namespaces: registry.npmmirror.com/web-namespaces/2.0.1 - zwitch: registry.npmmirror.com/zwitch/2.0.4 - dev: true - registry.npmmirror.com/hast-util-raw/8.0.0: resolution: {integrity: sha512-bKbaUxMNLjZMMowgcrc4l3aQSPiMLiceZD+mp+AKF8Si0mtyR2DYVdxzS2XBxXYDeW/VvfZy40lNxHRiY6MMTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hast-util-raw/-/hast-util-raw-8.0.0.tgz} name: hast-util-raw @@ -12450,17 +11583,17 @@ packages: name: hast-util-to-html version: 8.0.4 dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 '@types/unist': 2.0.8 ccount: registry.npmmirror.com/ccount/2.0.1 comma-separated-tokens: registry.npmmirror.com/comma-separated-tokens/2.0.3 - hast-util-raw: registry.npmmirror.com/hast-util-raw/7.2.3 + hast-util-raw: 7.2.3 hast-util-whitespace: registry.npmmirror.com/hast-util-whitespace/2.0.1 - html-void-elements: registry.npmmirror.com/html-void-elements/2.0.1 - property-information: registry.npmmirror.com/property-information/6.3.0 + html-void-elements: 2.0.1 + property-information: 6.3.0 space-separated-tokens: registry.npmmirror.com/space-separated-tokens/2.0.2 stringify-entities: registry.npmmirror.com/stringify-entities/4.0.3 - zwitch: registry.npmmirror.com/zwitch/2.0.4 + zwitch: 2.0.4 dev: true registry.npmmirror.com/hast-util-to-parse5/7.1.0: @@ -12468,12 +11601,12 @@ packages: name: hast-util-to-parse5 version: 7.1.0 dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 comma-separated-tokens: registry.npmmirror.com/comma-separated-tokens/2.0.3 - property-information: registry.npmmirror.com/property-information/6.3.0 + property-information: 6.3.0 space-separated-tokens: registry.npmmirror.com/space-separated-tokens/2.0.2 - web-namespaces: registry.npmmirror.com/web-namespaces/2.0.1 - zwitch: registry.npmmirror.com/zwitch/2.0.4 + web-namespaces: 2.0.1 + zwitch: 2.0.4 dev: true registry.npmmirror.com/hast-util-to-string/2.0.0: @@ -12490,18 +11623,6 @@ packages: version: 2.0.1 dev: true - registry.npmmirror.com/hastscript/7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/hastscript/-/hastscript-7.2.0.tgz} - name: hastscript - version: 7.2.0 - dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 - comma-separated-tokens: registry.npmmirror.com/comma-separated-tokens/2.0.3 - hast-util-parse-selector: registry.npmmirror.com/hast-util-parse-selector/3.1.1 - property-information: registry.npmmirror.com/property-information/6.3.0 - space-separated-tokens: registry.npmmirror.com/space-separated-tokens/2.0.2 - dev: true - registry.npmmirror.com/he/1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/he/-/he-1.2.0.tgz} name: he @@ -12576,7 +11697,7 @@ packages: version: 4.1.0 engines: {node: '>=10'} dependencies: - lru-cache: registry.npmmirror.com/lru-cache/6.0.0 + lru-cache: 6.0.0 dev: true registry.npmmirror.com/hosted-git-info/6.1.1: @@ -13684,7 +12805,7 @@ packages: '@babel/parser': registry.npmmirror.com/@babel/parser/7.23.0 '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema/0.1.3 istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage/3.2.0 - semver: registry.npmmirror.com/semver/6.3.1 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -13699,7 +12820,7 @@ packages: '@babel/parser': registry.npmmirror.com/@babel/parser/7.23.0 '@istanbuljs/schema': registry.npmmirror.com/@istanbuljs/schema/0.1.3 istanbul-lib-coverage: registry.npmmirror.com/istanbul-lib-coverage/3.2.0 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true @@ -13768,7 +12889,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: registry.npmmirror.com/execa/5.1.1 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 p-limit: registry.npmmirror.com/p-limit/3.1.0 dev: true @@ -13792,7 +12913,7 @@ packages: jest-message-util: registry.npmmirror.com/jest-message-util/29.7.0 jest-runtime: registry.npmmirror.com/jest-runtime/29.7.0 jest-snapshot: registry.npmmirror.com/jest-snapshot/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 p-limit: registry.npmmirror.com/p-limit/3.1.0 pretty-format: registry.npmmirror.com/pretty-format/29.7.0 pure-rand: registry.npmmirror.com/pure-rand/6.0.4 @@ -13862,7 +12983,7 @@ packages: jest-regex-util: registry.npmmirror.com/jest-regex-util/29.6.3 jest-resolve: registry.npmmirror.com/jest-resolve/29.7.0 jest-runner: registry.npmmirror.com/jest-runner/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 jest-validate: registry.npmmirror.com/jest-validate/29.7.0 micromatch: registry.npmmirror.com/micromatch/4.0.5 parse-json: registry.npmmirror.com/parse-json/5.2.0 @@ -13905,7 +13026,7 @@ packages: jest-regex-util: registry.npmmirror.com/jest-regex-util/29.6.3 jest-resolve: registry.npmmirror.com/jest-resolve/29.7.0 jest-runner: registry.npmmirror.com/jest-runner/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 jest-validate: registry.npmmirror.com/jest-validate/29.7.0 micromatch: registry.npmmirror.com/micromatch/4.0.5 parse-json: registry.npmmirror.com/parse-json/5.2.0 @@ -13944,10 +13065,10 @@ packages: version: 29.7.0 engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': registry.npmmirror.com/@jest/types/29.6.3 - chalk: registry.npmmirror.com/chalk/4.1.2 + '@jest/types': 29.6.3 + chalk: 4.1.2 jest-get-type: registry.npmmirror.com/jest-get-type/29.6.3 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 pretty-format: registry.npmmirror.com/pretty-format/29.7.0 dev: true @@ -13987,7 +13108,7 @@ packages: '@jest/types': registry.npmmirror.com/@jest/types/29.6.3 '@types/node': registry.npmmirror.com/@types/node/20.8.3 jest-mock: registry.npmmirror.com/jest-mock/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 dev: true registry.npmmirror.com/jest-get-type/29.6.3: @@ -14010,7 +13131,7 @@ packages: fb-watchman: registry.npmmirror.com/fb-watchman/2.0.2 graceful-fs: registry.npmmirror.com/graceful-fs/4.2.11 jest-regex-util: registry.npmmirror.com/jest-regex-util/29.6.3 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 jest-worker: registry.npmmirror.com/jest-worker/29.7.0 micromatch: registry.npmmirror.com/micromatch/4.0.5 walker: registry.npmmirror.com/walker/1.0.8 @@ -14112,7 +13233,7 @@ packages: graceful-fs: registry.npmmirror.com/graceful-fs/4.2.11 jest-haste-map: registry.npmmirror.com/jest-haste-map/29.7.0 jest-pnp-resolver: registry.npmmirror.com/jest-pnp-resolver/1.2.3_jest-resolve@29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 jest-validate: registry.npmmirror.com/jest-validate/29.7.0 resolve: registry.npmmirror.com/resolve/1.22.6 resolve.exports: registry.npmmirror.com/resolve.exports/2.0.2 @@ -14141,7 +13262,7 @@ packages: jest-message-util: registry.npmmirror.com/jest-message-util/29.7.0 jest-resolve: registry.npmmirror.com/jest-resolve/29.7.0 jest-runtime: registry.npmmirror.com/jest-runtime/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 jest-watcher: registry.npmmirror.com/jest-watcher/29.7.0 jest-worker: registry.npmmirror.com/jest-worker/29.7.0 p-limit: registry.npmmirror.com/p-limit/3.1.0 @@ -14175,7 +13296,7 @@ packages: jest-regex-util: registry.npmmirror.com/jest-regex-util/29.6.3 jest-resolve: registry.npmmirror.com/jest-resolve/29.7.0 jest-snapshot: registry.npmmirror.com/jest-snapshot/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 slash: registry.npmmirror.com/slash/3.0.0 strip-bom: registry.npmmirror.com/strip-bom/4.0.0 transitivePeerDependencies: @@ -14204,10 +13325,10 @@ packages: jest-get-type: registry.npmmirror.com/jest-get-type/29.6.3 jest-matcher-utils: registry.npmmirror.com/jest-matcher-utils/29.7.0 jest-message-util: registry.npmmirror.com/jest-message-util/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 natural-compare: registry.npmmirror.com/natural-compare/1.4.0 pretty-format: registry.npmmirror.com/pretty-format/29.7.0 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 transitivePeerDependencies: - supports-color dev: true @@ -14252,7 +13373,7 @@ packages: ansi-escapes: registry.npmmirror.com/ansi-escapes/4.3.2 chalk: registry.npmmirror.com/chalk/4.1.2 emittery: registry.npmmirror.com/emittery/0.13.1 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 string-length: registry.npmmirror.com/string-length/4.0.2 dev: true @@ -14275,7 +13396,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': registry.npmmirror.com/@types/node/20.8.3 - jest-util: registry.npmmirror.com/jest-util/29.7.0 + jest-util: 29.7.0 merge-stream: registry.npmmirror.com/merge-stream/2.0.0 supports-color: registry.npmmirror.com/supports-color/8.1.1 dev: true @@ -14442,15 +13563,6 @@ packages: hasBin: true dev: true - registry.npmmirror.com/json5/1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz} - name: json5 - version: 1.0.2 - hasBin: true - dependencies: - minimist: registry.npmmirror.com/minimist/1.2.8 - dev: true - registry.npmmirror.com/json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz} name: json5 @@ -14774,7 +13886,7 @@ packages: dependencies: big.js: registry.npmmirror.com/big.js/5.2.2 emojis-list: registry.npmmirror.com/emojis-list/3.0.0 - json5: registry.npmmirror.com/json5/2.2.3 + json5: 2.2.3 dev: true registry.npmmirror.com/local-pkg/0.4.3: @@ -14869,12 +13981,6 @@ packages: version: 4.6.0 dev: true - registry.npmmirror.com/lodash.memoize/4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz} - name: lodash.memoize - version: 4.1.2 - dev: true - registry.npmmirror.com/lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz} name: lodash.merge @@ -14943,7 +14049,7 @@ packages: version: 4.1.0 engines: {node: '>=10'} dependencies: - chalk: registry.npmmirror.com/chalk/4.1.2 + chalk: 4.1.2 is-unicode-supported: registry.npmmirror.com/is-unicode-supported/0.1.0 dev: true @@ -15003,15 +14109,7 @@ packages: version: 4.1.5 dependencies: pseudomap: registry.npmmirror.com/pseudomap/1.0.2 - yallist: registry.npmmirror.com/yallist/2.1.2 - dev: true - - registry.npmmirror.com/lru-cache/5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz} - name: lru-cache - version: 5.1.1 - dependencies: - yallist: registry.npmmirror.com/yallist/3.1.1 + yallist: 2.1.2 dev: true registry.npmmirror.com/lru-cache/6.0.0: @@ -15061,7 +14159,7 @@ packages: version: 4.0.0 engines: {node: '>=10'} dependencies: - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 dev: true registry.npmmirror.com/make-error/1.3.6: @@ -15080,7 +14178,7 @@ packages: http-cache-semantics: registry.npmmirror.com/http-cache-semantics/3.8.1 http-proxy-agent: registry.npmmirror.com/http-proxy-agent/2.1.0 https-proxy-agent: registry.npmmirror.com/https-proxy-agent/2.2.4 - lru-cache: registry.npmmirror.com/lru-cache/4.1.5 + lru-cache: 4.1.5 mississippi: registry.npmmirror.com/mississippi/1.3.1 node-fetch-npm: registry.npmmirror.com/node-fetch-npm/2.0.4 promise-retry: registry.npmmirror.com/promise-retry/1.1.1 @@ -15135,7 +14233,7 @@ packages: dependencies: '@types/mdast': 3.0.13 '@types/unist': 2.0.8 - unist-util-visit: registry.npmmirror.com/unist-util-visit/4.1.2 + unist-util-visit: 4.1.2 dev: true registry.npmmirror.com/mdast-util-directive/2.2.4: @@ -15202,7 +14300,7 @@ packages: version: 1.3.2 dependencies: '@types/estree-jsx': registry.npmmirror.com/@types/estree-jsx/1.0.1 - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 '@types/mdast': 3.0.13 mdast-util-from-markdown: registry.npmmirror.com/mdast-util-from-markdown/1.3.1 mdast-util-to-markdown: registry.npmmirror.com/mdast-util-to-markdown/1.5.0 @@ -15216,7 +14314,7 @@ packages: version: 1.3.1 dependencies: '@types/estree-jsx': registry.npmmirror.com/@types/estree-jsx/1.0.1 - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 '@types/mdast': 3.0.13 mdast-util-from-markdown: registry.npmmirror.com/mdast-util-from-markdown/1.3.1 mdast-util-to-markdown: registry.npmmirror.com/mdast-util-to-markdown/1.5.0 @@ -15238,14 +14336,14 @@ packages: name: mdast-util-to-hast version: 12.3.0 dependencies: - '@types/hast': registry.npmmirror.com/@types/hast/2.3.6 + '@types/hast': 2.3.6 '@types/mdast': 3.0.13 mdast-util-definitions: registry.npmmirror.com/mdast-util-definitions/5.1.2 micromark-util-sanitize-uri: registry.npmmirror.com/micromark-util-sanitize-uri/1.2.0 trim-lines: registry.npmmirror.com/trim-lines/3.0.1 unist-util-generated: registry.npmmirror.com/unist-util-generated/2.0.1 - unist-util-position: registry.npmmirror.com/unist-util-position/4.0.4 - unist-util-visit: registry.npmmirror.com/unist-util-visit/4.1.2 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 dev: true registry.npmmirror.com/mdast-util-to-markdown/1.5.0: @@ -15259,8 +14357,8 @@ packages: mdast-util-phrasing: registry.npmmirror.com/mdast-util-phrasing/3.0.1 mdast-util-to-string: registry.npmmirror.com/mdast-util-to-string/3.2.0 micromark-util-decode-string: registry.npmmirror.com/micromark-util-decode-string/1.1.0 - unist-util-visit: registry.npmmirror.com/unist-util-visit/4.1.2 - zwitch: registry.npmmirror.com/zwitch/2.0.4 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 dev: true registry.npmmirror.com/mdast-util-to-string/3.2.0: @@ -15314,7 +14412,7 @@ packages: redent: registry.npmmirror.com/redent/3.0.0 trim-newlines: registry.npmmirror.com/trim-newlines/3.0.1 type-fest: registry.npmmirror.com/type-fest/0.18.1 - yargs-parser: registry.npmmirror.com/yargs-parser/20.2.9 + yargs-parser: 20.2.9 dev: true registry.npmmirror.com/meow/9.0.0: @@ -15826,14 +14924,6 @@ packages: version: 0.0.8 dev: true - registry.npmmirror.com/nanoid/3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz} - name: nanoid - version: 3.3.6 - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - registry.npmmirror.com/natural-compare-lite/1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz} name: natural-compare-lite @@ -15946,7 +15036,7 @@ packages: dependencies: hosted-git-info: registry.npmmirror.com/hosted-git-info/2.8.9 resolve: registry.npmmirror.com/resolve/1.22.6 - semver: registry.npmmirror.com/semver/5.7.2 + semver: 5.7.2 validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license/3.0.4 dev: true @@ -15958,7 +15048,7 @@ packages: dependencies: hosted-git-info: registry.npmmirror.com/hosted-git-info/4.1.0 is-core-module: registry.npmmirror.com/is-core-module/2.13.0 - semver: registry.npmmirror.com/semver/7.5.4 + semver: 7.5.4 validate-npm-package-license: registry.npmmirror.com/validate-npm-package-license/3.0.4 dev: true @@ -15983,7 +15073,7 @@ packages: dependencies: hosted-git-info: registry.npmmirror.com/hosted-git-info/2.8.9 osenv: registry.npmmirror.com/osenv/0.1.5 - semver: registry.npmmirror.com/semver/5.7.2 + semver: 5.7.2 validate-npm-package-name: registry.npmmirror.com/validate-npm-package-name/3.0.0 dev: true @@ -15993,7 +15083,7 @@ packages: version: 1.0.4 dependencies: npm-package-arg: registry.npmmirror.com/npm-package-arg/5.1.2 - semver: registry.npmmirror.com/semver/5.7.2 + semver: 5.7.2 dev: true registry.npmmirror.com/npm-run-path/2.0.2: @@ -16419,7 +15509,7 @@ packages: got: registry.npmmirror.com/got/6.7.1 registry-auth-token: registry.npmmirror.com/registry-auth-token/3.4.0 registry-url: registry.npmmirror.com/registry-url/3.1.0 - semver: registry.npmmirror.com/semver/5.7.2 + semver: 5.7.2 dev: true registry.npmmirror.com/pacote/2.7.38: @@ -16442,7 +15532,7 @@ packages: promise-retry: registry.npmmirror.com/promise-retry/1.1.1 protoduck: registry.npmmirror.com/protoduck/4.0.0 safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1 - semver: registry.npmmirror.com/semver/5.7.2 + semver: 5.7.2 ssri: registry.npmmirror.com/ssri/4.1.6 tar-fs: registry.npmmirror.com/tar-fs/1.16.3 tar-stream: registry.npmmirror.com/tar-stream/1.6.2 @@ -16570,12 +15660,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - registry.npmmirror.com/parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz} - name: parse5 - version: 6.0.1 - dev: true - registry.npmmirror.com/parse5/7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/parse5/-/parse5-7.1.2.tgz} name: parse5 @@ -17790,7 +16874,7 @@ packages: version: 8.4.31 engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: registry.npmmirror.com/nanoid/3.3.6 + nanoid: 3.3.6 picocolors: registry.npmmirror.com/picocolors/1.0.0 source-map-js: registry.npmmirror.com/source-map-js/1.0.2 dev: true @@ -18518,7 +17602,7 @@ packages: '@babel/runtime': registry.npmmirror.com/@babel/runtime/7.23.1 classnames: registry.npmmirror.com/classnames/2.3.2 date-fns: registry.npmmirror.com/date-fns/2.30.0 - dayjs: registry.npmmirror.com/dayjs/1.11.10 + dayjs: 1.11.21 moment: registry.npmmirror.com/moment/2.29.4 rc-trigger: registry.npmmirror.com/rc-trigger/5.3.4_react-dom@18.2.0+react@18.2.0 rc-util: registry.npmmirror.com/rc-util/5.37.0_react-dom@18.2.0+react@18.2.0 @@ -19659,7 +18743,7 @@ packages: optional: true dependencies: open: registry.npmmirror.com/open/8.4.2 - picomatch: registry.npmmirror.com/picomatch/2.3.1 + picomatch: 2.3.1 source-map: 0.7.4 yargs: registry.npmmirror.com/yargs/17.7.2 dev: true @@ -19867,14 +18951,7 @@ packages: version: 2.1.0 engines: {node: '>=0.10.0'} dependencies: - semver: registry.npmmirror.com/semver/5.7.2 - dev: true - - registry.npmmirror.com/semver/5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz} - name: semver - version: 5.7.2 - hasBin: true + semver: 5.7.2 dev: true registry.npmmirror.com/semver/6.3.1: @@ -21202,42 +20279,6 @@ packages: version: 2.1.0 dev: true - registry.npmmirror.com/ts-jest/29.1.1_jest@29.7.0+typescript@4.5.5: - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ts-jest/-/ts-jest-29.1.1.tgz} - id: registry.npmmirror.com/ts-jest/29.1.1 - name: ts-jest - version: 29.1.1 - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - bs-logger: registry.npmmirror.com/bs-logger/0.2.6 - fast-json-stable-stringify: registry.npmmirror.com/fast-json-stable-stringify/2.1.0 - jest: registry.npmmirror.com/jest/29.7.0 - jest-util: registry.npmmirror.com/jest-util/29.7.0 - json5: registry.npmmirror.com/json5/2.2.3 - lodash.memoize: registry.npmmirror.com/lodash.memoize/4.1.2 - make-error: registry.npmmirror.com/make-error/1.3.6 - semver: registry.npmmirror.com/semver/7.5.4 - typescript: registry.npmmirror.com/typescript/4.5.5 - yargs-parser: registry.npmmirror.com/yargs-parser/21.1.1 - dev: true - registry.npmmirror.com/ts-node/10.9.1_44c60d09ad039c6eda10a03e8bf7dc51: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz} id: registry.npmmirror.com/ts-node/10.9.1 @@ -21284,7 +20325,7 @@ packages: version: 3.14.2 dependencies: '@types/json5': registry.npmmirror.com/@types/json5/0.0.29 - json5: registry.npmmirror.com/json5/1.0.2 + json5: 1.0.2 minimist: registry.npmmirror.com/minimist/1.2.8 strip-bom: registry.npmmirror.com/strip-bom/3.0.0 dev: true @@ -21920,15 +20961,6 @@ packages: engines: {node: '>= 0.8'} dev: true - registry.npmmirror.com/vfile-location/4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vfile-location/-/vfile-location-4.1.0.tgz} - name: vfile-location - version: 4.1.0 - dependencies: - '@types/unist': 2.0.8 - vfile: 5.3.7 - dev: true - registry.npmmirror.com/vfile-message/3.1.4: resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vfile-message/-/vfile-message-3.1.4.tgz} name: vfile-message @@ -22310,18 +21342,6 @@ packages: engines: {node: '>=10'} dev: true - registry.npmmirror.com/yallist/2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz} - name: yallist - version: 2.1.2 - dev: true - - registry.npmmirror.com/yallist/3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz} - name: yallist - version: 3.1.1 - dev: true - registry.npmmirror.com/yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} name: yallist diff --git a/src/chat/__tests__/__snapshots__/button.test.tsx.snap b/src/chat/__tests__/__snapshots__/button.test.tsx.snap index 653bc87eb..8f4ea5bd7 100644 --- a/src/chat/__tests__/__snapshots__/button.test.tsx.snap +++ b/src/chat/__tests__/__snapshots__/button.test.tsx.snap @@ -45,4 +45,4 @@ exports[`Test Chat Button Match the snapshot: secondary button 1`] = ` `; -exports[`Test Chat Button expect ONLY one global gradient div: global gradient 1`] = `""`; +exports[`Test Chat Button expect ONLY one global gradient div: global gradient 1`] = `""`; diff --git a/src/chat/__tests__/__snapshots__/conversations.test.tsx.snap b/src/chat/__tests__/__snapshots__/conversations.test.tsx.snap new file mode 100644 index 000000000..99d45e92e --- /dev/null +++ b/src/chat/__tests__/__snapshots__/conversations.test.tsx.snap @@ -0,0 +1,230 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Test Chat Conversations Match snapshot 1`] = ` + +
+
+
    +
+
+
+`; + +exports[`Test Chat Conversations Match snapshot: collapsed 1`] = ` + +
+
+
    +
+
+
+`; + +exports[`Test Chat Conversations Match snapshot: groupable 1`] = ` + +
+
+
    +
  • +
    +
    + 昨天 +
    +
    +
      +
      +
      +
      + this is conversation 1 +
      +
      +
      +
    +
  • +
  • +
    +
    + 今天 +
    +
    +
      +
      +
      +
      + this is conversation 2 +
      +
      +
      +
    +
  • +
+
+
+
+`; + +exports[`Test Chat Conversations Match snapshot: handleCreateChat 1`] = ` + +
+ +
+
    +
+
+
+`; + +exports[`Test Chat Conversations Match snapshot: loading 1`] = ` + +
+
+
+ + + + + + +
+
+
+
+`; + +exports[`Test Chat Conversations Match snapshot: normal 1`] = ` + +
+
+
    +
    +
    +
    + this is conversation 1 +
    +
    +
    +
    +
    +
    + this is conversation 2 +
    +
    +
    +
+
+
+
+`; + +exports[`Test Chat Conversations Match snapshot: select 1`] = ` + +
+
+
    +
+
+
+`; diff --git a/src/chat/__tests__/__snapshots__/think.test.tsx.snap b/src/chat/__tests__/__snapshots__/think.test.tsx.snap new file mode 100644 index 000000000..c65a2aff5 --- /dev/null +++ b/src/chat/__tests__/__snapshots__/think.test.tsx.snap @@ -0,0 +1,74 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Think component snapshot renders completed state with children correctly 1`] = ` +
+
+
+ 已完成深度思考 + +
+
+
+
+ 这里是 Think 的内容示例(支持 Markdown) + +- 列表项 A +- 列表项 B +
+
+
+
+`; + +exports[`Think component snapshot renders loading state correctly 1`] = ` +
+
+
+ + 思考中... + + +
+
+
+
+ 正在思考中,暂无内容。 +
+
+
+
+`; diff --git a/src/chat/__tests__/conversations.test.tsx b/src/chat/__tests__/conversations.test.tsx new file mode 100644 index 000000000..1d3e7295b --- /dev/null +++ b/src/chat/__tests__/conversations.test.tsx @@ -0,0 +1,210 @@ +import React from 'react'; +import { NewChatOutlined } from '@dtinsight/react-icons'; +import { act, cleanup, fireEvent, render } from '@testing-library/react'; +import { Menu } from 'antd'; +import dayjs from 'dayjs'; +import '@testing-library/jest-dom/extend-expect'; + +import Conversations, { ConversationInfo } from '../conversations'; +import Chat from '..'; + +function generateConversation() { + const conversation = [ + { + id: 'conversation_1', + createdAt: 1736479532239, + updatedAt: dayjs().subtract(1, 'day').toDate().getTime(), + title: 'this is conversation 1', + assistantId: 'assistant_1', + }, + { + id: 'conversation_2', + createdAt: 1736479532239, + updatedAt: dayjs().toDate().getTime(), + title: 'this is conversation 2', + assistantId: 'assistant_2', + }, + ]; + return conversation; +} +jest.mock('../../ellipsisText', () => { + return (props: any) =>
{props.value}
; +}); +jest.mock('remark-gfm', () => () => ({})); + +describe('Test Chat Conversations', () => { + beforeEach(() => { + cleanup(); + }); + + it('Match snapshot', () => { + const conversation = generateConversation(); + const handleCreateChat = jest.fn(); + expect(render().asFragment()).toMatchSnapshot(); + expect(render().asFragment()).toMatchSnapshot( + 'collapsed' + ); + expect( + render().asFragment() + ).toMatchSnapshot('select'); + expect(render().asFragment()).toMatchSnapshot( + 'loading' + ); + expect( + render( + } + onClick={handleCreateChat} + className="prompt-float-chat-add" + style={{ + margin: '16px', + gap: 4, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }} + > + 开启新对话 + + } + /> + ).asFragment() + ).toMatchSnapshot('handleCreateChat'); + expect(render().asFragment()).toMatchSnapshot( + 'normal' + ); + expect( + render().asFragment() + ).toMatchSnapshot('groupable'); + }); + it('Should loading', () => { + const { container } = render(); + + const ele = container.querySelector('.dtc__conversations__wrapper')?.children[0]; + expect(ele).toBeInTheDocument(); + expect(ele?.className).toContain('dtc__conversations__container'); + }); + + it('Should collapsed', () => { + const { container } = render(); + + const ele = container.querySelector('.dtc__conversations__wrapper'); + expect(ele).toBeInTheDocument(); + expect(ele?.className).toContain('dtc__conversations--collapsed'); + }); + + it('Should select item', () => { + const conversation = generateConversation(); + const { container } = render( + + ); + + const ele = container.querySelector('.dtc__conversations__item'); + expect(ele).toBeInTheDocument(); + expect(ele?.className).toContain('dtc__conversations__item--active'); + }); + + it('Should group list title', () => { + const { container } = render( + + ); + + const ele = container.querySelectorAll('.dtc__conversations__title'); + expect(ele).toHaveLength(2); + }); + + it('Should support add new session', () => { + const handleCreateChat = jest.fn(); + const { container } = render( + } + onClick={handleCreateChat} + className="prompt-float-chat-add" + style={{ + margin: '16px', + gap: 4, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }} + > + 开启新对话 + + } + /> + ); + + const btn = container.querySelector('.prompt-float-chat-add'); + expect(handleCreateChat).not.toBeCalled(); + expect(btn).not.toBeNull(); + + act(() => { + fireEvent.click(btn!); + }); + expect(handleCreateChat).toBeCalledWith( + expect.objectContaining({ + type: 'click', + }) + ); + }); + it('Should support select item', () => { + const conversation = generateConversation(); + const onItemClick = jest.fn(); + const { container } = render( + + ); + + const nodeList = container.querySelectorAll('.dtc__conversations__item'); + const ele = nodeList?.item(nodeList?.length - 1); + + expect(onItemClick).not.toBeCalled(); + expect(ele).not.toBeNull(); + + fireEvent.click(ele!); + expect(onItemClick).toBeCalledWith(conversation[conversation.length - 1]); + }); + + test('Should render delete button', () => { + const conversation = generateConversation(); + const onDelete = jest.fn(); + const renderMenu = (info: ConversationInfo) => ({ + overlay: ( + e.domEvent.stopPropagation()}> + onDelete?.(info)}> + 删除 + + + ), + }); + const { container } = render( + + ); + + const icon = container.querySelectorAll('.ant-dropdown-trigger')[0]; + expect(icon).toBeInTheDocument(); + + act(() => { + fireEvent.click(icon); + }); + + const dropdownMenuItems = document.querySelectorAll( + '.ant-dropdown:not(.ant-dropdown-hidden) .ant-dropdown-menu-item' + ); + expect(dropdownMenuItems).toHaveLength(1); + + fireEvent.click(dropdownMenuItems[0]); + expect(onDelete).toBeCalledWith(conversation[0]); + }); +}); diff --git a/src/chat/__tests__/message.test.tsx b/src/chat/__tests__/message.test.tsx index c88e747dc..152ffa8a4 100644 --- a/src/chat/__tests__/message.test.tsx +++ b/src/chat/__tests__/message.test.tsx @@ -7,7 +7,7 @@ import '@testing-library/jest-dom/extend-expect'; import { Message as MessageEntity, MessageStatus, Prompt as PromptEntity } from '../entity'; import Message from '../message'; -import Chat from '..'; +import Chat from '../'; jest.mock('remark-gfm', () => () => {}); @@ -187,7 +187,9 @@ describe('Test Chat Message', () => { act(() => { fireEvent.click(ele!); }); - expect(onCopy).toBeCalledWith('My Name is dt-react-component'); + await waitFor(() => { + expect(onCopy).toBeCalledWith('My Name is dt-react-component'); + }); rerender(); expect(container.querySelector(classNames)).toBeNull(); @@ -202,7 +204,9 @@ describe('Test Chat Message', () => { act(() => { fireEvent.click(container.querySelector(classNames)!); }); - expect(onCopy).toBeCalledWith('My Name is dt-react-component jest'); + await waitFor(() => { + expect(onCopy).toBeCalledWith('My Name is dt-react-component jest'); + }); }); it('Should support render message icons', () => { @@ -232,12 +236,24 @@ describe('Test Chat Message', () => { prompt.messages[0].status = MessageStatus.DONE; const onRegenerate = jest.fn(); const { container, getByText } = render( - + + ExtraDom +
+ } + > + + ); const nodeList = container @@ -301,4 +317,29 @@ describe('Test Chat Message', () => { expect(ele.dataset.messageid).toBe('1'); expect(ele.dataset.promptid).toBe('1'); }); + + it('Should support extraRender', () => { + const prompt = generatePrompt(); + prompt.messages[0].status = MessageStatus.DONE; + const { container, getByTestId } = render( + + ExtraDom +
+ } + > + + + ); + expect(getByTestId('fakeMessageExtraRender')).toBeInTheDocument(); + const nodeList = container.querySelectorAll('.dtc__message__extra__render'); + const ele = nodeList?.item(nodeList?.length - 1); + expect(ele).not.toBeNull(); + expect(ele?.textContent).toBe('ExtraDom'); + }); }); diff --git a/src/chat/__tests__/prompt.test.tsx b/src/chat/__tests__/prompt.test.tsx index 7f487844c..833c00e60 100644 --- a/src/chat/__tests__/prompt.test.tsx +++ b/src/chat/__tests__/prompt.test.tsx @@ -4,7 +4,7 @@ import { render } from '@testing-library/react'; import { Prompt as PromptEntity } from '../entity'; import Prompt from '../prompt'; -import Chat from '..'; +import Chat from '../'; jest.mock('remark-gfm', () => () => {}); class BasePrompt extends PromptEntity {} @@ -57,4 +57,24 @@ describe('Test Chat Prompt', () => { expect(getByTestId('fakeCode').dataset.promptid).toBe('1'); }); + + it('Should support extraRender', () => { + const data = generatePrompt(); + const { container } = render( + + PromptExtraDom + + } + > + + + ); + const nodeList = container.querySelectorAll('.dtc__prompt__extra__render'); + const ele = nodeList?.item(nodeList?.length - 1); + expect(ele).not.toBeNull(); + expect(ele?.textContent).toBe('PromptExtraDom'); + }); }); diff --git a/src/chat/__tests__/think.test.tsx b/src/chat/__tests__/think.test.tsx new file mode 100644 index 000000000..6d32ff61f --- /dev/null +++ b/src/chat/__tests__/think.test.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { render } from '@testing-library/react'; + +import Think from '../think'; + +describe('Think component snapshot', () => { + it('renders loading state correctly', () => { + const data = { children: '正在思考中,暂无内容。' } as any; + const { container } = render(); + expect(container).toMatchSnapshot(); + }); + + it('renders completed state with children correctly', () => { + const markdown = `这里是 Think 的内容示例(支持 Markdown)\n\n- 列表项 A\n- 列表项 B`; + const data = { children: markdown } as any; + const { container } = render(); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/src/chat/button/index.tsx b/src/chat/button/index.tsx index f6eb0243f..87697a49e 100644 --- a/src/chat/button/index.tsx +++ b/src/chat/button/index.tsx @@ -25,11 +25,10 @@ export default function Button({ type = 'default', className, children, ...rest @@ -37,11 +36,10 @@ export default function Button({ type = 'default', className, children, ...rest diff --git a/src/chat/codeBlock/index.tsx b/src/chat/codeBlock/index.tsx index 7733d9889..369fd6e82 100644 --- a/src/chat/codeBlock/index.tsx +++ b/src/chat/codeBlock/index.tsx @@ -4,28 +4,31 @@ import { oneLight } from 'react-syntax-highlighter/dist/cjs/styles/prism'; import classNames from 'classnames'; import Copy from '../../copy'; +import { Message as MessageEntity } from '../entity'; import { CopyOptions } from '../useContext'; import './index.scss'; -export interface ICodeBlockProps { +export interface ICodeBlockProps { copy?: boolean | CopyOptions; className?: string; style?: React.CSSProperties; + message?: M; convert?: boolean; - toolbars?: React.ReactNode | (() => React.ReactNode); + toolbars?: React.ReactNode | ((code: string, message?: M) => React.ReactNode); options?: Partial; children: React.ReactNode & React.ReactNode[]; } -export default function CodeBlock({ +export default function CodeBlock({ className, style, toolbars, + message, copy: rawCopy, convert, children, options: { lineNumberStyle = {}, ...rest } = {}, -}: ICodeBlockProps) { +}: ICodeBlockProps) { const { value, language } = useMemo(() => { const child = children[0] as React.ReactElement; const match = /language-(\w+)/.exec(child.props.className || ''); @@ -63,9 +66,9 @@ export default function CodeBlock({ {language.toLocaleLowerCase()}
+ {typeof toolbars === 'function' ? toolbars(text, message) : toolbars} {/* FIXME:Copy 组件后续可以支持一下 disabled 属性 */} {!copy.disabled && } - {typeof toolbars === 'function' ? toolbars() : toolbars}
= (props) => { + const { prefixCls = 'dtc__conversations' } = props; + return ( +
+ {props.children && ( + + )} +
+ ); +}; + +export default GroupTitle; diff --git a/src/chat/conversations/hooks/useGroupable.ts b/src/chat/conversations/hooks/useGroupable.ts new file mode 100644 index 000000000..07aee7087 --- /dev/null +++ b/src/chat/conversations/hooks/useGroupable.ts @@ -0,0 +1,88 @@ +import { useMemo } from 'react'; +import dayjs from 'dayjs'; +import shortid from 'shortid'; + +import useLocale, { Locale } from '../../../locale/useLocale'; +import { ConversationInfo, ConversationsProps, Groupable, GroupInfo } from '../interface'; + +const DEFAULT_GROUP_KEY = 'updatedAt'; +type GroupMap = Record; +const useGroupable = ( + groupable: ConversationsProps['groupable'], + conversations: ConversationInfo[] +): [list: GroupInfo[], enable: boolean] => { + const locale = useLocale('Chat'); + const [enable, sort, title] = useMemo(() => { + if (!groupable) return [false, undefined, undefined]; + + let baseConfig: Groupable = { + sort: undefined, + title: undefined, + }; + + if (typeof groupable === 'object') { + baseConfig = { ...baseConfig, ...groupable }; + } + + return [true, baseConfig.sort, baseConfig.title]; + }, [groupable]); + + return useMemo(() => { + if (!enable) { + const groupList: GroupInfo[] = [ + { + id: `group_${shortid()}`, + conversations, + title: undefined, + }, + ]; + return [groupList, enable]; + } + const groupMap = conversations.reduce((prev, current) => { + const group = current.group || classifyDate(locale, current[DEFAULT_GROUP_KEY]); + if (!prev[group]) { + prev[group] = []; + } + prev[group].push(current); + return prev; + }, {}); + + const groupEntries = sort ? Object.entries(groupMap).sort(sort) : Object.entries(groupMap); + + const groupList: GroupInfo[] = groupEntries.map(([key, value]) => { + return { + id: `group_${shortid()}`, + title, + conversations: value, + name: key, + }; + }); + return [groupList, enable]; + }, [conversations, enable]); +}; + +export function classifyDate(locale: Locale['Chat'], date?: string | Date | number) { + const input = dayjs(date).startOf('day'); + const now = dayjs().startOf('day'); + if (!date || !input.isValid()) { + return locale.other; + } + + const diffDays = now.diff(input, 'days'); + + if (diffDays < 1) { + return locale.today; + } else if (diffDays < 2) { + return locale.yesterday; + } else if (diffDays < 7) { + return locale.recent7Days; + } else if (diffDays < 15) { + return locale.recent15Days; + } else if (diffDays < 30) { + return locale.recent30Days; + } else { + return locale.other; + } +} + +export default useGroupable; diff --git a/src/chat/conversations/index.scss b/src/chat/conversations/index.scss new file mode 100644 index 000000000..b5e2c3c38 --- /dev/null +++ b/src/chat/conversations/index.scss @@ -0,0 +1,44 @@ +.dtc__conversations { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + gap: 4px; + margin: 0; + padding: 0 16px; + list-style: none; + overflow-y: auto; + &--empty { + margin-top: 50%; + } + &__list { + display: flex; + flex-direction: column; + gap: 4px; + } + &__spin__wrapper { + width: 100%; + display: flex; + justify-content: center; + margin: 40px 0; + } + &__wrapper { + display: flex; + flex-direction: column; + width: 0; + height: 100%; + transition: width 0.3s ease; + overflow: hidden; + } + &__container { + flex: 1; + overflow: hidden; + } + &--collapsed { + width: 240px; + } + &--hide { + opacity: 0; + pointer-events: none; + } +} diff --git a/src/chat/conversations/index.tsx b/src/chat/conversations/index.tsx new file mode 100644 index 000000000..91df93ec8 --- /dev/null +++ b/src/chat/conversations/index.tsx @@ -0,0 +1,133 @@ +import React, { useEffect } from 'react'; +import { Spin } from 'antd'; +import classNames from 'classnames'; + +import Empty from '../../empty'; +import useLocale from '../../locale/useLocale'; +import useGroupable from './hooks/useGroupable'; +import GroupTitle from './groupTitle'; +import { ConversationInfo, ConversationsProps } from './interface'; +import Item from './item'; +import './index.scss'; + +const prefixCls = 'dtc__conversations'; +const Conversations = (props: ConversationsProps) => { + const { + conversations, + activeKey, + defaultActiveKey, + dropdown, + groupable, + className, + style, + loading, + header, + footer, + collapsed = true, + onItemClick, + renderItem, + ...restProps + } = props; + const [value, setValue] = React.useState(activeKey || defaultActiveKey); + + const [groupList, enable] = useGroupable(groupable, conversations); + const [isHide, setIsHide] = React.useState(false); + const locale = useLocale('Chat'); + + const handleItemClick = (info: ConversationInfo) => { + setValue(info.id); + onItemClick?.(info); + }; + + useEffect(() => { + if (activeKey !== value) { + setValue(activeKey); + } + }, [activeKey]); + + const renderConversations = () => { + if (loading) { + return ; + } + if (!groupList?.length) { + return ( + + ); + } + return ( +
    + {groupList.map((group) => { + const items = group.conversations.map((conversation) => { + const dropdownVal = + typeof dropdown === 'function' ? dropdown(conversation) : dropdown; + if (renderItem) { + return renderItem({ + info: conversation, + active: conversation.id === value, + onClick: handleItemClick, + dropdown: dropdownVal, + }); + } + return ( + + ); + }); + if (enable) { + return ( +
  • + {group.title?.(group, { components: { GroupTitle } }) || ( + + {group.name} + + )} +
      {items}
    +
  • + ); + } + return items; + })} +
+ ); + }; + useEffect(() => { + if (collapsed) { + setIsHide(false); + } + }, [collapsed]); + + return ( +
{ + if (!collapsed) setIsHide(true); + }} + > + {header} +
{renderConversations()}
+ {footer} +
+ ); +}; + +export type { ConversationInfo }; + +Conversations.Item = Item; +Conversations.Title = GroupTitle; + +export default Conversations; diff --git a/src/chat/conversations/interface.ts b/src/chat/conversations/interface.ts new file mode 100644 index 000000000..2be016495 --- /dev/null +++ b/src/chat/conversations/interface.ts @@ -0,0 +1,132 @@ +import { HTMLAttributes } from 'react'; +import { DropdownProps } from 'antd'; + +import { ConversationProperties } from '../entity'; + +/** + * 单条会话信息结构 + * 用于描述侧边栏会话列表中的一项 + */ +export interface ConversationInfo extends ConversationProperties { + /** 会话所属分组(用于分组展示,可选,默认以updateAt分组) */ + group?: string; + /** 会话项自定义图标 */ + icon?: React.ReactNode; + /** 是否禁用此会话(禁用点击与交互) */ + disabled?: boolean; +} +/** + * Conversations 会话组件入参 + * 用于渲染会话列表与相关交互 + */ +export interface ConversationsProps extends React.HTMLAttributes { + /** 会话列表数据源 */ + conversations: ConversationInfo[]; + /** 当前激活会话的 id(受控模式) */ + activeKey?: ConversationInfo['id']; + /** 默认激活会话 id(非受控模式) */ + defaultActiveKey?: ConversationInfo['id']; + /** + * 自定义每一项的下拉菜单 + * - 传入对象时:所有项共享同一配置 + * - 传入方法时:可根据不同会话动态生成 + */ + dropdown?: + | ConversationsItemProps['dropdown'] + | ((info: ConversationInfo) => ConversationsItemProps['dropdown']); + /** 是否启用按 group 分组展示(true 时使用默认配置,也可传入自定义 Groupable 配置) */ + groupable?: boolean | Groupable; + className?: string; + style?: React.CSSProperties; + loading?: boolean; + /** 列表头部区域内容 */ + header?: React.ReactNode; + /** 列表底部区域内容 */ + footer?: React.ReactNode; + /** 是否为折叠状态(折叠时仅展示图标) */ + collapsed?: boolean; + /** 点击某条会话时触发 */ + onItemClick?: (info: ConversationInfo) => void; + /** 自定义渲染每一项的内容 */ + renderItem?: (props: ConversationsItemProps) => React.ReactNode; +} +/** + * Conversations.Item 单个会话项组件的入参 + * 用于渲染侧边栏中的一条会话 + */ +export interface ConversationsItemProps extends Omit, 'onClick'> { + /** 当前会话项的数据对象 */ + info: ConversationInfo; + /** 是否为激活状态 */ + active?: boolean; + /** + * 下拉菜单配置(用于操作会话项) + * - 可传入 DropdownProps + * - 支持通过 triggerDom 自定义触发节点 + */ + dropdown?: DropdownProps & { + triggerDom?: + | React.ReactNode + | (( + conversation: ConversationInfo, + info: { originNode: React.ReactNode } + ) => React.ReactNode); + }; + onClick?: (info: ConversationInfo) => void; +} + +/** + * 分组组件入参 + */ +export interface GroupTitleProps { + /** 分组标题内容 */ + children?: React.ReactNode; + prefixCls?: string; +} + +/** + * 处理之后的分组数据 + */ +export type GroupInfo = { + /** 分组内的会话列表 */ + conversations: ConversationInfo[]; + /** 分组唯一标识(可选) */ + id?: string; + /** 自定义渲染后的标题(Groupable.title 的结果) */ + title?: Groupable['title']; + name?: string; +}; + +/** 分组排序函数类型,来自 Array.sort 的入参类型 */ +export type GroupSorter = Parameters<[string, ConversationInfo[]][]['sort']>[0]; + +/** 自定义分组标题渲染时可访问的内置组件 */ +export type GroupTitleRenderComponents = { + components: { + GroupTitle: React.ComponentType; + }; +}; +/** + * 分组标题渲染函数 + * 用于完全自定义分组标题渲染逻辑 + */ +export type GroupTitleRender = + | ((groupInfo: GroupInfo, info: GroupTitleRenderComponents) => React.ReactNode) + | undefined; + +/** + * 分组功能配置 + * 控制会话列表是否按 group 分组显示 + */ +export interface Groupable { + /** + * @desc 分组排序函数 + * @descEN Group sorter + */ + sort?: GroupSorter; + /** + * @desc 自定义分组标签渲染 + * @descEN Semantic custom rendering + */ + title?: GroupTitleRender; +} diff --git a/src/chat/conversations/item/index.scss b/src/chat/conversations/item/index.scss new file mode 100644 index 000000000..6a7a1dadb --- /dev/null +++ b/src/chat/conversations/item/index.scss @@ -0,0 +1,32 @@ +.dtc__conversations__item { + display: flex; + align-items: center; + justify-content: center; + height: 32px; + gap: 4px; + padding: 0 16px; + border-radius: 4px; + cursor: pointer; + color: #3D446E; + &__title { + flex: 1; + overflow: hidden; + } + &:hover { + background-color: #EBECF0; + .dtc__conversations__menu__icon { + display: block; + } + } + .dtc__conversations__menu__icon { + display: none; + } + &--active, &--active:hover { + color: #1D78FF; + background-color: #E8F1FF; + } + &--disabled, &--disabled:hover { + cursor: not-allowed; + opacity: 0.5; + } +} diff --git a/src/chat/conversations/item/index.tsx b/src/chat/conversations/item/index.tsx new file mode 100644 index 000000000..c2dea873d --- /dev/null +++ b/src/chat/conversations/item/index.tsx @@ -0,0 +1,70 @@ +import React from 'react'; +import { MoreOutlined } from '@dtinsight/react-icons'; +import { Dropdown } from 'antd'; +import classNames from 'classnames'; + +import EllipsisText from '../../../ellipsisText'; +import { ConversationInfo, ConversationsItemProps } from '../interface'; +import './index.scss'; + +const prefixCls = 'dtc__conversations'; +const Item: React.FC = (props) => { + const { info, active, dropdown, onClick } = props; + + const { disabled } = info; + const { triggerDom } = dropdown || {}; + + const handleClick = () => { + if (disabled || active) return; + onClick?.(info); + }; + const stopPropagation = (e: React.MouseEvent) => { + e.stopPropagation(); + }; + const renderMenuTrigger = (conversation: ConversationInfo) => { + const originTriggerNode = ( + + ); + if (triggerDom) { + return typeof triggerDom === 'function' + ? triggerDom(conversation, { originNode: originTriggerNode }) + : triggerDom; + } + return originTriggerNode; + }; + return ( +
+ {info.icon &&
{info.icon}
} +
+ +
+ {!disabled && dropdown?.overlay && ( + + {renderMenuTrigger(info)} + + )} +
+ ); +}; + +export default Item; diff --git a/src/chat/demos/basic.tsx b/src/chat/demos/basic.tsx index b0e501ed0..e53f0c7d2 100644 --- a/src/chat/demos/basic.tsx +++ b/src/chat/demos/basic.tsx @@ -57,6 +57,8 @@ export default function () { ), }} + messageHeader={
这是自定义header
} + promptFooter={
这是自定义footer
} > Promise; + setEdit: (edit?: ConversationsItemProps['info']) => void; +} + +export default function CustomConversionItem(props: IProps) { + const { info, prefixCls, active, edit, onRename, setEdit } = props; + const { disabled, title } = info || {}; + + const isEdit = edit?.id === info?.id; + + const handleRename = async (value: string) => { + if (!value) { + setEdit(undefined); + message.error('请输入对话名称'); + return; + } + const res = await onRename?.(info, value); + if (res) { + setEdit(undefined); + } + }; + return isEdit ? ( +
+ { + handleRename(target.value); + }} + onPressEnter={({ target, key }) => { + if (key === 'Enter') { + handleRename((target as HTMLInputElement).value); + } + }} + /> +
+ ) : ( + + ); +} diff --git a/src/chat/demos/conversations.tsx b/src/chat/demos/conversations.tsx new file mode 100644 index 000000000..b4f2609d5 --- /dev/null +++ b/src/chat/demos/conversations.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { NewChatOutlined } from '@dtinsight/react-icons'; +import { Menu } from 'antd'; +import { Button, Chat } from 'dt-react-component'; +import { ConversationInfo } from 'dt-react-component/chat/conversations'; +import { ConversationProperties } from 'dt-react-component/chat/entity'; + +import CustomConversionItem from './components/customConversationItem'; +import './index.scss'; + +export default function ({ conversations = [] }: { conversations: ConversationProperties[] }) { + const [data, setData] = React.useState(conversations); + const [selectId, setSelectId] = React.useState('1'); + const [collapsed, setCollapsed] = React.useState(true); + const [edit, setEdit] = React.useState(); + + const handleSelectChat = (conversation: ConversationProperties) => { + setSelectId(conversation.id); + }; + + const handleRenameChat = (_conversation: ConversationProperties, _value: string) => { + data.forEach((item) => { + if (item.id === _conversation.id) { + item.title = _value; + } + }); + setData(data); + return Promise.resolve(true); + }; + + const handleClearChat = (conversation: ConversationProperties) => { + console.log(conversation); + }; + const handleNewChat = () => { + setData((prev) => { + const idx = prev.length + 1; + return [ + ...prev, + { + id: idx.toString(), + title: `对话${idx}`, + assistantId: idx.toString(), + createdAt: new Date().valueOf(), + updatedAt: new Date().valueOf(), + }, + ]; + }); + }; + const renderMenu = (info: ConversationInfo) => ({ + overlay: ( + e.domEvent.stopPropagation()}> + { + setEdit(info); + }} + > + 重命名 + + handleClearChat?.(info)}> + 删除 + + + ), + }); + + return ( +
+ + ( + + )} + header={ + } + onClick={handleNewChat} + className="prompt-float-chat-add" + > + 开启新对话 + + } + /> +
+ ); +} diff --git a/src/chat/demos/global-state/conversations.tsx b/src/chat/demos/global-state/conversations.tsx new file mode 100644 index 000000000..56488f59c --- /dev/null +++ b/src/chat/demos/global-state/conversations.tsx @@ -0,0 +1,211 @@ +import React, { useEffect, useState } from 'react'; +import { NewChatOutlined, ThumbsUpOutlined } from '@dtinsight/react-icons'; +import { Button, Menu } from 'antd'; +import { Chat, Flex } from 'dt-react-component'; +import { ConversationInfo } from 'dt-react-component/chat/conversations'; +import { ConversationProperties } from 'dt-react-component/chat/entity'; +import { produce } from 'immer'; +import { cloneDeep } from 'lodash-es'; + +import CustomConversionItem from '../components/customConversationItem'; +import { mockSSE } from '../mockSSE'; +import '../index.scss'; + +export default function () { + const chat = Chat.useChat(); + const [value, setValue] = useState(''); + const [convert, setConvert] = useState(false); + const [data, setData] = useState([]); + const [edit, setEdit] = React.useState(); + + const handleSelectChat = (conversation: ConversationProperties) => { + chat.conversation.remove(); + chat.conversation.create({ ...conversation }); + }; + + const handleRenameChat = (_conversation: ConversationProperties, _value: string) => { + setData((prev) => { + const idx = prev.findIndex((i) => i.id === _conversation.id); + if (idx === -1) return prev; + return produce(prev, (draft) => { + draft[idx].title = _value; + }); + }); + return Promise.resolve(true); + }; + + const handleDeleteChat = (conversation: ConversationProperties) => { + const list = cloneDeep(data).filter((i) => i.id !== conversation.id); + if (conversation.id === chat.conversation.get()?.id) { + chat.conversation.remove(); + if (list.length) { + handleSelectChat(list[0]); + chat.conversation.create({ ...list[0] }); + } + } + setData(list); + }; + const handleCreateChat = () => { + chat.conversation.remove(); + chat.conversation.create({ id: new Date().valueOf().toString() }); + }; + + const addData = (str: string) => { + setData((prev) => { + const idx = prev.length + 1; + return [ + ...prev, + { + id: chat.conversation.get()!.id, + title: str, + assistantId: idx.toString(), + createdAt: new Date().valueOf(), + updatedAt: new Date().valueOf(), + }, + ]; + }); + handleSelectChat(chat.conversation.get()!); + }; + + const handleSubmit = (raw = value) => { + const val = raw?.trim(); + if (chat.loading() || !val) return; + setValue(''); + const promptId = new Date().valueOf().toString(); + const messageId = (new Date().valueOf() + 1).toString(); + chat.prompt.create({ id: promptId, title: val }); + chat.message.create(promptId, { id: messageId, content: '' }); + mockSSE({ + message: val, + onopen() { + chat.start(promptId, messageId); + addData(val); + }, + onmessage(str) { + chat.push(promptId, messageId, str); + }, + onstop() { + chat.close(promptId, messageId); + }, + }); + }; + const renderMenu = (info: ConversationInfo) => ({ + overlay: ( + e.domEvent.stopPropagation()}> + { + setEdit(info); + }} + > + 重命名 + + handleDeleteChat?.(info)}> + 删除 + + + ), + }); + + useEffect(() => { + chat.conversation.create({ id: new Date().valueOf().toString() }); + }, []); + + return ( +
+ } + components={{ + a: ({ children }) => ( + + ), + }} + > + + ( + + )} + header={ + } + onClick={handleCreateChat} + className="prompt-float-chat-add" + style={{ + margin: '16px', + gap: 4, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + }} + > + 开启新对话 + + } + footer={
底部内容
} + style={{ + backgroundColor: '#F9F9FA', + borderRight: '1px solid #E5E7EB', + }} + /> + + + +
+ + handleSubmit('请告诉我一首诗')}> + 返回一首诗 + + handleSubmit('生成 CodeBlock')}> + 生成 CodeBlock + + +
+ } + /> + handleSubmit()} + onPressShiftEnter={() => setValue((v) => v + '\n')} + button={{ + disabled: chat.loading() || !value?.trim(), + }} + placeholder="请输入想咨询的内容…" + /> + + + + + ); +} diff --git a/src/chat/demos/index.scss b/src/chat/demos/index.scss new file mode 100644 index 000000000..5dde1b073 --- /dev/null +++ b/src/chat/demos/index.scss @@ -0,0 +1,16 @@ +li,ul { + padding: 0; + margin: 0; +} + +.dtc__conversations__wrapper { + border-right: 1px solid #E5E7EB; + background-color: #F9F9FA; + .ant-btn.dtc__aigc__button { + margin: 16px; + gap: 4px; + display: flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/chat/demos/markdown.tsx b/src/chat/demos/markdown.tsx index bc6435fc8..c6a4de3ca 100644 --- a/src/chat/demos/markdown.tsx +++ b/src/chat/demos/markdown.tsx @@ -1,5 +1,7 @@ import React from 'react'; +import { Components } from 'react-markdown'; import { Chat } from 'dt-react-component'; +import rehypeRaw from 'rehype-raw'; const children = ` # 大标题 @@ -35,7 +37,35 @@ SELECT * FROM table_name; | 单元格 | 单元格 | 单元格 | | 单元格 | 单元格 | 单元格 | `; +const childrenTsx = ` +这是自定义的标签 +`; export default function () { - return {children}; + return ( + { + return
{children}
; + }, + } as Components + } + rehypePlugins={[rehypeRaw]} + > + {children} + +
+ ); } diff --git a/src/chat/demos/message.tsx b/src/chat/demos/message.tsx index 0c277550a..a37d1f2ce 100644 --- a/src/chat/demos/message.tsx +++ b/src/chat/demos/message.tsx @@ -5,7 +5,9 @@ import { Message, MessageStatus, Prompt } from 'dt-react-component/chat/entity'; class BasicPrompt extends Prompt {} class BasicMessage extends Message {} - +const CustomRender = () => { + return
这是自定义header
; +}; export default function () { const [status, setStatus] = useState(MessageStatus.DONE); @@ -36,13 +38,15 @@ export default function () { 置为完成 - setStatus(MessageStatus.STOPPED)} - onRegenerate={() => console.log('regenerate')} - /> + }> + setStatus(MessageStatus.STOPPED)} + onRegenerate={() => console.log('regenerate')} + /> + ); } diff --git a/src/chat/demos/prompt.tsx b/src/chat/demos/prompt.tsx index 32b6ef29e..8dc89255d 100644 --- a/src/chat/demos/prompt.tsx +++ b/src/chat/demos/prompt.tsx @@ -4,7 +4,9 @@ import { Chat } from 'dt-react-component'; import { Prompt } from 'dt-react-component/chat/entity'; const updateReducer = (num: number): number => (num + 1) % 1_000_000; - +const CustomRender = () => { + return
这是自定义footer
; +}; export default function () { const [value, setValue] = useState(''); const [, update] = useReducer(updateReducer, 0); @@ -17,18 +19,20 @@ export default function () { return ( - - - value?.trim() && setContent(value.trim())} - /> - + }> + + + value?.trim() && setContent(value.trim())} + /> + + ); } diff --git a/src/chat/demos/think.tsx b/src/chat/demos/think.tsx new file mode 100644 index 000000000..e8c3a4b0a --- /dev/null +++ b/src/chat/demos/think.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import type { ReactMarkdownProps } from 'react-markdown/lib/complex-types'; +import { Chat } from 'dt-react-component'; + +const children = ` +这里是 Think 的内容示例 + +- 列表项 A +- 列表项 B +`; + +export default function () { + const [loading, setLoading] = React.useState(true); + + React.useEffect(() => { + const timer = setTimeout(() => { + setLoading(false); + }, 3000); + + return () => clearTimeout(timer); + }, []); + const data = { children } as ReactMarkdownProps; + return ; +} diff --git a/src/chat/entity.ts b/src/chat/entity.ts index 0c55c960c..ac31659c7 100644 --- a/src/chat/entity.ts +++ b/src/chat/entity.ts @@ -29,6 +29,7 @@ export type ConversationProperties = { id: string; assistantId?: string; createdAt?: Timestamp; + updatedAt?: Timestamp; title?: string; prompts?: Prompt[]; }; @@ -58,6 +59,7 @@ export abstract class Conversation { // 后端 Id assistantId?: string; createdAt: Timestamp; + updatedAt?: Timestamp; title?: string; prompts: Prompt[]; @@ -67,6 +69,7 @@ export abstract class Conversation { this.id = props.id; this.assistantId = props.assistantId; this.createdAt = props.createdAt || new Date().valueOf(); + this.updatedAt = props.updatedAt || new Date().valueOf(); this.title = props.title; this.prompts = props.prompts || []; } diff --git a/src/chat/gradientText/index.scss b/src/chat/gradientText/index.scss new file mode 100644 index 000000000..68f821431 --- /dev/null +++ b/src/chat/gradientText/index.scss @@ -0,0 +1,18 @@ +$loadingGradient: #90F8FF99 6%, #4983DA 28%, #002DA1 46%, #4983DA 72%, #90F8FF99 94%; + +span.gradient-text { + background: linear-gradient(102deg, $loadingGradient); + background-size: 200% 100%; + background-clip: text; + color: transparent; + animation: gradientScroll 2s linear infinite; +} + +@keyframes gradientScroll { + 0% { + background-position: 200% 50%; + } + 100% { + background-position: 0% 50%; + } +} diff --git a/src/chat/gradientText/index.tsx b/src/chat/gradientText/index.tsx new file mode 100644 index 000000000..4b0fbf06b --- /dev/null +++ b/src/chat/gradientText/index.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import classNames from 'classnames'; + +import './index.scss'; + +interface IGradientTextProps { + className?: string; + gradient?: boolean; +} + +export default function GradientText({ + className, + gradient, + children, +}: React.PropsWithChildren) { + return {children}; +} diff --git a/src/chat/index.$tab-conversations.md b/src/chat/index.$tab-conversations.md new file mode 100644 index 000000000..03e7fdec1 --- /dev/null +++ b/src/chat/index.$tab-conversations.md @@ -0,0 +1,43 @@ +--- +title: Conversations +group: 组件 +toc: content +demo: + cols: 2 +--- + +# Conversations + +## 何时使用 + +Conversations 组件用于展示会话列表 + +## 示例 + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | +| ---------------- | ----------------- | ---------------------------------------------------------------------------------- | ------- | +| conversations | 会话列表 | `ConversationInfo[]` | - | +| activeKey | 激活的会话 ID | `ConversationInfo['id']` | - | +| defaultActiveKey | 默认激活的会话 ID | `ConversationInfo['id']` | - | +| dropdown | 下拉菜单 | [ConversationsItemProps](?tab=conversations#iconversationsitemprops)`['dropdown']` | `false` | +| groupable | 是否启用分组 | `boolean` | - | +| className | 自定义类名 | `string` | - | +| style | 自定义样式 | `React.CSSProperties` | - | +| loading | 是否加载中 | `boolean` | - | +| header | 会话列表头部 | `React.ReactNode` | - | +| collapsed | 是否折叠 | `boolean` | `true` | +| onItemClick | 点击会话事件 | `(info: ConversationInfo) => void` | - | +| renderItem | 自定义渲染会话项 | `(props: ConversationsItemProps) => React.ReactNode` | - | + +## ConversationsItemProps + +| 参数 | 说明 | 类型 | 默认值 | +| -------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | +| info | 对话数据 | `ConversationInfo[]` | - | +| active | 是否激活 | `boolean` | - | +| dropdown | 下拉菜单 | `DropdownProps & { triggerDom?: React.ReactNode \| ((conversation: ConversationInfo, info: { originNode: React.ReactNode }) => React.ReactNode) }` | - | +| onClick | 点击事件 | `(conversation: ConversationInfo) => void` | - | diff --git a/src/chat/index.$tab-think.md b/src/chat/index.$tab-think.md new file mode 100644 index 000000000..cc1d883d8 --- /dev/null +++ b/src/chat/index.$tab-think.md @@ -0,0 +1,24 @@ +--- +title: Think +group: 组件 +toc: content +demo: + cols: 2 +--- + +# Think + +## 何时使用 + +Think 组件用以展示 AI 交互中深度思考样式。 + +## 示例 + + + +## API + +| 参数 | 说明 | 类型 | 默认值 | +| ------- | ---- | ------------------ | ------ | +| data | 类型 | ReactMarkdownProps | - | +| loading | 类型 | boolean | - | diff --git a/src/chat/index.md b/src/chat/index.md index 10b913ae5..890cd406f 100644 --- a/src/chat/index.md +++ b/src/chat/index.md @@ -21,6 +21,8 @@ Chat 规范由多个组件复合使用实现落地场景,其中: - `Message` 组件是符合 AI 规范的回答框 - `Prompt` 组件是符合 AI 规范的提问框 - `Content` 组件是符合 AI 规范的正文内容 +- `Conversations` 组件是符合 AI 规范的会话列表组件 +- `Think` 组件是符合 AI 规范的深度思考样式 ## 何时使用 @@ -30,5 +32,6 @@ Chat 规范由多个组件复合使用实现落地场景,其中: + ## API diff --git a/src/chat/index.tsx b/src/chat/index.tsx index 2a57861f3..840902b5f 100644 --- a/src/chat/index.tsx +++ b/src/chat/index.tsx @@ -3,6 +3,7 @@ import React, { type PropsWithChildren } from 'react'; import Button from './button'; import CodeBlock from './codeBlock'; import Content from './content'; +import Conversations from './conversations'; import Input from './input'; import Loading from './loading'; import Markdown from './markdown'; @@ -10,6 +11,7 @@ import Message from './message'; import Pagination from './pagination'; import Prompt from './prompt'; import Tag from './tag'; +import Think from './think'; import useChat from './useChat'; import { context, type IChatContext, useContext } from './useContext'; import Welcome from './welcome'; @@ -21,7 +23,25 @@ const DEFAULT_MAX_REGENERATE_COUNT = 5; type ChatProviderConfig = Omit & Partial>; -function Chat({ +type ChatComponent = React.FC> & { + useChat: typeof useChat; + useContext: typeof useContext; + Loading: typeof Loading; + Button: typeof Button; + CodeBlock: typeof CodeBlock; + Input: typeof Input; + Markdown: typeof Markdown; + Pagination: typeof Pagination; + Message: typeof Message; + Prompt: typeof Prompt; + Content: typeof Content; + Tag: typeof Tag; + Welcome: typeof Welcome; + Conversations: typeof Conversations; + Think: typeof Think; +}; + +const Chat: ChatComponent = function Chat({ chat, components, maxRegenerateCount = DEFAULT_MAX_REGENERATE_COUNT, @@ -31,6 +51,8 @@ function Chat({ messageIcons, rehypePlugins, remarkPlugins, + messageHeader, + promptFooter, children, }: PropsWithChildren) { return ( @@ -45,16 +67,17 @@ function Chat({ regenerate, rehypePlugins, remarkPlugins, + messageHeader, + promptFooter, }} > {children} ); -} +}; Chat.useChat = useChat; Chat.useContext = useContext; - Chat.Loading = Loading; Chat.Button = Button; Chat.CodeBlock = CodeBlock; @@ -66,6 +89,8 @@ Chat.Prompt = Prompt; Chat.Content = Content; Chat.Tag = Tag; Chat.Welcome = Welcome; +Chat.Conversations = Conversations; +Chat.Think = Think; export { type IContentRef } from './content'; export default Chat; diff --git a/src/chat/input/index.tsx b/src/chat/input/index.tsx index 4666adae8..897656bb9 100644 --- a/src/chat/input/index.tsx +++ b/src/chat/input/index.tsx @@ -34,6 +34,10 @@ export default function Input({
{ @@ -46,10 +50,6 @@ export default function Input({ onPressEnter?.(e); } }} - autoSize={{ - minRows: 2, - maxRows: 7, - }} /> {button?.disabled ? ( diff --git a/src/chat/markdown/index.scss b/src/chat/markdown/index.scss index d076fe70a..08418932a 100644 --- a/src/chat/markdown/index.scss +++ b/src/chat/markdown/index.scss @@ -73,6 +73,33 @@ font-size: 14px; } } + &__table { + border: 1px solid #EBECF0; + width: 100%; + margin-block-end: 8px; + tr { + border-bottom: 1px solid #EBECF0; + height: 36px; + text-align: left; + font-size: 12px; + line-height: 20px; + color: #3D446E; + th, td { + padding: 8px 16px; + } + } + thead { + tr { + background-color: #F9F9FA; + font-weight: 500; + } + } + tbody { + tr { + background-color: #FFF; + } + } + } &__inlineCode { margin: 0 4px; padding: 2px 8px; diff --git a/src/chat/markdown/index.tsx b/src/chat/markdown/index.tsx index 1f2223b33..94574d984 100644 --- a/src/chat/markdown/index.tsx +++ b/src/chat/markdown/index.tsx @@ -6,11 +6,13 @@ import remarkGfm from 'remark-gfm'; import Image from '../../image'; import CodeBlock, { type ICodeBlockProps } from '../codeBlock'; +import { Message as MessageEntity } from '../entity'; import './index.scss'; type IMarkdownProps = { typing?: boolean; codeBlock?: Omit; + message?: MessageEntity; onMount?: () => void; } & ReactMarkdownOptions; @@ -21,6 +23,7 @@ export default memo( rehypePlugins = [], remarkPlugins = [], codeBlock, + message, components, children, onMount, @@ -44,7 +47,11 @@ export default memo( return {children}; }, pre({ children }) { - return {children}; + return ( + + {children} + + ); }, hr() { return
; @@ -57,6 +64,9 @@ export default memo( return
{data.children}
; } }, + table({ children }) { + return {children}
; + }, img({ src, ...rest }) { return ( - {children} + {children?.replace(/<\/think>/g, '\n\n')} ); }, diff --git a/src/chat/message/index.scss b/src/chat/message/index.scss index 8e74318c4..e7db33695 100644 --- a/src/chat/message/index.scss +++ b/src/chat/message/index.scss @@ -3,6 +3,9 @@ display: flex; gap: 4px; position: relative; + &:has(+ .dtc__message__container):has(.dtc__message__iconGroup:not(:empty)) { + margin-bottom: 8px; + } &:hover { .dtc__message__iconGroup { opacity: 1; diff --git a/src/chat/message/index.tsx b/src/chat/message/index.tsx index 740f76444..a3c534218 100644 --- a/src/chat/message/index.tsx +++ b/src/chat/message/index.tsx @@ -18,7 +18,7 @@ import Pagination from '../pagination'; import { CopyOptions, useContext } from '../useContext'; import './index.scss'; -type IMessageProps = { +export type IMessageProps = { prompt: PromptEntity; data: MessageEntity[]; /** @@ -44,7 +44,14 @@ export default function Message({ onLazyRendered, }: IMessageProps) { const divRef = useIntersectionObserver(handleObserverCb); - const { components = {}, messageIcons, codeBlock, rehypePlugins, remarkPlugins } = useContext(); + const { + components = {}, + messageIcons, + codeBlock, + rehypePlugins, + remarkPlugins, + messageHeader, + } = useContext(); // 当前 Message 的懒加载,是否已经加载过 const [lazyRendered, setLazyRendered] = useState(false); @@ -137,6 +144,11 @@ export default function Message({ ref={divRef} > + + {typeof messageHeader === 'function' + ? messageHeader(record, prompt) + : messageHeader} + {lazyRendered && ( { mountCallback.current(); }} + message={record} > - {record?.content} + {record?.content ?? ''} )} diff --git a/src/chat/prompt/index.tsx b/src/chat/prompt/index.tsx index 2b041a823..7c2b1cc89 100644 --- a/src/chat/prompt/index.tsx +++ b/src/chat/prompt/index.tsx @@ -2,7 +2,7 @@ import React, { useMemo } from 'react'; import { Components } from 'react-markdown'; import classNames from 'classnames'; -import type { Prompt as PromptEntity } from '../entity'; +import { Prompt as PromptEntity } from '../entity'; import Markdown from '../markdown'; import { useContext } from '../useContext'; import './index.scss'; @@ -13,7 +13,7 @@ type IPromptProps = { }; export default function Prompt({ data, className }: IPromptProps) { - const { components = {}, codeBlock } = useContext(); + const { components = {}, codeBlock, promptFooter } = useContext(); const composedComponents = useMemo(() => { return Object.keys(components).reduce((acc, cur) => { @@ -39,6 +39,9 @@ export default function Prompt({ data, className }: IPromptProps) {
+ + {typeof promptFooter === 'function' ? promptFooter(data) : promptFooter} + ); } diff --git a/src/chat/think/index.scss b/src/chat/think/index.scss new file mode 100644 index 000000000..a6a43d3af --- /dev/null +++ b/src/chat/think/index.scss @@ -0,0 +1,29 @@ +.dtc__custom__think { + &__btn { + color: #64698B; + font-size: 12px; + line-height: 20px; + padding: 0; + cursor: pointer; + user-select: none; + } + &__content { + position: relative; + padding: 4px 0 4px 8px; + margin: 4px 0; + } + &__line { + position: absolute; + top: 0; + left: 0; + width: 2px; + height: 100%; + background-color: #D8DAE2; + } + &__text { + color: #8B8FA8; + font-size: 12px; + font-weight: 400; + line-height: 20px; + } +} diff --git a/src/chat/think/index.tsx b/src/chat/think/index.tsx new file mode 100644 index 000000000..be734935e --- /dev/null +++ b/src/chat/think/index.tsx @@ -0,0 +1,40 @@ +import React, { useState } from 'react'; +import type { ReactMarkdownProps } from 'react-markdown/lib/complex-types'; +import { UpOutlined } from '@dtinsight/react-icons'; + +import Flex from '../../flex'; +import GradientText from '../gradientText'; +import './index.scss'; + +export interface IThinkProps { + data: ReactMarkdownProps; + loading?: boolean; +} +export default function Think({ data, loading }: IThinkProps) { + const [collapse, setCollapse] = useState(false); + return ( +
+ setCollapse((p) => !p)} + > + {loading ? 思考中... : '已完成深度思考'} + + + {!collapse && ( +
+
+
{data.children}
+
+ )} +
+ ); +} diff --git a/src/chat/useChat.ts b/src/chat/useChat.ts index ee0d8fc5c..22a5700af 100644 --- a/src/chat/useChat.ts +++ b/src/chat/useChat.ts @@ -10,7 +10,6 @@ import { MessageProperties, MessageStatus, Prompt, - PromptProperties, } from './entity'; class BaseConversation extends Conversation {} @@ -117,10 +116,15 @@ export default function useChat< } function _updatePrompt(promptId: Id, predicate: (prompt: Prompt) => Prompt): void; - function _updatePrompt(promptId: Id, data: Partial>): void; function _updatePrompt( promptId: Id, - dataOrPredicate: Partial> | ((prompt: Prompt) => Prompt) + data: Partial[0], 'id'>> + ): void; + function _updatePrompt( + promptId: Id, + dataOrPredicate: + | Partial[0], 'id'>> + | ((prompt: Prompt) => Prompt) ) { if (!state.current) return; state.current = produce(state.current, (draft) => { diff --git a/src/chat/useContext.ts b/src/chat/useContext.ts index 0428f65f9..3715dec48 100644 --- a/src/chat/useContext.ts +++ b/src/chat/useContext.ts @@ -36,6 +36,8 @@ export interface IChatContext { messageIcons?: React.ReactNode | ((record: Message, prompt: Prompt) => React.ReactNode); rehypePlugins?: ReactMarkdownOptions['rehypePlugins']; remarkPlugins?: ReactMarkdownOptions['remarkPlugins']; + messageHeader?: React.ReactNode | ((record: Message, prompt: Prompt) => React.ReactNode); + promptFooter?: React.ReactNode | ((record: Prompt) => React.ReactNode); } export const context = React.createContext({ diff --git a/src/copy/__tests__/copy.test.tsx b/src/copy/__tests__/copy.test.tsx index bdb867dee..ce174db96 100644 --- a/src/copy/__tests__/copy.test.tsx +++ b/src/copy/__tests__/copy.test.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { cleanup, fireEvent, render } from '@testing-library/react'; +import { cleanup, fireEvent, render, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import '@testing-library/jest-dom/extend-expect'; @@ -12,7 +12,7 @@ describe('test Copy', () => { cleanup(); }); - it('should copy text to clipboard on click', () => { + it('should copy text to clipboard on click', async () => { const user = userEvent.setup({ writeToClipboard: true }); const mockCopy = jest.fn(); const { container } = render( mockCopy(text)} />); @@ -21,7 +21,9 @@ describe('test Copy', () => { expect(button).toBeInTheDocument(); fireEvent.click(button!); - expect(mockCopy).toHaveBeenCalledWith(mockText); + await waitFor(() => { + expect(mockCopy).toHaveBeenCalledWith(mockText); + }); user.paste().then((value) => { expect(value).toEqual(mockText); }); diff --git a/src/copy/index.tsx b/src/copy/index.tsx index d4993040a..d71c8df2f 100644 --- a/src/copy/index.tsx +++ b/src/copy/index.tsx @@ -1,5 +1,5 @@ import React, { CSSProperties, ReactNode } from 'react'; -import { CopyUtils } from '@dtinsight/dt-utils'; +import { copy } from '@dtinsight/dt-utils'; import { CopyOutlined } from '@dtinsight/react-icons'; import { message, Tooltip } from 'antd'; import classNames from 'classnames'; @@ -30,9 +30,10 @@ const Copy: React.FC = (props) => { onCopy = () => message.success(locale.copied), } = props; - const handleCopy = () => { + const handleCopy = async () => { if (disabled) return; - new CopyUtils().copy(text, () => onCopy(text)); + await copy(text); + onCopy(text); }; const renderCopyButton = () => ( diff --git a/src/dropdown/__tests__/__snapshots__/dropdown.test.tsx.snap b/src/dropdown/__tests__/__snapshots__/dropdown.test.tsx.snap index 6c88b09b9..bdfa307fe 100644 --- a/src/dropdown/__tests__/__snapshots__/dropdown.test.tsx.snap +++ b/src/dropdown/__tests__/__snapshots__/dropdown.test.tsx.snap @@ -28,10 +28,9 @@ exports[`Test Dropdown.Select Component Should match snapshot 1`] = ` class="ant-checkbox-wrapper" > { act(() => { jest.runAllTimers(); }); - // Should be indeterminate - expect(getByText('全选').previousElementSibling?.className).toContain( + // Only disabled item selected → not indeterminate (no enabled items selected) + expect(getByText('全选').previousElementSibling?.className).not.toContain( 'ant-checkbox-indeterminate' ); @@ -347,9 +347,9 @@ describe('Test Dropdown.Select Component', () => { ); - // Should be indeterminate + // All enabled items selected → checked expect(getByText('全选').previousElementSibling?.className).toContain( - 'ant-checkbox-indeterminate' + 'ant-checkbox-checked' ); rerender( diff --git a/src/dropdown/select.tsx b/src/dropdown/select.tsx index bbfa09b5a..392505c4a 100644 --- a/src/dropdown/select.tsx +++ b/src/dropdown/select.tsx @@ -1,4 +1,4 @@ -import React, { ReactNode, useEffect, useMemo, useState } from 'react'; +import React, { ReactNode, useCallback, useEffect, useMemo, useState } from 'react'; import { Button, Checkbox, Col, Dropdown, type DropDownProps, Row, Space } from 'antd'; import type { CheckboxChangeEvent } from 'antd/lib/checkbox'; import type { @@ -7,7 +7,6 @@ import type { CheckboxValueType, } from 'antd/lib/checkbox/Group'; import classNames from 'classnames'; -import { isEqual } from 'lodash-es'; import List from 'rc-virtual-list'; import useLocale from '../locale/useLocale'; @@ -38,24 +37,102 @@ export default function Select({ const locale = useLocale('Dropdown'); - const handleCheckedAll = (e: CheckboxChangeEvent) => { - if (e.target.checked) { - setSelected(options?.map((i) => i.value) || []); - } else { - handleReset(); + useEffect(() => { + if (value !== undefined) { + setSelected(value); } - }; + }, [value]); + + // Always turn string and number options into complex options + const options = useMemo(() => { + return ( + rawOptions?.map((i) => { + if (typeof i === 'string' || typeof i === 'number') { + return { + label: i, + value: i, + }; + } + + return i; + }) || [] + ); + }, [rawOptions]); + + /** + * The "derived metadata" of the selected data + * It does not directly participate in rendering but is only used for logical judgment + * + * Purpose: + * - Clearly distinguish enabled / disabled + * - Prevent disabled items from being accidentally selected / reset + */ + const selectionMeta = useMemo(() => { + const enabled = new Set(); + const disabled = new Set(); + + options.forEach((o) => { + if (o.disabled) { + disabled.add(o.value); + } else { + enabled.add(o.value); + } + }); + + const selectedEnabled: CheckboxValueType[] = []; + const selectedDisabled: CheckboxValueType[] = []; + + selected.forEach((v) => { + if (enabled.has(v)) { + selectedEnabled.push(v); + } + if (disabled.has(v)) { + selectedDisabled.push(v); + } + }); + + return { + /** All selectable (non-disabled) values */ + enabledValues: Array.from(enabled), + /** All disabled values */ + disabledValues: Array.from(disabled), + /** Currently selected enabled items */ + selectedEnabled, + /** Currently selected disabled items (for reset retention) */ + selectedDisabled, + /** All enabled items are selected */ + checkAll: enabled.size > 0 && selectedEnabled.length === enabled.size, + /** Partial enabled items are selected */ + indeterminate: selectedEnabled.length > 0 && selectedEnabled.length < enabled.size, + /** + * Whether to disable the Reset button + * Only disabled when: + * - All currently selected items are disabled + */ + resetDisabled: selected.length > 0 && selected.every((v) => disabled.has(v)), + }; + }, [options, selected]); + + const handleReset = useCallback(() => { + setSelected(selectionMeta.selectedDisabled); + }, [selectionMeta.selectedDisabled]); + + const handleCheckedAll = useCallback( + (e: CheckboxChangeEvent) => { + if (e.target.checked) { + setSelected([...selectionMeta.enabledValues, ...selectionMeta.selectedDisabled]); + } else { + handleReset(); + } + }, + [selectionMeta, handleReset] + ); const handleSubmit = () => { onChange?.(selected); setVisible(false); }; - const handleReset = () => { - // Clear checked but disabled item - setSelected(disabledValue); - }; - const handleChange = (e: CheckboxChangeEvent) => { const { checked, value } = e.target; const next = checked ? [...selected, value] : selected?.filter((i) => i !== value); @@ -83,55 +160,17 @@ export default function Select({ } }; - useEffect(() => { - if (value !== undefined && value !== selected) { - setSelected(value || []); - } - }, [value]); - - // Always turn string and number options into complex options - const options = useMemo(() => { - return ( - rawOptions?.map((i) => { - if (typeof i === 'string' || typeof i === 'number') { - return { - label: i, - value: i, - }; - } - - return i; - }) || [] - ); - }, [rawOptions]); - - const disabledValue = useMemo(() => { - return options?.filter((i) => i.disabled).map((i) => i.value) || []; - }, [options]); - - const resetDisabled = selected.every((i) => disabledValue?.includes(i)); - // If options' number is larger then the maxHeight, then enable virtual list const virtual = options.length > Math.floor(MAX_HEIGHT / ITEM_HEIGHT); - // ONLY the options are all be pushed into value array means select all - const checkAll = - !!selected?.length && isEqual(options.map((i) => i.value).sort(), [...selected].sort()); - - // At least one option's value is included in value array but not all options means indeterminate select - const indeterminate = - !!selected?.length && - !isEqual(options.map((i) => i.value).sort(), [...selected].sort()) && - options.some((o) => selected.includes(o.value)); - const overlay = ( <> {locale.selectAll} @@ -171,7 +210,7 @@ export default function Select({ -