{"_id":"nuxt-api-shield","_rev":"27-0798237bcbaab6812f348157f7c08694","name":"nuxt-api-shield","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"nuxt-api-shield","version":"0.1.0","keywords":["nuxt","nuxt-module","security"],"license":"MIT","_id":"nuxt-api-shield@0.1.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"2bcd00d2626e2957c244dab2c03179d3b7caccec","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.1.0.tgz","fileCount":19,"integrity":"sha512-4DFnxoXh0sa94tvFvDuidD69gx7PJFBJDqHMEHC8RL/WQcHDube3HTflFCVy1QNsom+9DVpoePXMfHM6TV+auQ==","signatures":[{"sig":"MEUCICmbUUuF4I3UTQPtE5Css0UDU3knRJ8TPvPHf17/B/1TAiEAnoyRcJnhAO60uOdY5IpGScLvnO447uKwheCbzRj34Cs=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":10085},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/your-org/nuxt-api-shield.git","type":"git"},"description":"My new Nuxt module","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.11.1"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.1.0_1711731542238_0.900933238487408","host":"s3://npm-registry-packages"}},"0.2.0":{"name":"nuxt-api-shield","version":"0.2.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.2.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"948b08a8ebaa1fab67e1f6afb6d8b3434fa7231d","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.2.0.tgz","fileCount":19,"integrity":"sha512-SvS2rr895e3RkSylSyDtp6VKIzDgeLV8vPAWxkTd0rWbwlWiicfQz1f0t8+GVjLQ6V+qszOaBXukUAULiOhpzg==","signatures":[{"sig":"MEYCIQDzTUXaPH37MTz1cxvxoTlpSAbRuwseK3zrRWtDJb9SGAIhAMo698YgU5lHEO1ciRnFL+DRKQLlAACqv3mNWfwB5hCe","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":11371},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/your-org/nuxt-api-shield.git","type":"git"},"description":"My new Nuxt module","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.11.1"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.2.0_1711796753432_0.9141915355121533","host":"s3://npm-registry-packages"}},"0.3.0":{"name":"nuxt-api-shield","version":"0.3.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.3.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"75dff23b2f54f49bd5391c11abb74a748e6a219e","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.3.0.tgz","fileCount":26,"integrity":"sha512-nYD4mr1hd5Bax+/mB0E6LficJLtcPMKI1xUpc3mcN/vAm6o1YKa/dCwVaiYy1Jkbo492B4bvMfrqe1TrJQEPLw==","signatures":[{"sig":"MEQCIAntnnsDnL5F4Fv8xtzuEJ9sXM6+uD6PqcVhmkytz/rpAiAjCWdRYp9DWNKQKApQo8nAwoVjhfigKcahHYrUC7HaYw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":12348},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.11.1"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.3.0_1711813961790_0.31521287746849946","host":"s3://npm-registry-packages"}},"0.4.0":{"name":"nuxt-api-shield","version":"0.4.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.4.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"25b6a9913ff66d96f7b73e4f8491d128321e84e5","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.4.0.tgz","fileCount":26,"integrity":"sha512-VOLzgBhLB/eeuIp3BWiD5/kiHgBjshtoPwvg5JoAZ4Kl0WtTqcmJxeihynLFKPvs2w3VVrWhCd1ld6U0uinPUw==","signatures":[{"sig":"MEUCIQCBEiAfNfm44Kx7cVTBMXyZ4LyCbRiHr54rFM1CGye8UAIgMjMiyPtr+J7pyJw+JsGXC3IqLM1tVdl2kjdOKCNnJt0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":13831},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.11.1"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.4.0_1713254698323_0.46840125692902457","host":"s3://npm-registry-packages"}},"0.4.1":{"name":"nuxt-api-shield","version":"0.4.1","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.4.1","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"e4cffbb0f7755fd2106f5da76adab9b4bbef438b","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.4.1.tgz","fileCount":26,"integrity":"sha512-ALfS8Xg1eJyU8kepZwEVcxDXUgmFjavDbNzf37PXpRB8KqYs/KXrvChIMFk6jFNXBnEe70DwfYsBY+hygiGbyQ==","signatures":[{"sig":"MEYCIQDRTQilcPlCi5treMpZ/qTL2UiYZ0f08QP1ybH+J1jltwIhAIPFTcxlWiZGZJPcsZsU7FrGn/6aohkRI3s8aXpPCrIZ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":14014},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.11.1"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.4.1_1715434073150_0.003384581666064035","host":"s3://npm-registry-packages"}},"0.5.0":{"name":"nuxt-api-shield","version":"0.5.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.5.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"f17252451c5686a61859dd4165707c584e7a67a9","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.5.0.tgz","fileCount":28,"integrity":"sha512-52UURoSGxch9Ftu+RB0KNN574cKRR5HAaNTzjLAU2kDKYhluxGTeIqx+sjm/YkZ4I7ye6g6g96AttLAYcqY6Cw==","signatures":[{"sig":"MEUCIDTG/PySuLvxPN3wzH3z47oC2V3PuckMw6Xfi+dXnG9NAiEAzDoH+qwzk/8b5OE5cCNPtd6d5jz4skvd1eTqvoZqiaw=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":15997},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.11.1"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.5.0_1715438721482_0.9758379038389078","host":"s3://npm-registry-packages"}},"0.6.0":{"name":"nuxt-api-shield","version":"0.6.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.0","dist":{"shasum":"53d0ba8ae73f70d2c49e2414dca14cddba68feb2","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.0.tgz","fileCount":28,"integrity":"sha512-hX37+Yekr71VrVB8Ih6vgCMqnPEF6OrDa39PczqgXDef1emgHfo/VmEiORSxROA3W06P/jVXV6vKCXWdNkJ6Cw==","signatures":[{"sig":"MEUCIQD/M21JJwM89FHqJgC3ncpAHG2Hjw9fNcGx9pazswUNaQIgSq5LUiLVQ58IAOO4vSrptZy/7zJ8aqB6825HJ3RWzNo=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":16966},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.0_1719419639115_0.5811291765478035","host":"s3://npm-registry-packages"}},"0.6.3":{"name":"nuxt-api-shield","version":"0.6.3","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.3","dist":{"shasum":"1d6e01db156942a99d7c3a3555eb2492afdaa496","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.3.tgz","fileCount":28,"integrity":"sha512-GVPqf8vuw14otOU8gkdqQrDmnBEWU9xa3ArtxnQjQ1YrGnnUktR4r3Ce+gVkmq1QkbEKwYjNTOvcoN+/eb36Qw==","signatures":[{"sig":"MEQCIC2ehq99YQfHiHo/zXUyBWLFweGfjlSxyIXkraES0gB6AiAaFu/ePMUL4M9zdGtG0NWOzBihapZib693SGXP1si/5g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17699},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn version --minor && yarn release","release:patch":"yarn version --patch && yarn release"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.3_1719421232065_0.24566145346466195","host":"s3://npm-registry-packages"}},"0.6.5":{"name":"nuxt-api-shield","version":"0.6.5","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.5","dist":{"shasum":"f2e8910dc5a742ba355d0cbcb56fb4de0ae9c2ce","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.5.tgz","fileCount":28,"integrity":"sha512-WHMqZn1jOSIxbciAXB6gu+61SY5+neeFr3BLopVhQ8lUAc6BU40UZMNi7EsY/ZPnWxgZQG+F9SxwGhQHU9RTuw==","signatures":[{"sig":"MEQCIAJoheihDatH5yPuP0riSYqIZjH0hyDHRlGc+AAoT8UTAiAt9bh4eMZVqPTrOZv6cEYvxoFmSCPdTatZku/QQMXw4w==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":17859},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","release":"yarn lint && yarn test && yarn prepack && changelogen --release && yarn publish --new-version $(node -p \"require('./package.json').version\") && git push --follow-tags","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn version --minor && yarn release","release:patch":"yarn version --patch && yarn release"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.5_1719421348726_0.6599833110438307","host":"s3://npm-registry-packages"}},"0.6.6":{"name":"nuxt-api-shield","version":"0.6.6","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.6","dist":{"shasum":"52d639c581a6b08e91f256fd409d1500463c050b","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.6.tgz","fileCount":28,"integrity":"sha512-TAA90zumn2dDlGLOPWu0u7mBeT1KUEa0CokAiVRIiOO+Dy2RlocIKCTC52J60tJnnrk7rpxRpj5v1iyuLaUehg==","signatures":[{"sig":"MEYCIQCyR39H0q9ClKKMS4Y9RE/fFRBLcTJblTQezM+lIvdb1AIhAML1FRAvbnbnEA/ksFeHSh0kJcNTivJD/bzt2qgYvB8j","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":18367},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 7000","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.6_1719421643405_0.24876789953659406","host":"s3://npm-registry-packages"}},"0.6.7":{"name":"nuxt-api-shield","version":"0.6.7","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.7","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"c6a3e4474a12e6b2b7ce6ce4db27676b9c906aa6","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.7.tgz","fileCount":28,"integrity":"sha512-72M4P/ECQTuh+SUVSXOd7OVoVcw2CKAJb7DJQTShrZoIqtBYxtFhlMJcIDZawIslGOPwvPOUTzD0x0LzJzCL6Q==","signatures":[{"sig":"MEQCIDsJGyF5riWvzoPZceM881tJcscaQCIA0ks4Y8p/EgEnAiAQohpIox3pP1o6s5jv4NjR9S0e5+a/nch6S4qYPKq7/A==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":18742},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept ","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.7_1720085398934_0.6548887046989131","host":"s3://npm-registry-packages"}},"0.6.8":{"name":"nuxt-api-shield","version":"0.6.8","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.8","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"3c7c3f36bef09125c57589c3388c843fed41313b","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.8.tgz","fileCount":28,"integrity":"sha512-LS3tWq8cEulpVXR4CQKw22H7vuRSYEvquICZw56J/seJkKg78FN8N3QWpT7ir7fFIQTj8ZvJ4H0cjmVczm5NNQ==","signatures":[{"sig":"MEUCIGBv1cAFQbI9GDtrMOQcmQVABno2dhFo2D4AXSWlenyEAiEA52bbZnIjc6r5AcrCoLknQPSHXmae537vl1MBGKc94jE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":18839},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept ","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.5.5"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.8_1725450539418_0.8888431666775469","host":"s3://npm-registry-packages"}},"0.6.9":{"name":"nuxt-api-shield","version":"0.6.9","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.6.9","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"929a228bbef9db6b0c009029c68aab323bc52ee9","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.6.9.tgz","fileCount":28,"integrity":"sha512-jpW/SKENoiPvvcS/Yuuf4fSkLFUWU8N4W+2QhscjR5iXyeG5+cAw4sC9ODpZf/oYvSSoeb/MCDworvP9dkXtjw==","signatures":[{"sig":"MEUCIAoq/CPGiqBD64LDrXwdFFO8ftKQF90Ob9Q8RL/18k3gAiEAqEf4qhRE1L16BRQEubydL6s2RfPSXwwxzhmc/nDAbl4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":18575},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept ","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"devDependencies":{"nuxt":"^3.11.1","eslint":"^8.57.0","vitest":"^1.4.0","@types/node":"^20.11.29","changelogen":"^0.5.5","@nuxt/schema":"^3.11.1","@nuxt/devtools":"latest","@nuxt/test-utils":"^3.12.0","@nuxt/eslint-config":"^0.2.0","@nuxt/module-builder":"^0.8.3"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.6.9_1725450799189_0.1569287179579668","host":"s3://npm-registry-packages"}},"0.7.0":{"name":"nuxt-api-shield","version":"0.7.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.7.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"b0912a5bf1a2d908f5f161a09e0652e852a267ed","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.7.0.tgz","fileCount":30,"integrity":"sha512-cmSlbc+/xa3DwpWRV/SY3kshZYR6sgHQHmo1LoN8GeHz1rsmdDPD8JMz8CPSnMUuZMjLDRP+SVIidh3fbv+aOg==","signatures":[{"sig":"MEQCIDXrVyuQuO8TFqV0+G2nzEiGwkZrlgKPPXyF1XCK+e5aAiBawJ4+KrphDbmO4IxBMR1qitP2oIfli42F304uo2T3iw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19462},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.21+sha1.1959a18351b811cdeedbd484a8f86c3cc3bbaf72","devDependencies":{"nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^2.0.5","vue-tsc":"^2.1.6","typescript":"latest","@types/node":"latest","changelogen":"^0.5.5","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^1.4.2","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^0.5.6","@nuxt/module-builder":"^0.8.3"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.7.0_1726141646412_0.007509198715176746","host":"s3://npm-registry-packages"}},"0.8.0":{"name":"nuxt-api-shield","version":"0.8.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.8.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"c2951901e166bd0c6b6ac3ad9d3b3f3ed3ff5635","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.8.0.tgz","fileCount":30,"integrity":"sha512-WTiWkGB1WaXU4X/RV9hdXbM3aGIdRY7i1o2Yz3UCh2nVMqXt0JURYVRod4F5Rgh8WIEa7Ea00dy5ISIpkN3a4g==","signatures":[{"sig":"MEUCIQDmedO3Hm0DHWNeSg0xVtCH8Dj/VDZS0IWTIuzM84b3EgIgVQ9TqITyB+LkMNf49RCqLl5DfNkp9ididcjK/aZBCyc=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":19977},"main":"./dist/module.cjs","type":"module","types":"./dist/types.d.ts","exports":{".":{"types":"./dist/types.d.ts","import":"./dist/module.mjs","require":"./dist/module.cjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^2.0.5","vue-tsc":"^2.1.6","typescript":"latest","@types/node":"latest","changelogen":"^0.5.5","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^1.4.2","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^0.5.6","@nuxt/module-builder":"^0.8.3"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.8.0_1726918169965_0.7881666601040538","host":"s3://npm-registry-packages"}},"0.8.1":{"name":"nuxt-api-shield","version":"0.8.1","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.8.1","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"6f499c236a1530f464fa0651d3d5aa7c2e9d44bc","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.8.1.tgz","fileCount":27,"integrity":"sha512-e88nDG/PUMI3shQ8n3JAcRI8HVOqJdKQMdBrQ3x48/BCzYZvA1WIxgmkCC6GvOccvmmMEg9pR1HK9I3tStKUmQ==","signatures":[{"sig":"MEQCIC7n9f4FckZcDRamvYDiFIUiBuBqnajX0cxNtglKO/GvAiAcb0GU/MUBgTAyJObtmiBIOjUDalENu3Dt49JUYe+ehQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21104},"main":"./dist/module.mjs","type":"module","exports":{".":{"import":"./dist/module.mjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","actor":{"name":"rrd","type":"user","email":"rrd@1108.cc"},"email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^2.0.5","vue-tsc":"^2.1.6","typescript":"latest","@types/node":"latest","changelogen":"^0.5.5","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^1.4.2","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^0.7.0","@nuxt/module-builder":"^0.8.3"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.8.1_1751826352369_0.40395924162414687","host":"s3://npm-registry-packages-npm-production"}},"0.8.2":{"name":"nuxt-api-shield","version":"0.8.2","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.8.2","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"805ab1d36aa8e1a1f611bb962fa3200d3029fc40","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.8.2.tgz","fileCount":30,"integrity":"sha512-79BfnchcGqGX2aE8FB2G0NIYXEwITYhVR1h5KKCI2nu63TnG9EMP/yKBIL1pt0dPUSTn4Ni4ph2iOpR2zSjJqg==","signatures":[{"sig":"MEUCIBFQzJ1cH1W7EkMwQCpIFcb+MPk439qS/jPv31z2VjJqAiEAv3AzyQODhL96lKbPJLl/q+UhgK1pCqeQtAnqyZDCWac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22535},"main":"./dist/module.mjs","type":"module","exports":{".":{"import":"./dist/module.mjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","actor":{"name":"rrd","type":"user","email":"rrd@1108.cc"},"email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^3.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^2.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.8.2_1751891701721_0.8851633533267744","host":"s3://npm-registry-packages-npm-production"}},"0.8.3":{"name":"nuxt-api-shield","version":"0.8.3","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.8.3","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"b7f8916e384e7786e84c655e84d048cd64834cc9","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.8.3.tgz","fileCount":27,"integrity":"sha512-rR6SIBzZrnErcHjEq35JNUJV5OmOKjbdFPadieh6bfl16BzCwNxMWLwkF9R3Xz951A+ZoavnUAD4zLShfFqpTA==","signatures":[{"sig":"MEUCIQCQH07VEVziKSmtPKkXd6mrKEQRbp7GJsIgl4iuwuzcWQIgdSSoJQoWA/g/Mcx0KvK3qMGUA5ImVikEHg8ggY+eVaA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30200},"main":"./dist/module.mjs","type":"module","exports":{".":{"import":"./dist/module.mjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=basic --disable-console-intercept","prepack":"nuxt-module-build build","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=basic --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^3.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^2.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.8.3_1756380230785_0.4273840235783575","host":"s3://npm-registry-packages-npm-production"}},"0.8.4":{"name":"nuxt-api-shield","version":"0.8.4","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.8.4","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"da2bab17408489db854d1fd6fc7e23a0306550e3","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.8.4.tgz","fileCount":27,"integrity":"sha512-51SSBQ3DRLIMIiNuqSabhq4+llwsdYpz9sB7lN089dSdKFC0huG+NEhK16jmTvZpG4hqu8Y3m+GbD5UE+Wxw+Q==","signatures":[{"sig":"MEYCIQCj1k63BhoHJzXXwSDk+6/Q8b8uVRq5wt9Pj9dq9ujVRAIhAJqjdndnYI6GmqNxq3H4aC4nmbTiMw6fZycaQmAa+mfc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30396},"main":"./dist/module.mjs","type":"module","exports":{".":{"import":"./dist/module.mjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","prepack":"nuxt-module-build build","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^3.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^2.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.8.4_1759836196178_0.44060902566069116","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"nuxt-api-shield","version":"0.9.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.9.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"0db9c8e502c2c4318f9581c04bfced179a252cdf","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.9.0.tgz","fileCount":31,"integrity":"sha512-lW7tck9Re3m09Xbv0+LUnXKd7MV7bJgNFkn73v6D8cqZFfatvxh3bsMiA5mtWlbOrEvVntmp0APS/1H2TNqZsA==","signatures":[{"sig":"MEQCIHPemIk3/EpLaVlGP5hGWjNsBZyguj3vX9ZvGu6SuGvxAiBxqfRfYJSVPJSi2XGmQtodnRWv8obPTNYSa/POEc2V3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34517},"main":"./dist/module.mjs","type":"module","exports":{".":{"import":"./dist/module.mjs"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","prepack":"nuxt-module-build build","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^3.12.2"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^3.13.0","eslint":"^9.10.0","vitest":"^3.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^3.13.1","@nuxt/devtools":"^2.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.9.0_1763111492331_0.81928951352775","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"nuxt-api-shield","version":"0.9.1","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.9.1","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"d1e6680d26385646f4e030e7a7604db65c2c4d09","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.9.1.tgz","fileCount":31,"integrity":"sha512-btZkvcPk9sGykgeaVnPJxuX685KDB7NoM1CGVhBhO+xRCOz7ZmRHLko/QIjhUIQQznqU+VEsE0Ej+7jfBRHDGA==","signatures":[{"sig":"MEUCIBnSNitI+D6T6EdNCHmKS/yJwwnR7om19hNbj4ageJSiAiEAtOPUeo9eYJ9XKOR4zPYeMLQ4hREt2M4XK8Fjt9ldxI8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35928},"main":"./dist/module.mjs","type":"module","types":"./dist/types.d.mts","exports":{".":{"types":"./dist/types.d.mts","import":"./dist/module.mjs"},"./types":{"types":"./dist/types.d.mts"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","prepack":"nuxt-module-build build && node scripts/add-types-export.js","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^4.0.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^4.0.0","eslint":"^9.10.0","vitest":"^4.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^4.0.0","@nuxt/devtools":"^3.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.9.1_1764948660192_0.40465295204922835","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"nuxt-api-shield","version":"0.9.3","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.9.3","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"cd166ea61aca991dc190a6c055f13b89bb70b36d","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.9.3.tgz","fileCount":32,"integrity":"sha512-1qpU1oKHCGxY8RWWHgdWdaICEaMGD6SzYm2o1zdGhmO0ndy/5jx8gUwy9sn9bThc134nveQQWnLAotm+5LA1zA==","signatures":[{"sig":"MEUCIC8V2PYMml3dZMGYsEK/s7ILyxfoCSIfH6Ufaq7Jj+qOAiEAiw/NKxKGT5HQvyJt29JpQQ8rLsGRLUS83uS8Oa6WSR4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37249},"main":"./dist/module.mjs","type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/module.mjs"},"./types":{"types":"./dist/index.d.mts"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept && yarn test:types","prepack":"nuxt-module-build build && node scripts/generate-types.js","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","build:test":"nuxt-module-build build --logLevel silent 2>&1 | grep -v 'Potential missing package.json' || true && node scripts/generate-types.js","test:types":"bash scripts/test-types-fix.sh","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"deprecated":"This version was released by mistake, please use v0.10.0 instead","repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^4.0.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^4.0.0","eslint":"^9.10.0","vitest":"^4.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^4.0.0","@nuxt/devtools":"^3.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.9.3_1764951565592_0.8289340529324309","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"nuxt-api-shield","version":"0.10.0","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.10.0","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"dist":{"shasum":"c6203e79e450fdeb2330b7ddb59e37082cb2ef6f","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.10.0.tgz","fileCount":32,"integrity":"sha512-0LkQ9fs6xlEvGn55+9ii4lm71IrPf9Jzu8cx1DxHO27jh7HEFCk3qihbeH0ClU45hnH9c6MZmbO0vYjn+Zyjiw==","signatures":[{"sig":"MEYCIQCpdjBDlErh/vmMsRJ6Sth/GntBqyC30Q2hM1XXMjuWDAIhAJKzf/ZM6Pg93L3w9m1Yx50BfhUh2F5Mg7Fk8kLy8Zmj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37253},"main":"./dist/module.mjs","type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/module.mjs"},"./types":{"types":"./dist/index.d.mts"}},"scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept && yarn test:types","prepack":"nuxt-module-build build && node scripts/generate-types.js","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","build:test":"nuxt-module-build build --logLevel silent 2>&1 | grep -v 'Potential missing package.json' || true && node scripts/generate-types.js","test:types":"bash scripts/test-types-fix.sh","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"description":"Nuxt API Shield - Rate Limiting","directories":{},"dependencies":{"defu":"^6.1.4","@nuxt/kit":"^4.0.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^4.0.0","eslint":"^9.10.0","vitest":"^4.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^4.0.0","@nuxt/devtools":"^3.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.10.0_1764952144951_0.9455034921304954","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"nuxt-api-shield","version":"0.10.1","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.10.1","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"homepage":"https://github.com/rrd108/nuxt-api-shield#readme","bugs":{"url":"https://github.com/rrd108/nuxt-api-shield/issues"},"dist":{"shasum":"28de06b51f44a5b36bfc8f75c6f596ae99b90e1f","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.10.1.tgz","fileCount":36,"integrity":"sha512-YQdy8xqvkhPS01MtdKtQA2uc5Da9Hfxg0um5rZFBRCRTs/OqSvCYYEda8YwxMYZB7fGwalKu9lL9jYJxoyIhVQ==","signatures":[{"sig":"MEQCIG2s38uvjFoAJ6gBflUoE/PO9XJZxFufHNNQ0gGl4S1RAiA5t6z7jpbUSSWXS+x8pG1+SiYWuc24WurMLh5Gc2VmfA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38670},"main":"./dist/module.mjs","type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/module.mjs"},"./types":{"types":"./dist/index.d.mts"}},"gitHead":"1d654ad87cdc3c75ded79e87c5fef214acc7ffc1","scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"yarn dev:prepare && vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept && yarn test:types","prepack":"nuxt-module-build build && node scripts/generate-types.js","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","test:types":"vue-tsc --noEmit --project ./test/tsconfig.json --moduleResolution bundler","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"git+https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"_npmVersion":"10.9.2","description":"Nuxt API Shield - Rate Limiting","directories":{},"_nodeVersion":"22.17.0","dependencies":{"defu":"^6.1.4","@nuxt/kit":"^4.0.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^4.0.0","eslint":"^9.10.0","vitest":"^4.0.0","vue-tsc":"^3.0.0","typescript":"latest","@types/node":"latest","changelogen":"^0.6.0","@nuxt/schema":"^4.0.0","@nuxt/devtools":"^3.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.10.1_1774690198883_0.29509169808179037","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"nuxt-api-shield","version":"0.10.2","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"license":"MIT","_id":"nuxt-api-shield@0.10.2","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"homepage":"https://github.com/rrd108/nuxt-api-shield#readme","bugs":{"url":"https://github.com/rrd108/nuxt-api-shield/issues"},"dist":{"shasum":"5f7b3b24d0775c151f17abbf67d6173c756e6b6b","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-0.10.2.tgz","fileCount":36,"integrity":"sha512-oMc48DpA2FG2VwjTxRf2MZsFf9Xu4/uhsVf3utWUqJNs7kYxMXQtJTMktPb+KiGRawyENnI3xhg+f2mmgM6Ffg==","signatures":[{"sig":"MEYCIQD+y/ovqt45oG++Y1lSQFS7jDsG4D5JcXlc/xxYV/ICTgIhAKnrXy09pNmrqAzXRlr8v1qeITL26MUODBavlOdHZ/Ys","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273965},"main":"./dist/module.mjs","type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/module.mjs"},"./types":{"types":"./dist/index.d.mts"}},"gitHead":"dc290da85b7186f2953c31b40b1b5974b4f53c53","scripts":{"dev":"nuxi dev playground","lint":"eslint .","test":"yarn dev:prepare && vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept && yarn test:types","prepack":"nuxt-module-build build && node scripts/generate-types.js","lint:fix":"eslint . --fix","dev:build":"nuxi build playground","test:types":"vue-tsc --noEmit --project ./test/tsconfig.json --moduleResolution bundler","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags"},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"repository":{"url":"git+https://github.com/rrd108/nuxt-api-shield.git","type":"git"},"_npmVersion":"10.9.2","description":"Nuxt API Shield - Rate Limiting","directories":{},"resolutions":{"typescript":"5.8.3"},"_nodeVersion":"22.17.0","dependencies":{"defu":"^6.1.4","@nuxt/kit":"^4.0.0"},"_hasShrinkwrap":false,"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","devDependencies":{"nuxi":"^3.25.1","nuxt":"^4.0.0","eslint":"^9.10.0","vitest":"^4.0.0","vue-tsc":"^3.0.0","typescript":"~5.8.3","@types/node":"^25.5.0","changelogen":"^0.6.0","@nuxt/schema":"^4.0.0","@nuxt/devtools":"^3.0.0","@nuxt/test-utils":"^3.14.2","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/nuxt-api-shield_0.10.2_1774886806958_0.8686182417644273","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"nuxt-api-shield","version":"1.0.0","description":"Nuxt API Shield - Rate Limiting","repository":{"type":"git","url":"git+https://github.com/rrd108/nuxt-api-shield.git"},"license":"MIT","type":"module","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"exports":{".":{"import":"./dist/module.mjs","types":"./dist/index.d.mts"},"./types":{"types":"./dist/index.d.mts"}},"main":"./dist/module.mjs","scripts":{"prepack":"nuxt-module-build build && node scripts/generate-types.js","dev":"nuxi dev playground","dev:build":"nuxi build playground","dev:prepare":"nuxt-module-build build --stub && nuxt-module-build prepare && nuxi prepare playground","release:patch":"yarn lint && yarn test && yarn prepack && changelogen --release --patch && yarn publish && git push --follow-tags","release:minor":"yarn lint && yarn test && yarn prepack && changelogen --release --minor && yarn publish && git push --follow-tags","lint":"eslint .","lint:fix":"eslint . --fix","test":"yarn dev:prepare && vitest run --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept && yarn test:types","test:watch":"vitest watch  --testTimeout 15000 --reporter=default --reporter.summary=false --disable-console-intercept","test:types":"vue-tsc --noEmit --project ./test/tsconfig.json --moduleResolution bundler"},"dependencies":{"@nuxt/kit":"^4.0.0","defu":"^6.1.4"},"devDependencies":{"@nuxt/devtools":"^3.0.0","@nuxt/eslint-config":"^1.0.0","@nuxt/module-builder":"^1.0.0","@nuxt/schema":"^4.0.0","@nuxt/test-utils":"^4.0.0","@types/node":"^25.5.0","changelogen":"^0.6.0","eslint":"^10.0.0","nuxi":"^3.25.1","nuxt":"^4.0.0","typescript":"~6.0.0","vitest":"^4.0.0","vue-tsc":"^3.0.0"},"packageManager":"yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e","resolutions":{"typescript":"~6.0.0"},"_id":"nuxt-api-shield@1.0.0","gitHead":"e5e51b950230d85a4d62a2068388f14d1c81cc4d","bugs":{"url":"https://github.com/rrd108/nuxt-api-shield/issues"},"homepage":"https://github.com/rrd108/nuxt-api-shield#readme","_nodeVersion":"22.17.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-mV2E3A/oefzN6V7z4sN3tSbCjBjkzakNBU+tDzJc4kZLInJRTxSN2JUa4724MMWCd0CYzVv3+HHkc/dJ7DHWoA==","shasum":"e2297ccee52262f6d575357928c4814c58605417","tarball":"https://registry.npmjs.org/nuxt-api-shield/-/nuxt-api-shield-1.0.0.tgz","fileCount":34,"unpackedSize":282612,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQChCVIblIufKRsd1eJP6VAE5ooD/EBSdRBsByusSaSZGgIgLjHAiSiY+tmM4Gd3zmZ49oBywIve+1qkhqFrXrKqCe8="}]},"_npmUser":{"name":"rrd","email":"rrd@1108.cc"},"directories":{},"maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nuxt-api-shield_1.0.0_1782038138563_0.8877393491387691"},"_hasShrinkwrap":false}},"time":{"created":"2024-03-29T16:59:02.236Z","modified":"2026-06-21T10:35:38.831Z","0.1.0":"2024-03-29T16:59:02.463Z","0.2.0":"2024-03-30T11:05:53.661Z","0.3.0":"2024-03-30T15:52:41.940Z","0.4.0":"2024-04-16T08:04:58.481Z","0.4.1":"2024-05-11T13:27:53.311Z","0.5.0":"2024-05-11T14:45:21.664Z","0.6.0":"2024-06-26T16:33:59.280Z","0.6.3":"2024-06-26T17:00:32.229Z","0.6.5":"2024-06-26T17:02:28.908Z","0.6.6":"2024-06-26T17:07:23.549Z","0.6.7":"2024-07-04T09:29:59.126Z","0.6.8":"2024-09-04T11:48:59.614Z","0.6.9":"2024-09-04T11:53:19.357Z","0.7.0":"2024-09-12T11:47:26.514Z","0.8.0":"2024-09-21T11:29:30.273Z","0.8.1":"2025-07-06T18:25:52.531Z","0.8.2":"2025-07-07T12:35:01.914Z","0.8.3":"2025-08-28T11:23:50.955Z","0.8.4":"2025-10-07T11:23:16.347Z","0.9.0":"2025-11-14T09:11:32.526Z","0.9.1":"2025-12-05T15:31:00.338Z","0.9.3":"2025-12-05T16:19:25.794Z","0.10.0":"2025-12-05T16:29:05.105Z","0.10.1":"2026-03-28T09:29:59.037Z","0.10.2":"2026-03-30T16:06:47.124Z","1.0.0":"2026-06-21T10:35:38.727Z"},"bugs":{"url":"https://github.com/rrd108/nuxt-api-shield/issues"},"license":"MIT","homepage":"https://github.com/rrd108/nuxt-api-shield#readme","keywords":["nuxt","nuxt-module","security","rate-limit","bruteforce"],"repository":{"type":"git","url":"git+https://github.com/rrd108/nuxt-api-shield.git"},"description":"Nuxt API Shield - Rate Limiting","maintainers":[{"name":"rrd","email":"rrd@1108.cc"}],"readme":"# Nuxt API Shield\n\n[![npm version][npm-version-src]][npm-version-href]\n[![npm downloads][npm-downloads-src]][npm-downloads-href]\n[![License][license-src]][license-href]\n[![Nuxt][nuxt-src]][nuxt-href]\n\nThis Nuxt module implements a rate limiting middleware to protect your API endpoints from excessive requests.\n\n- [✨ &nbsp;Release Notes](/CHANGELOG.md)\n  <!-- - [🏀 Online playground](https://stackblitz.com/github/your-org/nuxt-api-shield?file=playground%2Fapp.vue) -->\n  - [📖 &nbsp;Documentation](https://github.com/rrd108/nuxt-api-shield)\n\n## Features\n\n- **IP-Based Rate limiting and Brute Force Protection**\n  - Tracks and enforces rate limits for individual IP addresses.\n  - Prevents malicious actors or excessive requests from a single source from overwhelming your API.\n- **Customizable Rate Limits**\n  - Configure maximum request count, duration within which the limit applies, and a ban period for exceeding the limit.\n  - If the request limit is exceeded, the user is banned for the configured ban period. During the ban period, **all requests are blocked with a 429 error**, regardless of the rate limit window.\n  - Add a delay to responses when a user is banned to discourage further abuse (optional).\n  - Customize the error message for banned users.\n  - Optionally include the `Retry-After` header in responses when a user is banned.\n  - Tailor the rate-limiting behavior to align with your API's specific needs and usage patterns.\n- **Event-Driven Handling**\n  - Intercepts incoming API requests efficiently using Nuxt's event system.\n  - Ensures seamless integration with your Nuxt application's request lifecycle.\n- **Flexible Storage**\n  - Utilizes Nuxt's unstorage abstraction for versatile storage options.\n  - Store rate-limiting data in various storage providers (filesystem, memory, databases, etc.) based on your project's requirements.\n- **Configurable with Runtime Config**\n  - Easily adjust rate-limiting parameters without code changes.\n  - Adapt to dynamic needs and maintain control over rate-limiting behavior through Nuxt's runtime configuration.\n- **Bundled cleanup tasks**\n  - Registers Nitro tasks `shield:cleanBans` and `shield:cleanIpData` so you can schedule maintenance without adding task files (see setup step 4).\n- **Clear Error Handling**\n  - Returns a standardized 429 \"Too Many Requests\" error response when rate limits are exceeded or when a user is banned.\n  - The 429 body is JSON (`{ error, retryAfter }`) for predictable client-side handling.\n  - Facilitates proper error handling in client-side applications for a smooth user experience.\n- **Standard Rate-Limit Headers**\n  - Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` headers so clients and CDNs can track usage without parsing response bodies.\n\n## Quick Setup\n\n### 1. Add `nuxt-api-shield` dependency to your project\n\n```bash\n# Using pnpm\npnpm add nuxt-api-shield\n\n# Using yarn\nyarn add nuxt-api-shield\n\n# Using npm\nnpm install nuxt-api-shield\n```\n\n### 2. Add `nuxt-api-shield` to the `modules` section of `nuxt.config.ts`\n\nYou should add only the values you want to use differently from the default values.\n\n```js\nexport default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n  nuxtApiShield: {\n    /*limit: {\n      max: 12,        // maximum requests per duration time, default is 12/duration\n      duration: 108,   // duration time in seconds, default is 108 seconds\n      ban: 3600,      // ban time in seconds, default is 3600 seconds = 1 hour\n      // If the request limit is exceeded, the user is banned for this period. During the ban, all requests are blocked with 429.\n    },\n    delayOnBan: true  // delay every response with +1sec when the user is banned, default is true\n    errorMessage: \"Too Many Requests\",  // error message when the user is banned, default is \"Too Many Requests\"\n    retryAfterHeader: false, // when the user is banned add the Retry-After header to the response, default is false\n    log: {\n      path: \"\", // path to the log file, every day a new log file will be created, use \"\" to disable logging\n      attempts: 0,    // if an IP reach 0 requests (disabled), all the requests will be logged, can be used for further analysis or blocking for example with fail2ban, use 0 to disable logging\n      fail2ban: false, // enable fail2ban-compatible log format for ban events (see fail2ban section)\n    },\n    routes: [], // specify routes to apply rate limiting to, default is an empty array meaning all routes are protected.\n    // Example:\n    // routes: [\"/api/v2/\", \"/api/v3/\"], // /api/v1 will not be protected, /api/v2/ and /api/v3/ will be protected */\n    skipRoutes: [], // specify routes to skip/exempt from rate limiting, supports wildcard patterns (*/**)\n    // Example:\n    // skipRoutes: [\"/api/health\", \"/api/_nuxt/**\", \"/api/webhooks/stripe\"],\n    ipTTL: 604800, // Optional: Time-to-live in seconds for IP tracking entries (default: 7 days). Set to 0 or negative to disable this specific cleanup.\n    security: {\n      // Optional: Security-related configurations\n      trustXForwardedFor: false, // Default: false. Whether to trust X-Forwarded-For headers. See warning below.\n    },\n  },\n});\n```\n\n**Default Configuration Values:**\n(These are applied by the module if not specified in your `nuxtApiShield` config)\n\n```js\n{\n  limit: {\n    max: 12,\n    duration: 108, // seconds\n    ban: 3600,     // seconds\n  },\n  delayOnBan: true,\n  errorMessage: \"Too Many Requests\",\n  retryAfterHeader: false,\n  log: {\n    path: \"\", // Logging is disabled if path is empty\n    attempts: 0, // Logging per IP is disabled if attempts is 0\n    fail2ban: false,\n  },\n  routes: [],\n  skipRoutes: [],\n  ipTTL: 7 * 24 * 60 * 60, // 7 days in seconds\n  security: {\n    trustXForwardedFor: false,\n  }\n}\n```\n\n**Security Warning: `trustXForwardedFor`**\n\nThe `security.trustXForwardedFor` option (default is `false`, set by the module) determines if the module uses the `X-Forwarded-For` HTTP header to identify the client's IP address.\n\n- If set to `true`: The module will use the IP address provided in the `X-Forwarded-For` header. This is common when your Nuxt application is behind a trusted reverse proxy, load balancer, or CDN (like Nginx, Cloudflare, AWS ELB/ALB) that correctly sets this header with the real client IP.\n- **WARNING:** If `trustXForwardedFor` is `true` and your application is directly internet-facing OR your proxy is not configured to strip incoming `X-Forwarded-For` headers from clients, malicious users can spoof their IP address by sending a fake `X-Forwarded-For` header. This would allow them to bypass rate limits or cause other users to be incorrectly rate-limited.\n- If set to `false`: The module will use the direct IP address of the incoming connection (i.e., `event.node.req.socket.remoteAddress`). Use this setting if your application is directly internet-facing or if you are unsure about your proxy's configuration.\n- **Recommendation:** Only enable `trustXForwardedFor: true` if you are certain your reverse proxy is correctly configured to set this header and strip any client-sent versions of it. Otherwise, set it to `false`.\n\n### 3. Add `nitro/storage` to `nuxt.config.ts`\n\nYou can use any storage you want, but you have to use **shield** as the name of the storage.\n\n```json\n{\n  \"nitro\": {\n    \"storage\": {\n      \"shield\": {\n        // storage name, you **must** use \"shield\" as the name\n        \"driver\": \"memory\"\n      }\n    }\n  }\n}\n```\n\nIf you use for example redis, you can use the following configuration, define the host and port.\n\n```json\n{\n  \"nitro\": {\n    \"storage\": {\n      \"shield\": {\n        \"driver\": \"redis\",\n        \"host\": \"localhost\",\n        \"port\": 6379\n      }\n    }\n  }\n}\n```\n\n### 4. Schedule bundled cleanup tasks in `nuxt.config.ts`\n\nThe module registers two Nitro tasks for you: `shield:cleanBans` (removes expired `ban:*` keys) and `shield:cleanIpData` (removes stale `ip:*` keys using `ipTTL`). Turn on Nitro tasks and add `scheduledTasks` so they run on a cadence you choose. You do **not** need files under `server/tasks/` for this default setup.\n\n```json\n{\n  \"nitro\": {\n    \"experimental\": {\n      \"tasks\": true\n    },\n    \"scheduledTasks\": {\n      \"*/15 * * * *\": [\"shield:cleanBans\"],\n      \"0 0 * * *\": [\"shield:cleanIpData\"]\n    }\n  }\n}\n```\n\nCron expressions are examples only: for instance, clean expired bans every 15 minutes and IP tracking data daily at midnight.\n\n### 5. Optional: custom cleanup task implementations\n\nSkip this unless you need behavior different from the bundled handlers (for example extra logging, metrics, or storage layout). The snippets below mirror what the module already ships; they are useful as a reference or if you define **another** task name and point `scheduledTasks` at that name instead.\n\n#### a) Task for cleaning expired bans\n\nRemoves ban entries (`ban:xxx.xxx.xxx.xxx`) after the ban timestamp has passed.\n\nExample `server/tasks/shield/cleanBans.ts` (task name must match what you schedule):\n\n```ts\nimport { isActualBanTimestampExpired } from \"#imports\"; // Auto-imported utility from nuxt-api-shield\n\nexport default defineTask({\n  meta: {\n    name: \"shield:cleanBans\", // Match the name in scheduledTasks\n    description: \"Clean expired bans from nuxt-api-shield storage.\",\n  },\n  async run() {\n    const shieldStorage = useStorage(\"shield\"); // Use your configured storage name\n\n    // Only fetch keys that start with the 'ban:' prefix\n    const banKeys = await shieldStorage.getKeys(\"ban:\");\n\n    let cleanedCount = 0;\n    for (const key of banKeys) {\n      const bannedUntilRaw = await shieldStorage.getItem(key);\n      if (isActualBanTimestampExpired(bannedUntilRaw)) {\n        await shieldStorage.removeItem(key);\n        cleanedCount++;\n      }\n    }\n    console.log(`[nuxt-api-shield] Cleaned ${cleanedCount} expired ban(s).`);\n    return { result: { cleanedCount } };\n  },\n});\n```\n\nThe `isActualBanTimestampExpired` utility is provided by `nuxt-api-shield` and should be available via `#imports`.\n\n#### b) Task for cleaning old IP tracking data\n\nCleans IP tracking entries (`ip:xxx.xxx.xxx.xxx`) whose `time` is older than `nuxtApiShield.ipTTL` (default 7 days), and drops malformed entries. That keeps storage from growing with one-off IPs that were never banned.\n\nExample `server/tasks/shield/cleanIpData.ts`:\n\n```ts\nimport type { RateLimit } from \"nuxt-api-shield\";\nimport { useRuntimeConfig } from \"#imports\";\n\nexport default defineTask({\n  meta: {\n    name: \"shield:cleanIpData\", // Match the name in scheduledTasks\n    description: \"Clean old IP tracking data from nuxt-api-shield storage.\",\n  },\n  async run() {\n    const shieldStorage = useStorage(\"shield\");\n    const config = useRuntimeConfig().public.nuxtApiShield;\n\n    // ipTTL is expected to be in seconds from config (module applies default if not set by user)\n    const ipTTLseconds = config.ipTTL;\n\n    if (!ipTTLseconds || ipTTLseconds <= 0) {\n      console.log(\n        \"[nuxt-api-shield] IP data cleanup (ipTTL) is disabled or invalid.\"\n      );\n      return { result: { cleanedCount: 0 }, status: \"disabled_or_invalid_ttl\" };\n    }\n    const ipTTLms = ipTTLseconds * 1000;\n\n    const ipKeys = await shieldStorage.getKeys(\"ip:\");\n    const currentTime = Date.now();\n    let cleanedCount = 0;\n\n    for (const key of ipKeys) {\n      const entry = (await shieldStorage.getItem(key)) as RateLimit | null;\n\n      // Check if entry exists and has a numeric 'time' property\n      if (entry && typeof entry.time === \"number\") {\n        if (currentTime - entry.time > ipTTLms) {\n          await shieldStorage.removeItem(key);\n          cleanedCount++;\n        }\n      } else {\n        // Clean up entries that are null, not an object, or missing a numeric 'time'\n        await shieldStorage.removeItem(key);\n        cleanedCount++;\n      }\n    }\n\n    console.log(\n      `[nuxt-api-shield] Cleaned ${cleanedCount} old/malformed IP data entries.`\n    );\n    return { result: { cleanedCount } };\n  },\n});\n```\n\nConfigure `ipTTL` under `nuxtApiShield` if you want a TTL other than the default. Setting `ipTTL` to `0` (or any non-positive value) makes the bundled `shield:cleanIpData` task skip IP cleanup (it logs and exits).\n\nIf you add your own task file with the same `meta.name` as a bundled task (`shield:cleanBans` or `shield:cleanIpData`), Nitro may prefer your project file over the module—avoid duplicate names unless you intend to override.\n\n## Production Deployment\n\n### Use Redis as the storage driver\n\nFor production deployments — especially with multiple server instances or significant traffic — **Redis is the recommended storage driver**. The `memory` and `fs` drivers have important limitations:\n\n| Area | `memory` / `fs` | Redis |\n|------|----------------|-------|\n| **Multi-instance** | Each process has its own isolated state. Rate limits reset per instance, allowing bypass. | Shared state across all instances. |\n| **Atomic operations** | Read → increment → write is not atomic. Concurrent requests can both read the same count and exceed the limit simultaneously. | Single-threaded — reads and writes are naturally atomic. No race conditions. |\n| **Cleanup** | Cleanup tasks (`shield:cleanBans`, `shield:cleanIpData`) must scan all keys with `getKeys()`. At scale this blocks the event loop. | Use `EXPIRE` or `TTL` natively — expired keys are reclaimed automatically without scanning. |\n\nTo use Redis, configure the `shield` storage with the `redis` driver:\n\n```json\n{\n  \"nitro\": {\n    \"storage\": {\n      \"shield\": {\n        \"driver\": \"redis\",\n        \"host\": \"localhost\",\n        \"port\": 6379\n      }\n    }\n  }\n}\n```\n\nSee the [unstorage Redis driver docs](https://unstorage.unjs.io/drivers/redis) for all available options.\n\n### When `memory` / `fs` is acceptable\n\nThe `memory` and `fs` drivers are fine for:\n- Single-instance deployments\n- Development environments\n- Low-traffic applications where occasional race conditions are acceptable\n\nFor everything else, use Redis.\n\n## Fail2ban Integration\n\nWhen a user exceeds the rate limit and gets banned, `nuxt-api-shield` can write ban events to the log file in a `fail2ban`-compatible format. You can then configure fail2ban to watch these logs and automatically block the IP at the firewall level.\n\n### Setup\n\nEnable fail2ban logging by setting `log.fail2ban` to `true` and configuring the `log.path`:\n\n```js\nexport default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n  nuxtApiShield: {\n    log: {\n      path: \"/var/log/nuxt-api-shield\", // required — must be set\n      attempts: 1,                       // optional — threshold for regular request logging\n      fail2ban: true,                     // enable fail2ban format\n    },\n  },\n})\n```\n\nWhen enabled, every ban event writes a line like:\n\n```\n2026-06-21 12:34:56,789 nuxt-api-shield ban 192.168.1.100 — /api/v3/login exceeded limit (12 requests in 108s)\n```\n\n### Fail2ban filter configuration\n\nCreate `/etc/fail2ban/filter.d/nuxt-api-shield.conf`:\n\n```ini\n[Definition]\nfailregex = ^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3} nuxt-api-shield ban <HOST>\n```\n\n### Jail configuration\n\nAdd a jail entry in `/etc/fail2ban/jail.local`:\n\n```ini\n[nuxt-api-shield]\nenabled  = true\nfilter   = nuxt-api-shield\nlogpath  = /var/log/nuxt-api-shield/shield-*.log\nport     = http,https\nbanaction = iptables-multiport\nmaxretry = 1\nfindtime = 1\nbantime  = 3600\n```\n\nSince `nuxt-api-shield` already applies its own ban logic (configurable via `limit.ban`), set `maxretry = 1` and `findtime = 1` so fail2ban acts immediately on each ban log entry. Adjust `bantime` to match or extend your module-level ban duration.\n\nRestart fail2ban after adding the config:\n\n```bash\nsudo systemctl restart fail2ban\n```\n\n> **Note:** The `log.path` directory must be readable by the fail2ban service. Ensure permissions are set accordingly.\n\n## TypeScript Types\n\nThe module exports TypeScript types that you can use in your application:\n\n### `RateLimit` Type\n\nThe `RateLimit` type represents the structure of rate limit data stored for each IP address:\n\n```ts\nimport type { RateLimit } from \"nuxt-api-shield\";\n\n// RateLimit structure:\n// {\n//   count: number  // Number of requests made\n//   time: number   // Timestamp of the last request\n// }\n```\n\n**Usage Example:**\n\n```ts\nimport type { RateLimit } from \"nuxt-api-shield\";\nimport { useStorage } from \"#imports\";\n\nconst shieldStorage = useStorage(\"shield\");\nconst ipKey = \"ip:192.168.1.1\";\nconst entry = (await shieldStorage.getItem(ipKey)) as RateLimit | null;\n\nif (entry) {\n  console.log(`IP has made ${entry.count} requests`);\n  console.log(`Last request at: ${new Date(entry.time).toISOString()}`);\n}\n```\n\n### `ModuleOptions` Type\n\nYou can also import the module configuration type:\n\n```ts\nimport type { ModuleOptions } from \"nuxt-api-shield\";\n```\n\n## Per-Route Rate Limiting\n\n`nuxt-api-shield` supports **per-route rate limiting**, allowing you to define custom limits for specific API endpoints while keeping a global default configuration for all other routes.\n\nThis is useful when certain endpoints (such as `/api/login`, `/api/auth`, or `/api/payment`) require stricter protection.\n\n---\n\n### Configuration Example\n\nThe `routes` option accepts a mixed array of strings (exact matches) and objects (custom limits or patterns).\n\n```ts\nexport default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n\n  nuxtApiShield: {\n    limit: {\n      max: 12,\n      duration: 108,\n      ban: 3600,\n    },\n\n    routes: [\n      // 1. String: uses the global default limit (exact match)\n      \"/api/example\",\n\n      // 2. Object: custom rate limit for a specific route (exact match)\n      {\n        path: \"/api/example-per-route\",\n        max: 5,\n        duration: 10,\n        // \"ban\" can also be overridden per route\n      },\n\n      // 3. Object: Wildcard pattern\n      {\n        path: \"/api/users/*/profile\",\n        pattern: true,\n        max: 10,\n        duration: 60\n      }\n    ],\n  },\n});\n```\n\n### Wildcard Route Support\n\nWildcard patterns allow you to apply the same limits to groups of related API endpoints. Enable them by setting `pattern: true` in your route configuration.\n\n#### Wildcard Pattern Syntax\n\n- **Single-Segment Wildcard (`*`)**: Matches exactly one path segment.\n  - `/api/users/*/profile` matches `/api/users/123/profile` or `/api/users/admin/profile`.\n- **Multi-Segment Wildcard (`**`)**: Matches zero or more path segments.\n  - `/api/reports/**/summary` matches `/api/reports/monthly/2023/summary` or `/api/reports/summary`.\n\n#### Pattern Precedence\n1. **Exact matches** always take precedence over wildcard patterns.\n2. **More specific wildcards** take precedence over less specific ones.\n3. When multiple wildcard patterns match, the most specific one is used.\n\n#### Important Notes\n- **Shared Rate Limits:** All requests that match the same wildcard pattern share the same rate limit counter.\n- **Security:** Broad or dangerous patterns like `/**` or `/*` are automatically rejected to prevent accidental global blocking.\n\n## Skipping Routes\n\nThe `skipRoutes` option lets you exempt specific paths from all shield processing (ban check, rate limit counter, and logging) without needing to list every protected route in the `routes` array.\n\nThis is useful for health checks, webhook endpoints, monitoring probes, or internal status routes that should always respond regardless of traffic.\n\n### Configuration Example\n\n```ts\nexport default defineNuxtConfig({\n  modules: [\"nuxt-api-shield\"],\n\n  nuxtApiShield: {\n    limit: {\n      max: 12,\n      duration: 108,\n      ban: 3600,\n    },\n\n    skipRoutes: [\n      \"/api/health\",          // exact match\n      \"/api/_nuxt/**\",        // multi-segment wildcard\n      \"/api/webhooks/stripe\", // exact match\n    ],\n  },\n})\n```\n\n### How It Works\n\n- Routes in `skipRoutes` bypass the middleware entirely — no ban check, no rate limit counter, no log entry.\n- The rest of your API routes (those matching the global defaults or the `routes` option) continue to be rate limited normally.\n- Supports the same wildcard syntax as per-route patterns: `*` for single segment, `**` for multi-segment.\n\n## Important Considerations\n\n### Data Privacy (IP Address Storage)\n\n`nuxt-api-shield` functions by tracking IP addresses to monitor request rates and apply bans. This means IP addresses, which can be considered Personally Identifiable Information (PII) under regulations like GDPR, are stored by the module.\n\n- **Data Stored:**\n  - `ip:<IP_ADDRESS>`: Stores `{ count: number, time: number }` for tracking request rates.\n  - `ban:<IP_ADDRESS>`: Stores a timestamp indicating when a ban on an IP address expires.\n- **Compliance:** Ensure your usage complies with any applicable data privacy regulations. This may involve updating your privacy policy to inform users about this data processing.\n- **Data Retention:**\n  - Ban entries are cleaned up by the `shield:cleanBans` task after expiry.\n  - IP tracking entries are cleaned up by the `shield:cleanIpData` task based on the `ipTTL` setting.\n\n### Storage Security\n\n- **Filesystem Driver (`driver: 'fs'`):** If you use the filesystem driver for `unstorage` (e.g., `driver: 'fs'`, `base: '.shield'`), ensure that the storage directory (and the `logs` directory if logging is enabled via `log.path`) is:\n  - **Not web-accessible:** Your web server should not be configured to serve files from these directories.\n  - **Properly permissioned:** The directories should have appropriate server-side file permissions to prevent unauthorized reading or writing.\n- **Other Drivers (Redis, etc.):** If using database drivers like Redis, ensure your database server itself is secured (e.g., authentication, network access controls).\n\n### Error Message (`errorMessage`)\n\nThe `errorMessage` option in the module configuration is returned in the body of a 429 response.\n\n- It's recommended to use a plain text message.\n- If you choose to use HTML in your `errorMessage`, ensure your client-side application correctly sanitizes it or renders it in a way that prevents XSS vulnerabilities. The module itself does not sanitize this user-configured message.\n\n## Development\n\n```bash\n# Install dependencies\nyarn\n\n# Generate type stubs\nyarn dev:prepare\n\n# Develop with the playground\nyarn dev\n\n# Build the playground\nyarn dev:build\n\n# Run ESLint\nyarn lint\n\n# Run Vitest\nyarn test\nyarn test:watch\n\n# Release new version\nyarn release:patch\nyarn release:minor\n```\n\n<!-- Badges -->\n\n[npm-version-src]: https://img.shields.io/npm/v/nuxt-api-shield/latest.svg?style=flat&colorA=020420&colorB=00DC82\n[npm-version-href]: https://npmjs.com/package/nuxt-api-shield\n[npm-downloads-src]: https://img.shields.io/npm/dm/nuxt-api-shield.svg?style=flat&colorA=020420&colorB=00DC82\n[npm-downloads-href]: https://npmjs.com/package/nuxt-api-shield\n[license-src]: https://img.shields.io/npm/l/nuxt-api-shield.svg?style=flat&colorA=020420&colorB=00DC82\n[license-href]: https://npmjs.com/package/nuxt-api-shield\n[nuxt-src]: https://img.shields.io/badge/Nuxt-020420?logo=nuxt.js\n[nuxt-href]: https://nuxt.com\n","readmeFilename":"README.md"}