diff --git a/package.json b/package.json index 175fca7..929b892 100644 --- a/package.json +++ b/package.json @@ -87,16 +87,16 @@ "devDependencies": { "@commitlint/config-conventional": "^19.8.1", "@commitlint/types": "^19.8.1", - "@types/node": "^22.16.3", + "@types/node": "^22.16.5", "@vitest/coverage-v8": "^3.2.4", "@webdeveric/eslint-config-ts": "^0.11.0", "@webdeveric/prettier-config": "^0.3.0", "commitlint": "^19.8.1", "commitlint-plugin-cspell": "^0.3.0", "conventional-changelog-conventionalcommits": "^9.1.0", - "cspell": "^9.1.5", + "cspell": "^9.2.0", "eslint": "^8.57.1", - "eslint-config-prettier": "^10.1.5", + "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1b81494..d633f22 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,11 +15,11 @@ importers: specifier: ^19.8.1 version: 19.8.1 '@types/node': - specifier: ^22.16.3 - version: 22.16.3 + specifier: ^22.16.5 + version: 22.16.5 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@22.16.3)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/node@22.16.5)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0)) '@webdeveric/eslint-config-ts': specifier: ^0.11.0 version: 0.11.0(eslint@8.57.1)(typescript@5.8.3) @@ -28,7 +28,7 @@ importers: version: 0.3.0(prettier@3.6.2) commitlint: specifier: ^19.8.1 - version: 19.8.1(@types/node@22.16.3)(typescript@5.8.3) + version: 19.8.1(@types/node@22.16.5)(typescript@5.8.3) commitlint-plugin-cspell: specifier: ^0.3.0 version: 0.3.0(@commitlint/lint@19.8.1) @@ -36,14 +36,14 @@ importers: specifier: ^9.1.0 version: 9.1.0 cspell: - specifier: ^9.1.5 - version: 9.1.5 + specifier: ^9.2.0 + version: 9.2.0 eslint: specifier: ^8.57.1 version: 8.57.1 eslint-config-prettier: - specifier: ^10.1.5 - version: 10.1.5(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@8.57.1) eslint-import-resolver-typescript: specifier: ^4.4.4 version: 4.4.4(eslint-plugin-import@2.32.0)(eslint@8.57.1) @@ -76,7 +76,7 @@ importers: version: 0.12.0 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@22.16.3)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) + version: 3.2.4(@types/node@22.16.5)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) packages: @@ -185,28 +185,28 @@ packages: resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} engines: {node: '>=v18'} - '@cspell/cspell-bundled-dicts@9.1.5': - resolution: {integrity: sha512-CdaWYdxnXBFRWAga2qhB/WVO4oCxgSeV1hosvnFCBxrFUyG5KuqYRJdYgCQcITs6dpA3IdNNa7+zWX8JvxnH+A==} + '@cspell/cspell-bundled-dicts@9.2.0': + resolution: {integrity: sha512-e4qb78SQWqHkRw47W8qFJ3RPijhSLkADF+T0oH8xl3r/golq1RGp2/KrWOqGRRofUSTiIKYqaMX7mbAyFnOxyA==} engines: {node: '>=20'} - '@cspell/cspell-json-reporter@9.1.5': - resolution: {integrity: sha512-tnapaKwxlHa7e5kuy0quJjW0oZlqetTbbsmYlayavm4PEVhuuNEp+skj4t957aRMGSq76t8Kgl7vS5Qp41ToMw==} + '@cspell/cspell-json-reporter@9.2.0': + resolution: {integrity: sha512-qHdkW8eyknCSDEsqCG8OHBMal03LQf21H2LVWhtwszEQ4BQRKcWctc+VIgkO69F/jLaN2wi/yhhMufXWHAEzIg==} engines: {node: '>=20'} - '@cspell/cspell-pipe@9.1.5': - resolution: {integrity: sha512-6zmRfbqTHpYcI/n5uoerQVMqY31lnhA34BHU97uZn6kaW5rXTmQLze/WKmlrs+LAFfDL6MHIOLBJAusZw5Bb5g==} + '@cspell/cspell-pipe@9.2.0': + resolution: {integrity: sha512-RO3adcsr7Ek+4511nyEOWDhOYYU1ogRs1Mo5xx3kDIdcKAJzhFdGry35T2wqft4dPASLCXcemBrhoS+hdQ+z+Q==} engines: {node: '>=20'} - '@cspell/cspell-resolver@9.1.5': - resolution: {integrity: sha512-xZdTdcOcRoShrmA7S3tX5s8UmxFNaef5xdv8TABDjnTr6oPLBsZ5S3kPBZ8T+xlkj3MUB593SIkhD/0G74vLpw==} + '@cspell/cspell-resolver@9.2.0': + resolution: {integrity: sha512-0Xvwq0iezfO71Alw+DjsGxacAzydqOAxdXnY4JknHuxt2l8GTSMjRwj65QAflv3PN6h1QoRZEeWdiKtusceWAw==} engines: {node: '>=20'} - '@cspell/cspell-service-bus@9.1.5': - resolution: {integrity: sha512-mAXtwYw5Xobn8uicZjblI+8SPscKHK3eDGm7hnYeThb/kzS83uQog0+8LbSh+YiXDrAqzXn73kXMHg1D+EvMpQ==} + '@cspell/cspell-service-bus@9.2.0': + resolution: {integrity: sha512-ZDvcOTFk3cCVW+OjlkljeP7aSuV8tIguVn+GMco1/A+961hsEP20hngK9zJtyfpXqyvJKtvCVlyzS+z8VRrZGg==} engines: {node: '>=20'} - '@cspell/cspell-types@9.1.5': - resolution: {integrity: sha512-SPX9vHhqCtPE0wayvwmczax8X0oAXA3sBFIW31CoSyiu4lJ5sfKM4ZaoL25Wu4bW6GlYhaW4+diemmTdLHquag==} + '@cspell/cspell-types@9.2.0': + resolution: {integrity: sha512-hL4ltFwiARpFxlfXt4GiTWQxIFyZp4wrlp7dozZbitYO6QlYc5fwQ8jBc5zFUqknuH4gx/sCMLNXhAv3enNGZQ==} engines: {node: '>=20'} '@cspell/dict-ada@4.1.1': @@ -257,11 +257,11 @@ packages: '@cspell/dict-en-common-misspellings@2.1.3': resolution: {integrity: sha512-v1I97Hr1OrK+mwHsVzbY4vsPxx6mA5quhxzanF6XuRofz00wH4HPz8Q3llzRHxka5Wl/59gyan04UkUrvP4gdA==} - '@cspell/dict-en-gb-mit@3.1.5': - resolution: {integrity: sha512-ovJScYOzSeik0cmr2L379VDWXaFD/FMlC6yXz1X3soGPheGkjVSgI3HICAv7Lk+knf906ifhAcEIrbTPKq9EnQ==} + '@cspell/dict-en-gb-mit@3.1.6': + resolution: {integrity: sha512-3JJGxuPhDK5rMDYPzJYAdjjsBddEyV54rXfUQpOCl7c7weMhNDWfC2q4h3cKNDj7Isud1q2RM+DlSxQWf40OTw==} - '@cspell/dict-en_us@4.4.15': - resolution: {integrity: sha512-mhWaLui5aq0pgM4oIqAJNbOW/wQG3epe4nu22eqYTLQN+ztdzyn7aFpE+9yTtZTNvldK0xtN7jgk2mtHZ9w+1A==} + '@cspell/dict-en_us@4.4.16': + resolution: {integrity: sha512-/R47sUbUmba2dG/0LZyE6P6gX/DRF1sCcYNQNWyPk/KeidQRNZG+FH9U0KRvX42/2ZzMge6ebXH3WAJ52w0Vqw==} '@cspell/dict-filetypes@3.0.13': resolution: {integrity: sha512-g6rnytIpQlMNKGJT1JKzWkC+b3xCliDKpQ3ANFSq++MnR4GaLiifaC4JkVON11Oh/UTplYOR1nY3BR4X30bswA==} @@ -388,20 +388,20 @@ packages: '@cspell/dict-vue@3.0.5': resolution: {integrity: sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==} - '@cspell/dynamic-import@9.1.5': - resolution: {integrity: sha512-vf6mSD9XW3fvl/uXShiZJ58f+FV6uoOPoFV0+xyg78h80bpXOagJeAd/vy0YcGcP/kcAcgRK0q22wCeKkGbeOA==} + '@cspell/dynamic-import@9.2.0': + resolution: {integrity: sha512-2/k4LR8CQqbgIPQGELbCdt9xgg9+aQ7pMwOtllKvnFYBtwNiwqcZjlzAam2gtvD5DghKX2qrcSHG5A7YP5cX9A==} engines: {node: '>=20'} - '@cspell/filetypes@9.1.5': - resolution: {integrity: sha512-Rhy+jBQwLKP6QnW2hIUYZiJ7TfJpTTW/gMfXJYf38BMIKkDlSx1bJV0j6VTcQF3EdqY6f5HmY48uDzNB87ygQQ==} + '@cspell/filetypes@9.2.0': + resolution: {integrity: sha512-6wmCa3ZyI647H7F4w6kb9PCJ703JKSgFTB8EERTdIoGySbgVp5+qMIIoZ//wELukdjgcufcFZ5pBrhRDRsemRA==} engines: {node: '>=20'} - '@cspell/strong-weak-map@9.1.5': - resolution: {integrity: sha512-/IvDGDZAGk41Gm6i/YDpu7Cn47Ap6c+ZXHRb5/BdzK7oomSfeDA77YBTMJrbwSQQEt/NDY+5LXxmB161xIQxSw==} + '@cspell/strong-weak-map@9.2.0': + resolution: {integrity: sha512-5mpIMiIOCu4cBqy1oCTXISgJuOCQ6R/e38AkvnYWfmMIx7fCdx8n+mF52wX9m61Ng28Sq8VL253xybsWcCxHug==} engines: {node: '>=20'} - '@cspell/url@9.1.5': - resolution: {integrity: sha512-2AxwDCf4fwXF558Qf4fHUAreVUvEaRhWagkX3uO6PES+54/uNmLDmjL3Xl6R+GpGGrIeRrBGtc/nqAeamK9g+g==} + '@cspell/url@9.2.0': + resolution: {integrity: sha512-plB0wwdAESqBl4xDAT2db2/K1FZHJXfYlJTiV6pkn0XffTGyg4UGLaSCm15NzUoPxdSmzqj5jQb7y+mB9kFK8g==} engines: {node: '>=20'} '@csstools/color-helpers@5.0.2': @@ -432,167 +432,167 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@emnapi/core@1.4.4': - resolution: {integrity: sha512-A9CnAbC6ARNMKcIcrQwq6HeHCjpcBZ5wSx4U01WXCqEKlrzB9F9315WDNHkrs2xbx7YjjSxbUYxuN6EQzpcY2g==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.4.4': - resolution: {integrity: sha512-hHyapA4A3gPaDCNfiqyZUStTMqIkKRshqPIuDOXv1hcBnD4U3l8cP0T1HMCfGRxQ6V64TGCcoswChANyOAwbQg==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.0.3': - resolution: {integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + '@esbuild/aix-ppc64@0.25.8': + resolution: {integrity: sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + '@esbuild/android-arm64@0.25.8': + resolution: {integrity: sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + '@esbuild/android-arm@0.25.8': + resolution: {integrity: sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + '@esbuild/android-x64@0.25.8': + resolution: {integrity: sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + '@esbuild/darwin-arm64@0.25.8': + resolution: {integrity: sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + '@esbuild/darwin-x64@0.25.8': + resolution: {integrity: sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + '@esbuild/freebsd-arm64@0.25.8': + resolution: {integrity: sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + '@esbuild/freebsd-x64@0.25.8': + resolution: {integrity: sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + '@esbuild/linux-arm64@0.25.8': + resolution: {integrity: sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + '@esbuild/linux-arm@0.25.8': + resolution: {integrity: sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + '@esbuild/linux-ia32@0.25.8': + resolution: {integrity: sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + '@esbuild/linux-loong64@0.25.8': + resolution: {integrity: sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + '@esbuild/linux-mips64el@0.25.8': + resolution: {integrity: sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + '@esbuild/linux-ppc64@0.25.8': + resolution: {integrity: sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + '@esbuild/linux-riscv64@0.25.8': + resolution: {integrity: sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + '@esbuild/linux-s390x@0.25.8': + resolution: {integrity: sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + '@esbuild/linux-x64@0.25.8': + resolution: {integrity: sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + '@esbuild/netbsd-arm64@0.25.8': + resolution: {integrity: sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + '@esbuild/netbsd-x64@0.25.8': + resolution: {integrity: sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + '@esbuild/openbsd-arm64@0.25.8': + resolution: {integrity: sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + '@esbuild/openbsd-x64@0.25.8': + resolution: {integrity: sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + '@esbuild/openharmony-arm64@0.25.8': + resolution: {integrity: sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + '@esbuild/sunos-x64@0.25.8': + resolution: {integrity: sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + '@esbuild/win32-arm64@0.25.8': + resolution: {integrity: sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + '@esbuild/win32-ia32@0.25.8': + resolution: {integrity: sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + '@esbuild/win32-x64@0.25.8': + resolution: {integrity: sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -705,8 +705,8 @@ packages: resolution: {integrity: sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q==} engines: {node: ^18.17.0 || >=20.5.0} - '@npmcli/metavuln-calculator@9.0.0': - resolution: {integrity: sha512-znLKqdy1ZEGNK3VB9j/RzGyb/P0BJb3fGpvEbHIAyBAXsps2l1ce8SVHfsGAFLl9s8072PxafqTn7RC8wSnQPg==} + '@npmcli/metavuln-calculator@9.0.1': + resolution: {integrity: sha512-B7ziEnkSmnauecEvFbg9h0d2CVa3uJudd9bTDc9vScfYdRETkQkCriFiYCV3PXE++igd5JRw35WJz902HnGrCg==} engines: {node: ^20.17.0 || >=22.9.0} '@npmcli/name-from-folder@3.0.0': @@ -801,103 +801,103 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.45.0': - resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} + '@rollup/rollup-android-arm-eabi@4.45.1': + resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.45.0': - resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} + '@rollup/rollup-android-arm64@4.45.1': + resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.45.0': - resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} + '@rollup/rollup-darwin-arm64@4.45.1': + resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.0': - resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} + '@rollup/rollup-darwin-x64@4.45.1': + resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.0': - resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} + '@rollup/rollup-freebsd-arm64@4.45.1': + resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.0': - resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} + '@rollup/rollup-freebsd-x64@4.45.1': + resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.45.0': - resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.45.0': - resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} + '@rollup/rollup-linux-arm-musleabihf@4.45.1': + resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.45.0': - resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} + '@rollup/rollup-linux-arm64-gnu@4.45.1': + resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.45.0': - resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} + '@rollup/rollup-linux-arm64-musl@4.45.1': + resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.45.0': - resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': - resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.45.0': - resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} + '@rollup/rollup-linux-riscv64-gnu@4.45.1': + resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.45.0': - resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} + '@rollup/rollup-linux-riscv64-musl@4.45.1': + resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.45.0': - resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} + '@rollup/rollup-linux-s390x-gnu@4.45.1': + resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.45.0': - resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} + '@rollup/rollup-linux-x64-gnu@4.45.1': + resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.45.0': - resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} + '@rollup/rollup-linux-x64-musl@4.45.1': + resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.45.0': - resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} + '@rollup/rollup-win32-arm64-msvc@4.45.1': + resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.0': - resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} + '@rollup/rollup-win32-ia32-msvc@4.45.1': + resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.0': - resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} + '@rollup/rollup-win32-x64-msvc@4.45.1': + resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} cpu: [x64] os: [win32] @@ -997,8 +997,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@22.16.3': - resolution: {integrity: sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==} + '@types/node@22.16.5': + resolution: {integrity: sha512-bJFoMATwIGaxxx8VJPeM8TonI8t579oRvgAuT8zFugJsJZgzqv0Fu8Mhp68iecjzG7cnN3mO2dJQ5uUM2EFrgQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1563,42 +1563,42 @@ packages: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} - cspell-config-lib@9.1.5: - resolution: {integrity: sha512-VE3tsr2y+FwTENoAPFqzx8xE/+xTkllW3/i0HDRai5Kv8o35+ilTozY476bOI7fj445wNqPR8JstEdV314fdGA==} + cspell-config-lib@9.2.0: + resolution: {integrity: sha512-Yc8+hT+uIWWCi6WMhOL6HDYbBCP2qig1tgKGThHVeOx6GviieV10TZ5kQ+P7ONgoqw2nmm7uXIC19dGYx3DblQ==} engines: {node: '>=20'} - cspell-dictionary@9.1.5: - resolution: {integrity: sha512-UpMFtKs9O028yIxea/svTyUPPgNzlVdZXsht5O47nDuK+pVfZu+ngJOGSwmyoafQqd25jY00WRFXhQ5h503u1g==} + cspell-dictionary@9.2.0: + resolution: {integrity: sha512-lV4VtjsDtxu8LyCcb6DY7Br4e/Aw1xfR8QvjYhHaJ8t03xry9STey5Rkfp+lz+hlVevNcn3lfCaacGuXyD+lLg==} engines: {node: '>=20'} - cspell-gitignore@9.1.5: - resolution: {integrity: sha512-zTLVv0xhuMKxCTdy1M68MuOYvDD/6IKLg8aL+06kO2TM3tQR91mJVSrazT9c+AmmpstOhzcVGmXf6vBNNDUa0Q==} + cspell-gitignore@9.2.0: + resolution: {integrity: sha512-gXDQZ7czTPwmEg1qtsUIjVEFm9IfgTO8rA02O8eYIveqjFixbSV3fIYOgoxZSZYxjt3O44m8+/zAFC1RE4CM/Q==} engines: {node: '>=20'} hasBin: true - cspell-glob@9.1.5: - resolution: {integrity: sha512-aMlUCSLcxVL7BdFAlxHHCvA/R35Jr457t4XJiJOoUCupybr5cBPvn8PNpEllBKhG60n6F/QN2uIt+r1tCJbAaQ==} + cspell-glob@9.2.0: + resolution: {integrity: sha512-viycZDyegzW2AKPFqvX5RveqTrB0sKgexlCu2A8z8eumpYYor5sD1NP05VDOqkAF4hDuiGqkHn6iNo0L1wNgLw==} engines: {node: '>=20'} - cspell-grammar@9.1.5: - resolution: {integrity: sha512-TSqlFZk2thBghPSEKb1DeLoLVxlko/KBrg7siCaJV8aBi0Juve48f4+rIfSW9L7Nd5Y7VpuYxI0iriP4LTE+Dw==} + cspell-grammar@9.2.0: + resolution: {integrity: sha512-qthAmWcNHpYAmufy7YWVg9xwrYANkVlI40bgC2uGd8EnKssm/qOPhqXXNS+kLf+q0NmJM5nMgRLhCC23xSp3JA==} engines: {node: '>=20'} hasBin: true - cspell-io@9.1.5: - resolution: {integrity: sha512-i4bw5QDZp1yoxii+bmD/V6eFGIX5IzGwROko/6X84JHjtJGItiiA3kLfO69fZuXhzuzn9GjWRhSVX6wHafRAtQ==} + cspell-io@9.2.0: + resolution: {integrity: sha512-oxKiqFLcz629FmOId8UpdDznpMvCgpuktg4nkD2G9pYpRh+fRLZpP4QtZPyvJqvpUIzFhIOznMeHjsiBYHOZUA==} engines: {node: '>=20'} - cspell-lib@9.1.5: - resolution: {integrity: sha512-vxHPePzJRVFMN6NfKlCeekH11OZrxG7yW06BJ312tzsK/xovQ6Y+Rv2w2WC9h5TKHhPN2vP0aDPls/5ASH9PDA==} + cspell-lib@9.2.0: + resolution: {integrity: sha512-RnhDIsETw6Ex0UaK3PFoJ2FwWMWfJPtdpNpv1qgmJwoGD4CzwtIqPOLtZ24zqdCP8ZnNTF/lwV/9rZVqifYjsw==} engines: {node: '>=20'} - cspell-trie-lib@9.1.5: - resolution: {integrity: sha512-wDP7wUH54vVrdDCkpd6W0H3DkWbYhYzm6yDGqi/aN/Z0q/ZR2tBByEY4IjYeJ6VNxhzJZq4+2xYZQaQkZWJgwQ==} + cspell-trie-lib@9.2.0: + resolution: {integrity: sha512-6GHL1KvLQzcPBSNY6QWOabq8YwRJAnNKamA0O/tRKy+11Hy99ysD4xvfu3kKYPAcobp5ZykX4nudHxy8yrEvng==} engines: {node: '>=20'} - cspell@9.1.5: - resolution: {integrity: sha512-AlFoGplH1YyRoCFHg2K0auS8vDna4yJjUiuP2mVZn82MaEKJQ4tMgnvUMdP+HtPP1lFlQ0iCvFr6+VVqCJVEDg==} + cspell@9.2.0: + resolution: {integrity: sha512-AKzaFMem2jRcGpAY2spKP0z15jpZeX1WTDNHCDsB8/YvnhnOfWXc0S5AF+4sfU1cQgHWYGFOolMuTri0ZQdV+Q==} engines: {node: '>=20'} hasBin: true @@ -1768,8 +1768,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + esbuild@0.25.8: + resolution: {integrity: sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==} engines: {node: '>=18'} hasBin: true @@ -1789,8 +1789,8 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-prettier@10.1.5: - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -1957,10 +1957,6 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - file-entry-cache@9.1.0: - resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} - engines: {node: '>=18'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1989,10 +1985,6 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@5.0.0: - resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} - engines: {node: '>=18'} - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -2797,8 +2789,8 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-postinstall@0.3.0: - resolution: {integrity: sha512-M7NqKyhODKV1gRLdkwE7pDsZP2/SC2a2vHkOYh9MCpKMbWVfyVfUw5MaH83Fv6XMjxr5jryUp3IDDL9rlxsTeA==} + napi-postinstall@0.3.2: + resolution: {integrity: sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true @@ -3150,8 +3142,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} pidtree@0.6.0: @@ -3311,8 +3303,8 @@ packages: engines: {node: 20 || >=22} hasBin: true - rollup@4.45.0: - resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} + rollup@4.45.1: + resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3818,8 +3810,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@7.0.4: - resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} + vite@7.0.5: + resolution: {integrity: sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4083,11 +4075,11 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@commitlint/cli@19.8.1(@types/node@22.16.3)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@22.16.5)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@22.16.3)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@22.16.5)(typescript@5.8.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -4134,7 +4126,7 @@ snapshots: '@commitlint/rules': 19.8.1 '@commitlint/types': 19.8.1 - '@commitlint/load@19.8.1(@types/node@22.16.3)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@22.16.5)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -4142,7 +4134,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.4.1 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@22.16.3)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.16.5)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -4193,7 +4185,7 @@ snapshots: '@types/conventional-commits-parser': 5.0.1 chalk: 5.4.1 - '@cspell/cspell-bundled-dicts@9.1.5': + '@cspell/cspell-bundled-dicts@9.2.0': dependencies: '@cspell/dict-ada': 4.1.1 '@cspell/dict-al': 1.1.1 @@ -4211,8 +4203,8 @@ snapshots: '@cspell/dict-dotnet': 5.0.10 '@cspell/dict-elixir': 4.0.8 '@cspell/dict-en-common-misspellings': 2.1.3 - '@cspell/dict-en-gb-mit': 3.1.5 - '@cspell/dict-en_us': 4.4.15 + '@cspell/dict-en-gb-mit': 3.1.6 + '@cspell/dict-en_us': 4.4.16 '@cspell/dict-filetypes': 3.0.13 '@cspell/dict-flutter': 1.1.1 '@cspell/dict-fonts': 4.0.5 @@ -4254,19 +4246,19 @@ snapshots: '@cspell/dict-typescript': 3.2.3 '@cspell/dict-vue': 3.0.5 - '@cspell/cspell-json-reporter@9.1.5': + '@cspell/cspell-json-reporter@9.2.0': dependencies: - '@cspell/cspell-types': 9.1.5 + '@cspell/cspell-types': 9.2.0 - '@cspell/cspell-pipe@9.1.5': {} + '@cspell/cspell-pipe@9.2.0': {} - '@cspell/cspell-resolver@9.1.5': + '@cspell/cspell-resolver@9.2.0': dependencies: global-directory: 4.0.1 - '@cspell/cspell-service-bus@9.1.5': {} + '@cspell/cspell-service-bus@9.2.0': {} - '@cspell/cspell-types@9.1.5': {} + '@cspell/cspell-types@9.2.0': {} '@cspell/dict-ada@4.1.1': {} @@ -4302,9 +4294,9 @@ snapshots: '@cspell/dict-en-common-misspellings@2.1.3': {} - '@cspell/dict-en-gb-mit@3.1.5': {} + '@cspell/dict-en-gb-mit@3.1.6': {} - '@cspell/dict-en_us@4.4.15': {} + '@cspell/dict-en_us@4.4.16': {} '@cspell/dict-filetypes@3.0.13': {} @@ -4393,16 +4385,16 @@ snapshots: '@cspell/dict-vue@3.0.5': {} - '@cspell/dynamic-import@9.1.5': + '@cspell/dynamic-import@9.2.0': dependencies: - '@cspell/url': 9.1.5 + '@cspell/url': 9.2.0 import-meta-resolve: 4.1.0 - '@cspell/filetypes@9.1.5': {} + '@cspell/filetypes@9.2.0': {} - '@cspell/strong-weak-map@9.1.5': {} + '@cspell/strong-weak-map@9.2.0': {} - '@cspell/url@9.1.5': {} + '@cspell/url@9.2.0': {} '@csstools/color-helpers@5.0.2': {} @@ -4424,98 +4416,98 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@emnapi/core@1.4.4': + '@emnapi/core@1.4.5': dependencies: - '@emnapi/wasi-threads': 1.0.3 + '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.4.4': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.0.3': + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.25.6': + '@esbuild/aix-ppc64@0.25.8': optional: true - '@esbuild/android-arm64@0.25.6': + '@esbuild/android-arm64@0.25.8': optional: true - '@esbuild/android-arm@0.25.6': + '@esbuild/android-arm@0.25.8': optional: true - '@esbuild/android-x64@0.25.6': + '@esbuild/android-x64@0.25.8': optional: true - '@esbuild/darwin-arm64@0.25.6': + '@esbuild/darwin-arm64@0.25.8': optional: true - '@esbuild/darwin-x64@0.25.6': + '@esbuild/darwin-x64@0.25.8': optional: true - '@esbuild/freebsd-arm64@0.25.6': + '@esbuild/freebsd-arm64@0.25.8': optional: true - '@esbuild/freebsd-x64@0.25.6': + '@esbuild/freebsd-x64@0.25.8': optional: true - '@esbuild/linux-arm64@0.25.6': + '@esbuild/linux-arm64@0.25.8': optional: true - '@esbuild/linux-arm@0.25.6': + '@esbuild/linux-arm@0.25.8': optional: true - '@esbuild/linux-ia32@0.25.6': + '@esbuild/linux-ia32@0.25.8': optional: true - '@esbuild/linux-loong64@0.25.6': + '@esbuild/linux-loong64@0.25.8': optional: true - '@esbuild/linux-mips64el@0.25.6': + '@esbuild/linux-mips64el@0.25.8': optional: true - '@esbuild/linux-ppc64@0.25.6': + '@esbuild/linux-ppc64@0.25.8': optional: true - '@esbuild/linux-riscv64@0.25.6': + '@esbuild/linux-riscv64@0.25.8': optional: true - '@esbuild/linux-s390x@0.25.6': + '@esbuild/linux-s390x@0.25.8': optional: true - '@esbuild/linux-x64@0.25.6': + '@esbuild/linux-x64@0.25.8': optional: true - '@esbuild/netbsd-arm64@0.25.6': + '@esbuild/netbsd-arm64@0.25.8': optional: true - '@esbuild/netbsd-x64@0.25.6': + '@esbuild/netbsd-x64@0.25.8': optional: true - '@esbuild/openbsd-arm64@0.25.6': + '@esbuild/openbsd-arm64@0.25.8': optional: true - '@esbuild/openbsd-x64@0.25.6': + '@esbuild/openbsd-x64@0.25.8': optional: true - '@esbuild/openharmony-arm64@0.25.6': + '@esbuild/openharmony-arm64@0.25.8': optional: true - '@esbuild/sunos-x64@0.25.6': + '@esbuild/sunos-x64@0.25.8': optional: true - '@esbuild/win32-arm64@0.25.6': + '@esbuild/win32-arm64@0.25.8': optional: true - '@esbuild/win32-ia32@0.25.6': + '@esbuild/win32-ia32@0.25.8': optional: true - '@esbuild/win32-x64@0.25.6': + '@esbuild/win32-x64@0.25.8': optional: true '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': @@ -4592,8 +4584,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.4.4 - '@emnapi/runtime': 1.4.4 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.10.0 optional: true @@ -4625,7 +4617,7 @@ snapshots: '@npmcli/fs': 4.0.0 '@npmcli/installed-package-contents': 3.0.0 '@npmcli/map-workspaces': 4.0.2 - '@npmcli/metavuln-calculator': 9.0.0 + '@npmcli/metavuln-calculator': 9.0.1 '@npmcli/name-from-folder': 3.0.0 '@npmcli/node-gyp': 4.0.0 '@npmcli/package-json': 6.2.0 @@ -4685,7 +4677,7 @@ snapshots: glob: 10.4.5 minimatch: 9.0.5 - '@npmcli/metavuln-calculator@9.0.0': + '@npmcli/metavuln-calculator@9.0.1': dependencies: cacache: 19.0.1 json-parse-even-better-errors: 4.0.0 @@ -4804,64 +4796,64 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.45.0': + '@rollup/rollup-android-arm-eabi@4.45.1': optional: true - '@rollup/rollup-android-arm64@4.45.0': + '@rollup/rollup-android-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-arm64@4.45.0': + '@rollup/rollup-darwin-arm64@4.45.1': optional: true - '@rollup/rollup-darwin-x64@4.45.0': + '@rollup/rollup-darwin-x64@4.45.1': optional: true - '@rollup/rollup-freebsd-arm64@4.45.0': + '@rollup/rollup-freebsd-arm64@4.45.1': optional: true - '@rollup/rollup-freebsd-x64@4.45.0': + '@rollup/rollup-freebsd-x64@4.45.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + '@rollup/rollup-linux-arm-gnueabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.0': + '@rollup/rollup-linux-arm-musleabihf@4.45.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.0': + '@rollup/rollup-linux-arm64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.0': + '@rollup/rollup-linux-arm64-musl@4.45.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + '@rollup/rollup-linux-loongarch64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.0': + '@rollup/rollup-linux-riscv64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.0': + '@rollup/rollup-linux-riscv64-musl@4.45.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.0': + '@rollup/rollup-linux-s390x-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.0': + '@rollup/rollup-linux-x64-gnu@4.45.1': optional: true - '@rollup/rollup-linux-x64-musl@4.45.0': + '@rollup/rollup-linux-x64-musl@4.45.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.0': + '@rollup/rollup-win32-arm64-msvc@4.45.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.0': + '@rollup/rollup-win32-ia32-msvc@4.45.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.0': + '@rollup/rollup-win32-x64-msvc@4.45.1': optional: true '@rtsao/scc@1.1.0': {} @@ -4995,7 +4987,7 @@ snapshots: '@types/conventional-commits-parser@5.0.1': dependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 '@types/deep-eql@4.0.2': {} @@ -5003,7 +4995,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@22.16.3': + '@types/node@22.16.5': dependencies: undici-types: 6.21.0 @@ -5151,7 +5143,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.3)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@22.16.5)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -5166,7 +5158,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@22.16.3)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) + vitest: 3.2.4(@types/node@22.16.5)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -5178,13 +5170,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0) + vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -5531,11 +5523,11 @@ snapshots: dependencies: '@commitlint/lint': 19.8.1 '@commitlint/types': 19.8.1 - cspell-lib: 9.1.5 + cspell-lib: 9.2.0 - commitlint@19.8.1(@types/node@22.16.3)(typescript@5.8.3): + commitlint@19.8.1(@types/node@22.16.5)(typescript@5.8.3): dependencies: - '@commitlint/cli': 19.8.1(@types/node@22.16.3)(typescript@5.8.3) + '@commitlint/cli': 19.8.1(@types/node@22.16.5)(typescript@5.8.3) '@commitlint/types': 19.8.1 transitivePeerDependencies: - '@types/node' @@ -5595,9 +5587,9 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@22.16.3)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@22.16.5)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.4.2 typescript: 5.8.3 @@ -5621,59 +5613,59 @@ snapshots: dependencies: type-fest: 1.4.0 - cspell-config-lib@9.1.5: + cspell-config-lib@9.2.0: dependencies: - '@cspell/cspell-types': 9.1.5 + '@cspell/cspell-types': 9.2.0 comment-json: 4.2.5 smol-toml: 1.4.1 yaml: 2.8.0 - cspell-dictionary@9.1.5: + cspell-dictionary@9.2.0: dependencies: - '@cspell/cspell-pipe': 9.1.5 - '@cspell/cspell-types': 9.1.5 - cspell-trie-lib: 9.1.5 + '@cspell/cspell-pipe': 9.2.0 + '@cspell/cspell-types': 9.2.0 + cspell-trie-lib: 9.2.0 fast-equals: 5.2.2 - cspell-gitignore@9.1.5: + cspell-gitignore@9.2.0: dependencies: - '@cspell/url': 9.1.5 - cspell-glob: 9.1.5 - cspell-io: 9.1.5 + '@cspell/url': 9.2.0 + cspell-glob: 9.2.0 + cspell-io: 9.2.0 - cspell-glob@9.1.5: + cspell-glob@9.2.0: dependencies: - '@cspell/url': 9.1.5 - picomatch: 4.0.2 + '@cspell/url': 9.2.0 + picomatch: 4.0.3 - cspell-grammar@9.1.5: + cspell-grammar@9.2.0: dependencies: - '@cspell/cspell-pipe': 9.1.5 - '@cspell/cspell-types': 9.1.5 + '@cspell/cspell-pipe': 9.2.0 + '@cspell/cspell-types': 9.2.0 - cspell-io@9.1.5: + cspell-io@9.2.0: dependencies: - '@cspell/cspell-service-bus': 9.1.5 - '@cspell/url': 9.1.5 + '@cspell/cspell-service-bus': 9.2.0 + '@cspell/url': 9.2.0 - cspell-lib@9.1.5: + cspell-lib@9.2.0: dependencies: - '@cspell/cspell-bundled-dicts': 9.1.5 - '@cspell/cspell-pipe': 9.1.5 - '@cspell/cspell-resolver': 9.1.5 - '@cspell/cspell-types': 9.1.5 - '@cspell/dynamic-import': 9.1.5 - '@cspell/filetypes': 9.1.5 - '@cspell/strong-weak-map': 9.1.5 - '@cspell/url': 9.1.5 + '@cspell/cspell-bundled-dicts': 9.2.0 + '@cspell/cspell-pipe': 9.2.0 + '@cspell/cspell-resolver': 9.2.0 + '@cspell/cspell-types': 9.2.0 + '@cspell/dynamic-import': 9.2.0 + '@cspell/filetypes': 9.2.0 + '@cspell/strong-weak-map': 9.2.0 + '@cspell/url': 9.2.0 clear-module: 4.1.2 comment-json: 4.2.5 - cspell-config-lib: 9.1.5 - cspell-dictionary: 9.1.5 - cspell-glob: 9.1.5 - cspell-grammar: 9.1.5 - cspell-io: 9.1.5 - cspell-trie-lib: 9.1.5 + cspell-config-lib: 9.2.0 + cspell-dictionary: 9.2.0 + cspell-glob: 9.2.0 + cspell-grammar: 9.2.0 + cspell-io: 9.2.0 + cspell-trie-lib: 9.2.0 env-paths: 3.0.0 fast-equals: 5.2.2 gensequence: 7.0.0 @@ -5683,30 +5675,30 @@ snapshots: vscode-uri: 3.1.0 xdg-basedir: 5.1.0 - cspell-trie-lib@9.1.5: + cspell-trie-lib@9.2.0: dependencies: - '@cspell/cspell-pipe': 9.1.5 - '@cspell/cspell-types': 9.1.5 + '@cspell/cspell-pipe': 9.2.0 + '@cspell/cspell-types': 9.2.0 gensequence: 7.0.0 - cspell@9.1.5: + cspell@9.2.0: dependencies: - '@cspell/cspell-json-reporter': 9.1.5 - '@cspell/cspell-pipe': 9.1.5 - '@cspell/cspell-types': 9.1.5 - '@cspell/dynamic-import': 9.1.5 - '@cspell/url': 9.1.5 + '@cspell/cspell-json-reporter': 9.2.0 + '@cspell/cspell-pipe': 9.2.0 + '@cspell/cspell-types': 9.2.0 + '@cspell/dynamic-import': 9.2.0 + '@cspell/url': 9.2.0 chalk: 5.4.1 chalk-template: 1.1.0 commander: 14.0.0 - cspell-config-lib: 9.1.5 - cspell-dictionary: 9.1.5 - cspell-gitignore: 9.1.5 - cspell-glob: 9.1.5 - cspell-io: 9.1.5 - cspell-lib: 9.1.5 + cspell-config-lib: 9.2.0 + cspell-dictionary: 9.2.0 + cspell-gitignore: 9.2.0 + cspell-glob: 9.2.0 + cspell-io: 9.2.0 + cspell-lib: 9.2.0 fast-json-stable-stringify: 2.1.0 - file-entry-cache: 9.1.0 + flatted: 3.3.3 semver: 7.7.2 tinyglobby: 0.2.14 @@ -5914,34 +5906,34 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.25.6: + esbuild@0.25.8: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.6 - '@esbuild/android-arm': 0.25.6 - '@esbuild/android-arm64': 0.25.6 - '@esbuild/android-x64': 0.25.6 - '@esbuild/darwin-arm64': 0.25.6 - '@esbuild/darwin-x64': 0.25.6 - '@esbuild/freebsd-arm64': 0.25.6 - '@esbuild/freebsd-x64': 0.25.6 - '@esbuild/linux-arm': 0.25.6 - '@esbuild/linux-arm64': 0.25.6 - '@esbuild/linux-ia32': 0.25.6 - '@esbuild/linux-loong64': 0.25.6 - '@esbuild/linux-mips64el': 0.25.6 - '@esbuild/linux-ppc64': 0.25.6 - '@esbuild/linux-riscv64': 0.25.6 - '@esbuild/linux-s390x': 0.25.6 - '@esbuild/linux-x64': 0.25.6 - '@esbuild/netbsd-arm64': 0.25.6 - '@esbuild/netbsd-x64': 0.25.6 - '@esbuild/openbsd-arm64': 0.25.6 - '@esbuild/openbsd-x64': 0.25.6 - '@esbuild/openharmony-arm64': 0.25.6 - '@esbuild/sunos-x64': 0.25.6 - '@esbuild/win32-arm64': 0.25.6 - '@esbuild/win32-ia32': 0.25.6 - '@esbuild/win32-x64': 0.25.6 + '@esbuild/aix-ppc64': 0.25.8 + '@esbuild/android-arm': 0.25.8 + '@esbuild/android-arm64': 0.25.8 + '@esbuild/android-x64': 0.25.8 + '@esbuild/darwin-arm64': 0.25.8 + '@esbuild/darwin-x64': 0.25.8 + '@esbuild/freebsd-arm64': 0.25.8 + '@esbuild/freebsd-x64': 0.25.8 + '@esbuild/linux-arm': 0.25.8 + '@esbuild/linux-arm64': 0.25.8 + '@esbuild/linux-ia32': 0.25.8 + '@esbuild/linux-loong64': 0.25.8 + '@esbuild/linux-mips64el': 0.25.8 + '@esbuild/linux-ppc64': 0.25.8 + '@esbuild/linux-riscv64': 0.25.8 + '@esbuild/linux-s390x': 0.25.8 + '@esbuild/linux-x64': 0.25.8 + '@esbuild/netbsd-arm64': 0.25.8 + '@esbuild/netbsd-x64': 0.25.8 + '@esbuild/openbsd-arm64': 0.25.8 + '@esbuild/openbsd-x64': 0.25.8 + '@esbuild/openharmony-arm64': 0.25.8 + '@esbuild/sunos-x64': 0.25.8 + '@esbuild/win32-arm64': 0.25.8 + '@esbuild/win32-ia32': 0.25.8 + '@esbuild/win32-x64': 0.25.8 escalade@3.2.0: {} @@ -5951,7 +5943,7 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.5(eslint@8.57.1): + eslint-config-prettier@10.1.8(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -6156,9 +6148,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.6(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 figures@2.0.0: dependencies: @@ -6172,10 +6164,6 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-entry-cache@9.1.0: - dependencies: - flat-cache: 5.0.0 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6208,11 +6196,6 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 - flat-cache@5.0.0: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - flatted@3.3.3: {} for-each@0.3.5: @@ -7026,7 +7009,7 @@ snapshots: nanoid@3.3.11: {} - napi-postinstall@0.3.0: {} + napi-postinstall@0.3.2: {} natural-compare@1.4.0: {} @@ -7330,7 +7313,7 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} pidtree@0.6.0: {} @@ -7483,30 +7466,30 @@ snapshots: glob: 11.0.3 package-json-from-dist: 1.0.1 - rollup@4.45.0: + rollup@4.45.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.0 - '@rollup/rollup-android-arm64': 4.45.0 - '@rollup/rollup-darwin-arm64': 4.45.0 - '@rollup/rollup-darwin-x64': 4.45.0 - '@rollup/rollup-freebsd-arm64': 4.45.0 - '@rollup/rollup-freebsd-x64': 4.45.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.0 - '@rollup/rollup-linux-arm-musleabihf': 4.45.0 - '@rollup/rollup-linux-arm64-gnu': 4.45.0 - '@rollup/rollup-linux-arm64-musl': 4.45.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.0 - '@rollup/rollup-linux-riscv64-gnu': 4.45.0 - '@rollup/rollup-linux-riscv64-musl': 4.45.0 - '@rollup/rollup-linux-s390x-gnu': 4.45.0 - '@rollup/rollup-linux-x64-gnu': 4.45.0 - '@rollup/rollup-linux-x64-musl': 4.45.0 - '@rollup/rollup-win32-arm64-msvc': 4.45.0 - '@rollup/rollup-win32-ia32-msvc': 4.45.0 - '@rollup/rollup-win32-x64-msvc': 4.45.0 + '@rollup/rollup-android-arm-eabi': 4.45.1 + '@rollup/rollup-android-arm64': 4.45.1 + '@rollup/rollup-darwin-arm64': 4.45.1 + '@rollup/rollup-darwin-x64': 4.45.1 + '@rollup/rollup-freebsd-arm64': 4.45.1 + '@rollup/rollup-freebsd-x64': 4.45.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 + '@rollup/rollup-linux-arm-musleabihf': 4.45.1 + '@rollup/rollup-linux-arm64-gnu': 4.45.1 + '@rollup/rollup-linux-arm64-musl': 4.45.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-gnu': 4.45.1 + '@rollup/rollup-linux-riscv64-musl': 4.45.1 + '@rollup/rollup-linux-s390x-gnu': 4.45.1 + '@rollup/rollup-linux-x64-gnu': 4.45.1 + '@rollup/rollup-linux-x64-musl': 4.45.1 + '@rollup/rollup-win32-arm64-msvc': 4.45.1 + '@rollup/rollup-win32-ia32-msvc': 4.45.1 + '@rollup/rollup-win32-x64-msvc': 4.45.1 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -7902,8 +7885,8 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.1.1: {} @@ -8038,7 +8021,7 @@ snapshots: unrs-resolver@1.11.1: dependencies: - napi-postinstall: 0.3.0 + napi-postinstall: 0.3.2 optionalDependencies: '@unrs/resolver-binding-android-arm-eabi': 1.11.1 '@unrs/resolver-binding-android-arm64': 1.11.1 @@ -8083,13 +8066,13 @@ snapshots: transitivePeerDependencies: - supports-color - vite-node@3.2.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0) + vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -8104,25 +8087,25 @@ snapshots: - tsx - yaml - vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0): + vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0): dependencies: - esbuild: 0.25.6 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + esbuild: 0.25.8 + fdir: 6.4.6(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.45.0 + rollup: 4.45.1 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 fsevents: 2.3.3 jiti: 2.4.2 yaml: 2.8.0 - vitest@3.2.4(@types/node@22.16.3)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0): + vitest@3.2.4(@types/node@22.16.5)(jiti@2.4.2)(jsdom@26.1.0)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.0.5(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8133,18 +8116,18 @@ snapshots: expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.16.3)(jiti@2.4.2)(yaml@2.8.0) + vite: 7.0.5(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.16.5)(jiti@2.4.2)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.16.3 + '@types/node': 22.16.5 jsdom: 26.1.0 transitivePeerDependencies: - jiti diff --git a/src/assertion/assertPathExists.ts b/src/assertion/assertPathExists.ts new file mode 100644 index 0000000..d3e0fe9 --- /dev/null +++ b/src/assertion/assertPathExists.ts @@ -0,0 +1,30 @@ +import { get } from '../get.js'; +import { has } from '../has.js'; + +import type { TypePredicateFn } from '../types/functions.js'; +import type { WithPath } from '../types/objects.js'; + +export function assertPathExists( + input: Input, + path: InputPath, +): asserts input is Input & WithPath; + +export function assertPathExists( + input: Input, + path: InputPath, + predicate: TypePredicateFn, +): asserts input is Input & WithPath; + +export function assertPathExists( + input: Input, + path: InputPath, + predicate?: TypePredicateFn, +): asserts input is Input & WithPath { + if (!has(input, path)) { + throw new Error(`object path (${path}) does not exist on input`); + } + + if (predicate && !predicate(get(input, path))) { + throw new Error(`object path (${path}) failed predicate check`); + } +} diff --git a/src/assertion/index.ts b/src/assertion/index.ts index c8f2a84..b298048 100644 --- a/src/assertion/index.ts +++ b/src/assertion/index.ts @@ -43,4 +43,5 @@ export * from './assertIsSymbol.js'; export * from './assertIsSymbolArray.js'; export * from './assertIsUndefined.js'; export * from './assertIsUndefinedArray.js'; +export * from './assertPathExists.js'; export * from './assertPredicate.js'; diff --git a/src/get.ts b/src/get.ts index 4b9d6ab..20c10dc 100644 --- a/src/get.ts +++ b/src/get.ts @@ -9,9 +9,9 @@ export function get>( path: InputPath, ): PathValue; -export function get(input: Input, path: InputPath): unknown; +export function get(input: Input, path: InputPath): unknown; -export function get | string>( +export function get | PropertyKey>( input: Input, path: InputPath, ): unknown { diff --git a/src/has.ts b/src/has.ts new file mode 100644 index 0000000..01959e7 --- /dev/null +++ b/src/has.ts @@ -0,0 +1,49 @@ +import { pathParts } from './pathParts.js'; +import { isAnyObject } from './predicate/isAnyObject.js'; + +import type { FromPath, Merge, Path, PathValue } from './types/objects.js'; +import type { IfNever, Pretty } from './types/utils.js'; + +/** + * Determine if the path exists on an object. + */ +// Known path so the `Input` type is unchanged +export function has>(input: Input, path: InputPath): input is Input; + +// Unknown path so the `Input` type is extended +export function has( + input: Input, + path: InputPath, +): input is Pretty>>; + +// Unknown input can be assume to match at least the shape the input path makes +export function has( + input: unknown, + path: InputPath, +): input is FromPath; + +export function has | string | number>( + input: Input, + path: InputPath, +): input is Input & FromPath, unknown, PathValue>> { + if (!isAnyObject(input)) { + return false; + } + + if (path === '') { + return false; + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let current: any = input; + + for (const part of pathParts(path)) { + if (typeof current === 'object' && current !== null && part in current) { + current = current[part]; + } else { + return false; + } + } + + return true; +} diff --git a/src/index.ts b/src/index.ts index 6320b4a..bae8cad 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,6 +36,7 @@ export * from './getPackageName.js'; export * from './getPaths.js'; export * from './getRandomItem.js'; export * from './getType.js'; +export * from './has.js'; export * from './hasAdditionalProperties.js'; export * from './inRange.js'; export * from './isEmpty.js'; @@ -51,6 +52,7 @@ export * from './randomInt.js'; export * from './redactCredentialsInURL.js'; export * from './resultify.js'; export * from './secToString.js'; +export * from './set.js'; export * from './sort-factory.js'; export * from './sort.js'; export * from './stripWhitespace.js'; diff --git a/src/set.ts b/src/set.ts new file mode 100644 index 0000000..a7067f8 --- /dev/null +++ b/src/set.ts @@ -0,0 +1,58 @@ +import { pathParts } from './pathParts.js'; + +import type { Path, PathValue } from './types/objects.js'; + +/** + * Set the value of a property + */ +export function set, Value extends PathValue>( + input: Input, + path: InputPath, + value: Value, +): Value; + +export function set( + input: Input, + path: InputPath, + value: Value, +): Value; + +export function set | string, Value>( + input: Input, + path: InputPath, + value: Value, +): Value { + if (path === '') { + throw new Error('Path cannot be an empty string'); + } + + if (typeof path === 'string' && /\b(__proto__|constructor|prototype)\b/.test(path)) { + throw new Error('Cannot pollute prototype'); + } + + const parts = Array.from(pathParts(path)); + + const lastPart = parts.pop(); + + if (typeof lastPart === 'undefined') { + throw new Error('Path must have at least one part'); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let current: any = input; + + const useParts: PropertyKey[] = []; + + // get a reference to the last node that will be updated + for (const part of parts) { + useParts.push(part); + + if (typeof current === 'object' && current !== null && part in current) { + current = current[part]; + } else { + throw new Error(`Path "${useParts.join('.')}" does not exist in the input object`); + } + } + + return (current[lastPart] = value); +} diff --git a/src/types/objects.ts b/src/types/objects.ts index 8991317..eca7a0e 100644 --- a/src/types/objects.ts +++ b/src/types/objects.ts @@ -1,8 +1,9 @@ import type { IfArray, IfArrayLike } from './arrays.js'; import type { Primitive } from './common.js'; -import type { CamelCase } from './strings.js'; +import type { UnknownRecord } from './records.js'; +import type { AutoCompletableString, CamelCase } from './strings.js'; import type { KeyValueTuple } from './tuples.js'; -import type { CanBeUndefined, IfNever } from './utils.js'; +import type { CanBeUndefined, IfNever, Pretty } from './utils.js'; export type Assign = IfNever & Source>; @@ -119,7 +120,7 @@ export type GetValueForKey< */ export type PathValue< Type extends object, - TargetPath extends Path, + TargetPath extends Path | AutoCompletableString | number, Optional extends boolean = CanBeUndefined, > = TargetPath extends `${infer Key}.${infer Rest}` ? GetValueForKey extends infer Value @@ -132,3 +133,54 @@ export type PathValue< export type PathValues> = { [TargetPath in TargetPaths as CamelCase<`${TargetPath}`, '.'>]: PathValue; }; + +export type FromPath = TargetPath extends `${infer Key}.${infer Rest}` + ? { [K in Key]: FromPath } + : { [K in TargetPath]: Value }; + +/** + * Get a union of all intermediate paths, ending with `TargetPath` + */ +export type AllPaths = TargetPath extends `${infer Head}.${infer Tail}` + ? Head | `${Head}.${AllPaths}` + : TargetPath; + +export type WithPath = Pretty< + Input & Merge> +>; + +export type Merge = Left extends unknown[] + ? Right extends Record + ? MergeArrayWithObject + : Right + : Left extends object + ? Right extends object + ? MergeObjects + : Right + : Right; + +/** + * @internal + */ +export type MergeObjects = { + [Key in keyof Left | keyof Right]: Key extends keyof Right + ? Key extends keyof Left // Key exists in both Left and Right + ? Merge + : Right[Key] // Key exists only in Right + : Key extends keyof Left + ? Left[Key] // Key exists only in Left + : never; +}; + +/** + * @internal + */ +export type MergeArrayWithObject = Left & { + [Key in keyof Right]: Key extends keyof Left + ? Merge + : Key extends `${infer Index extends number}` + ? Index extends keyof Left + ? Merge + : Right[Key] + : Right[Key]; +}; diff --git a/src/types/utils.ts b/src/types/utils.ts index 2a251c6..fd3ea14 100644 --- a/src/types/utils.ts +++ b/src/types/utils.ts @@ -156,3 +156,5 @@ export type Simplify = Type extends string export type IfHasOnlyNumericKeys = `${Exclude}` extends `${number}` ? T : F; export type HasOnlyNumericKeys = IfHasOnlyNumericKeys; + +export type ParseNumber = T extends `${infer N extends number}` ? N : never; diff --git a/test/assertion/assertPathExists.test.ts b/test/assertion/assertPathExists.test.ts new file mode 100644 index 0000000..10cbc7f --- /dev/null +++ b/test/assertion/assertPathExists.test.ts @@ -0,0 +1,27 @@ +import { describe, it, expect } from 'vitest'; + +import { assertPathExists } from '../../src/assertion/assertPathExists.js'; +import { isNumber } from '../../src/predicate/isNumber.js'; +import { isString } from '../../src/predicate/isString.js'; + +describe('assertPathExists()', () => { + it('Throws when path does not exist on object', () => { + expect(() => { + assertPathExists({ name: 'Test' }, 'name'); + }).not.toThrowError(); + + expect(() => { + assertPathExists({ name: 'Test' }, 'age'); + }).toThrowError(); + }); + + it('Throws when path does not pass predicate validation', () => { + expect(() => { + assertPathExists({ name: 'Test' }, 'name', isString); + }).not.toThrowError(); + + expect(() => { + assertPathExists({ name: 'Test' }, 'name', isNumber); + }).toThrowError(); + }); +}); diff --git a/test/has.test-d.ts b/test/has.test-d.ts new file mode 100644 index 0000000..ee79c3b --- /dev/null +++ b/test/has.test-d.ts @@ -0,0 +1,33 @@ +import { describe, it, expectTypeOf } from 'vitest'; + +import { has } from '../src/has.js'; + +describe('has()', () => { + describe('Is a type predicate', () => { + it('Handles unknown input', () => { + const input: unknown = { + firstName: 'Test', + }; + + if (has(input, 'firstName')) { + expectTypeOf().toEqualTypeOf<{ firstName: unknown }>(); + } + }); + + it('Handles tuple input', () => { + const data = ['test'] as const satisfies string[]; + + if (has(data, 0)) { + expectTypeOf().toEqualTypeOf<['test']>(); + } + }); + + it('Handles array input', () => { + const data: string[] = ['test']; + + if (has(data, 0)) { + expectTypeOf().toEqualTypeOf(); + } + }); + }); +}); diff --git a/test/has.test.ts b/test/has.test.ts new file mode 100644 index 0000000..59c0b6e --- /dev/null +++ b/test/has.test.ts @@ -0,0 +1,62 @@ +import { describe, it, expect } from 'vitest'; + +import { has } from '../src/has.js'; + +describe('has()', () => { + it('returns boolean indicating the path exists', () => { + const input: Record = { + firstName: 'Test', + }; + + expect(has(input, 'firstName')).toBe(true); + expect(has(input, 'lastName')).toBe(false); + + if (has(input, 'firstName')) { + input['lastName'] = 'Testerson'; + } + + expect(input).toEqual({ + firstName: 'Test', + lastName: 'Testerson', + }); + }); + + it('is aware of input type', () => { + expect.assertions(0); + + const input = { + name: { + first: 'Test', + last: 'Testerson', + }, + } as const; + + if (has(input, 'name.middle')) { + // Never happens, but TypeScript thinks it does + expect(input.name.middle).toBe(undefined); + } + }); + + it('Handles `unknown` input', () => { + const input: unknown = { + name: 'Test', + }; + + expect(has(input, 'name')).toBe(true); + }); + + it('Handles array input', () => { + expect(has(['a', 'b', 'c'], 0)).toBe(true); + }); + + it.each([() => true, null, undefined, true, 1, 1n, 'A', Symbol('test')])( + 'Returns false for non-objects: %s', + (input) => { + expect(has(input, 'some.path')).toBe(false); + }, + ); + + it('Returns false for empty path', () => { + expect(has({ data: true }, '')).toBe(false); + }); +}); diff --git a/test/set.test.ts b/test/set.test.ts new file mode 100644 index 0000000..501bfd6 --- /dev/null +++ b/test/set.test.ts @@ -0,0 +1,64 @@ +import { describe, it, expect } from 'vitest'; + +import { assertPathExists } from '../src/assertion/assertPathExists.js'; +import { isString } from '../src/predicate/isString.js'; +import { set } from '../src/set.js'; + +describe('set()', () => { + it('updates a value in an object', () => { + const input = { + age: 100_000, + name: { + first: 'Test', + last: 'Testerson', + }, + sayHi(): void { + console.log('Hi!'); + }, + role: [ + { + job: { + title: 'Developer', + }, + }, + ], + }; + + const lastName = set(input, 'name.last', 'Test'); + + const startDate = set(input, 'role.0.job.startDate', new Date().toISOString()); + + expect(lastName).toBe(input.name.last); + + assertPathExists(input, 'role.0.job.startDate', isString); + + expect(startDate).toBe(input.role[0].job.startDate); + }); + + it('throws an error when trying to set a value on a non-existent path', () => { + const input = { + job: { + title: 'Developer', + }, + }; + + expect(() => set(input, 'job.details.startDate', 'some date')).toThrowError( + 'Path "job.details" does not exist in the input object', + ); + }); + + it('throws an error when path is empty', () => { + expect(() => set({}, '', true)).toThrowError('Path cannot be an empty string'); + }); + + it('throws an error when path is invalid', () => { + expect(() => set({}, '...', true)).toThrowError('Path must have at least one part'); + }); + + it.each(['name.__proto__', 'name.constructor', 'name.prototype'])( + 'does not allow polluting the prototype chain: "%s"', + (path) => { + expect(() => set({ name: 'test' }, path, true)).toThrowError('Cannot pollute prototype'); + }, + ); +}); diff --git a/test/types/objects.test-d.ts b/test/types/objects.test-d.ts index 5194899..9499ecc 100644 --- a/test/types/objects.test-d.ts +++ b/test/types/objects.test-d.ts @@ -1,6 +1,36 @@ import { describe, expectTypeOf, it } from 'vitest'; -import type { PathValue, GetValueForKey, ValidKeys } from '../../src/types/objects.js'; +import type { PathValue, GetValueForKey, ValidKeys, FromPath, WithPath, Merge } from '../../src/types/objects.js'; + +describe('FromPath', () => { + it('Builds a type that matches the given path', () => { + expectTypeOf>().toEqualTypeOf<{ + name: string; + }>(); + + expectTypeOf>().toEqualTypeOf<{ + job: { + title: string; + }; + }>(); + + expectTypeOf>().toEqualTypeOf<{ + job: { + 0: { + title: string; + }; + }; + }>(); + + expectTypeOf>().toEqualTypeOf<{ + some: { + path: { + data: true; + }; + }; + }>(); + }); +}); describe('ValidKeys', () => { it('Returns valid keys for an object', () => { @@ -47,6 +77,10 @@ describe('GetValueForKey', () => { }); describe('PathValue', () => { + it('Returns `never` for `object` inputs', () => { + expectTypeOf>().toEqualTypeOf(); + }); + it('Gets the value from Type using path dot notation', () => { const input = { name: { @@ -66,6 +100,8 @@ describe('PathValue', () => { expectTypeOf>().toEqualTypeOf(); expectTypeOf>().toEqualTypeOf(); expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); }); it('Gets the value from a const Type using path dot notation', () => { @@ -107,3 +143,96 @@ describe('PathValue', () => { expectTypeOf>().toEqualTypeOf(); }); }); + +describe('Merge', () => { + it('Merges two object types', () => { + expectTypeOf>().toEqualTypeOf<{ + name: string; + pets: { name: string }[]; + job: { title: string }; + }>(); + }); + + it('Handles specific array indexes', () => { + type Data = Merge<{ pets: { name: string }[] }, { pets: { 0: { age: number } } }>; + + expectTypeOf().toEqualTypeOf<{ name: string }>(); + expectTypeOf().toEqualTypeOf<{ name: string; age: number }>(); + }); + + it('Works with FromPath', () => { + type Base = { + name: string; + job: { + title: string; + }[]; + }; + + type ExtraJobDetails = { + job: { + 0: { + startDate: Date; + }; + }; + }; + + type ExtraJobDetailsFromPath = FromPath<'job.0.startDate', Date>; + + type ExpectedType = { + name: string; + job: { + title: string; + }[] & { + 0: { + title: string; + startDate: Date; + }; + }; + }; + + expectTypeOf>().toMatchObjectType(); + + expectTypeOf>().toMatchObjectType(); + }); +}); + +describe('WithPath', () => { + it('Generate a new type of an object with a specific path', () => { + expectTypeOf>().toEqualTypeOf<{ + name: string; + job: { + title: unknown; + }; + }>(); + + expectTypeOf>().toEqualTypeOf<{ + name: string; + job: { + title: string; + }; + }>(); + }); + + it('Handles paths with array indexes', () => { + expectTypeOf< + WithPath< + { + name: string; + job: { + title: string; + }[]; + }, + 'job.0.startDate', + Date + > + >().toEqualTypeOf<{ + name: string; + job: { title: string }[] & { + 0: { + title: string; + startDate: Date; + }; + }; + }>(); + }); +}); diff --git a/test/types/utils.test-d.ts b/test/types/utils.test-d.ts index cf91981..34d8bd5 100644 --- a/test/types/utils.test-d.ts +++ b/test/types/utils.test-d.ts @@ -1,6 +1,6 @@ import { describe, expectTypeOf, it } from 'vitest'; -import type { HasOnlyNumericKeys } from '../../src/types/utils.js'; +import type { HasOnlyNumericKeys, ParseNumber } from '../../src/types/utils.js'; describe('HasOnlyNumericKeys', () => { it('should return false for non-numeric keys', () => { @@ -11,3 +11,16 @@ describe('HasOnlyNumericKeys', () => { expectTypeOf>().toEqualTypeOf(); }); }); + +describe('ParseNumber', () => { + it('should return never for non-numeric strings', () => { + expectTypeOf>().toEqualTypeOf(); + expectTypeOf>().toEqualTypeOf(); + }); + + it('should return the number for numeric strings', () => { + expectTypeOf>().toEqualTypeOf<123 | 456>(); + expectTypeOf>().toEqualTypeOf<123.456>(); + expectTypeOf>().toEqualTypeOf<-789>(); + }); +});