From 80b87d7ffe5750f9f64459a6655c8e1d998927b3 Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 15:09:54 +0700 Subject: [PATCH 01/18] fix(repo): workspaces -> workspace --- pnpm-lock.yaml | 550 +++++++++++++++++++- pnpm-workspaces.yaml => pnpm-workspace.yaml | 0 2 files changed, 531 insertions(+), 19 deletions(-) rename pnpm-workspaces.yaml => pnpm-workspace.yaml (100%) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bee7d9e..91d496c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,25 +4,45 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -devDependencies: - '@types/node': - specifier: ^20.12.6 - version: 20.12.6 - citty: - specifier: ^0.1.6 - version: 0.1.6 - jiti: - specifier: ^1.21.0 - version: 1.21.0 - pathe: - specifier: ^1.1.2 - version: 1.1.2 - scule: - specifier: ^1.3.0 - version: 1.3.0 - vitepress: - specifier: ^1.1.0 - version: 1.1.0(@algolia/client-search@4.23.2)(@types/node@20.12.6)(search-insights@2.13.0) +importers: + + .: + devDependencies: + '@types/node': + specifier: ^20.12.6 + version: 20.12.6 + citty: + specifier: ^0.1.6 + version: 0.1.6 + jiti: + specifier: ^1.21.0 + version: 1.21.0 + pathe: + specifier: ^1.1.2 + version: 1.1.2 + scule: + specifier: ^1.3.0 + version: 1.3.0 + vitepress: + specifier: ^1.1.0 + version: 1.1.0(@algolia/client-search@4.23.2)(@types/node@20.12.6)(search-insights@2.13.0) + + packages/stdlib: + devDependencies: + '@robonen/tsconfig': + specifier: workspace:* + version: link:../tsconfig + pathe: + specifier: ^1.1.2 + version: 1.1.2 + vite: + specifier: ^5.2.8 + version: 5.2.8(@types/node@20.12.6) + vite-plugin-dts: + specifier: ^3.8.1 + version: 3.8.1(@types/node@20.12.6)(typescript@5.4.4)(vite@5.2.8) + + packages/tsconfig: {} packages: @@ -457,6 +477,64 @@ packages: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@microsoft/api-extractor-model@7.28.13(@types/node@20.12.6): + resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.6) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.43.0(@types/node@20.12.6): + resolution: {integrity: sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.13(@types/node@20.12.6) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.6) + '@rushstack/rig-package': 0.5.2 + '@rushstack/terminal': 0.10.0(@types/node@20.12.6) + '@rushstack/ts-command-line': 4.19.1(@types/node@20.12.6) + lodash: 4.17.21 + minimatch: 3.0.8 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.4.2 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: true + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + /@rollup/rollup-android-arm-eabi@4.14.1: resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==} cpu: [arm] @@ -577,6 +655,54 @@ packages: dev: true optional: true + /@rushstack/node-core-library@4.0.2(@types/node@20.12.6): + resolution: {integrity: sha512-hyES82QVpkfQMeBMteQUnrhASL/KHPhd7iJ8euduwNJG4mu2GSOKybf0rOEjOm1Wz7CwJEUm9y0yD7jg2C1bfg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.12.6 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true + + /@rushstack/rig-package@0.5.2: + resolution: {integrity: sha512-mUDecIJeH3yYGZs2a48k+pbhM6JYwWlgjs2Ca5f2n1G2/kgdgP9D/07oglEGf6mRyXEnazhEENeYTSNDRCwdqA==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/terminal@0.10.0(@types/node@20.12.6): + resolution: {integrity: sha512-UbELbXnUdc7EKwfH2sb8ChqNgapUOdqcCIdQP4NGxBpTZV2sQyeekuK3zmfQSa/MN+/7b4kBogl2wq0vpkpYGw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 4.0.2(@types/node@20.12.6) + '@types/node': 20.12.6 + supports-color: 8.1.1 + dev: true + + /@rushstack/ts-command-line@4.19.1(@types/node@20.12.6): + resolution: {integrity: sha512-J7H768dgcpG60d7skZ5uSSwyCZs/S2HrWP1Ds8d1qYAyaaeJmpmmLr9BVw97RjFzmQPOYnoXcKA4GkqDCkduQg==} + dependencies: + '@rushstack/terminal': 0.10.0(@types/node@20.12.6) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + dev: true + /@shikijs/core@1.3.0: resolution: {integrity: sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA==} dev: true @@ -587,6 +713,10 @@ packages: shiki: 1.3.0 dev: true + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true @@ -627,6 +757,25 @@ packages: vue: 3.4.21 dev: true + /@volar/language-core@1.11.1: + resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} + dependencies: + '@volar/source-map': 1.11.1 + dev: true + + /@volar/source-map@1.11.1: + resolution: {integrity: sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==} + dependencies: + muggle-string: 0.3.1 + dev: true + + /@volar/typescript@1.11.1: + resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + dependencies: + '@volar/language-core': 1.11.1 + path-browserify: 1.0.1 + dev: true + /@vue/compiler-core@3.4.21: resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: @@ -692,6 +841,26 @@ packages: rfdc: 1.3.1 dev: true + /@vue/language-core@1.8.27(typescript@5.4.4): + resolution: {integrity: sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@volar/language-core': 1.11.1 + '@volar/source-map': 1.11.1 + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + computeds: 0.0.1 + minimatch: 9.0.4 + muggle-string: 0.3.1 + path-browserify: 1.0.1 + typescript: 5.4.4 + vue-template-compiler: 2.7.16 + dev: true + /@vue/reactivity@3.4.21: resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} dependencies: @@ -802,6 +971,15 @@ packages: - vue dev: true + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + /algoliasearch@4.23.2: resolution: {integrity: sha512-8aCl055IsokLuPU8BzLjwzXjb7ty9TPcUFFOk0pYOwsE5DMVhE3kwCMFtsCFKcnoPZK7oObm+H5mbnSO/9ioxQ==} dependencies: @@ -822,12 +1000,50 @@ packages: '@algolia/transporter': 4.23.2 dev: true + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + /citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} dependencies: consola: 3.2.3 dev: true + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: true + optional: true + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -837,6 +1053,22 @@ packages: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dev: true + /de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -877,12 +1109,29 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + /focus-trap@7.5.4: resolution: {integrity: sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==} dependencies: tabbable: 6.2.0 dev: true + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -891,15 +1140,88 @@ packages: dev: true optional: true + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: true + /hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} dev: true + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true dev: true + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + /magic-string@0.30.9: resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} engines: {node: '>=12'} @@ -911,6 +1233,19 @@ packages: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} dev: true + /minimatch@3.0.8: + resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minisearch@6.3.0: resolution: {integrity: sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==} dev: true @@ -919,12 +1254,28 @@ packages: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: true + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /muggle-string@0.3.1: + resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + dev: true + /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + /pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true @@ -937,6 +1288,11 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + /postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} @@ -950,6 +1306,27 @@ packages: resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==} dev: true + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + /rfdc@1.3.1: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} dev: true @@ -987,6 +1364,22 @@ packages: resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} dev: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + /shiki@1.3.0: resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} dependencies: @@ -998,11 +1391,42 @@ packages: engines: {node: '>=0.10.0'} dev: true + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + /speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} dev: true + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + /tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: true @@ -1012,10 +1436,63 @@ packages: engines: {node: '>=4'} dev: true + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /typescript@5.4.4: + resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: true + + /vite-plugin-dts@3.8.1(@types/node@20.12.6)(typescript@5.4.4)(vite@5.2.8): + resolution: {integrity: sha512-zEYyQxH7lKto1VTKZHF3ZZeOPkkJgnMrePY4VxDHfDSvDjmYMMfWjZxYmNwW8QxbaItWJQhhXY+geAbyNphI7g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@microsoft/api-extractor': 7.43.0(@types/node@20.12.6) + '@rollup/pluginutils': 5.1.0 + '@vue/language-core': 1.8.27(typescript@5.4.4) + debug: 4.3.4 + kolorist: 1.8.0 + magic-string: 0.30.9 + typescript: 5.4.4 + vite: 5.2.8(@types/node@20.12.6) + vue-tsc: 1.8.27(typescript@5.4.4) + transitivePeerDependencies: + - '@types/node' + - rollup + - supports-color + dev: true + /vite@5.2.8(@types/node@20.12.6): resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1122,6 +1599,25 @@ packages: vue: 3.4.21 dev: true + /vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + dev: true + + /vue-tsc@1.8.27(typescript@5.4.4): + resolution: {integrity: sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==} + hasBin: true + peerDependencies: + typescript: '*' + dependencies: + '@volar/typescript': 1.11.1 + '@vue/language-core': 1.8.27(typescript@5.4.4) + semver: 7.6.0 + typescript: 5.4.4 + dev: true + /vue@3.4.21: resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} peerDependencies: @@ -1136,3 +1632,19 @@ packages: '@vue/server-renderer': 3.4.21(vue@3.4.21) '@vue/shared': 3.4.21 dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 + dev: true diff --git a/pnpm-workspaces.yaml b/pnpm-workspace.yaml similarity index 100% rename from pnpm-workspaces.yaml rename to pnpm-workspace.yaml From d7a2d15bdb51563f675b374ee69da62837f8372e Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 15:11:27 +0700 Subject: [PATCH 02/18] refactor(repo): add pathe lib to cli tool --- cli.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cli.ts b/cli.ts index 9da6878..aa56207 100644 --- a/cli.ts +++ b/cli.ts @@ -7,6 +7,7 @@ const PACKAGE_MANAGER = 'pnpm@8.15.6'; const NODE_VERSION = '>=18.0.0'; const VITE_VERSION = '^5.2.8'; const VITE_DTS_VERSION = '^3.8.1'; +const PATHE_VERSION = '^1.1.2' const DEFAULT_DIR = 'packages'; const generatePackageJson = (name: string, path: string, hasVite: boolean) => { @@ -51,7 +52,8 @@ const generatePackageJson = (name: string, path: string, hasVite: boolean) => { '@robonen/tsconfig': 'workspace:*', ...(hasVite && { vite: VITE_VERSION, - 'vite-plugin-dts': VITE_DTS_VERSION, + 'vite-plugin-dts': VITE_DTS_VERSION, + pathe: PATHE_VERSION, }), }, }; @@ -61,6 +63,7 @@ const generatePackageJson = (name: string, path: string, hasVite: boolean) => { const generateViteConfig = () => `import { defineConfig } from 'vite'; import dts from 'vite-plugin-dts'; +import { resolve } from 'pathe'; export default defineConfig({ resolve: { From 37d25bfb1d115d58d83feb5fa59c8728c2b1b704 Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 15:12:25 +0700 Subject: [PATCH 03/18] refactor(packages/tsconfig): add description and publishConfig --- packages/tsconfig/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 797bdf9..828309b 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -3,7 +3,7 @@ "private": true, "version": "1.0.0", "license": "UNLICENSED", - "description": "", + "description": "Base typescript configuration for projects", "keywords": [ "tsconfig", "typescript", @@ -22,5 +22,8 @@ }, "files": [ "**tsconfig.json" - ] + ], + "publishConfig": { + "access": "public" + } } \ No newline at end of file From c985b95fc5d2fc59c12391926ba7ff64e291563f Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 15:12:53 +0700 Subject: [PATCH 04/18] feat(packages/stdlib): create stdlib --- packages/stdlib/README.md | 1 + packages/stdlib/package.json | 44 ++++++++++++++++++++++++++++++++++ packages/stdlib/tsconfig.json | 3 +++ packages/stdlib/vite.config.ts | 14 +++++++++++ 4 files changed, 62 insertions(+) create mode 100644 packages/stdlib/README.md create mode 100644 packages/stdlib/package.json create mode 100644 packages/stdlib/tsconfig.json create mode 100644 packages/stdlib/vite.config.ts diff --git a/packages/stdlib/README.md b/packages/stdlib/README.md new file mode 100644 index 0000000..728ebbe --- /dev/null +++ b/packages/stdlib/README.md @@ -0,0 +1 @@ +# @robonen/stdlib \ No newline at end of file diff --git a/packages/stdlib/package.json b/packages/stdlib/package.json new file mode 100644 index 0000000..94a2ddf --- /dev/null +++ b/packages/stdlib/package.json @@ -0,0 +1,44 @@ +{ + "name": "@robonen/stdlib", + "private": true, + "version": "1.0.0", + "license": "UNLICENSED", + "description": "", + "keywords": [], + "author": "Robonen Andrew ", + "repository": { + "type": "git", + "url": "git+https://github.com/robonen/tools.git", + "directory": "packages/stdlib" + }, + "packageManager": "pnpm@8.15.6", + "engines": { + "node": ">=18.0.0" + }, + "type": "module", + "files": [ + "dist" + ], + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "types": "./dist/index.d.ts" + } + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@robonen/tsconfig": "workspace:*", + "vite": "^5.2.8", + "vite-plugin-dts": "^3.8.1", + "pathe": "^1.1.2" + } +} \ No newline at end of file diff --git a/packages/stdlib/tsconfig.json b/packages/stdlib/tsconfig.json new file mode 100644 index 0000000..80ea232 --- /dev/null +++ b/packages/stdlib/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@robonen/tsconfig/tsconfig.json", +} \ No newline at end of file diff --git a/packages/stdlib/vite.config.ts b/packages/stdlib/vite.config.ts new file mode 100644 index 0000000..1c7341c --- /dev/null +++ b/packages/stdlib/vite.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import { resolve } from 'pathe'; + +export default defineConfig({ + resolve: { + alias: { + '@': resolve(__dirname, './src'), + }, + }, + plugins: [ + dts({ insertTypesEntry: true }), + ], +}); From a5d33ea9db862e705a25d02db61cd9706ab71f38 Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 16:48:32 +0700 Subject: [PATCH 05/18] refactor(repo): change cli generated exports in package.json --- cli.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cli.ts b/cli.ts index aa56207..a8e9dfa 100644 --- a/cli.ts +++ b/cli.ts @@ -30,13 +30,13 @@ const generatePackageJson = (name: string, path: string, hasVite: boolean) => { }, type: 'module', files: ['dist'], - main: './dist/index.cjs', + main: './dist/index.umd.js', module: './dist/index.js', types: './dist/index.d.ts', exports: { '.': { import: './dist/index.js', - require: './dist/index.cjs', + require: './dist/index.umd.js', types: './dist/index.d.ts', }, }, From 04347254b458db9685dc10203b799dde5ebecc6a Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 16:49:49 +0700 Subject: [PATCH 06/18] feat(packages/stdlib): base vite config --- packages/stdlib/package.json | 32 +- packages/stdlib/vite.config.ts | 12 +- pnpm-lock.yaml | 622 +++++++++++++++++++++++++++++++++ 3 files changed, 654 insertions(+), 12 deletions(-) diff --git a/packages/stdlib/package.json b/packages/stdlib/package.json index 94a2ddf..b1eaf55 100644 --- a/packages/stdlib/package.json +++ b/packages/stdlib/package.json @@ -4,7 +4,15 @@ "version": "1.0.0", "license": "UNLICENSED", "description": "", - "keywords": [], + "keywords": [ + "stdlib", + "utils", + "tools", + "helpers", + "math", + "algorithms", + "data-structures" + ], "author": "Robonen Andrew ", "repository": { "type": "git", @@ -19,26 +27,28 @@ "files": [ "dist" ], - "main": "./dist/index.cjs", - "module": "./dist/index.js", - "types": "./dist/index.d.ts", + "main": "./dist/stdlib.umd.js", + "module": "./dist/stdlib.js", + "types": "./dist/stdlib.d.ts", "exports": { ".": { - "import": "./dist/index.js", - "require": "./dist/index.cjs", - "types": "./dist/index.d.ts" + "import": "./dist/stdlib.js", + "require": "./dist/stdlib.umd.js", + "types": "./dist/stdlib.d.ts" } }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test": "vitest", + "coverage": "vitest run --coverage", "dev": "vite", - "build": "vite build", - "preview": "vite preview" + "build": "vite build" }, "devDependencies": { "@robonen/tsconfig": "workspace:*", + "@vitest/coverage-v8": "^1.4.0", + "pathe": "^1.1.2", "vite": "^5.2.8", "vite-plugin-dts": "^3.8.1", - "pathe": "^1.1.2" + "vitest": "^1.4.0" } } \ No newline at end of file diff --git a/packages/stdlib/vite.config.ts b/packages/stdlib/vite.config.ts index 1c7341c..9eef0bf 100644 --- a/packages/stdlib/vite.config.ts +++ b/packages/stdlib/vite.config.ts @@ -3,12 +3,22 @@ import dts from 'vite-plugin-dts'; import { resolve } from 'pathe'; export default defineConfig({ + build: { + lib: { + name: 'Stdlib', + fileName: 'stdlib', + entry: resolve(__dirname, './src/index.ts'), + }, + }, resolve: { alias: { '@': resolve(__dirname, './src'), }, }, plugins: [ - dts({ insertTypesEntry: true }), + dts({ + insertTypesEntry: true, + exclude: '**/*.test.ts', + }), ], }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 91d496c..6c79dc7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: '@robonen/tsconfig': specifier: workspace:* version: link:../tsconfig + '@vitest/coverage-v8': + specifier: ^1.4.0 + version: 1.4.0(vitest@1.4.0) pathe: specifier: ^1.1.2 version: 1.1.2 @@ -41,6 +44,9 @@ importers: vite-plugin-dts: specifier: ^3.8.1 version: 3.8.1(@types/node@20.12.6)(typescript@5.4.4)(vite@5.2.8) + vitest: + specifier: ^1.4.0 + version: 1.4.0(@types/node@20.12.6) packages/tsconfig: {} @@ -196,6 +202,14 @@ packages: '@algolia/requester-common': 4.23.2 dev: true + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + /@babel/helper-string-parser@7.24.1: resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} engines: {node: '>=6.9.0'} @@ -223,6 +237,10 @@ packages: to-fast-properties: 2.0.0 dev: true + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + /@docsearch/css@3.6.0: resolution: {integrity: sha512-+sbxb71sWre+PwDK7X2T8+bhS6clcVMLwBPznX45Qu6opJcgRjAp7gYSDzVFp187J+feSj5dNBN1mJoi6ckkUQ==} dev: true @@ -473,10 +491,48 @@ packages: dev: true optional: true + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@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 + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@microsoft/api-extractor-model@7.28.13(@types/node@20.12.6): resolution: {integrity: sha512-39v/JyldX4MS9uzHcdfmjjfS6cYGAoXV+io8B5a338pkHiSt+gy2eXQ0Q7cGFJ7quSa1VqqlMdlPrB6sLR/cAw==} dependencies: @@ -713,6 +769,10 @@ packages: shiki: 1.3.0 dev: true + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} dev: true @@ -721,6 +781,10 @@ packages: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + /@types/linkify-it@3.0.5: resolution: {integrity: sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==} dev: true @@ -757,6 +821,69 @@ packages: vue: 3.4.21 dev: true + /@vitest/coverage-v8@1.4.0(vitest@1.4.0): + resolution: {integrity: sha512-4hDGyH1SvKpgZnIByr9LhGgCEuF9DKM34IBLCC/fVfy24Z3+PZ+Ii9hsVBsHvY1umM1aGPEjceRkzxCfcQ10wg==} + peerDependencies: + vitest: 1.4.0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.9 + magicast: 0.3.3 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + test-exclude: 6.0.0 + v8-to-istanbul: 9.2.0 + vitest: 1.4.0(@types/node@20.12.6) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@1.4.0: + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} + dependencies: + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.4.0: + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} + dependencies: + '@vitest/utils': 1.4.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.4.0: + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} + dependencies: + magic-string: 0.30.9 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.4.0: + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.4.0: + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /@volar/language-core@1.11.1: resolution: {integrity: sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==} dependencies: @@ -971,6 +1098,17 @@ packages: - vue dev: true + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -1000,12 +1138,21 @@ packages: '@algolia/transporter': 4.23.2 dev: true + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 dev: true + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true @@ -1023,6 +1170,30 @@ packages: balanced-match: 1.0.2 dev: true + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true + /citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} dependencies: @@ -1049,6 +1220,19 @@ packages: engines: {node: ^14.18.0 || >=16.10.0} dev: true + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} dev: true @@ -1069,6 +1253,18 @@ packages: ms: 2.1.2 dev: true + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1109,6 +1305,27 @@ packages: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} dev: true + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -1132,6 +1349,10 @@ packages: universalify: 0.1.2 dev: true + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1144,6 +1365,26 @@ packages: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true @@ -1169,17 +1410,79 @@ packages: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} dev: true + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + /import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} dev: true + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.2 dev: true + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@5.0.4: + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + engines: {node: '>=10'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} hasBin: true @@ -1189,10 +1492,18 @@ packages: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} dev: true + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -1203,6 +1514,14 @@ packages: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} dev: true + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + dev: true + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true @@ -1215,6 +1534,12 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1229,16 +1554,46 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + source-map-js: 1.2.0 + dev: true + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.0 + dev: true + /mark.js@8.11.1: resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} dev: true + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /minimatch@3.0.8: resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==} dependencies: brace-expansion: 1.1.11 dev: true + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -1254,6 +1609,15 @@ packages: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} dev: true + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.0.3 + ufo: 1.5.3 + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true @@ -1268,10 +1632,52 @@ packages: hasBin: true dev: true + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true + /path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -1280,6 +1686,10 @@ packages: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} dev: true + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} dev: true @@ -1293,6 +1703,14 @@ packages: engines: {node: '>=8.6'} dev: true + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + dev: true + /postcss@8.4.38: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} @@ -1306,11 +1724,24 @@ packages: resolution: {integrity: sha512-S1d1ernz3KQ+Y2awUxKakpfOg2CEmJmwOP+6igPx6dgr6pgDvenqYviyokWso2rhHvGtTlWWnJDa7RaPbQerTg==} dev: true + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} dev: true + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: @@ -1380,12 +1811,33 @@ packages: lru-cache: 6.0.0 dev: true + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + /shiki@1.3.0: resolution: {integrity: sha512-9aNdQy/etMXctnPzsje1h1XIGm9YfRcSksKOGqZWXA/qP9G18/8fpz5Bjpma8bOgz3tqIpjERAd6/lLjFyzoww==} dependencies: '@shikijs/core': 1.3.0 dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + /source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -1405,16 +1857,42 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + dev: true + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} dev: true + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} dev: true + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + dependencies: + js-tokens: 9.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + /supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -1431,11 +1909,39 @@ packages: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: true + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.0.8 + dev: true + + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} + dev: true + + /tinypool@0.8.3: + resolution: {integrity: sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + /typescript@5.4.2: resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} @@ -1448,6 +1954,10 @@ packages: hasBin: true dev: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true @@ -1463,11 +1973,41 @@ packages: punycode: 2.3.1 dev: true + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + /validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} dev: true + /vite-node@1.4.0(@types/node@20.12.6): + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.8(@types/node@20.12.6) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vite-plugin-dts@3.8.1(@types/node@20.12.6)(typescript@5.4.4)(vite@5.2.8): resolution: {integrity: sha512-zEYyQxH7lKto1VTKZHF3ZZeOPkkJgnMrePY4VxDHfDSvDjmYMMfWjZxYmNwW8QxbaItWJQhhXY+geAbyNphI7g==} engines: {node: ^14.18.0 || >=16.0.0} @@ -1584,6 +2124,62 @@ packages: - universal-cookie dev: true + /vitest@1.4.0(@types/node@20.12.6): + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.4.0 + '@vitest/ui': 1.4.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + dependencies: + '@types/node': 20.12.6 + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.9 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.6.0 + tinypool: 0.8.3 + vite: 5.2.8(@types/node@20.12.6) + vite-node: 1.4.0(@types/node@20.12.6) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + /vue-demi@0.14.7(vue@3.4.21): resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} engines: {node: '>=12'} @@ -1633,10 +2229,36 @@ packages: '@vue/shared': 3.4.21 dev: true + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /z-schema@5.0.5: resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} engines: {node: '>=8.0.0'} From 3f1d16b48415012720c6b59ff5790be1f77f94bb Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 16:50:25 +0700 Subject: [PATCH 07/18] refactor(packages/tsconfig): disable declaration and source maps --- packages/tsconfig/tsconfig.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/tsconfig/tsconfig.json b/packages/tsconfig/tsconfig.json index c7882d4..151f37c 100644 --- a/packages/tsconfig/tsconfig.json +++ b/packages/tsconfig/tsconfig.json @@ -6,9 +6,8 @@ "module": "Preserve", "noEmit": true, "moduleResolution": "Bundler", - "sourceMap": true, "target": "ESNext", - + "outDir": "dist", "skipLibCheck": true, "esModuleInterop": true, @@ -27,10 +26,9 @@ /* Library transpiling */ "declaration": true, - - /* Library in monorepo */ "composite": true, - "declarationMap": true + "sourceMap": false, + "declarationMap": false }, "exclude": ["node_modules", "dist"] } \ No newline at end of file From 8515bff983c6a71204a7431903a28975a1cd07f0 Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 16:51:09 +0700 Subject: [PATCH 08/18] feat(packages/stdlib): math/clamp util --- packages/stdlib/src/index.ts | 1 + packages/stdlib/src/math/clamp/index.test.ts | 22 ++++++++++++++++++++ packages/stdlib/src/math/clamp/index.ts | 3 +++ packages/stdlib/src/math/index.ts | 1 + 4 files changed, 27 insertions(+) create mode 100644 packages/stdlib/src/index.ts create mode 100644 packages/stdlib/src/math/clamp/index.test.ts create mode 100644 packages/stdlib/src/math/clamp/index.ts create mode 100644 packages/stdlib/src/math/index.ts diff --git a/packages/stdlib/src/index.ts b/packages/stdlib/src/index.ts new file mode 100644 index 0000000..444cc89 --- /dev/null +++ b/packages/stdlib/src/index.ts @@ -0,0 +1 @@ +export * from './math'; \ No newline at end of file diff --git a/packages/stdlib/src/math/clamp/index.test.ts b/packages/stdlib/src/math/clamp/index.test.ts new file mode 100644 index 0000000..54157a4 --- /dev/null +++ b/packages/stdlib/src/math/clamp/index.test.ts @@ -0,0 +1,22 @@ +import { describe,it, expect } from 'vitest'; +import { clamp } from '.'; + +describe('clamp', () => { + it('should return the value itself if it is within the range', () => { + expect(clamp(5, 0, 10)).toBe(5); + expect(clamp(-3, -5, 5)).toBe(-3); + expect(clamp(0, -10, 10)).toBe(0); + }); + + it('should return the minimum value if the value is less than the minimum', () => { + expect(clamp(-10, 0, 10)).toBe(0); + expect(clamp(-100, -50, 50)).toBe(-50); + expect(clamp(-5, -5, 5)).toBe(-5); + }); + + it('should return the maximum value if the value is greater than the maximum', () => { + expect(clamp(15, 0, 10)).toBe(10); + expect(clamp(100, -50, 50)).toBe(50); + expect(clamp(10, -5, 5)).toBe(5); + }); +}); \ No newline at end of file diff --git a/packages/stdlib/src/math/clamp/index.ts b/packages/stdlib/src/math/clamp/index.ts new file mode 100644 index 0000000..29f49f6 --- /dev/null +++ b/packages/stdlib/src/math/clamp/index.ts @@ -0,0 +1,3 @@ +export function clamp(value: number, min: number, max: number): number { + return Math.min(Math.max(value, min), max); +} \ No newline at end of file diff --git a/packages/stdlib/src/math/index.ts b/packages/stdlib/src/math/index.ts new file mode 100644 index 0000000..0244181 --- /dev/null +++ b/packages/stdlib/src/math/index.ts @@ -0,0 +1 @@ +export * from './clamp'; \ No newline at end of file From 5280ace1681c1ebd54a1f48dde10952ddb0a328a Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 17:55:08 +0700 Subject: [PATCH 09/18] refactor(packages/stdlib): add doc, update tests --- packages/stdlib/src/math/clamp/index.test.ts | 48 +++++++++++++++----- packages/stdlib/src/math/clamp/index.ts | 10 +++- 2 files changed, 45 insertions(+), 13 deletions(-) diff --git a/packages/stdlib/src/math/clamp/index.test.ts b/packages/stdlib/src/math/clamp/index.test.ts index 54157a4..ade0756 100644 --- a/packages/stdlib/src/math/clamp/index.test.ts +++ b/packages/stdlib/src/math/clamp/index.test.ts @@ -2,21 +2,45 @@ import { describe,it, expect } from 'vitest'; import { clamp } from '.'; describe('clamp', () => { - it('should return the value itself if it is within the range', () => { - expect(clamp(5, 0, 10)).toBe(5); - expect(clamp(-3, -5, 5)).toBe(-3); - expect(clamp(0, -10, 10)).toBe(0); + it('should clamp a value within the given range', () => { + // value < min + expect(clamp(-10, 0, 100)).toBe(0); + + // value > max + expect(clamp(200, 0, 100)).toBe(100); + + // value within range + expect(clamp(50, 0, 100)).toBe(50); + + // value at min + expect(clamp(0, 0, 100)).toBe(0); + + // value at max + expect(clamp(100, 0, 100)).toBe(100); + + // value at midpoint + expect(clamp(50, 100, 100)).toBe(100); }); - it('should return the minimum value if the value is less than the minimum', () => { - expect(clamp(-10, 0, 10)).toBe(0); - expect(clamp(-100, -50, 50)).toBe(-50); - expect(clamp(-5, -5, 5)).toBe(-5); + it('should handle floating-point numbers correctly', () => { + // floating-point value within range + expect(clamp(3.14, 0, 5)).toBe(3.14); + + // floating-point value < min + expect(clamp(-1.5, 0, 10)).toBe(0); + + // floating-point value > max + expect(clamp(15.75, 0, 10)).toBe(10); }); - it('should return the maximum value if the value is greater than the maximum', () => { - expect(clamp(15, 0, 10)).toBe(10); - expect(clamp(100, -50, 50)).toBe(50); - expect(clamp(10, -5, 5)).toBe(5); + it('should handle edge cases', () => { + // all values are the same + expect(clamp(5, 5, 5)).toBe(5); + + // min > max + expect(clamp(10, 100, 50)).toBe(50); + + // negative range and value + expect(clamp(-10, -100, -5)).toBe(-10); }); }); \ No newline at end of file diff --git a/packages/stdlib/src/math/clamp/index.ts b/packages/stdlib/src/math/clamp/index.ts index 29f49f6..41cffde 100644 --- a/packages/stdlib/src/math/clamp/index.ts +++ b/packages/stdlib/src/math/clamp/index.ts @@ -1,3 +1,11 @@ +/** + * Clamps a number between a minimum and maximum value + * + * @param {number} value The number to clamp + * @param {number} min Minimum value + * @param {number} max Maximum value + * @returns {number} The clamped number + */ export function clamp(value: number, min: number, max: number): number { return Math.min(Math.max(value, min), max); -} \ No newline at end of file +} From d8a9a62335d15fd5d86ea727e71bad51ce0cb583 Mon Sep 17 00:00:00 2001 From: robonen Date: Wed, 10 Apr 2024 20:21:44 +0700 Subject: [PATCH 10/18] feat(packages/stdlib): mapRange util --- packages/stdlib/src/math/index.ts | 3 +- .../stdlib/src/math/mapRange/index.test.ts | 46 +++++++++++++++++++ packages/stdlib/src/math/mapRange/index.ts | 18 ++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 packages/stdlib/src/math/mapRange/index.test.ts create mode 100644 packages/stdlib/src/math/mapRange/index.ts diff --git a/packages/stdlib/src/math/index.ts b/packages/stdlib/src/math/index.ts index 0244181..701b72a 100644 --- a/packages/stdlib/src/math/index.ts +++ b/packages/stdlib/src/math/index.ts @@ -1 +1,2 @@ -export * from './clamp'; \ No newline at end of file +export * from './clamp'; +export * from './mapRange'; \ No newline at end of file diff --git a/packages/stdlib/src/math/mapRange/index.test.ts b/packages/stdlib/src/math/mapRange/index.test.ts new file mode 100644 index 0000000..55d362b --- /dev/null +++ b/packages/stdlib/src/math/mapRange/index.test.ts @@ -0,0 +1,46 @@ +import { describe, expect, it } from 'vitest'; +import { mapRange } from './index'; + +describe('mapRange', () => { + it('should map values from one range to another', () => { + // value at midpoint + expect(mapRange(5, 0, 10, 0, 100)).toBe(50); + + // value at min + expect(mapRange(0, 0, 10, 0, 100)).toBe(0); + + // value at max + expect(mapRange(10, 0, 10, 0, 100)).toBe(100); + + // value outside range (below) + expect(mapRange(-5, 0, 10, 0, 100)).toBe(0); + + // value outside range (above) + expect(mapRange(15, 0, 10, 0, 100)).toBe(100); + + // value at midpoint of negative range + expect(mapRange(75, 50, 100, -50, 50)).toBe(0); + + // value at midpoint of negative range + expect(mapRange(-25, -50, 0, 0, 100)).toBe(50); + }); + + it('should handle floating-point numbers correctly', () => { + // floating-point value + expect(mapRange(3.5, 0, 10, 0, 100)).toBe(35); + + // positive floating-point ranges + expect(mapRange(1.25, 0, 2.5, 0, 100)).toBe(50); + + // negative floating-point value + expect(mapRange(-2.5, -5, 0, 0, 100)).toBe(50); + + // negative floating-point ranges + expect(mapRange(-1.25, -2.5, 0, 0, 100)).toBe(50); + }); + + it('should handle edge cases', () => { + // input range is zero (should return output min) + expect(mapRange(5, 0, 0, 0, 100)).toBe(0); + }); +}); \ No newline at end of file diff --git a/packages/stdlib/src/math/mapRange/index.ts b/packages/stdlib/src/math/mapRange/index.ts new file mode 100644 index 0000000..cc9cddf --- /dev/null +++ b/packages/stdlib/src/math/mapRange/index.ts @@ -0,0 +1,18 @@ +import { clamp } from "../clamp"; + +/** + * Map a value from one range to another + * + * @param {number} value The value to map + * @param {number} in_min The minimum value of the input range + * @param {number} in_max The maximum value of the input range + * @param {number} out_min The minimum value of the output range + * @param {number} out_max The maximum value of the output range + * @returns {number} The mapped value + */ +export function mapRange(value: number, in_min: number, in_max: number, out_min: number, out_max: number): number { + if (in_min === in_max) + return out_min; + + return (clamp(value, in_min, in_max) - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; +} \ No newline at end of file From e9b8b0c78de1ad3a711487e2d9b3a94423b6c4f1 Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 00:10:16 +0700 Subject: [PATCH 11/18] chore(packages/stdlib): add bench script, add vscode workspace --- packages/stdlib/package.json | 3 ++- tools.code-workspace | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 tools.code-workspace diff --git a/packages/stdlib/package.json b/packages/stdlib/package.json index b1eaf55..3668566 100644 --- a/packages/stdlib/package.json +++ b/packages/stdlib/package.json @@ -39,7 +39,8 @@ }, "scripts": { "test": "vitest", - "coverage": "vitest run --coverage", + "test:coverage": "vitest run --coverage", + "test:bench": "vitest bench", "dev": "vite", "build": "vite build" }, diff --git a/tools.code-workspace b/tools.code-workspace new file mode 100644 index 0000000..568b1fa --- /dev/null +++ b/tools.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "packages/stdlib" + } + ] +} \ No newline at end of file From 65ba312f4cbe434c0de8e0477547c7e63a46bf1c Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 00:10:52 +0700 Subject: [PATCH 12/18] refactor(packages/stdlib): add comments for math utils --- packages/stdlib/src/math/clamp/index.ts | 5 +++++ packages/stdlib/src/math/mapRange/index.ts | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/stdlib/src/math/clamp/index.ts b/packages/stdlib/src/math/clamp/index.ts index 41cffde..b8532eb 100644 --- a/packages/stdlib/src/math/clamp/index.ts +++ b/packages/stdlib/src/math/clamp/index.ts @@ -7,5 +7,10 @@ * @returns {number} The clamped number */ export function clamp(value: number, min: number, max: number): number { + // The clamp function takes a value, a minimum, and a maximum as parameters. + // It ensures that the value falls within the range defined by the minimum and maximum values. + // If the value is less than the minimum, it returns the minimum value. + // If the value is greater than the maximum, it returns the maximum value. + // Otherwise, it returns the original value. return Math.min(Math.max(value, min), max); } diff --git a/packages/stdlib/src/math/mapRange/index.ts b/packages/stdlib/src/math/mapRange/index.ts index cc9cddf..f82dd41 100644 --- a/packages/stdlib/src/math/mapRange/index.ts +++ b/packages/stdlib/src/math/mapRange/index.ts @@ -11,8 +11,13 @@ import { clamp } from "../clamp"; * @returns {number} The mapped value */ export function mapRange(value: number, in_min: number, in_max: number, out_min: number, out_max: number): number { + // Zero input range means invalid input, so return lowest output range value if (in_min === in_max) return out_min; - return (clamp(value, in_min, in_max) - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; + // To ensure the value is within the input range, clamp it + const clampedValue = clamp(value, in_min, in_max); + + // Finally, map the value from the input range to the output range + return (clampedValue - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } \ No newline at end of file From 002215303a0fda40e81c459bf5ce8323304f9ca9 Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 00:11:29 +0700 Subject: [PATCH 13/18] feat(packages/stdlib): levenshtein distance util --- packages/stdlib/src/text/index.ts | 1 + .../text/levenshtein-distance/index.test.ts | 32 ++++++++++++++ .../src/text/levenshtein-distance/index.ts | 44 +++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 packages/stdlib/src/text/index.ts create mode 100644 packages/stdlib/src/text/levenshtein-distance/index.test.ts create mode 100644 packages/stdlib/src/text/levenshtein-distance/index.ts diff --git a/packages/stdlib/src/text/index.ts b/packages/stdlib/src/text/index.ts new file mode 100644 index 0000000..106ddd8 --- /dev/null +++ b/packages/stdlib/src/text/index.ts @@ -0,0 +1 @@ +export * from './levenshtein-distance'; \ No newline at end of file diff --git a/packages/stdlib/src/text/levenshtein-distance/index.test.ts b/packages/stdlib/src/text/levenshtein-distance/index.test.ts new file mode 100644 index 0000000..4989e5b --- /dev/null +++ b/packages/stdlib/src/text/levenshtein-distance/index.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from 'vitest'; +import levenshteinDistance from '.'; + +describe('levenshteinDistance', () => { + it('should calculate edit distance between two strings', () => { + // just one substitution I at the beginning + expect(levenshteinDistance('islander', 'slander')).toBe(1); + + // substitution M->K, T->M and add an A to the end + expect(levenshteinDistance('mart', 'karma')).toBe(3); + + // substitution K->S, E->I and insert G at the end + expect(levenshteinDistance('kitten', 'sitting')).toBe(3); + + // should add 4 letters FOOT at the beginning + expect(levenshteinDistance('ball', 'football')).toBe(4); + + // should delete 4 letters FOOT at the beginning + expect(levenshteinDistance('football', 'foot')).toBe(4); + + // needs to substitute the first 5 chars INTEN->EXECU + expect(levenshteinDistance('intention', 'execution')).toBe(5); + }); + + it('should handle edge cases', () => { + expect(levenshteinDistance('', '')).toBe(0); + expect(levenshteinDistance('a', '')).toBe(1); + expect(levenshteinDistance('', 'a')).toBe(1); + expect(levenshteinDistance('abc', '')).toBe(3); + expect(levenshteinDistance('', 'abc')).toBe(3); + }); + }); \ No newline at end of file diff --git a/packages/stdlib/src/text/levenshtein-distance/index.ts b/packages/stdlib/src/text/levenshtein-distance/index.ts new file mode 100644 index 0000000..48728e2 --- /dev/null +++ b/packages/stdlib/src/text/levenshtein-distance/index.ts @@ -0,0 +1,44 @@ +/** + * Calculate the Levenshtein distance between two strings + * + * @param {string} a First string + * @param {string} b Second string + * @returns {number} The Levenshtein distance between the two strings + */ +export default function levenshteinDistance(a: string, b: string): number { + // If the strings are equal, the distance is 0 + if (a === b) return 0; + + // If either string is empty, the distance is the length of the other string + if (a.length === 0) return b.length; + if (b.length === 0) return a.length; + + // Create empty edit distance matrix for all possible modifications of + // substrings of a to substrings of b + const distanceMatrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(null)); + + // Fill the first row of the matrix + // If this is the first row, we're transforming from an empty string to a + // In this case, the number of operations equals the length of a substring + for (let i = 0; i <= a.length; i++) + distanceMatrix[0]![i]! = i; + + // Fill the first column of the matrix + // If this is the first column, we're transforming empty string to b + // In this case, the number of operations equals the length of b substring + for (let j = 0; j <= b.length; j++) + distanceMatrix[j]![0]! = j; + + for (let j = 1; j <= b.length; j++) { + for (let i = 1; i <= a.length; i++) { + const indicator = a[i - 1] === b[j - 1] ? 0 : 1; + distanceMatrix[j]![i]! = Math.min( + distanceMatrix[j]![i - 1]! + 1, // deletion + distanceMatrix[j - 1]![i]! + 1, // insertion + distanceMatrix[j - 1]![i - 1]! + indicator // substitution + ); + } + } + + return distanceMatrix[b.length]![a.length]!; +} From 92721b348add5ed24ffa4220f6f624ae5d866ffd Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 00:22:20 +0700 Subject: [PATCH 14/18] refactor(packages/stdlib): levensthein fn replate to module export --- packages/stdlib/src/index.ts | 1 + packages/stdlib/src/text/levenshtein-distance/index.test.ts | 2 +- packages/stdlib/src/text/levenshtein-distance/index.ts | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/stdlib/src/index.ts b/packages/stdlib/src/index.ts index 444cc89..cd510a8 100644 --- a/packages/stdlib/src/index.ts +++ b/packages/stdlib/src/index.ts @@ -1 +1,2 @@ +export * from './text'; export * from './math'; \ No newline at end of file diff --git a/packages/stdlib/src/text/levenshtein-distance/index.test.ts b/packages/stdlib/src/text/levenshtein-distance/index.test.ts index 4989e5b..72e1cf6 100644 --- a/packages/stdlib/src/text/levenshtein-distance/index.test.ts +++ b/packages/stdlib/src/text/levenshtein-distance/index.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import levenshteinDistance from '.'; +import {levenshteinDistance} from '.'; describe('levenshteinDistance', () => { it('should calculate edit distance between two strings', () => { diff --git a/packages/stdlib/src/text/levenshtein-distance/index.ts b/packages/stdlib/src/text/levenshtein-distance/index.ts index 48728e2..50e1fa2 100644 --- a/packages/stdlib/src/text/levenshtein-distance/index.ts +++ b/packages/stdlib/src/text/levenshtein-distance/index.ts @@ -5,7 +5,7 @@ * @param {string} b Second string * @returns {number} The Levenshtein distance between the two strings */ -export default function levenshteinDistance(a: string, b: string): number { +export function levenshteinDistance(a: string, b: string): number { // If the strings are equal, the distance is 0 if (a === b) return 0; From 7d8f5be6e959b3636a288daff42b6cc382d41ba4 Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 21:16:53 +0700 Subject: [PATCH 15/18] refactor(packages/stdlib): rename arguments to left and right --- .../src/text/levenshtein-distance/index.ts | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/stdlib/src/text/levenshtein-distance/index.ts b/packages/stdlib/src/text/levenshtein-distance/index.ts index 50e1fa2..06957a8 100644 --- a/packages/stdlib/src/text/levenshtein-distance/index.ts +++ b/packages/stdlib/src/text/levenshtein-distance/index.ts @@ -1,37 +1,37 @@ /** * Calculate the Levenshtein distance between two strings * - * @param {string} a First string - * @param {string} b Second string + * @param {string} left First string + * @param {string} right Second string * @returns {number} The Levenshtein distance between the two strings */ -export function levenshteinDistance(a: string, b: string): number { +export function levenshteinDistance(left: string, right: string): number { // If the strings are equal, the distance is 0 - if (a === b) return 0; + if (left === right) return 0; // If either string is empty, the distance is the length of the other string - if (a.length === 0) return b.length; - if (b.length === 0) return a.length; + if (left.length === 0) return right.length; + if (right.length === 0) return left.length; // Create empty edit distance matrix for all possible modifications of - // substrings of a to substrings of b - const distanceMatrix = Array(b.length + 1).fill(null).map(() => Array(a.length + 1).fill(null)); + // substrings of left to substrings of right + const distanceMatrix = Array(right.length + 1).fill(null).map(() => Array(left.length + 1).fill(null)); // Fill the first row of the matrix - // If this is the first row, we're transforming from an empty string to a - // In this case, the number of operations equals the length of a substring - for (let i = 0; i <= a.length; i++) + // If this is the first row, we're transforming from an empty string to left + // In this case, the number of operations equals the length of left substring + for (let i = 0; i <= left.length; i++) distanceMatrix[0]![i]! = i; // Fill the first column of the matrix - // If this is the first column, we're transforming empty string to b - // In this case, the number of operations equals the length of b substring - for (let j = 0; j <= b.length; j++) + // If this is the first column, we're transforming empty string to right + // In this case, the number of operations equals the length of right substring + for (let j = 0; j <= right.length; j++) distanceMatrix[j]![0]! = j; - for (let j = 1; j <= b.length; j++) { - for (let i = 1; i <= a.length; i++) { - const indicator = a[i - 1] === b[j - 1] ? 0 : 1; + for (let j = 1; j <= right.length; j++) { + for (let i = 1; i <= left.length; i++) { + const indicator = left[i - 1] === right[j - 1] ? 0 : 1; distanceMatrix[j]![i]! = Math.min( distanceMatrix[j]![i - 1]! + 1, // deletion distanceMatrix[j - 1]![i]! + 1, // insertion @@ -40,5 +40,5 @@ export function levenshteinDistance(a: string, b: string): number { } } - return distanceMatrix[b.length]![a.length]!; + return distanceMatrix[right.length]![left.length]!; } From 5045852e68f5a2cb52f09a0b2c4e422cbf567607 Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 21:18:03 +0700 Subject: [PATCH 16/18] feat(packages/stdlib): add trigram distance utill --- .../stdlib/src/text/trigram-distance/index.ts | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 packages/stdlib/src/text/trigram-distance/index.ts diff --git a/packages/stdlib/src/text/trigram-distance/index.ts b/packages/stdlib/src/text/trigram-distance/index.ts new file mode 100644 index 0000000..186f055 --- /dev/null +++ b/packages/stdlib/src/text/trigram-distance/index.ts @@ -0,0 +1,49 @@ +export type Trigrams = Map; + +/** + * Extracts trigrams from a text and returns a map of trigram to count + * + * @param {string} text The text to extract trigrams + * @returns {Trigrams} A map of trigram to count + */ +export function trigramProfile(text: string): Trigrams { + text = '\n\n' + text + '\n\n'; + + const trigrams = new Map(); + + for (let i = 0; i < text.length - 2; i++) { + const trigram = text.slice(i, i + 3); + const count = trigrams.get(trigram) ?? 0; + trigrams.set(trigram, count + 1); + } + + return trigrams; +} + +/** + * Calculates the trigram distance between two strings + * + * @param {Trigrams} left First text trigram profile + * @param {Trigrams} right Second text trigram profile + * @returns {number} The trigram distance between the two strings + */ +export function trigramDistance(left: Trigrams, right: Trigrams) { + let distance = -4; + let total = -4; + + for (const [trigram, left_count] of left) { + total += left_count; + const right_count = right.get(trigram) ?? 0; + distance += Math.abs(left_count - right_count); + } + + for (const [trigram, right_count] of right) { + total += right_count; + const left_count = left.get(trigram) ?? 0; + distance += Math.abs(left_count - right_count); + } + + if (distance < 0) return 0; + + return distance / total; +} \ No newline at end of file From 4c10d38ae17a671414ecd9bb66db6cfbc6608189 Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 21:19:09 +0700 Subject: [PATCH 17/18] test(packages/stdlib): trigram distance tests --- packages/stdlib/src/text/index.ts | 3 +- .../src/text/trigram-distance/index.test.ts | 93 +++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 packages/stdlib/src/text/trigram-distance/index.test.ts diff --git a/packages/stdlib/src/text/index.ts b/packages/stdlib/src/text/index.ts index 106ddd8..c740f6d 100644 --- a/packages/stdlib/src/text/index.ts +++ b/packages/stdlib/src/text/index.ts @@ -1 +1,2 @@ -export * from './levenshtein-distance'; \ No newline at end of file +export * from './levenshtein-distance'; +export * from './trigram-distance'; \ No newline at end of file diff --git a/packages/stdlib/src/text/trigram-distance/index.test.ts b/packages/stdlib/src/text/trigram-distance/index.test.ts new file mode 100644 index 0000000..3f23146 --- /dev/null +++ b/packages/stdlib/src/text/trigram-distance/index.test.ts @@ -0,0 +1,93 @@ +import { describe, it, expect } from 'vitest'; +import { trigramDistance, trigramProfile } from '.'; + +describe('trigramProfile', () => { + it('trigram profile of a text with different trigrams', () => { + const different_trigrams = 'hello world'; + const profile1 = trigramProfile(different_trigrams); + + expect(profile1).toEqual(new Map([ + ['\n\nh', 1], + ['\nhe', 1], + ['hel', 1], + ['ell', 1], + ['llo', 1], + ['lo ', 1], + ['o w', 1], + [' wo', 1], + ['wor', 1], + ['orl', 1], + ['rld', 1], + ['ld\n', 1], + ['d\n\n', 1] + ])); + }); + + it('trigram profile of a text with repeated trigrams', () => { + const repeated_trigrams = 'hello hello'; + const profile2 = trigramProfile(repeated_trigrams); + + expect(profile2).toEqual(new Map([ + ['\n\nh', 1], + ['\nhe', 1], + ['hel', 2], + ['ell', 2], + ['llo', 2], + ['lo ', 1], + ['o h', 1], + [' he', 1], + ['lo\n', 1], + ['o\n\n', 1] + ])); + }); + + it('trigram profile of an empty text', () => { + const text = ''; + const profile = trigramProfile(text); + + expect(profile).toEqual(new Map([ + ['\n\n\n', 2], + ])); + }); +}); + +describe('trigramDistance', () => { + it('zero when comparing the same text', () => { + const profile1 = trigramProfile('hello world'); + const profile2 = trigramProfile('hello world'); + + expect(trigramDistance(profile1, profile2)).toBe(0); + }); + + it('one for completely different text', () => { + const profile1 = trigramProfile('hello world'); + const profile2 = trigramProfile('lorem ipsum'); + + expect(trigramDistance(profile1, profile2)).toBe(1); + }); + + it('one for empty text and non-empty text', () => { + const profile1 = trigramProfile('hello world'); + const profile2 = trigramProfile(''); + + expect(trigramDistance(profile1, profile2)).toBe(1); + }); + + it('approximately 0.5 for similar text', () => { + const profile1 = trigramProfile('hello world'); + const profile2 = trigramProfile('hello lorem'); + + const approx = trigramDistance(profile1, profile2); + + expect(approx).toBeGreaterThan(0.45); + expect(approx).toBeLessThan(0.55); + }); + + it('triangle inequality', () => { + const A = trigramDistance(trigramProfile('metric'), trigramProfile('123ric')); + const B = trigramDistance(trigramProfile('123ric'), trigramProfile('123456')); + const C = trigramDistance(trigramProfile('metric'), trigramProfile('123456')); + + expect(A + B).toBeGreaterThanOrEqual(C); + }); +}); \ No newline at end of file From 9031430aeca84e74ee16347df69f9f8c01d825cf Mon Sep 17 00:00:00 2001 From: robonen Date: Thu, 11 Apr 2024 21:20:10 +0700 Subject: [PATCH 18/18] refactor(packages/stdlib): reformat test files --- packages/stdlib/src/math/clamp/index.test.ts | 6 +++--- packages/stdlib/src/math/mapRange/index.test.ts | 6 +++--- .../src/text/levenshtein-distance/index.test.ts | 14 +++++++------- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/stdlib/src/math/clamp/index.test.ts b/packages/stdlib/src/math/clamp/index.test.ts index ade0756..3d49e3d 100644 --- a/packages/stdlib/src/math/clamp/index.test.ts +++ b/packages/stdlib/src/math/clamp/index.test.ts @@ -2,7 +2,7 @@ import { describe,it, expect } from 'vitest'; import { clamp } from '.'; describe('clamp', () => { - it('should clamp a value within the given range', () => { + it('clamp a value within the given range', () => { // value < min expect(clamp(-10, 0, 100)).toBe(0); @@ -22,7 +22,7 @@ describe('clamp', () => { expect(clamp(50, 100, 100)).toBe(100); }); - it('should handle floating-point numbers correctly', () => { + it('handle floating-point numbers correctly', () => { // floating-point value within range expect(clamp(3.14, 0, 5)).toBe(3.14); @@ -33,7 +33,7 @@ describe('clamp', () => { expect(clamp(15.75, 0, 10)).toBe(10); }); - it('should handle edge cases', () => { + it('handle edge cases', () => { // all values are the same expect(clamp(5, 5, 5)).toBe(5); diff --git a/packages/stdlib/src/math/mapRange/index.test.ts b/packages/stdlib/src/math/mapRange/index.test.ts index 55d362b..17a4292 100644 --- a/packages/stdlib/src/math/mapRange/index.test.ts +++ b/packages/stdlib/src/math/mapRange/index.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import { mapRange } from './index'; describe('mapRange', () => { - it('should map values from one range to another', () => { + it('map values from one range to another', () => { // value at midpoint expect(mapRange(5, 0, 10, 0, 100)).toBe(50); @@ -25,7 +25,7 @@ describe('mapRange', () => { expect(mapRange(-25, -50, 0, 0, 100)).toBe(50); }); - it('should handle floating-point numbers correctly', () => { + it('handle floating-point numbers correctly', () => { // floating-point value expect(mapRange(3.5, 0, 10, 0, 100)).toBe(35); @@ -39,7 +39,7 @@ describe('mapRange', () => { expect(mapRange(-1.25, -2.5, 0, 0, 100)).toBe(50); }); - it('should handle edge cases', () => { + it('handle edge cases', () => { // input range is zero (should return output min) expect(mapRange(5, 0, 0, 0, 100)).toBe(0); }); diff --git a/packages/stdlib/src/text/levenshtein-distance/index.test.ts b/packages/stdlib/src/text/levenshtein-distance/index.test.ts index 72e1cf6..a3c0f79 100644 --- a/packages/stdlib/src/text/levenshtein-distance/index.test.ts +++ b/packages/stdlib/src/text/levenshtein-distance/index.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from 'vitest'; import {levenshteinDistance} from '.'; describe('levenshteinDistance', () => { - it('should calculate edit distance between two strings', () => { + it('calculate edit distance between two strings', () => { // just one substitution I at the beginning expect(levenshteinDistance('islander', 'slander')).toBe(1); @@ -22,11 +22,11 @@ describe('levenshteinDistance', () => { expect(levenshteinDistance('intention', 'execution')).toBe(5); }); - it('should handle edge cases', () => { - expect(levenshteinDistance('', '')).toBe(0); - expect(levenshteinDistance('a', '')).toBe(1); - expect(levenshteinDistance('', 'a')).toBe(1); - expect(levenshteinDistance('abc', '')).toBe(3); - expect(levenshteinDistance('', 'abc')).toBe(3); + it('handle empty strings', () => { + expect(levenshteinDistance('', '')).toBe(0); + expect(levenshteinDistance('a', '')).toBe(1); + expect(levenshteinDistance('', 'a')).toBe(1); + expect(levenshteinDistance('abc', '')).toBe(3); + expect(levenshteinDistance('', 'abc')).toBe(3); }); }); \ No newline at end of file