tractatus/.eslintrc.json
TheFlow 2298d36bed fix(submissions): restructure Economist package and fix article display
- Create Economist SubmissionTracking package correctly:
  * mainArticle = full blog post content
  * coverLetter = 216-word SIR— letter
  * Links to blog post via blogPostId
- Archive 'Letter to The Economist' from blog posts (it's the cover letter)
- Fix date display on article cards (use published_at)
- Target publication already displaying via blue badge

Database changes:
- Make blogPostId optional in SubmissionTracking model
- Economist package ID: 68fa85ae49d4900e7f2ecd83
- Le Monde package ID: 68fa2abd2e6acd5691932150

Next: Enhanced modal with tabs, validation, export

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 08:47:42 +13:00

159 lines
3.5 KiB
JSON

{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
// ===================================
// inst_026: Client-Side Code Quality
// ===================================
// No console.log in production code (console.error allowed)
"no-console": ["error", {
"allow": ["error", "warn"]
}],
// Consistent code style
"quotes": ["error", "single", {
"avoidEscape": true,
"allowTemplateLiterals": true
}],
"semi": ["error", "always"],
"indent": ["error", 2, {
"SwitchCase": 1
}],
"comma-dangle": ["error", "never"],
// No unused variables (prevents dead code)
"no-unused-vars": ["error", {
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_"
}],
// Require let/const instead of var
"no-var": "error",
"prefer-const": "error",
// Arrow functions consistency
"arrow-spacing": ["error", {
"before": true,
"after": true
}],
"arrow-parens": ["error", "as-needed"],
// Best practices
"eqeqeq": ["error", "always"],
"no-eval": "error",
"no-implied-eval": "error",
"no-with": "error",
"no-new-func": "error",
// Security (XSS prevention)
"no-script-url": "error",
"no-alert": "warn",
// Code quality
"no-debugger": "error",
"no-empty": "error",
"no-extra-semi": "error",
"no-unreachable": "error",
"no-dupe-keys": "error",
// Spacing and formatting
"space-before-function-paren": ["error", {
"anonymous": "never",
"named": "never",
"asyncArrow": "always"
}],
"keyword-spacing": ["error", {
"before": true,
"after": true
}],
"space-infix-ops": "error",
"comma-spacing": ["error", {
"before": false,
"after": true
}],
"brace-style": ["error", "1tbs", {
"allowSingleLine": true
}],
// Modern JavaScript
"prefer-arrow-callback": "warn",
"prefer-template": "warn",
"object-shorthand": ["warn", "always"],
// Disable rules that conflict with Prettier (if used later)
"max-len": ["warn", {
"code": 120,
"ignoreUrls": true,
"ignoreStrings": true,
"ignoreTemplateLiterals": true
}]
},
"overrides": [
{
// Frontend JavaScript (public/js/**)
"files": ["public/js/**/*.js"],
"env": {
"browser": true,
"node": false
},
"globals": {
"fetch": "readonly",
"Headers": "readonly",
"Request": "readonly",
"Response": "readonly",
"URL": "readonly",
"URLSearchParams": "readonly"
},
"rules": {
// Stricter rules for client-side code
"no-console": ["error", {
"allow": ["error"]
}]
}
},
{
// Backend JavaScript (src/**)
"files": ["src/**/*.js"],
"env": {
"browser": false,
"node": true
},
"rules": {
// Allow console in backend code
"no-console": "off"
}
},
{
// Test files
"files": ["tests/**/*.js", "**/*.test.js", "**/*.spec.js"],
"env": {
"jest": true,
"node": true
},
"rules": {
// Relax rules for tests
"no-console": "off",
"no-unused-expressions": "off"
}
}
],
"ignorePatterns": [
"node_modules/",
"dist/",
"build/",
"coverage/",
".claude/",
"*.min.js"
]
}