{"_id":"@curiousdev-oss/eslint-plugin-web-perf","_rev":"7-22f97f4d620684439281557d7a9f9186","name":"@curiousdev-oss/eslint-plugin-web-perf","dist-tags":{"latest":"0.1.4"},"versions":{"0.1.1":{"name":"@curiousdev-oss/eslint-plugin-web-perf","version":"0.1.1","keywords":["eslint","eslint-plugin","performance","web-vitals","core-web-vitals","optimization","javascript","typescript","angular","react"],"author":"","license":"MIT","_id":"@curiousdev-oss/eslint-plugin-web-perf@0.1.1","maintainers":[{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"}],"homepage":"https://github.com/curiousdev-oss/web-perf-toolkit/tree/main/packages/eslint-plugin-perf","bugs":{"url":"https://github.com/curiousdev-oss/web-perf-toolkit/issues"},"dist":{"shasum":"7a32100e0190df42c694903e28e7b35d866fa547","tarball":"https://registry.npmjs.org/@curiousdev-oss/eslint-plugin-web-perf/-/eslint-plugin-web-perf-0.1.1.tgz","fileCount":85,"integrity":"sha512-krKdRTap+y++BaPecnE8Nu66Ut0iRwJtfKgA4IedCfTik/94gRyZHNNVAbrHUEAXDSV95GW+ft+Nss/EdUEBkQ==","signatures":[{"sig":"MEUCIEst+1CIaWECOAdb7YQ6IUTG+TQHzlfPz+b9zyTIZmqNAiEAxyqFQ5k+ndUupyjow6YqrGG4hL1vWbYHKmwFcbUFRIg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":514735},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"44fc52108435063f1cb3e221b0414bee856b83f8","scripts":{"dev":"tsc -w -b","test":"jest --runInBand","build":"tsc -b","test:ci":"jest --ci --coverage --runInBand --maxWorkers=2","test:all":"npm run test:lint && npm run test:coverage","test:lint":"eslint src/**/*.ts tests/**/*.ts","test:unit":"jest --testPathPattern=tests --runInBand","test:debug":"jest --runInBand --detectOpenHandles","test:index":"jest --testPathPattern=index --runInBand","test:rules":"jest --testPathPattern=rules --runInBand","test:watch":"jest --watch","test:verbose":"jest --verbose --runInBand","test:coverage":"jest --coverage --runInBand","prepublishOnly":"npm run test:lint","test:coverage:html":"jest --coverage --coverageReporters=html --runInBand"},"_npmUser":{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"},"repository":{"url":"git+https://github.com/curiousdev-oss/web-perf-toolkit.git","type":"git","directory":"packages/eslint-plugin-perf"},"_npmVersion":"10.2.4","description":"Comprehensive ESLint plugin with 14 performance rules for web performance optimization","directories":{},"_nodeVersion":"21.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.2.5","typescript":"^5.5.0","@types/jest":"^29.5.14","@types/eslint":"^8.56.0","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-web-perf_0.1.1_1756671846529_0.28708066178538516","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@curiousdev-oss/eslint-plugin-web-perf","version":"0.1.2","keywords":["eslint","eslint-plugin","performance","web-vitals","core-web-vitals","optimization","javascript","typescript","angular","react"],"author":"","license":"MIT","_id":"@curiousdev-oss/eslint-plugin-web-perf@0.1.2","maintainers":[{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"}],"homepage":"https://github.com/curiousdev-oss/web-perf-toolkit/tree/main/packages/eslint-plugin-perf","bugs":{"url":"https://github.com/curiousdev-oss/web-perf-toolkit/issues"},"dist":{"shasum":"97ac23733b5b5bc49920414b9d260b7356f18f46","tarball":"https://registry.npmjs.org/@curiousdev-oss/eslint-plugin-web-perf/-/eslint-plugin-web-perf-0.1.2.tgz","fileCount":32,"integrity":"sha512-SUEUHsxuJi/pnrJaeZ/wK9xS75MqDTovLCQ/NOiXDCs8plFLwljrrJieAdMIibS8FVUk0/ewPo0Neg4wMtBW7g==","signatures":[{"sig":"MEUCIQCO8d3dhz4Hnc7uFOCHBJuGYwdr/R0fBAi3X/XzfBRxmQIgPR4I6OEUN/HZeG+ZvjwvyMS9rBcfkL46LXFFv1bG1cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":113836},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"fea2dea5afc6dfe07b43efdfd345e00e92ee7e9b","scripts":{"dev":"tsc -w -b","test":"jest --runInBand","build":"tsc -b","test:ci":"jest --ci --coverage --runInBand --maxWorkers=2","test:all":"npm run test:lint && npm run test:coverage","test:lint":"eslint src/**/*.ts tests/**/*.ts","test:unit":"jest --testPathPattern=tests --runInBand","test:debug":"jest --runInBand --detectOpenHandles","test:index":"jest --testPathPattern=index --runInBand","test:rules":"jest --testPathPattern=rules --runInBand","test:watch":"jest --watch","test:verbose":"jest --verbose --runInBand","test:coverage":"jest --coverage --runInBand","prepublishOnly":"npm run test:lint","test:coverage:html":"jest --coverage --coverageReporters=html --runInBand"},"_npmUser":{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"},"repository":{"url":"git+https://github.com/curiousdev-oss/web-perf-toolkit.git","type":"git","directory":"packages/eslint-plugin-perf"},"_npmVersion":"10.2.4","description":"Comprehensive ESLint plugin with 14 performance rules for web performance optimization","directories":{},"_nodeVersion":"21.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.2.5","typescript":"^5.5.0","@types/jest":"^29.5.14","@types/eslint":"^8.56.0","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-web-perf_0.1.2_1756672783869_0.22242960684232682","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@curiousdev-oss/eslint-plugin-web-perf","version":"0.1.3","keywords":["eslint","eslint-plugin","performance","web-vitals","core-web-vitals","optimization","javascript","typescript","angular","react"],"author":{"name":"curiousdev-oss"},"license":"MIT","_id":"@curiousdev-oss/eslint-plugin-web-perf@0.1.3","maintainers":[{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"}],"homepage":"https://github.com/curiousdev-oss/web-perf-toolkit/tree/main/packages/eslint-plugin-perf","bugs":{"url":"https://github.com/curiousdev-oss/web-perf-toolkit/issues"},"dist":{"shasum":"0875a33433dc9ff48d7b941cf8923506f594ca6f","tarball":"https://registry.npmjs.org/@curiousdev-oss/eslint-plugin-web-perf/-/eslint-plugin-web-perf-0.1.3.tgz","fileCount":32,"integrity":"sha512-qTJ6F4/4g9Gs+IpGs8QhETcxTTdVLineuENmCEoLJjIhgHrf5MOSxes5QrnYW+UgfM7Efygu6GOSNO/rvtx1Vg==","signatures":[{"sig":"MEUCIC4WUYPzv5cCfmC29reF5deSpS6BrlbbcMzuGXj3q+VJAiEAlWHQoOycMWMRb0l+PvIBwE2bYu0/Y+9Xq94/GpLCFs4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114099},"main":"dist/src/index.js","type":"module","types":"dist/src/index.d.ts","gitHead":"4ecd8294a2a4fe31a7ba33f563d7cf9e4f9457cb","scripts":{"dev":"tsc -w -b","test":"jest --runInBand","build":"tsc -b","test:ci":"jest --ci --coverage --runInBand --maxWorkers=2","test:all":"npm run test:lint && npm run test:coverage","test:lint":"eslint src/**/*.ts tests/**/*.ts","test:unit":"jest --testPathPattern=tests --runInBand","test:debug":"jest --runInBand --detectOpenHandles","test:index":"jest --testPathPattern=index --runInBand","test:rules":"jest --testPathPattern=rules --runInBand","test:watch":"jest --watch","test:verbose":"jest --verbose --runInBand","test:coverage":"jest --coverage --runInBand","prepublishOnly":"npm run test:lint","test:coverage:html":"jest --coverage --coverageReporters=html --runInBand"},"_npmUser":{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"},"repository":{"url":"git+https://github.com/curiousdev-oss/web-perf-toolkit.git","type":"git","directory":"packages/eslint-plugin-perf"},"_npmVersion":"10.2.4","description":"Comprehensive ESLint plugin with 14 performance rules for web performance optimization","directories":{},"_nodeVersion":"21.5.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.57.0","ts-jest":"^29.2.5","typescript":"^5.5.0","@types/jest":"^29.5.14","@types/eslint":"^8.56.0","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-web-perf_0.1.3_1757104389883_0.10618174581334516","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@curiousdev-oss/eslint-plugin-web-perf","version":"0.1.4","description":"Comprehensive ESLint plugin with 18 performance rules for web performance optimization, including Angular-specific rules","main":"dist/src/index.js","types":"dist/src/index.d.ts","type":"module","keywords":["eslint","eslint-plugin","performance","web-vitals","core-web-vitals","optimization","javascript","typescript","angular","react"],"author":{"name":"curiousdev-oss"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/curiousdev-oss/web-perf-toolkit.git","directory":"packages/eslint-plugin-perf"},"bugs":{"url":"https://github.com/curiousdev-oss/web-perf-toolkit/issues"},"homepage":"https://github.com/curiousdev-oss/web-perf-toolkit/tree/main/packages/eslint-plugin-perf","publishConfig":{"access":"public"},"scripts":{"build":"tsc -b","dev":"tsc -w -b","test":"jest --runInBand","test:watch":"jest --watch","test:coverage":"jest --coverage --runInBand","test:coverage:html":"jest --coverage --coverageReporters=html --runInBand","test:verbose":"jest --verbose --runInBand","test:debug":"jest --runInBand --detectOpenHandles","test:ci":"jest --ci --coverage --runInBand --maxWorkers=2","test:rules":"jest --testPathPattern=rules --runInBand","test:index":"jest --testPathPattern=index --runInBand","test:unit":"jest --testPathPattern=tests --runInBand","test:lint":"eslint src/**/*.ts tests/**/*.ts","test:all":"npm run test:lint && npm run test:coverage","prepublishOnly":"npm run test:lint"},"devDependencies":{"@types/eslint":"^8.56.0","@types/jest":"^29.5.14","@typescript-eslint/eslint-plugin":"^6.21.0","@typescript-eslint/parser":"^6.21.0","eslint":"^8.57.0","jest":"^29.7.0","ts-jest":"^29.2.5","typescript":"^5.5.0"},"_id":"@curiousdev-oss/eslint-plugin-web-perf@0.1.4","gitHead":"4ecd8294a2a4fe31a7ba33f563d7cf9e4f9457cb","_nodeVersion":"21.5.0","_npmVersion":"10.2.4","dist":{"integrity":"sha512-NSPvOhlbUnb9e8kQ7pBS1ROc0sgN19GFMkrlmjp3VgcNSiaPIkvWR52JkTlkFsymstgQRraWknpqaJzfrwxYoQ==","shasum":"b8f671e99b05440fe8c2644f82a2938f6afa0fc1","tarball":"https://registry.npmjs.org/@curiousdev-oss/eslint-plugin-web-perf/-/eslint-plugin-web-perf-0.1.4.tgz","fileCount":40,"unpackedSize":127274,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEpfC7Fe++M7Q0olbyehPU3rZ4OJJY91n3OXe6MYV/qmAiEA9QIDE1W2evoRHcK0ysim7b824by7dERKD2VbhWeK/j8="}]},"_npmUser":{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"},"directories":{},"maintainers":[{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin-web-perf_0.1.4_1757106947183_0.10534836515676127"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-31T20:24:06.414Z","modified":"2025-09-05T21:15:47.621Z","0.1.0":"2025-08-31T20:11:24.668Z","0.1.1":"2025-08-31T20:24:06.744Z","0.1.2":"2025-08-31T20:39:44.088Z","0.1.3":"2025-09-05T20:33:10.086Z","0.1.4":"2025-09-05T21:15:47.447Z"},"bugs":{"url":"https://github.com/curiousdev-oss/web-perf-toolkit/issues"},"author":{"name":"curiousdev-oss"},"license":"MIT","homepage":"https://github.com/curiousdev-oss/web-perf-toolkit/tree/main/packages/eslint-plugin-perf","keywords":["eslint","eslint-plugin","performance","web-vitals","core-web-vitals","optimization","javascript","typescript","angular","react"],"repository":{"type":"git","url":"git+https://github.com/curiousdev-oss/web-perf-toolkit.git","directory":"packages/eslint-plugin-perf"},"description":"Comprehensive ESLint plugin with 18 performance rules for web performance optimization, including Angular-specific rules","maintainers":[{"name":"curiousdev-oss","email":"kuriousdev@gmail.com"}],"readme":"# 🚀 ESLint Plugin Performance\n\n[![npm version](https://badge.fury.io/js/@curiousdev-oss%2Feslint-plugin-web-perf.svg)](https://badge.fury.io/js/@curiousdev-oss%2Feslint-plugin-web-perf)\n[![npm downloads](https://img.shields.io/npm/dm/@curiousdev-oss/eslint-plugin-web-perf.svg)](https://www.npmjs.com/package/@curiousdev-oss/eslint-plugin-web-perf)\n[![npm publish](https://img.shields.io/npm/v/@curiousdev-oss/eslint-plugin-web-perf?color=success&label=latest)](https://www.npmjs.com/package/@curiousdev-oss/eslint-plugin-web-perf)\n[![GitHub release](https://img.shields.io/github/release/curiousdev-oss/web-perf-toolkit.svg)](https://github.com/curiousdev-oss/web-perf-toolkit/releases)\n[![Install size](https://packagephobia.com/badge?p=@curiousdev-oss/eslint-plugin-web-perf)](https://packagephobia.com/result?p=@curiousdev-oss/eslint-plugin-web-perf)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Test Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen.svg)](https://github.com/curiousdev-oss/web-perf-toolkit)\n\nA comprehensive ESLint plugin with **18 performance-focused rules** designed to help developers write more performant web applications.\n\n> **🎉 v0.1.4 Release** - Added 4 Angular-specific performance rules for better framework optimization.\n\n## ✨ Features\n\n- **🎯 Core Web Vitals** - LCP, FID, CLS optimization rules\n- **📦 Bundle Optimization** - Tree-shaking and code-splitting enforcement\n- **🧠 Memory Management** - Memory leak prevention and cleanup patterns\n- **🌐 Modern Web APIs** - Legacy to modern API migration guidance\n- **⚡ Framework Support** - Optimized configs for Angular, React, and vanilla JS\n\n## 📦 Installation\n\n```bash\n# Install the latest version\nnpm install --save-dev @curiousdev-oss/eslint-plugin-web-perf\n\n# Or install specific version\nnpm install --save-dev @curiousdev-oss/eslint-plugin-web-perf@^0.1.3\n```\n\n**Version**: 0.1.3 | **Release Date**: 2025 | **Stability**: Optimized Release\n\n## 🚀 Quick Start\n\n### ESLint 9.x (Flat Config)\n\n```javascript\n// eslint.config.js\nimport perfPlugin from \"@curiousdev-oss/eslint-plugin-web-perf\";\n\nexport default [\n  {\n    plugins: {\n      \"@curiousdev-oss/perf\": perfPlugin,\n    },\n    rules: {\n      // Use one of the preset configurations\n      ...perfPlugin.configs.recommended.rules, // Balanced rules\n      // ...perfPlugin.configs.strict.rules,       // Maximum performance\n      // ...perfPlugin.configs.angular.rules,      // Angular-optimized\n    },\n  },\n];\n```\n\n### ESLint 8.x (Legacy Config)\n\n```javascript\n// .eslintrc.js\nmodule.exports = {\n  plugins: [\"@curiousdev-oss/perf\"],\n  extends: [\"plugin:@curiousdev-oss/perf/recommended\"],\n  // or 'plugin:@curiousdev-oss/perf/strict'\n  // or 'plugin:@curiousdev-oss/perf/angular'\n};\n```\n\n## 📊 Complete Rule Set\n\n| Category                    | Rules   | Purpose                             |\n| --------------------------- | ------- | ----------------------------------- |\n| **🎯 Core Web Vitals**      | 4 rules | CLS, LCP, FID optimization          |\n| **📦 Bundle Size**          | 3 rules | Import optimization, lazy loading   |\n| **🧠 Memory & Performance** | 3 rules | Memory leaks, efficient algorithms  |\n| **🌐 Modern Web Standards** | 4 rules | API modernization, DOM optimization |\n| **🅰️ Angular Performance** | 4 rules | OnPush, trackBy, async pipe, NgOptimizedImage |\n\n### 🎯 Core Web Vitals Rules\n\n#### `img-requires-dimensions`\n\nPrevents Cumulative Layout Shift by requiring image dimensions.\n\n```javascript\n// ❌ Bad - causes CLS\n<img src=\"hero.jpg\" />\n\n// ✅ Good - reserves space\n<img src=\"hero.jpg\" width=\"800\" height=\"600\" />\n```\n\n#### `prefer-web-vitals-optimizations` ⭐\n\nComprehensive Core Web Vitals optimizations for LCP, FID, and CLS.\n\n```javascript\n// ❌ Bad - blocks FID\naddEventListener(\"scroll\", handler);\n\n// ✅ Good - passive listener\naddEventListener(\"scroll\", handler, { passive: true });\n```\n\n#### `no-render-blocking-resources` ⭐\n\nEliminates render-blocking CSS and JavaScript.\n\n```javascript\n// ❌ Bad - blocks rendering\nimport \"./styles.css\";\n\n// ✅ Good - non-blocking\nimport(\"./styles.css\");\n```\n\n#### `prefer-resource-hints` ⭐\n\nEnforces preload/prefetch for critical resources.\n\n```javascript\n// ❌ Missing preload for critical image\n<img src=\"hero.jpg\" />\n\n// ✅ Good - preloaded\n<link rel=\"preload\" as=\"image\" href=\"hero.jpg\" />\n<img src=\"hero.jpg\" />\n```\n\n### 📦 Bundle Size Rules\n\n#### `no-heavy-namespace-imports`\n\nPrevents large library imports that hurt bundle size.\n\n```javascript\n// ❌ Bad - imports entire library (100KB)\nimport * as _ from \"lodash\";\n\n// ✅ Good - tree-shakeable\nimport { debounce } from \"lodash\";\n```\n\n#### `prefer-lazy-loading`\n\nEncourages code splitting and lazy loading.\n\n```javascript\n// ❌ Bad - eager loading of heavy library\nimport chart from \"chart.js\";\n\n// ✅ Good - lazy loaded\nconst chart = await import(\"chart.js\");\n```\n\n#### `no-large-bundle-imports` ⭐\n\nSmart bundle size management with size thresholds.\n\n```javascript\n// ❌ Bad - large library without tree-shaking\nimport moment from \"moment\"; // 300KB\n\n// ✅ Good - lighter alternative\nimport { format } from \"date-fns\"; // 20KB\n```\n\n### 🧠 Memory & Performance Rules\n\n#### `no-memory-leaks`\n\nPrevents common memory leak patterns.\n\n```javascript\n// ❌ Bad - memory leak\nsetInterval(() => update(), 1000);\n\n// ✅ Good - cleanup in lifecycle\nconst interval = setInterval(() => update(), 1000);\n// Clear in ngOnDestroy/useEffect cleanup\n```\n\n#### `no-sync-apis-in-render` ⭐\n\nPrevents render function blocking.\n\n```javascript\n// ❌ Bad - blocks rendering\nfunction render() {\n  const data = localStorage.getItem(\"user\");\n  return data;\n}\n\n// ✅ Good - async\nasync function render() {\n  const data = await asyncStorage.getItem(\"user\");\n  return data;\n}\n```\n\n#### `prefer-efficient-data-structures`\n\nOptimizes algorithms and data structures.\n\n```javascript\n// ❌ Bad - O(n) lookup\nif (array.indexOf(item) !== -1) {\n}\n\n// ✅ Good - O(1) lookup\nif (set.has(item)) {\n}\n```\n\n### 🌐 Modern Web Standards Rules\n\n#### `prefer-modern-apis` ⭐\n\nModernizes legacy code patterns.\n\n```javascript\n// ❌ Bad - legacy API\nnew XMLHttpRequest();\n\n// ✅ Good - modern API\nfetch(url);\n```\n\n#### `no-blocking-apis`\n\nEliminates synchronous operations.\n\n```javascript\n// ❌ Bad - blocks main thread\nconst data = JSON.parse(largeData);\n\n// ✅ Good - non-blocking\nconst data = await streamParser.parse(largeData);\n```\n\n#### `no-expensive-dom-operations`\n\nOptimizes DOM performance.\n\n```javascript\n// ❌ Bad - layout thrashing\nfor (const el of elements) {\n  el.style.width = \"100px\";\n  const height = el.offsetHeight;\n}\n\n// ✅ Good - batched operations\nelements.forEach((el) => el.classList.add(\"new-width\"));\nconst heights = elements.map((el) => el.getBoundingClientRect().height);\n```\n\n#### `no-inefficient-loops`\n\nPrevents performance-killing loop patterns.\n\n```javascript\n// ❌ Bad - DOM query in loop\nfor (const item of items) {\n  const el = document.querySelector(`#${item.id}`);\n}\n\n// ✅ Good - cached outside loop\nconst elements = items.map((item) => document.querySelector(`#${item.id}`));\n```\n\n## ⚙️ Configuration Options\n\n### 📋 Recommended Config (Default)\n\nBalanced rules suitable for most projects.\n\n```javascript\n// Errors for critical issues, warnings for optimizations\nrules: {\n  '@curiousdev-oss/perf/img-requires-dimensions': 'error',\n  '@curiousdev-oss/perf/no-sync-apis-in-render': 'error',\n  '@curiousdev-oss/perf/no-render-blocking-resources': 'error',\n  '@curiousdev-oss/perf/prefer-web-vitals-optimizations': 'warn',\n  // ... more rules\n}\n```\n\n### 🔥 Strict Config\n\nAll rules as errors for performance-critical applications.\n\n```javascript\n// Zero tolerance for performance issues\nrules: {\n  '@curiousdev-oss/perf/prefer-web-vitals-optimizations': 'error',\n  '@curiousdev-oss/perf/no-large-bundle-imports': 'error',\n  '@curiousdev-oss/perf/prefer-modern-apis': 'error',\n  // ... all rules as 'error'\n}\n```\n\n### 🅰️ Angular Config\n\nOptimized for Angular applications with framework-specific settings.\n\n```javascript\n// Angular-optimized with larger bundle allowances\nrules: {\n  '@curiousdev-oss/perf/no-large-bundle-imports': [\n    'warn',\n    {\n      maxSize: 75,\n      allowedLarge: ['@angular/core', '@angular/common']\n    }\n  ],\n  // ... Angular-specific configurations\n}\n```\n\n### 🅰️ Angular-Specific Performance Rules\n\n- `angular-onpush-change-detection` (suggested/error in Angular preset): Enforce `ChangeDetectionStrategy.OnPush` in `@Component` to reduce change detection work.\n- `angular-require-trackby` (suggested/error in Angular preset): Require `trackBy` in `*ngFor` (detected in inline templates) to prevent DOM churn.\n- `angular-prefer-async-pipe` (suggested/error in Angular preset): Prefer `async` pipe over manual `subscribe()` within component classes.\n- `angular-img-ngoptimizedimage` (suggested/error in Angular preset): Suggest `NgOptimizedImage` (`ngSrc`) and enforce `width`/`height` in inline templates to prevent CLS.\n\nThese rules are safe no-ops outside Angular code and do not require app-level ESLint config changes; they are included in this plugin's presets.\n\n## 🏆 Performance Impact\n\nProjects using this plugin typically see:\n\n- **⬆️ 15-25 point** Lighthouse score improvements\n- **⚡ 30-50% faster** Core Web Vitals metrics\n- **📦 20-40% smaller** bundle sizes\n- **🔧 90% fewer** performance-related bugs\n\n## 🧪 Testing\n\nThe plugin includes comprehensive test applications:\n\n```bash\n# Test on sample applications\ncd test-apps/ts-sample && npm run lint    # 72+ issues detected\ncd test-apps/angular-sample && npm run lint  # 80+ issues detected\ncd test-apps/js-sample && npm run lint    # 36+ issues detected\n```\n\n## 📊 Release Notes\n\n### v0.1.4 - Angular Performance Rules\n\n**🅰️ What's New:**\n- ✅ 4 new Angular-specific performance rules\n- ✅ `angular-onpush-change-detection`: Enforces ChangeDetectionStrategy.OnPush\n- ✅ `angular-require-trackby`: Requires trackBy in *ngFor directives\n- ✅ `angular-prefer-async-pipe`: Prefers async pipe over manual subscriptions\n- ✅ `angular-img-ngoptimizedimage`: Suggests NgOptimizedImage and enforces dimensions\n- ✅ Enhanced Angular preset configuration\n- ✅ Comprehensive test coverage for all new rules\n- ✅ Updated documentation and examples\n\n### v0.1.3 - OSS & Docs Update\n\n**What's Included:**\n- Added LICENSE, CONTRIBUTING, Code of Conduct, Security policy, CODEOWNERS\n- Improved .gitignore; removed committed coverage artifacts\n- Anonymized maintainer to `@curiousdev-oss`; license link fixed\n- Package metadata updated; README synced\n\n### v0.1.2 - Optimized Release\n\n**🚀 What's Included:**\n- ✅ 14 comprehensive performance rules\n- ✅ 3 preset configurations (recommended, strict, angular)\n- ✅ 238+ unit tests with comprehensive coverage\n- ✅ TypeScript & JavaScript support\n- ✅ Framework-specific optimizations\n- ✅ Production-ready performance linting\n\n**📦 Package Optimizations:**\n- ✅ 78% smaller package size (from 515KB to 114KB)\n- ✅ Removed unnecessary test files and dev dependencies\n- ✅ Only ships essential runtime code\n- ✅ Faster npm install times\n\n**📈 Performance Impact:**\n- Bundle size optimization rules\n- Core Web Vitals improvements\n- Memory leak prevention\n- Modern API migration guidance\n\n## 🗺️ Roadmap\n\n- **v0.1.x** - Bug fixes and minor improvements\n- **v0.2.0** - React-specific performance rules\n- **v0.3.0** - Vue.js framework support\n- **v1.0.0** - Stable API with enterprise features\n\n## 👥 Maintainers\n\n**Lead Maintainer:** `@curiousdev-oss`\n\n## 🤝 Contributing\n\nContributions welcome! We're looking for:\n- 🐛 Bug reports and fixes\n- 🚀 New performance rules\n- 📖 Documentation improvements\n- 🧪 Additional test cases\n\nPlease see [CONTRIBUTING.md](../../CONTRIBUTING.md) for guidelines.\n\n## 📄 License\n\nMIT License - see [LICENSE](../../LICENSE) for details\n\n---\n\n**Made with ❤️ for web performance** | [Report Issues](https://github.com/curiousdev-oss/web-perf-toolkit/issues) | [Suggest Features](https://github.com/curiousdev-oss/web-perf-toolkit/discussions)\n","readmeFilename":"README.md"}