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>();
+ });
+});