{"_id":"eslint-plugin-ejs-templates","_rev":"13-e46b224e67b1ec9788bde7fb71648c31","name":"eslint-plugin-ejs-templates","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"eslint-plugin-ejs-templates","version":"0.1.0","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.1.0","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/prettier-plugin-templates#readme","bugs":{"url":"https://github.com/mshima/prettier-plugin-templates/issues"},"dist":{"shasum":"f0189f69c2fd7b7840036d1f1e6e057e71e4f5b2","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.1.0.tgz","fileCount":6,"integrity":"sha512-CMTRu1kfrNgSVsQZaAnH7vN/H49xU/Z9dOJ+uZnFKw/5DbnDdvgZKKIrzMW9v2u9AQ+R62+8EnIx7UMc0zrkqA==","signatures":[{"sig":"MEYCIQCcY+SKnp703JT7ktQ7gUMQZ5UQYh5saC+PyHVV+jI4CQIhAK8BHIW9+ZtaioWZkBVDeBEffWFuSKgQf9sVsANJRzLP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108332},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"759aa25eb65114e7b4a4d9381f9fd121449389ea","scripts":{"dev":"tsup --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsup","pretest":"prettier . --check && eslint .","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"mshima","email":"marceloshima@gmail.com"},"repository":{"url":"git+https://github.com/mshima/prettier-plugin-templates.git","type":"git"},"_npmVersion":"11.11.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"22.22.0","dependencies":{"web-tree-sitter":"^0.26.7","tree-sitter-embedded-template":"^0.25.0"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","tsup":"^8.0.0","eslint":"^10.0.0","vitest":"^3.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/node":"^24.0.0","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0","prettier-plugin-packagejson":"^3.0.2"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.1.0_1774102461128_0.6150760631602592","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"eslint-plugin-ejs-templates","version":"0.2.0","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.2.0","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"022231a72ddac7b7d066ab7ec468f782adc575f5","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.2.0.tgz","fileCount":6,"integrity":"sha512-iAuWhllWX3qFNjgHn2MGnUJ+HibiLZYWfag9w81d+NF/pkM8fXha1LtvSvGKApyzHmiZLbwZcW6AAhlqLibsrA==","signatures":[{"sig":"MEYCIQCcqf7JT0LF0xYSqhiBWjU2JVNpaN/DIiGeuZFPFavAlQIhAOhORO59VxZD6/Yez1V5cR3wZz7tPcfgn2G/bU/lxFxA","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":108585},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"c520e05907e33dc2dec0d219f8fa159ad4fa2657","scripts":{"dev":"tsup --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsup","pretest":"prettier . --check && eslint .","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.9.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.0","dependencies":{"web-tree-sitter":"^0.26.7","tree-sitter-embedded-template":"^0.25.0"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","tsup":"^8.0.0","eslint":"^10.0.0","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/node":"^24.0.0","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0","prettier-plugin-packagejson":"^3.0.2"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.2.0_1774113060243_0.03584520989022488","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"eslint-plugin-ejs-templates","version":"0.2.1","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.2.1","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"eb8bcb1fe2d34e4caaaa6ec79d56933e3a50f780","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.2.1.tgz","fileCount":6,"integrity":"sha512-6bZW0S5mFCl7lJpsety1KganW6vs/T0kxRIPFr6A88STMiRg8avD+T7VfjrtVVW95Ac2eIJ3/D5/4PZWQeERXw==","signatures":[{"sig":"MEUCIElJhbiuC6nub3F/YKoiL5x7SAgnYIJFqlvJ+TuymTR9AiEAtmhHQ4xWASAgA/aWEX6B3ENspqA/NRL7jxN6WFHy1k4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":113757},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"8482fe5e7f902f61fb7d252e4ff572f90f410948","scripts":{"dev":"tsup --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsup","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.9.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.7","tree-sitter-embedded-template":"^0.25.0"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","tsup":"^8.0.0","eslint":"^10.0.0","vitest":"^4.1.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/node":"^24.0.0","@types/debug":"^4.1.13","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0","prettier-plugin-packagejson":"^3.0.2"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.2.1_1774140683380_0.8840919609980253","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"eslint-plugin-ejs-templates","version":"0.3.0","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.3.0","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"44754620d9b6fbc173e9ba2c0415295d75e17248","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.3.0.tgz","fileCount":8,"integrity":"sha512-G8K3vFjqCLoAcdCIDa3o9+0BJvjuqSG8DB7tg03xdEgyqpB8ZaZbOBnHryBlDyb9p49gufs5szqfDoQI0IQfeA==","signatures":[{"sig":"MEUCIHttnFUq+FzMEg28Y2za6rK/VFFa8qLMFZtLPFO6jLZyAiEA3dTyItrfe9ziMpfxcJKWrG0VsDdqaIhhHUSwWnR3prw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":602113},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"930e408614e9e722c42414daf244c62755ea048c","scripts":{"dev":"tsup --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsup","prepare":"npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm dist/tree-sitter-embedded_template.wasm && cpy node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm dist/tree-sitter-javascript.wasm","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.9.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.0","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.7"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","tsup":"^8.0.0","eslint":"^10.0.0","vitest":"^4.1.0","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^5.0.0","@types/node":"^24.0.0","@types/debug":"^4.1.13","typescript-eslint":"^8.0.0","eslint-config-prettier":"^10.0.0","tree-sitter-javascript":"0.25.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.3.0_1774435146506_0.2551710852462443","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"eslint-plugin-ejs-templates","version":"0.4.0","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.0","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"8b947a557f1944c6c7eaea93f4429e5eb4e5201a","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.0.tgz","fileCount":89,"integrity":"sha512-fNLJBixeihRpN2xbwiWQ8KlUgXdIDEBVFqId0CvuhZD+sDsoFK0QljyOTRRBADxSVAP96iH4mALhrYmxiHMfXQ==","signatures":[{"sig":"MEYCIQDyfQnlvaVaP52LYbU17XQWYqhrd/i9CDQvCX3jX8tlxgIhAPTAJXpMRHxKnQbpA0RNQDC5ipGDiB4USDB6mt5v0O8r","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":707844},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"1ebedd7d856edd4fd4d022ec871a0302fcd41cac","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.11.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.0_1776290590839_0.4162495989477444","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"eslint-plugin-ejs-templates","version":"0.4.1","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.1","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"fb1abdc85d29f618db65d4dff687a298c7d4e96f","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.1.tgz","fileCount":90,"integrity":"sha512-uUeWGoY+7bpXjUPv13k8pARpDf5LV6tjS5mDo/UVRLOpVu9qs4kzbPBTr9G2gCODK6tUErhPVCuw82jqPCbmRA==","signatures":[{"sig":"MEQCIEPd0fzuyAbdMqhyBKxshV6RhlKnAmbw5cgi4xw+/gGmAiBgoXCdEAzlJrgZVR39Wy6rQVzvbIRqHVZSi5ruyjb/lA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":745330},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"39b2a96cb43ad38cb9b32775fadba53c48b57335","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.11.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.1_1776307102023_0.07694415068038474","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"eslint-plugin-ejs-templates","version":"0.4.2","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.2","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"5973a6a8d3a37a3b2b192cf27ed9f3e323081379","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.2.tgz","fileCount":90,"integrity":"sha512-7lzEaQjfYtLYcdNIVTNjll2RussEG7GEyGBA8qsfIymsEzORGwURlVM0rInf20bFhEU3Sbm4Sshr/yySDCM+dA==","signatures":[{"sig":"MEUCIC0LeQUCWv4tAAxXesKhBb+R78sJq+r0bQoyX1TQy/TXAiEAsXlUGiVrUrLwcJ9eyyFHtFZZMAoEWY4Z1xHOwLJEDM0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":746408},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"45f53264c02168e050af4a836ac240ee262d1f73","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.11.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.2_1776351967806_0.1463044733835277","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"eslint-plugin-ejs-templates","version":"0.4.3","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.3","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"cb70b0f2f8c4c39d8d47dee15603bacee816bd91","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.3.tgz","fileCount":90,"integrity":"sha512-6i9izk9pbJJts/Rzh/R9DSWxQKAdDtcNVOCVBLmXPXEGfSxhCQi3hUpsdR80qyD55UXdQbPCVCc2L0WG8rrMtA==","signatures":[{"sig":"MEUCIQD6TWmO4tJNpE/h3mL2LnE6wS8gxXx4bCotm2oPmwDMngIgYEFDzcuD6x/0cpMCIXK24jyfyM8Jfntw1MVGL1Z8E4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":748564},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"bfef2e7bc639b96ba0c3e6d39ba4978e00c35dcd","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:15df52bf-6525-4439-92b0-71d4372d0765"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.11.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.14.1","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.3_1776397631950_0.0700323806217924","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"eslint-plugin-ejs-templates","version":"0.4.4","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.4","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"0e8cfc93b7c300221b8d996b63d341b94b4253a3","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.4.tgz","fileCount":94,"integrity":"sha512-oPcrAa3kGcPJcD1Xu1wZ00yV89hMwWPVVlPHCa6bWxqqGuTTB0lU8jMd5xkfnsPyRq57o9AlHoHpYDLcf0c+ZA==","signatures":[{"sig":"MEYCIQD4ByS3O84Yj2F7d0aRkyZ7mquRc0dRw+L2zrLBpvbI0wIhALXOKV4MSVOKE7q+Q3P5JVI5H773BB7dJJXnvNDLFK48","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":760545},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"7c38701333aa63052a583dad0a6fb1b0a7363a1b","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"husky && npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5129ba45-7c6a-4aa7-949e-2f5bb16cb30d"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.12.1","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.15.0","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","husky":"^9.1.7","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@commitlint/cli":"^21.0.1","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0","@commitlint/config-conventional":"^21.0.1"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.4_1779737519924_0.2961801484035349","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"eslint-plugin-ejs-templates","version":"0.4.5","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.5","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"e2321eef6fd7375772582b7e7ee33eaeb42730aa","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.5.tgz","fileCount":94,"integrity":"sha512-L3cDOMY+ZnyxZM2XARYqP5U7zXRLq7Xe1dc09ivJYK3OJR1CCKu+XqCcSKPHHa74/iDNwzqFylvGDinBjFsxyw==","signatures":[{"sig":"MEYCIQDOFbfgSWfWd9Mg60Bu+iIcYgkE6qS7aQcsMre5dlWa1gIhAKlYkoXmOFU/zZVovDROeZjTP8vbGeIEq7/PHAj7htbV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":764182},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"29bbe778232012153a681c5036af785d6f34df14","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"husky && npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5129ba45-7c6a-4aa7-949e-2f5bb16cb30d"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.12.1","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.15.0","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","husky":"^9.1.7","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@commitlint/cli":"^21.0.1","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0","@commitlint/config-conventional":"^21.0.1"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.5_1779832854054_0.7206062400525539","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"eslint-plugin-ejs-templates","version":"0.4.6","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.6","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"3fb787f380f2fb8c161bd453dd009e8878929079","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.6.tgz","fileCount":94,"integrity":"sha512-JrG5nk2h7vLokhlE0m5Xi7Hn+nNMGzRI6Pvi7Ujez7i2MA5myVeGqogwRjALEJ/aV/+Ce8x2/K4l+JOl7VoTVA==","signatures":[{"sig":"MEQCIDVw+1pEmnWx9GlQNH4Fv/5qBR6L1l0swW5biuAUzf0WAiBDODBZSQs4jupdoOt3KwOSx0x5RDdTigCyjKXZCaFnAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":764446},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"59f0e7d18fd27ec286905e7d752fdb1d2f18705e","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"husky && npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5129ba45-7c6a-4aa7-949e-2f5bb16cb30d"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.13.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.16.0","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","husky":"^9.1.7","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@commitlint/cli":"^21.0.1","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0","@commitlint/config-conventional":"^21.0.1"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.6_1779901345559_0.04562548393647692","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"eslint-plugin-ejs-templates","version":"0.4.7","keywords":["eslint","eslint-plugin","ejs","template","processor"],"author":"","license":"Apache-2.0","_id":"eslint-plugin-ejs-templates@0.4.7","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"dist":{"shasum":"aa0deae9f0c392ee1adcf2e712fd07b6b2e3b4b8","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.4.7.tgz","fileCount":94,"integrity":"sha512-VxhJehXN65BFLHlIAdvQEfGrISDd7o1g3XZNcjzerAHz84cGYT9kM9NPRScCCfnFeI3dU8Yak6f7VZ4c8gmAMA==","signatures":[{"sig":"MEUCIQDereXK+QoSi/aoATGJu2ab0Hi9TWGLxmd2xYFWGFJxBgIgTbMcjTPTHNKiTa4X+O62Gz49g8AreolQpiPwemVNhY8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.4.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":768482},"type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"41b61bf04be681e1deff097949a9992ba56b78ff","scripts":{"dev":"tsc --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","test":"vitest run","build":"tsc","prepare":"husky && npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","pretest":"prettier . --check && eslint .","posttest":"npm run typecheck","typecheck":"tsc -p tsconfig.spec.json --noEmit","prepublishOnly":"npm run prepare"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5129ba45-7c6a-4aa7-949e-2f5bb16cb30d"}},"repository":{"url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git","type":"git"},"_npmVersion":"11.13.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","directories":{},"_nodeVersion":"24.16.0","dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.8"},"_hasShrinkwrap":false,"devDependencies":{"jiti":"^2.6.1","husky":"^9.1.7","eslint":"^10.1.0","vitest":"^4.1.2","cpy-cli":"^7.0.0","prettier":"^3.8.1","@eslint/js":"^10.0.1","typescript":"^6.0.2","@types/node":"^25.5.0","@types/debug":"^4.1.13","@commitlint/cli":"^21.0.1","@types/emscripten":"^1.41.5","typescript-eslint":"^8.58.0","eslint-config-prettier":"^10.1.8","tree-sitter-javascript":"0.25.0","@stylistic/eslint-plugin":"^5.10.0","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0","@commitlint/config-conventional":"^21.0.1"},"peerDependencies":{"eslint":">=9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-ejs-templates_0.4.7_1782158732702_0.8145579819842237","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"eslint-plugin-ejs-templates","version":"0.5.0","description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","keywords":["eslint","eslint-plugin","ejs","template","processor"],"homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"repository":{"type":"git","url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git"},"license":"Apache-2.0","author":"","type":"module","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"types":"dist/index.d.ts","scripts":{"build":"tsc -p tsconfig.build.json","dev":"tsc -p tsconfig.build.json --watch","fix":"prettier . --write && eslint . --fix","lint":"eslint .","prepare":"husky && npm run build && cpy node_modules/tree-sitter-embedded-template/tree-sitter-embedded_template.wasm node_modules/tree-sitter-javascript/tree-sitter-javascript.wasm wasm --flat","prepublishOnly":"npm run prepare","pretest":"prettier . --check && eslint .","test":"vitest run","posttest":"npm run typecheck","typecheck":"tsc --noEmit"},"dependencies":{"debug":"^4.4.3","web-tree-sitter":"^0.26.13"},"devDependencies":{"@commitlint/cli":"^21.2.2","@commitlint/config-conventional":"^21.2.2","@eslint/js":"^10.0.1","@stylistic/eslint-plugin":"^5.10.0","@types/debug":"^4.1.13","@types/emscripten":"^1.41.5","@types/node":"^26.4.0","cpy-cli":"^7.0.0","eslint":"^10.9.1","eslint-config-prettier":"^10.1.8","husky":"^9.1.7","jiti":"^2.7.0","prettier":"^3.9.6","prettier-plugin-packagejson":"^3.0.2","tree-sitter-embedded-template":"0.25.0","tree-sitter-javascript":"0.25.0","typescript":"^6.0.2","typescript-eslint":"^8.68.0","vitest":"^4.1.11"},"peerDependencies":{"eslint":">=9.0.0"},"gitHead":"2131f0d9c847dad84e0bbf5862914bceb9c5ccae","_id":"eslint-plugin-ejs-templates@0.5.0","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-PwluBIV2KVhB0g3OVG3tCNgEQMfojg4aa3pl3MR885v/gYgHzi8T0KoIio9sb8nycoOcOChe8ECJHWV15x5VoA==","shasum":"d49eac5804e2f2f5bc9a499f797ddd092600cabe","tarball":"https://registry.npmjs.org/eslint-plugin-ejs-templates/-/eslint-plugin-ejs-templates-0.5.0.tgz","fileCount":94,"unpackedSize":828996,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/eslint-plugin-ejs-templates@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDEtmmPjATlb7gv7ei8OI49Z08gR9uF+Wj5kmHqLnaQBAIhAKh7M8FZgjZjNwkNKe4mh5TPvsKhedM9XyLKnbJiEk0A"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:5129ba45-7c6a-4aa7-949e-2f5bb16cb30d"}},"directories":{},"maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin-ejs-templates_0.5.0_1787969471158_0.7669093679964392"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-21T14:14:21.127Z","modified":"2026-08-29T02:11:11.985Z","0.1.0":"2026-03-21T14:14:21.270Z","0.2.0":"2026-03-21T17:11:00.392Z","0.2.1":"2026-03-22T00:51:23.517Z","0.3.0":"2026-03-25T10:39:06.632Z","0.4.0":"2026-04-15T22:03:11.023Z","0.4.1":"2026-04-16T02:38:22.194Z","0.4.2":"2026-04-16T15:06:07.953Z","0.4.3":"2026-04-17T03:47:12.091Z","0.4.4":"2026-05-25T19:32:00.092Z","0.4.5":"2026-05-26T22:00:54.223Z","0.4.6":"2026-05-27T17:02:25.761Z","0.4.7":"2026-06-22T20:05:32.856Z","0.5.0":"2026-08-29T02:11:11.603Z"},"bugs":{"url":"https://github.com/mshima/eslint-plugin-ejs-templates/issues"},"license":"Apache-2.0","homepage":"https://github.com/mshima/eslint-plugin-ejs-templates#readme","keywords":["eslint","eslint-plugin","ejs","template","processor"],"repository":{"type":"git","url":"git+https://github.com/mshima/eslint-plugin-ejs-templates.git"},"description":"ESLint plugin for EJS (Embedded JavaScript) templates — processor and rules","maintainers":[{"name":"mshima","email":"marceloshima@gmail.com"}],"readme":"# eslint-plugin-ejs-templates\n\nAn [ESLint](https://eslint.org/) plugin for [EJS](https://ejs.co/) (Embedded JavaScript) templates.\n\nEJS files are parsed by [tree-sitter-embedded-template](https://github.com/tree-sitter/tree-sitter-embedded-template) via [web-tree-sitter](https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web), which provides accurate position information for all lint messages and autofixes.\n\n## Features\n\n- **EJS processor** – extracts each EJS tag into its own virtual JS block so standard ESLint rules can inspect the embedded JavaScript\n- **Autofix support** – most rules support autofix; run `eslint --fix` to apply fixes (`no-global-function-call` and `no-function-block` have no autofix)\n- **Autofix for built-in [`no-negated-condition`](#autofix-for-the-built-in-no-negated-condition-rule)** – supplies the fix ESLint itself cannot produce for EJS `if`/`else` tag pairs\n- [`ejs-templates/no-comment-empty-line`](#ejs-templatesno-comment-empty-line) – flags comment tags that leave an empty line (missing `-%>` close)\n- [`ejs-templates/no-complex-statements`](#ejs-templatesno-complex-statements) – disallows complex statements (try, while, switch, etc.) in templates to keep them simple\n- [`ejs-templates/no-function-block`](#ejs-templatesno-function-block) – disallows function/arrow statement blocks in templates to keep logic simple\n- [`ejs-templates/no-global-function-call`](#ejs-templatesno-global-function-call) – disallows direct function calls in EJS tags (with `include()` allowed by default)\n- [`ejs-templates/no-multiline-output`](#ejs-templatesno-multiline-output) – flags (and auto-fixes) output tags whose conditional renders multiple lines\n- [`ejs-templates/output-semi`](#ejs-templatesoutput-semi) – enforces semicolon style for output tags (`<%= %>`, `<%- %>`) (default: `never`)\n- [`ejs-templates/prefer-encoded`](#ejs-templatespreferencoded) – flags `<%- … %>` and suggests `<%= … %>` (`always`, default), or flags `<%= … %>` and suggests `<%- … %>` (`never`)\n- [`ejs-templates/prefer-output`](#ejs-templatesprefer-output) – suggests (and auto-fixes) simple if-wrappers into output ternaries\n- [`ejs-templates/prefer-single-line-tags`](#ejs-templatesprefer-single-line-tags) – collapses multiline EJS tags to single-line tags\n- [`ejs-templates/prefer-slurping-codeonly`](#ejs-templatespreferslurpingcodeonly) – flags `<% … %>` code tags that can be safely converted to `<%_ … _%>`\n- [`ejs-templates/experimental-prefer-slurp-multiline`](#ejs-templatesexperimental-prefer-slurp-multiline) – converts multiline `<% … %>` to `<%_ … _%>`\n- [`ejs-templates/format`](#ejs-templatesformat) – normalizes spacing inside tags and multiline closing delimiter layout\n- [`ejs-templates/indent`](#ejs-templatesindent) – enforces brace-depth–based indentation on standalone `<%_ … _%>` tags\n- [`ejs-templates/slurp-newline`](#ejs-templatesslurp-newline) – ensures `<%_ … _%>` tags are on their own line\n\n## Installation\n\n```sh\nnpm install --save-dev eslint eslint-plugin-ejs-templates\n```\n\n## Usage\n\nAdd the plugin to your ESLint flat config (`eslint.config.js`):\n\n```js\nimport { defineConfig } from 'eslint/config';\nimport templates from 'eslint-plugin-ejs-templates';\nimport eslint from '@eslint/js';\n\nexport default defineConfig([\n  // Standard JS rules:\n  eslint.configs.recommended,\n\n  // Apply the EJS processor to all *.ejs files with no rules (opt-in below):\n  ...templates.configs.base,\n\n  {\n    files: ['**/*.ejs'],\n    rules: {\n      // No specific ordering requirement:\n      'ejs-templates/no-comment-empty-line': 'error',\n      'ejs-templates/no-function-block': 'error',\n      'ejs-templates/no-global-function-call': 'error',\n      'ejs-templates/output-semi': ['error', 'never'],\n      'ejs-templates/prefer-output': 'error',\n      'ejs-templates/prefer-encoded': 'error', // 'always' (default) or 'never'\n      // Apply remaining rules in this order:\n      'ejs-templates/experimental-prefer-slurp-multiline': 'error',\n      'ejs-templates/prefer-slurping-codeonly': 'error',\n      'ejs-templates/prefer-single-line-tags': 'error',\n      'ejs-templates/slurp-newline': 'error',\n      'ejs-templates/indent': 'error',\n      'ejs-templates/format': 'error',\n    },\n  },\n]);\n```\n\nOr use the `customize` helper to enable all rules with a single call and convenient options:\n\n```js\nimport { defineConfig } from 'eslint/config';\nimport ejs from 'eslint-plugin-ejs-templates';\n\nexport default defineConfig([\n  ...ejs.configs.customize({\n    // allowedGlobals: ['include'],   // extra global functions to allow (default: [])\n    // experimental: true,            // enable experimental rules (default: false)\n    // html: 'extension',             // 'always' | 'never' | 'extension' (default)\n    // stylisticBlocklist: false,     // disable conflicting @stylistic rules (default: false)\n    // prettierBlocklist: false,      // disable prettier/prettier rule (default: false)\n  }),\n]);\n```\n\n`customize` also accepts additional ESLint `Config` entries (spread after the options object)\nthat will be scoped to `**/*.ejs` files:\n\n```js\nexport default defineConfig([\n  ...ejs.configs.customize(\n    { allowedGlobals: ['include'] },\n    { rules: { 'no-var': 'error' } },\n    js.configs.recommended,\n    stylistic.configs.customize({\n      jsx: false,\n      semi: true, // This plugin is optimized for 'semi: true' configuration.\n    }),\n  ),\n]);\n```\n\n#### Options\n\n| Option               | Type                                 | Default       | Description                                                                                                                                              |\n| -------------------- | ------------------------------------ | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `allowedGlobals`     | `string[]`                           | `[]`          | Extra global function names that `no-global-function-call` will not flag                                                                                 |\n| `experimental`       | `boolean`                            | `false`       | Enables experimental features                                                                                                                            |\n| `html`               | `'always' \\| 'never' \\| 'extension'` | `'extension'` | Controls the `prefer-encoded` option: `always` for all `.ejs` files, `never` for all `.ejs` files, or `always` for `*.html.ejs` and `never` for the rest |\n| `stylisticBlocklist` | `boolean`                            | `false`       | Turns off `@stylistic` rules that conflict with EJS formatting (for example `eol-last`, `indent`, `brace-style` and `multiline-ternary`)                 |\n| `prettierBlocklist`  | `boolean`                            | `false`       | Turns off the `prettier/prettier` rule when Prettier is also configured                                                                                  |\n\nThen run ESLint as usual:\n\n```sh\nnpx eslint \"**/*.ejs\"\n# or auto-fix violations:\nnpx eslint --fix \"**/*.ejs\"\n```\n\n> **Note on incompatible rules**\n>\n> The EJS processor lints each tag as a separate virtual JavaScript block.\n> `no-undef` diagnostics are suppressed internally for `*.ejs` virtual blocks,\n> so you do not need to disable `no-undef` in your ESLint config.\n\n> **Note on ESLint directives in EJS comments**\n>\n> You can use supported ESLint directive comments inside EJS comments:\n>\n> - `<%# eslint-disable no-var %>`\n> - `<%# eslint-enable no-var %>`\n> - `<%# eslint-disable-next-line no-var %>`\n>\n> Example:\n>\n> ```ejs\n> <%# eslint-disable-next-line no-var %>\n> <% var value = 1; %>\n> ```\n>\n> Regular EJS comments that are not ESLint directives continue to be ignored.\n\n## Rules\n\nThe following rules have no specific ordering requirement (they can appear in any position):\n\n- [`no-comment-empty-line`](#ejs-templatesno-comment-empty-line)\n- [`no-complex-statements`](#ejs-templatesno-complex-statements)\n- [`no-function-block`](#ejs-templatesno-function-block)\n- [`no-global-function-call`](#ejs-templatesno-global-function-call)\n- [`no-multiline-output`](#ejs-templatesno-multiline-output)\n- [`output-semi`](#ejs-templatesoutput-semi)\n\nApply [`prefer-output`](#ejs-templatesprefer-output) before [`prefer-encoded`](#ejs-templatespreferencoded).\n\nThe built-in `customize()` config already does this by enabling `prefer-output`\nin the base EJS rules and applying `prefer-encoded` in later config entries.\n\nApply the remaining rules in the following order for best results:\n\n1. [`experimental-prefer-slurp-multiline`](#ejs-templatesexperimental-prefer-slurp-multiline) — convert multiline `<% %>` to `<%_ %>` first\n2. [`prefer-slurping-codeonly`](#ejs-templatespreferslurpingcodeonly) — convert single-line `<% %>` to `<%_ %>`\n3. [`prefer-single-line-tags`](#ejs-templatesprefer-single-line-tags) — collapse remaining multiline tags\n4. [`slurp-newline`](#ejs-templatesslurp-newline) — ensure slurp tags are on their own line\n5. [`indent`](#ejs-templatesindent) — enforce brace-depth indentation\n6. [`format`](#ejs-templatesformat) — apply final whitespace/layout normalization\n\n### `ejs-templates/experimental-prefer-slurp-multiline`\n\nConverts multiline `<% … %>` tags to `<%_ … _%>`. Apply this rule **before**\n`prefer-single-line-tags` so that multiline `<% %>` tags get their delimiters changed\nbefore being collapsed.\n\n|             |                                                              |\n| ----------- | ------------------------------------------------------------ |\n| **Fixable** | Yes — `eslint --fix` changes `<%` to `<%_` and `%>` to `_%>` |\n\n```ejs\n<!-- ✗ violation -->\n<%\n  if (condition) {\n%>\n\n<!-- ✓ fixed -->\n<%_\n  if (condition) {\n_%>\n```\n\n### `ejs-templates/format`\n\nApplies final formatting normalization to EJS tags:\n\n- ensures a single space around trimmed content (`<% foo %>`)\n- controls multiline closing delimiter style\n\n|             |                                                       |\n| ----------- | ----------------------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` normalizes tag whitespace/layout |\n\nOptions:\n\n- `{ multilineClose: 'new-line' }` (default) — for originally multiline tags, move close delimiter to a new line aligned with opening tag indentation\n- `{ multilineClose: 'same-line' }` — keep close delimiter on the same line as content after formatting\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'ejs-templates/format': ['error', { multilineClose: 'new-line' }],\n  },\n}\n```\n\n```ejs\n<!-- input -->\n  <%_\n  doWork(); _%>\n\n<!-- with multilineClose: 'new-line' (default) -->\n  <%_ doWork();\n  _%>\n\n<!-- with multilineClose: 'same-line' -->\n  <%_ doWork(); _%>\n```\n\n### `ejs-templates/indent`\n\nEnforces brace-depth–based indentation (two spaces per level) on standalone\n`<%_ … _%>` tags.\n\nConsistent indentation improves readability of nested template logic.\n\n|             |                                                     |\n| ----------- | --------------------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` adjusts the leading whitespace |\n\n```ejs\n<!-- ✗ violation: wrong indentation -->\n<%_ if (show) { _%>\n<%_ doWork(); _%>\n<%_ } _%>\n\n<!-- ✓ fixed -->\n<%_ if (show) { _%>\n  <%_ doWork(); _%>\n<%_ } _%>\n```\n\n### `ejs-templates/no-comment-empty-line`\n\nRequires standalone EJS comment tags to use `-%>` (trim-newline close) to avoid\nleaving an empty line in the rendered output. A `<%# comment %>` tag that is on\nits own line emits a blank line; `<%# comment -%>` suppresses it.\n\n|             |                                            |\n| ----------- | ------------------------------------------ |\n| **Fixable** | Yes — `eslint --fix` changes `%>` to `-%>` |\n\n```ejs\n<!-- ✗ violation: leaves an empty line in output -->\n<%# This is a comment %>\n\n<!-- ✓ fixed: no empty line in output -->\n<%# This is a comment -%>\n```\n\n### `ejs-templates/no-complex-statements`\n\nDisallows complex statements in EJS tags that increase logic complexity and\nreduce maintainability. By default, forbidden statement types include:\n\n- `TryStatement` (try/catch)\n- `WhileStatement`, `DoWhileStatement` (while/do-while loops)\n- `SwitchStatement` (switch)\n- `FunctionDeclaration` (function declarations)\n- `ClassDeclaration` (class declarations)\n- `LabeledStatement` (labeled blocks)\n- `DebuggerStatement` (debugger)\n- `WithStatement` (with statements)\n\nThese statements encourage moving logic outside of templates. Use simpler\nconstructs like `if/else`, `for/for-of` loops, and array methods instead.\n\n|             |     |\n| ----------- | --- |\n| **Fixable** | No  |\n\n```ejs\n<!-- ✗ violation: try/catch statements -->\n<% try {\n  const result = JSON.parse(data);\n} catch (e) {\n  console.error(e);\n} %>\n\n<!-- ✓ better: handle errors in the controller, pass clean data to template -->\n<% const result = data; %>\n\n<!-- ✗ violation: while loop -->\n<% let i = 0;\nwhile (i < items.length) {\n  console.log(items[i]);\n  i++;\n} %>\n\n<!-- ✓ better: use for-of -->\n<% for (const item of items) {\n  console.log(item);\n} %>\n\n<!-- ✗ violation: switch statement -->\n<% switch (statusCode) {\n  case 200:\n    message = 'OK';\n    break;\n  case 404:\n    message = 'Not Found';\n    break;\n} %>\n\n<!-- ✓ better: use simple conditional or pass logic from controller -->\n<% const message = statusCode === 200 ? 'OK' : statusCode === 404 ? 'Not Found' : 'Unknown'; %>\n```\n\n**Options:**\n\n- `{ disallow: ['TryStatement', 'SwitchStatement'] }` — customize which statement types are forbidden\n- Each item can be a string (statement type) or an object `{ type: 'StatementType', message: 'Custom message' }`\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'ejs-templates/no-complex-statements': [\n      'error',\n      {\n        disallow: [\n          'TryStatement',\n          'SwitchStatement',\n          { type: 'WhileStatement', message: 'Use for-of loops instead of while loops' },\n          { type: 'FunctionDeclaration', message: 'Declare functions outside templates' },\n        ],\n      },\n    ],\n  },\n}\n```\n\n### `ejs-templates/no-function-block`\n\nDisallows function bodies that use `statement_block` (`{ ... }`) in templates,\nincluding:\n\n- function declarations\n- function expressions\n- arrow functions with block bodies\n\nReason: `statement_block` inside templates increases logic complexity and\nreduces readability/maintainability.\n\n|             |     |\n| ----------- | --- |\n| **Fixable** | No  |\n\n```ejs\n<!-- ✗ violation: arrow function with block body -->\n<% foos.filter(foo => { return foo.ok; }); %>\n\n<!-- ✓ allowed: concise arrow expression -->\n<% foos.filter(foo => foo.ok); %>\n\n<!-- ✓ allowed: concise arrow expression -->\n<% foos.map(foo => foo.name); %>\n```\n\nAlternatives when logic grows:\n\n- Prefer concise arrow expressions (`foo => foo.ok`) when possible.\n- Pass the function through template data/context and call it as a method.\n- Prefer `for...of` loops over `forEach` callback blocks for control flow.\n- Split complex template parts into partials and use `include`.\n\n### `ejs-templates/no-global-function-call`\n\nDisallows direct function calls in EJS tags (`foo()`), while allowing\n`include()` by default. Method calls (`obj.foo()`) are ignored.\n\nIf a function is passed through the template context, call it as a method such\nas `locals.method()`. This rule allows that form because it only blocks direct\ncalls like `method()`.\n\n|             |                                             |\n| ----------- | ------------------------------------------- |\n| **Fixable** | No                                          |\n| **Default** | `include` is allowed (`allow: ['include']`) |\n\n```ejs\n<!-- ✗ violation -->\n<% doWork(); %>\n\n<!-- ✓ allowed by default -->\n<% include('partial.ejs'); %>\n\n<!-- ✓ not checked by this rule (method call) -->\n<% locals.save(); %>\n```\n\nOptions:\n\n- `{ allow: ['name1', 'name2'] }` — adds direct function names to the allowlist\n\n### Autofix for the built-in `no-negated-condition` rule\n\nESLint's own [`no-negated-condition`] rule already reports negated `if`/`else`\nconditions inside EJS templates: the virtual JavaScript this plugin builds keeps\nthe `if`/`else` structure intact, so the rule sees it and reports it at the right\nposition. What ESLint cannot do is fix it — the branch bodies are template markup\nliving between tags, outside the JavaScript the rule has access to.\n\nThis plugin supplies that missing fix. There is no `ejs-templates` rule to enable:\nturn on the built-in rule and `eslint --fix` will apply the swap.\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'no-negated-condition': 'error',\n  },\n}\n```\n\n```ejs\n<!-- ✗ violation -->\n<% if (!user.active) { %>\n  <span>Inactive</span>\n<% } else { %>\n  <span>Active</span>\n<% } %>\n\n<!-- ✓ fixed -->\n<% if (user.active) { %>\n  <span>Active</span>\n<% } else { %>\n  <span>Inactive</span>\n<% } %>\n```\n\nNegated tests are recognised as `!cond`, `!(a && b)`, `a !== b` and `a != b`; the\ncomparison operators are inverted (`!==` becomes `===`) rather than wrapped in a\nfurther negation. Branch bodies are moved verbatim, so markup, indentation and\ndelimiter style — including `<%_ … _%>` — are preserved, and bodies may contain\nany number of nested tags.\n\nThe same fix covers the ternary form the built-in rule reports, inside an output\ntag:\n\n```ejs\n<!-- ✗ violation -->\n<%= !cond ? a : b %>\n<%= a !== b ? x : y %>\n\n<!-- ✓ fixed -->\n<%= cond ? b : a %>\n<%= a === b ? y : x %>\n```\n\nNothing is fixed where the built-in rule does not report: an `if` without an\n`else` (there is no branch to swap with), or an `else if` chain (swapping would\nnot preserve the chain). A ternary in a code tag is reported but not fixed, since\nit produces no output to swap.\n\n[`no-negated-condition`]: https://eslint.org/docs/latest/rules/no-negated-condition\n\n### `ejs-templates/no-multiline-output`\n\nFlags output tags whose conditional renders multiple lines, and auto-fixes them\ninto a conditional block. Escaping markup into a string hides the template's\nstructure: the output cannot be seen, indented, or edited as markup.\n\n```ejs\n<!-- ✗ violation -->\n<%- condition ? 'first\\nsecond' : '' %>\n\n<!-- ✓ fixed -->\n<% if (condition) { %>first\nsecond<% } %>\n```\n\nThe branch text is written flush against plain `<% %>` tags. Slurp tags would\nswallow the whitespace and newlines around them, so the block would render\ndifferently from the output tag it replaced; plain tags emit nothing themselves\nand consume nothing around them, so the rendered output is unchanged — including\nfor an indented or inline tag, whose surrounding text is preserved exactly.\n\nA non-empty alternate branch becomes an `else`:\n\n```ejs\n<!-- ✗ violation -->\n<%- condition ? 'aaa\\nbbb' : 'ccc\\nddd' %>\n\n<!-- ✓ fixed -->\n<% if (condition) { %>aaa\nbbb<% } else { %>ccc\nddd<% } %>\n```\n\nThis is the counterpart to [`prefer-output`](#ejs-templatesprefer-output), which\ncollapses the opposite case. The two never apply to the same tag: `prefer-output`\nonly produces single-line ternaries, and this rule only reports multiline ones.\n\nOnly ternaries whose branches are plain string literals are reported — a template\nliteral can interpolate, so its rendered text is not known statically.\n\nOne case is **reported but deliberately not fixed**: a `<%=` tag whose text\ncontains `&`, `<`, `>`, `\"` or `'`. `<%=` escapes its value, while the template\ntext the fix produces is emitted raw, so no rewrite preserves the output. A `<%-`\ntag has no such limit.\n\nThis rule is enabled by default by `customize()`. To turn it off, set it in a\nconfig entry of your own — `customize()` leaves any `ejs-templates` rule you\nconfigure yourself untouched:\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'ejs-templates/no-multiline-output': 'off',\n  },\n}\n```\n\n### `ejs-templates/no-output-negated-condition`\n\nRemoved, along with its later name `ejs-templates/no-output-negated-ternary`.\nNegated output ternaries are reported by ESLint's built-in `no-negated-condition`\nrule, and this plugin supplies the autofix — see\n[Autofix for the built-in `no-negated-condition` rule](#autofix-for-the-built-in-no-negated-condition-rule).\n\nReplace either rule name with the built-in one:\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'no-negated-condition': 'error',\n  },\n}\n```\n\n### `ejs-templates/output-semi`\n\nEnforces semicolon style at the end of single-line output tag content in\n`<%= ... %>` and `<%- ... %>`.\n\nThis rule is independent from the ordered formatting pipeline\n(`experimental-prefer-slurp-multiline` → `format`) and does not affect the\nbehavior of the other plugin rules.\n\n|             |                                                      |\n| ----------- | ---------------------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` adds/removes trailing semicolon |\n| **Default** | `never`                                              |\n\nOptions:\n\n- `'never'` (default) — disallow trailing semicolon\n- `'always'` — require trailing semicolon\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'ejs-templates/output-semi': ['error', 'never'],\n  },\n}\n```\n\n```ejs\n<!-- with 'never' (default) -->\n<%= value; %>\n<!-- fixed -->\n<%= value %>\n\n<!-- with 'always' -->\n<%= value %>\n<!-- fixed -->\n<%= value; %>\n```\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    'ejs-templates/no-global-function-call': ['error', { allow: ['include'] }],\n  },\n}\n```\n\nSecurity implications:\n\n- Allowing dangerous direct calls (for example `exec()`) inside templates can\n  lead to command execution risks if arguments are user-controlled.\n- Prefer keeping the allowlist minimal and avoid granting process-execution\n  primitives to template code.\n- If your project must allow such calls, validate/sanitize all inputs and\n  isolate execution contexts.\n\n### `ejs-templates/prefer-encoded`\n\nEnforces a consistent output-tag style across the template.\n\n- `'always'` (default): prefer `<%=` (HTML-encoded) over `<%-` (raw).\n  Flags every `<%- … %>` tag. Use this when templates render HTML and you want XSS-safe defaults.\n- `'never'`: prefer `<%-` (raw / unescaped) over `<%=` (HTML-encoded).\n  Flags every `<%= … %>` tag. Use this when output is already trusted or escaped by other means.\n\n|             |                                                                           |\n| ----------- | ------------------------------------------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` converts between `<%-` and `<%=` based on the option |\n\n```js\n// eslint.config.js\n{\n  files: ['**/*.ejs'],\n  rules: {\n    // 'always' (default) — prefer HTML-encoded output:\n    'ejs-templates/prefer-encoded': 'error',\n    // 'never' — prefer raw output:\n    'ejs-templates/prefer-encoded': ['error', 'never'],\n  },\n}\n```\n\n```ejs\n<!-- with 'always' (default) -->\n<%- value %>\n<!-- fixed -->\n<%= value %>\n\n<!-- with 'never' -->\n<%= value %>\n<!-- fixed -->\n<%- value %>\n```\n\n### `ejs-templates/prefer-output`\n\nSuggests replacing simple output-wrapper conditionals with a ternary output tag.\nThe rule applies only when the full wrapper (opening tag, content, and closing/else tags)\nis on a single line.\n\nPrimary target pattern:\n\n- `<% if (condition) { %>content<% } %>`\n- `<% if (condition) { %>A<% } else { %>B<% } %>`\n\nAuto-fixed form:\n\n- `<%= condition ? 'content' : '' %>`\n- `<%= condition ? 'A' : 'B' %>`\n\n|             |                                                               |\n| ----------- | ------------------------------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` for simple single-line wrapper patterns  |\n| **Notes**   | Conservative fix: skips nested EJS content inside the wrapper |\n\n```ejs\n<!-- ✗ violation -->\n<% if (showTitle) { %>Title<% } %>\n\n<!-- ✓ fixed -->\n<%= showTitle ? 'Title' : '' %>\n\n<!-- ✗ violation (if/else wrapper) -->\n<% if (showTitle) { %>Title<% } else { %>Untitled<% } %>\n\n<!-- ✓ fixed -->\n<%= showTitle ? 'Title' : 'Untitled' %>\n```\n\n```ejs\n<!-- still reported, but not auto-fixed (inline empty if) -->\n<% if (showTitle) { } %>\n\n<!-- not applied (multiline wrapper) -->\n<% if (showTitle) { %>\nTitle\n<% } %>\n```\n\n### `ejs-templates/prefer-single-line-tags`\n\nFlags multiline tags when either:\n\n- their content has structural braces, or\n- their content becomes a single line after trimming.\n\nIt also flags a **single-line** tag that closes more than one block, such as\n`<%_ } } _%>`:\n\n```ejs\n<!-- ✗ violation -->\n<%_ } } _%>\n\n<!-- ✓ fixed -->\n<%_ } _%>\n<%_ } _%>\n```\n\nA tag closing two blocks at once cannot sit at a single indent depth, so\n[`indent`](#ejs-templatesindent) has no correct answer for it and a reader has to\ncount braces to follow the nesting. A tag that closes one block and opens another\n(`<%_ } else { _%>`) is an ordinary continuation and is left alone.\n\nFor structural-brace cases, autofix keeps brace boundaries (`{` and `}`) as\nseparate tags and keeps the content between them in a single tag.\n\nA tag on its own line becomes one tag per line, and the generated tags close with\n`_%>` and open with `<%_` so the line break between them is slurped away.\n\nAn **inline** tag — one with template text either side of it — instead becomes\nadjacent tags on the same line. The opening delimiter the author wrote stays on\nthe first tag only, since repeating `<%_` would ask for the whitespace before the\ntag to be slurped once per generated tag; later tags open with whatever pairs with\nthe closing delimiter:\n\n```ejs\n<% } } %>      becomes    <% } %><% } %>\n<% } } _%>     becomes    <% } _%><%_ } _%>\n<%_ } } %>     becomes    <%_ } %><% } %>\n<%_ } } _%>    becomes    <%_ } _%><%_ } _%>\n```\n\nEither way the rendered output is unchanged.\n\nKeeping tags single-line avoids visual confusion between template output text\nand EJS control flow, making template intent easier to scan.\n\n|             |                                        |\n| ----------- | -------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` collapses the tag |\n\n```ejs\n<!-- ✗ violation: single phrase split across lines -->\n<%_\nif (generateSpringAuditor) {\n_%>\n\n<!-- ✓ fixed -->\n<%_ if (generateSpringAuditor) { _%>\n```\n\n```ejs\n<!-- ✗ violation: multiline content that trims to one line -->\n<%_\n  code;\n_%>\n\n<!-- ✓ fixed -->\n<%_ code; _%>\n```\n\n```ejs\n<!-- ✗ violation: block with body and close -->\n<%_\n  if (x) {\n  doWork();\n  }\n_%>\n\n<!-- ✓ fixed: one tag per boundary -->\n<%_ if (x) { _%>\n<%_ doWork(); _%>\n<%_ } _%>\n```\n\n### `ejs-templates/prefer-slurping-codeonly`\n\nPrefers `<%_ … _%>` (whitespace-slurping) over `<% … %>` for single-line code\ntags that are logic-only (no direct output), whose content has balanced braces,\nand does not open or close a brace block.\n\nUse this for code-only control logic; blocks that generate output should keep\ntheir output-specific delimiters.\n\n|             |                                                        |\n| ----------- | ------------------------------------------------------ |\n| **Fixable** | Yes — `eslint --fix` converts `<% … %>` to `<%_ … _%>` |\n\n```ejs\n<!-- ✗ violation -->\n<% const cssClass = active ? 'active' : ''; %>\n\n<!-- ✓ fixed -->\n<%_ const cssClass = active ? 'active' : ''; _%>\n```\n\nTags that open or close brace depth are left unchanged:\n\n```ejs\n<% if (condition) { %>  ← not flagged (opens a block)\n<% } %>                 ← not flagged (closes a block)\n```\n\n### `ejs-templates/slurp-newline`\n\nEnsures `<%_ … _%>` whitespace-slurping tags are on their own line. An inline\nslurp tag will not eat the preceding whitespace as intended. Apply this rule\n**after** `prefer-slurping-*` and **before** `indent`.\n\nBecause slurp tags remove the newline/whitespace before them, placing each tag\non its own line (then indenting it) makes the template easier to read and reason\nabout.\n\n|             |                                                       |\n| ----------- | ----------------------------------------------------- |\n| **Fixable** | Yes — `eslint --fix` inserts a newline before the tag |\n\n```ejs\n<!-- ✗ violation: slurp tag is inline after other content -->\nsome text<%_ doWork(); _%>\n\n<!-- ✓ fixed -->\nsome text\n<%_ doWork(); _%>\n```\n\n## Supported EJS Delimiters\n\n| Delimiter | Meaning                                |\n| --------- | -------------------------------------- |\n| `<%`      | Code (no output)                       |\n| `<%=`     | Output (HTML-escaped)                  |\n| `<%-`     | Output (raw / unescaped)               |\n| `<%_`     | Code, trims preceding whitespace       |\n| `<%#`     | Comment (no output)                    |\n| `%>`      | Standard closing delimiter             |\n| `-%>`     | Closing delimiter, trims trailing `\\n` |\n| `_%>`     | Closing delimiter, trims whitespace    |\n\n## License\n\n[Apache 2.0](./LICENSE)\n","readmeFilename":"README.md"}