{"_id":"@ai-partner-x/eslint-plugin-aiko-boot","_rev":"4-cce41b0436286eed017dcd50023f43e1","name":"@ai-partner-x/eslint-plugin-aiko-boot","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.3":{"name":"@ai-partner-x/eslint-plugin-aiko-boot","version":"0.1.3","keywords":["eslint","eslint-plugin","java-compatible","typescript","aiko-boot"],"_id":"@ai-partner-x/eslint-plugin-aiko-boot@0.1.3","maintainers":[{"name":"moyin333","email":"158182907@qq.com"}],"dist":{"shasum":"74f50c75eb513530a61cc4a3f26a57e1e9f93e9d","tarball":"https://registry.npmjs.org/@ai-partner-x/eslint-plugin-aiko-boot/-/eslint-plugin-aiko-boot-0.1.3.tgz","fileCount":50,"integrity":"sha512-vr/9qHN7GxZFsfgsc2ePxM2n/pKL7yggf7/mKzyIpQzuEin4ERVtZZL46SJdhBqG9RfRpdsQZtYo63VK81JecQ==","signatures":[{"sig":"MEUCIQDoNoYS5DOLI04u49jrvz42Zg9kkhYKTsD7hAdg0NccqwIgLtrBh6O5wcXq6Y/old6DdbMkAV6avIOz/iAY7n+rEqo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55338},"main":"./dist/index.js","type":"module","_from":"file:ai-partner-x-eslint-plugin-aiko-boot-0.1.3.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"moyin333","email":"158182907@qq.com"},"_resolved":"/tmp/7036a9b61c3a3fab4c523548ea44a4bf/ai-partner-x-eslint-plugin-aiko-boot-0.1.3.tgz","_integrity":"sha512-vr/9qHN7GxZFsfgsc2ePxM2n/pKL7yggf7/mKzyIpQzuEin4ERVtZZL46SJdhBqG9RfRpdsQZtYo63VK81JecQ==","_npmVersion":"10.8.2","description":"ESLint plugin to enforce Java-compatible TypeScript code for Aiko Boot","directories":{},"_nodeVersion":"20.20.1","dependencies":{"@typescript-eslint/utils":"^6.21.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.56.0","typescript":"^5.3.3","@types/node":"^20.11.0","@types/eslint":"^8.56.0","@typescript-eslint/utils":"^6.21.0","@typescript-eslint/parser":"^6.21.0"},"peerDependencies":{"eslint":"^8.0.0","typescript":"^5.0.0","@typescript-eslint/parser":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-aiko-boot_0.1.3_1773857062760_0.579428133138286","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@ai-partner-x/eslint-plugin-aiko-boot","version":"0.1.4","keywords":["eslint","eslint-plugin","java-compatible","typescript","aiko-boot"],"_id":"@ai-partner-x/eslint-plugin-aiko-boot@0.1.4","maintainers":[{"name":"moyin333","email":"158182907@qq.com"}],"dist":{"shasum":"8896cf50d09f54a8afbead1bb37f2ca79a3e5326","tarball":"https://registry.npmjs.org/@ai-partner-x/eslint-plugin-aiko-boot/-/eslint-plugin-aiko-boot-0.1.4.tgz","fileCount":50,"integrity":"sha512-2QCdiWnCv2pmqxnrdU+kD2Yzd7TsGrDf07CrwCpiCL38182D6sVfBRXpADqH0nOhWjc9T325TXNUQWm0wcZBOA==","signatures":[{"sig":"MEQCIQDHvGRuETWmtEB6AOBf6TKxxlhBuYpV0Z/y869svq9AKAIfeidTJ8OTUy295AK7FkFODIr1Yb+jUjaJeEut5L/lTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55338},"main":"./dist/index.js","type":"module","_from":"file:ai-partner-x-eslint-plugin-aiko-boot-0.1.4.tgz","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"scripts":{"dev":"tsc --watch","build":"tsc"},"_npmUser":{"name":"moyin333","email":"158182907@qq.com"},"_resolved":"/tmp/4cca9fe4fb8463db953c0fdde73ad5c4/ai-partner-x-eslint-plugin-aiko-boot-0.1.4.tgz","_integrity":"sha512-2QCdiWnCv2pmqxnrdU+kD2Yzd7TsGrDf07CrwCpiCL38182D6sVfBRXpADqH0nOhWjc9T325TXNUQWm0wcZBOA==","_npmVersion":"10.8.2","description":"ESLint plugin to enforce Java-compatible TypeScript code for Aiko Boot","directories":{},"_nodeVersion":"20.20.1","dependencies":{"@typescript-eslint/utils":"^6.21.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^8.56.0","typescript":"^5.3.3","@types/node":"^20.11.0","@types/eslint":"^8.56.0","@typescript-eslint/utils":"^6.21.0","@typescript-eslint/parser":"^6.21.0"},"peerDependencies":{"eslint":"^8.0.0","typescript":"^5.0.0","@typescript-eslint/parser":"^6.0.0"},"_npmOperationalInternal":{"tmp":"tmp/eslint-plugin-aiko-boot_0.1.4_1773908273470_0.9827930803573375","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@ai-partner-x/eslint-plugin-aiko-boot","version":"0.1.5","description":"ESLint plugin to enforce Java-compatible TypeScript code for Aiko Boot","type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"keywords":["eslint","eslint-plugin","java-compatible","typescript","aiko-boot"],"peerDependencies":{"@typescript-eslint/parser":"^6.0.0","eslint":"^8.0.0","typescript":"^5.0.0"},"devDependencies":{"@typescript-eslint/parser":"^6.21.0","@typescript-eslint/utils":"^6.21.0","@types/eslint":"^8.56.0","@types/node":"^20.11.0","eslint":"^8.56.0","typescript":"^5.3.3"},"dependencies":{"@typescript-eslint/utils":"^6.21.0"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"scripts":{"build":"tsc","dev":"tsc --watch"},"_id":"@ai-partner-x/eslint-plugin-aiko-boot@0.1.5","_integrity":"sha512-3Tg+ZMkxCBvQb5aaJ11KP8O0lHsZzR0/ez1f6/xms4lnCpLKHpnMuBH7IpCUqgUMd5bpypFQmGJygLhNZd6zlg==","_resolved":"/tmp/9b03f0d69cc79464365e1bc043a9ad4d/ai-partner-x-eslint-plugin-aiko-boot-0.1.5.tgz","_from":"file:ai-partner-x-eslint-plugin-aiko-boot-0.1.5.tgz","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-3Tg+ZMkxCBvQb5aaJ11KP8O0lHsZzR0/ez1f6/xms4lnCpLKHpnMuBH7IpCUqgUMd5bpypFQmGJygLhNZd6zlg==","shasum":"12dbc40ddfb339f7651e3005ad8a871a543e889a","tarball":"https://registry.npmjs.org/@ai-partner-x/eslint-plugin-aiko-boot/-/eslint-plugin-aiko-boot-0.1.5.tgz","fileCount":50,"unpackedSize":55338,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDi3+I24Dmm7OCl3IXWk56IN8Dhb9IXrkUj4NRvbVV5vwIgDAtDjrdIechJX9ARKQyK+NDLYT5/HrvUMVa9Vlz37fE="}]},"_npmUser":{"name":"moyin333","email":"158182907@qq.com"},"directories":{},"maintainers":[{"name":"moyin333","email":"158182907@qq.com"},{"name":"liujin0528","email":"un0528@hotmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eslint-plugin-aiko-boot_0.1.5_1774102912912_0.09070330618316302"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-18T18:04:22.644Z","modified":"2026-03-21T14:21:53.219Z","0.1.3":"2026-03-18T18:04:22.912Z","0.1.4":"2026-03-19T08:17:53.632Z","0.1.5":"2026-03-21T14:21:53.077Z"},"keywords":["eslint","eslint-plugin","java-compatible","typescript","aiko-boot"],"description":"ESLint plugin to enforce Java-compatible TypeScript code for Aiko Boot","maintainers":[{"name":"moyin333","email":"158182907@qq.com"},{"name":"liujin0528","email":"un0528@hotmail.com"}],"readme":"# @aiko-boot/eslint-plugin\n\nESLint plugin to enforce Java-compatible TypeScript code for aiko-boot Framework.\n\n## Installation\n\n```bash\npnpm add -D @aiko-boot/eslint-plugin @typescript-eslint/parser\n```\n\n## Usage\n\n### Basic Setup\n\nIn your `.eslintrc.js` or `.eslintrc.json`:\n\n```javascript\nmodule.exports = {\n  parser: '@typescript-eslint/parser',\n  parserOptions: {\n    ecmaVersion: 2022,\n    sourceType: 'module',\n  },\n  plugins: ['@aiko-boot'],\n  extends: ['plugin:@aiko-boot/recommended'],\n};\n```\n\n### Strict Mode\n\nFor maximum Java compatibility:\n\n```javascript\nmodule.exports = {\n  parser: '@typescript-eslint/parser',\n  plugins: ['@aiko-boot'],\n  extends: ['plugin:@aiko-boot/strict'],\n};\n```\n\n### Custom Configuration\n\n```javascript\nmodule.exports = {\n  parser: '@typescript-eslint/parser',\n  plugins: ['@aiko-boot'],\n  rules: {\n    '@aiko-boot/no-arrow-methods': 'error',\n    '@aiko-boot/no-destructuring-in-methods': 'error',\n    '@aiko-boot/no-object-spread': 'warn',\n    '@aiko-boot/static-route-paths': 'error',\n    '@aiko-boot/require-rest-controller': 'error',\n  },\n};\n```\n\n## Rules\n\n### `@aiko-boot/no-arrow-methods` (error)\n\nDisallow arrow functions as class methods (not Java-compatible).\n\n❌ **Incorrect**:\n```typescript\n@RestController()\nclass UserController {\n  // ❌ Arrow function as method\n  getUser = async (id: number) => {\n    return this.userService.getUserById(id);\n  }\n}\n```\n\n✅ **Correct**:\n```typescript\n@RestController()\nclass UserController {\n  // ✅ Regular method\n  async getUser(id: number) {\n    return this.userService.getUserById(id);\n  }\n}\n```\n\n### `@aiko-boot/no-destructuring-in-methods` (error)\n\nDisallow destructuring in class methods (not Java-compatible).\n\n❌ **Incorrect**:\n```typescript\nasync createUser(dto: CreateUserDto) {\n  // ❌ Destructuring\n  const { username, email } = dto;\n  return this.userService.create(username, email);\n}\n```\n\n✅ **Correct**:\n```typescript\nasync createUser(dto: CreateUserDto) {\n  // ✅ Explicit property access\n  const username = dto.username;\n  const email = dto.email;\n  return this.userService.create(username, email);\n}\n```\n\n### `@aiko-boot/no-object-spread` (warn)\n\nWarn about object spread in class methods (difficult to translate to Java).\n\n❌ **Problematic**:\n```typescript\nasync updateUser(id: number, dto: UpdateUserDto) {\n  // ⚠️ Object spread\n  const user = { ...dto, id };\n  return this.userRepository.save(user);\n}\n```\n\n✅ **Recommended**:\n```typescript\nasync updateUser(id: number, dto: UpdateUserDto) {\n  // ✅ Explicit assignment (translates to BeanUtils.copyProperties in Java)\n  const user = new User();\n  user.id = id;\n  user.username = dto.username;\n  user.email = dto.email;\n  return this.userRepository.save(user);\n}\n```\n\n### `@aiko-boot/static-route-paths` (error)\n\nEnforce static string literals for route paths.\n\n❌ **Incorrect**:\n```typescript\nconst BASE_PATH = '/api/users';\n\n@RestController({ path: BASE_PATH })  // ❌ Dynamic path\nclass UserController {}\n```\n\n✅ **Correct**:\n```typescript\n@RestController({ path: '/api/users' })  // ✅ Static string literal\nclass UserController {}\n```\n\n### `@aiko-boot/require-rest-controller` (error)\n\nRequire `@RestController` decorator for classes with route mapping decorators.\n\n❌ **Incorrect**:\n```typescript\n// ❌ Missing @RestController\nclass UserController {\n  @GetMapping('/:id')\n  async getUser(id: number) {}\n}\n```\n\n✅ **Correct**:\n```typescript\n@RestController({ path: '/api/users' })  // ✅ Has @RestController\nclass UserController {\n  @GetMapping('/:id')\n  async getUser(id: number) {}\n}\n```\n\n## Configuration Presets\n\n### `plugin:@aiko-boot/recommended`\n\nRecommended rules for Java compatibility:\n- `no-arrow-methods`: error\n- `no-destructuring-in-methods`: error\n- `no-object-spread`: warn\n- `static-route-paths`: error\n- `require-rest-controller`: error\n\n### `plugin:@aiko-boot/strict`\n\nStrict mode (all rules as errors):\n- `no-arrow-methods`: error\n- `no-destructuring-in-methods`: error\n- `no-object-spread`: error (upgraded from warn)\n- `static-route-paths`: error\n- `require-rest-controller`: error\n\n## License\n\nMIT\n","readmeFilename":"README.md"}