@testgorilla/tgo-linting 2.1.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@testgorilla/tgo-linting",
3
- "version": "2.1.1",
3
+ "version": "3.0.0",
4
4
  "displayName": "TGO Linting",
5
5
  "description": "Linting rules and code quality standards for TestGorilla projects",
6
6
  "author": "TestGorilla",
@@ -24,9 +24,9 @@
24
24
  "registry": "https://registry.npmjs.org/"
25
25
  },
26
26
  "dependencies": {
27
- "@angular-eslint/eslint-plugin": "^19.8.0",
28
- "@angular-eslint/eslint-plugin-template": "^19.8.0",
29
- "@angular-eslint/template-parser": "^19.8.0",
27
+ "@angular-eslint/eslint-plugin": "^20.7.0",
28
+ "@angular-eslint/eslint-plugin-template": "^20.7.0",
29
+ "@angular-eslint/template-parser": "^20.7.0",
30
30
  "@typescript-eslint/utils": "^8.56.1",
31
31
  "eslint-config-prettier": "10.1.8",
32
32
  "eslint-import-resolver-typescript": "4.4.4",
@@ -111,7 +111,10 @@ function recommended(opts) {
111
111
  '@typescript-eslint/no-namespace': 'error',
112
112
  '@typescript-eslint/no-misused-new': 'error',
113
113
  '@typescript-eslint/no-empty-object-type': 'error',
114
- '@typescript-eslint/triple-slash-reference': ['error', { path: 'always', types: 'prefer-import', lib: 'always' }],
114
+ '@typescript-eslint/triple-slash-reference': [
115
+ 'error',
116
+ { path: 'always', types: 'prefer-import', lib: 'always' },
117
+ ],
115
118
  '@typescript-eslint/unified-signatures': 'error',
116
119
  '@typescript-eslint/prefer-function-type': 'error',
117
120
  '@typescript-eslint/prefer-namespace-keyword': 'error',
@@ -148,10 +151,24 @@ function recommended(opts) {
148
151
  // Naming convention — Angular-friendly, lenient. Land at warn, ratchet later.
149
152
  '@typescript-eslint/naming-convention': [
150
153
  'warn',
151
- { selector: 'default', format: ['camelCase'], leadingUnderscore: 'allow', trailingUnderscore: 'allow' },
152
- { selector: 'variable', format: ['camelCase', 'UPPER_CASE', 'PascalCase'], leadingUnderscore: 'allow' },
154
+ {
155
+ selector: 'default',
156
+ format: ['camelCase'],
157
+ leadingUnderscore: 'allow',
158
+ trailingUnderscore: 'allow',
159
+ },
160
+ {
161
+ selector: 'variable',
162
+ format: ['camelCase', 'UPPER_CASE', 'PascalCase'],
163
+ leadingUnderscore: 'allow',
164
+ },
153
165
  { selector: 'parameter', format: ['camelCase'], leadingUnderscore: 'allow' },
154
- { selector: 'memberLike', modifiers: ['private'], format: ['camelCase'], leadingUnderscore: 'allow' },
166
+ {
167
+ selector: 'memberLike',
168
+ modifiers: ['private'],
169
+ format: ['camelCase'],
170
+ leadingUnderscore: 'allow',
171
+ },
155
172
  { selector: 'typeLike', format: ['PascalCase'] },
156
173
  { selector: 'enumMember', format: ['PascalCase', 'UPPER_CASE'] },
157
174
  // API payloads commonly use snake_case — opt out of property naming entirely.
@@ -162,12 +179,30 @@ function recommended(opts) {
162
179
  'error',
163
180
  {
164
181
  types: {
165
- Object: { message: 'Avoid using the `Object` type. Did you mean `object`?', fixWith: 'object' },
166
- Function: { message: 'Avoid using the `Function` type. Prefer a specific function type.', fixWith: '() => void' },
167
- Boolean: { message: 'Avoid using the `Boolean` type. Did you mean `boolean`?', fixWith: 'boolean' },
168
- Number: { message: 'Avoid using the `Number` type. Did you mean `number`?', fixWith: 'number' },
169
- String: { message: 'Avoid using the `String` type. Did you mean `string`?', fixWith: 'string' },
170
- Symbol: { message: 'Avoid using the `Symbol` type. Did you mean `symbol`?', fixWith: 'symbol' },
182
+ Object: {
183
+ message: 'Avoid using the `Object` type. Did you mean `object`?',
184
+ fixWith: 'object',
185
+ },
186
+ Function: {
187
+ message: 'Avoid using the `Function` type. Prefer a specific function type.',
188
+ fixWith: '() => void',
189
+ },
190
+ Boolean: {
191
+ message: 'Avoid using the `Boolean` type. Did you mean `boolean`?',
192
+ fixWith: 'boolean',
193
+ },
194
+ Number: {
195
+ message: 'Avoid using the `Number` type. Did you mean `number`?',
196
+ fixWith: 'number',
197
+ },
198
+ String: {
199
+ message: 'Avoid using the `String` type. Did you mean `string`?',
200
+ fixWith: 'string',
201
+ },
202
+ Symbol: {
203
+ message: 'Avoid using the `Symbol` type. Did you mean `symbol`?',
204
+ fixWith: 'symbol',
205
+ },
171
206
  },
172
207
  },
173
208
  ],
@@ -175,10 +210,16 @@ function recommended(opts) {
175
210
  // Angular structural rules — error.
176
211
  // ══════════════════════════════════════════════════════════════════
177
212
  '@angular-eslint/component-class-suffix': 'error',
178
- '@angular-eslint/component-selector': ['error', { type: 'element', prefix: 'tgo', style: 'kebab-case' }],
213
+ '@angular-eslint/component-selector': [
214
+ 'error',
215
+ { type: 'element', prefix: 'tgo', style: 'kebab-case' },
216
+ ],
179
217
  '@angular-eslint/contextual-lifecycle': 'error',
180
218
  '@angular-eslint/directive-class-suffix': 'error',
181
- '@angular-eslint/directive-selector': ['error', { type: 'attribute', prefix: 'tgo', style: 'camelCase' }],
219
+ '@angular-eslint/directive-selector': [
220
+ 'error',
221
+ { type: 'attribute', prefix: 'tgo', style: 'camelCase' },
222
+ ],
182
223
  '@angular-eslint/no-conflicting-lifecycle': 'error',
183
224
  '@angular-eslint/no-input-rename': 'error',
184
225
  '@angular-eslint/no-inputs-metadata-property': 'error',
@@ -271,7 +312,18 @@ function recommended(opts) {
271
312
  'default-case-last': 'error',
272
313
  eqeqeq: ['error', 'always'],
273
314
  'guard-for-in': 'error',
274
- 'id-denylist': ['error', 'any', 'Number', 'number', 'String', 'string', 'Boolean', 'boolean', 'Undefined', 'undefined'],
315
+ 'id-denylist': [
316
+ 'error',
317
+ 'any',
318
+ 'Number',
319
+ 'number',
320
+ 'String',
321
+ 'string',
322
+ 'Boolean',
323
+ 'boolean',
324
+ 'Undefined',
325
+ 'undefined',
326
+ ],
275
327
  'max-classes-per-file': 'off',
276
328
  'max-depth': ['warn', 4],
277
329
  'max-nested-callbacks': ['warn', 3],
@@ -283,9 +335,24 @@ function recommended(opts) {
283
335
  'error',
284
336
  {
285
337
  allow: [
286
- 'warn', 'dir', 'timeLog', 'assert', 'clear', 'count', 'countReset', 'group', 'groupEnd',
287
- 'table', 'dirxml', 'error', 'groupCollapsed', 'Console', 'profile', 'profileEnd',
288
- 'timeStamp', 'context',
338
+ 'warn',
339
+ 'dir',
340
+ 'timeLog',
341
+ 'assert',
342
+ 'clear',
343
+ 'count',
344
+ 'countReset',
345
+ 'group',
346
+ 'groupEnd',
347
+ 'table',
348
+ 'dirxml',
349
+ 'error',
350
+ 'groupCollapsed',
351
+ 'Console',
352
+ 'profile',
353
+ 'profileEnd',
354
+ 'timeStamp',
355
+ 'context',
289
356
  ],
290
357
  },
291
358
  ],
@@ -303,7 +370,10 @@ function recommended(opts) {
303
370
  {
304
371
  paths: [
305
372
  { name: 'rxjs/Rx', message: 'Use the rxjs barrel (`rxjs`) instead.' },
306
- { name: 'lodash', message: 'Import per-method from lodash (e.g., `lodash/cloneDeep`) for tree-shaking.' },
373
+ {
374
+ name: 'lodash',
375
+ message: 'Import per-method from lodash (e.g., `lodash/cloneDeep`) for tree-shaking.',
376
+ },
307
377
  { name: 'moment', message: 'Use date-fns (already a project dep).' },
308
378
  ],
309
379
  },
@@ -313,7 +383,7 @@ function recommended(opts) {
313
383
  'no-restricted-syntax': [
314
384
  'error',
315
385
  {
316
- selector: "CallExpression[callee.property.name=/^bypassSecurityTrust(Html|Script|Url|ResourceUrl|Style)$/]",
386
+ selector: 'CallExpression[callee.property.name=/^bypassSecurityTrust(Html|Script|Url|ResourceUrl|Style)$/]',
317
387
  message: 'Use the bypass-sanitization-{html,url}.pipe.ts wrappers in src/@testgorilla/pipes instead of calling DomSanitizer.bypassSecurityTrust* directly. If a TS-side bypass is genuinely required, add an inline eslint-disable-next-line with a SECURITY comment explaining why.',
318
388
  },
319
389
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../../../../packages/tgo-linting/src/configs/recommended.ts"],"names":[],"mappings":"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","sourcesContent":["import angular from '@angular-eslint/eslint-plugin'\nimport angularTemplate from '@angular-eslint/eslint-plugin-template'\n// `@angular-eslint/template-parser` is a TypeScript-compiled ES module with\n// `__esModule: true` and only named exports — there is no `default`. A default\n// import via `__importDefault` resolves to `undefined`, silently dropping the\n// parser and letting ESLint fall back to espree (parser errors on every `.html`).\n// Namespace import preserves the parse/parseForESLint functions ESLint expects.\nimport * as angularTemplateParser from '@angular-eslint/template-parser'\nimport prettierConfig from 'eslint-config-prettier'\nimport importX from 'eslint-plugin-import-x'\nimport jsdoc from 'eslint-plugin-jsdoc'\nimport noUnsanitized from 'eslint-plugin-no-unsanitized'\nimport rxjsX from 'eslint-plugin-rxjs-x'\nimport security from 'eslint-plugin-security'\nimport tseslint, { type ConfigArray } from 'typescript-eslint'\n\nimport { tgoPlugin } from '../plugin'\n\n// `tseslint.configs.recommended` etc. are arrays of mixed config objects\n// (some carry `name`, some carry `rules`, etc.). Flatten their rule maps via\n// reduce; cast the result to a permissive record so the spread into the\n// strongly-typed `rules` block below doesn't leak unrelated config keys.\ntype RulesRecord = Record<string, unknown>\n\nconst tseslintRecommended = tseslint.configs.recommended.reduce<RulesRecord>(\n (acc, cfg) => ({ ...acc, ...(cfg.rules ?? {}) }),\n {},\n)\nconst tseslintRecommendedTypeChecked = tseslint.configs.recommendedTypeChecked.reduce<RulesRecord>(\n (acc, cfg) => ({ ...acc, ...(cfg.rules ?? {}) }),\n {},\n)\n\nexport interface RecommendedOptions {\n /** Absolute path to the consumer repo root. Pass `import.meta.dirname`. */\n tsconfigRootDir: string\n /** tsconfig path (relative to tsconfigRootDir). Default: 'tsconfig.json'. */\n project?: string\n /** Glob for source TS files. Default: ['src/**\\/*.ts']. */\n tsFiles?: string[]\n /** Glob for HTML templates. Default: ['src/**\\/*.html']. */\n htmlFiles?: string[]\n /** Glob for spec files (relaxations applied). Default: ['src/**\\/*.spec.ts', 'src/**\\/*.integration.spec.ts']. */\n specFiles?: string[]\n}\n\n/**\n * Strict default ESLint flat-config preset for TGO Angular frontends.\n *\n * Type-aware rules (no-unsafe-*, restrict-*, no-floating-promises, etc.) are\n * kept at `warn` until consumer tsconfig moves to TS strict. Ratchet to error\n * after the strict tsconfig migration (Phase 1, Workstream 3).\n */\nexport function recommended(opts: RecommendedOptions): ConfigArray {\n const {\n tsconfigRootDir,\n project = 'tsconfig.json',\n tsFiles = ['src/**/*.ts'],\n htmlFiles = ['src/**/*.html'],\n specFiles = ['src/**/*.spec.ts', 'src/**/*.integration.spec.ts'],\n } = opts\n\n return tseslint.config(\n // ── TypeScript files (*.ts) ──────────────────────────────────────────\n {\n files: tsFiles,\n languageOptions: {\n parser: tseslint.parser,\n parserOptions: {\n project,\n tsconfigRootDir,\n sourceType: 'module',\n },\n },\n settings: {\n 'import-x/resolver': {\n typescript: { project },\n node: true,\n },\n },\n plugins: {\n '@typescript-eslint': tseslint.plugin,\n '@angular-eslint': angular,\n 'import-x': importX,\n jsdoc,\n 'no-unsanitized': noUnsanitized,\n security,\n 'rxjs-x': rxjsX,\n },\n rules: {\n // Spread recommended + recommendedTypeChecked, then disable ESLint formatting\n // rules that conflict with Prettier. Prettier runs separately in consumer\n // pipelines (pre-commit / lint-staged / CI), not as an ESLint rule.\n ...tseslintRecommended,\n ...tseslintRecommendedTypeChecked,\n ...prettierConfig.rules,\n\n // ══════════════════════════════════════════════════════════════════\n // Type-aware rules — DEFERRED at warn until TS strict lands.\n // Cleanup PRs ratchet these to error after tsconfig.json gets `strict: true`.\n // ══════════════════════════════════════════════════════════════════\n '@typescript-eslint/no-unused-vars': 'warn',\n '@typescript-eslint/no-unsafe-assignment': 'warn',\n '@typescript-eslint/no-unsafe-call': 'warn',\n '@typescript-eslint/no-unsafe-member-access': 'warn',\n '@typescript-eslint/no-unsafe-return': 'warn',\n '@typescript-eslint/no-unsafe-argument': 'warn',\n '@typescript-eslint/no-unsafe-enum-comparison': 'warn',\n '@typescript-eslint/no-unsafe-unary-minus': 'warn',\n '@typescript-eslint/no-floating-promises': 'warn',\n '@typescript-eslint/no-misused-promises': 'warn',\n '@typescript-eslint/await-thenable': 'warn',\n '@typescript-eslint/only-throw-error': 'warn',\n '@typescript-eslint/prefer-promise-reject-errors': 'warn',\n '@typescript-eslint/require-await': 'warn',\n '@typescript-eslint/return-await': ['warn', 'in-try-catch'],\n '@typescript-eslint/no-base-to-string': 'warn',\n '@typescript-eslint/restrict-template-expressions': 'warn',\n '@typescript-eslint/restrict-plus-operands': 'warn',\n '@typescript-eslint/no-unnecessary-type-assertion': 'warn',\n '@typescript-eslint/no-redundant-type-constituents': 'warn',\n '@typescript-eslint/no-deprecated': 'warn',\n '@typescript-eslint/no-meaningless-void-operator': 'warn',\n '@typescript-eslint/prefer-readonly': 'warn',\n '@typescript-eslint/prefer-nullish-coalescing': 'warn',\n '@typescript-eslint/prefer-optional-chain': 'warn',\n '@typescript-eslint/prefer-includes': 'warn',\n '@typescript-eslint/prefer-string-starts-ends-with': 'warn',\n '@typescript-eslint/prefer-literal-enum-member': 'warn',\n '@typescript-eslint/no-mixed-enums': 'warn',\n '@typescript-eslint/switch-exhaustiveness-check': 'warn',\n '@typescript-eslint/use-unknown-in-catch-callback-variable': 'warn',\n '@typescript-eslint/unbound-method': 'warn',\n '@typescript-eslint/no-wrapper-object-types': 'warn',\n '@typescript-eslint/no-unsafe-function-type': 'off',\n 'dot-notation': 'off',\n '@typescript-eslint/dot-notation': ['warn', { allowIndexSignaturePropertyAccess: true }],\n\n // ══════════════════════════════════════════════════════════════════\n // Type-aware rules at error — purely syntactic, safe without TS strict.\n // ══════════════════════════════════════════════════════════════════\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/no-non-null-assertion': 'error',\n '@typescript-eslint/no-namespace': 'error',\n '@typescript-eslint/no-misused-new': 'error',\n '@typescript-eslint/no-empty-object-type': 'error',\n '@typescript-eslint/triple-slash-reference': ['error', { path: 'always', types: 'prefer-import', lib: 'always' }],\n '@typescript-eslint/unified-signatures': 'error',\n '@typescript-eslint/prefer-function-type': 'error',\n '@typescript-eslint/prefer-namespace-keyword': 'error',\n '@typescript-eslint/prefer-for-of': 'error',\n '@typescript-eslint/adjacent-overload-signatures': 'error',\n '@typescript-eslint/consistent-type-assertions': 'error',\n '@typescript-eslint/no-inferrable-types': ['error', { ignoreParameters: true }],\n '@typescript-eslint/no-shadow': ['error', { hoist: 'all' }],\n '@typescript-eslint/no-unused-expressions': 'error',\n '@typescript-eslint/no-this-alias': 'error',\n '@typescript-eslint/no-for-in-array': 'error',\n '@typescript-eslint/ban-ts-comment': 'error',\n // consistent-type-imports — disabled preset-wide. The rule is not\n // Angular-aware: it converts constructor-injected service imports to\n // `import type { X }`, which then fails the Angular AOT compiler with\n // TS-992003 (\"No suitable injection token\") because Angular reads the\n // parameter type as a runtime DI token. The escape is one\n // `eslint-disable-next-line` comment per DI import, which scales with\n // the number of constructor-injected services in the codebase. Off\n // until either (a) consumer codebases migrate from constructor DI to\n // `inject()` everywhere — at which point the rule becomes safe and\n // valuable — or (b) we adopt a typescript-eslint variant that\n // recognises Angular DI sites.\n '@typescript-eslint/consistent-type-imports': 'off',\n '@typescript-eslint/no-import-type-side-effects': 'error',\n\n // High-friction rules — explicitly off (see plan rationale).\n '@typescript-eslint/explicit-function-return-type': 'off',\n '@typescript-eslint/no-empty-function': 'off',\n '@typescript-eslint/no-use-before-define': 'off',\n '@typescript-eslint/no-require-imports': 'off',\n '@typescript-eslint/array-type': 'off',\n '@typescript-eslint/parameter-properties': 'off',\n '@typescript-eslint/explicit-member-accessibility': ['off', { accessibility: 'explicit' }],\n\n // Naming convention — Angular-friendly, lenient. Land at warn, ratchet later.\n '@typescript-eslint/naming-convention': [\n 'warn',\n { selector: 'default', format: ['camelCase'], leadingUnderscore: 'allow', trailingUnderscore: 'allow' },\n { selector: 'variable', format: ['camelCase', 'UPPER_CASE', 'PascalCase'], leadingUnderscore: 'allow' },\n { selector: 'parameter', format: ['camelCase'], leadingUnderscore: 'allow' },\n { selector: 'memberLike', modifiers: ['private'], format: ['camelCase'], leadingUnderscore: 'allow' },\n { selector: 'typeLike', format: ['PascalCase'] },\n { selector: 'enumMember', format: ['PascalCase', 'UPPER_CASE'] },\n // API payloads commonly use snake_case — opt out of property naming entirely.\n { selector: 'objectLiteralProperty', format: null },\n { selector: 'import', format: null },\n ],\n\n '@typescript-eslint/no-restricted-types': [\n 'error',\n {\n types: {\n Object: { message: 'Avoid using the `Object` type. Did you mean `object`?', fixWith: 'object' },\n Function: { message: 'Avoid using the `Function` type. Prefer a specific function type.', fixWith: '() => void' },\n Boolean: { message: 'Avoid using the `Boolean` type. Did you mean `boolean`?', fixWith: 'boolean' },\n Number: { message: 'Avoid using the `Number` type. Did you mean `number`?', fixWith: 'number' },\n String: { message: 'Avoid using the `String` type. Did you mean `string`?', fixWith: 'string' },\n Symbol: { message: 'Avoid using the `Symbol` type. Did you mean `symbol`?', fixWith: 'symbol' },\n },\n },\n ],\n\n // ══════════════════════════════════════════════════════════════════\n // Angular structural rules — error.\n // ══════════════════════════════════════════════════════════════════\n '@angular-eslint/component-class-suffix': 'error',\n '@angular-eslint/component-selector': ['error', { type: 'element', prefix: 'tgo', style: 'kebab-case' }],\n '@angular-eslint/contextual-lifecycle': 'error',\n '@angular-eslint/directive-class-suffix': 'error',\n '@angular-eslint/directive-selector': ['error', { type: 'attribute', prefix: 'tgo', style: 'camelCase' }],\n '@angular-eslint/no-conflicting-lifecycle': 'error',\n '@angular-eslint/no-input-rename': 'error',\n '@angular-eslint/no-inputs-metadata-property': 'error',\n '@angular-eslint/no-output-native': 'error',\n '@angular-eslint/no-output-on-prefix': 'error',\n '@angular-eslint/no-output-rename': 'error',\n '@angular-eslint/no-outputs-metadata-property': 'error',\n '@angular-eslint/use-lifecycle-interface': 'error',\n '@angular-eslint/use-pipe-transform-interface': 'error',\n '@angular-eslint/prefer-standalone': 'error',\n '@angular-eslint/prefer-on-push-component-change-detection': 'error',\n '@angular-eslint/use-component-view-encapsulation': 'error',\n '@angular-eslint/no-queries-metadata-property': 'error',\n '@angular-eslint/no-duplicates-in-metadata-arrays': 'error',\n '@angular-eslint/no-async-lifecycle-method': 'error',\n '@angular-eslint/no-empty-lifecycle-method': 'error',\n\n // ══════════════════════════════════════════════════════════════════\n // Import discipline (eslint-plugin-import-x).\n // ══════════════════════════════════════════════════════════════════\n // PERF NOTE — full-repo lint with this rule enabled costs ~+45s wall and ~+1 GB peak RSS\n // (measured: 92.8s / 3.38 GB OFF vs 138.6s / 4.44 GB ON across 2,337 files). It walks the\n // full import graph and finds zero violations today. Kept active to preserve the rule as\n // part of the canonical rule set; revisit moving it to OXLint's fast path as part of the\n // toolchain decision (Phase 1, Workstream 1) rather than disabling.\n 'import-x/no-self-import': 'error',\n 'import-x/no-duplicates': 'error',\n // PERF NOTE — TIMING profile shows this rule at 64-75% of total rule execution time\n // (~1.1-1.3s per file). It walks every import looking for @deprecated JSDoc tags and\n // currently reports zero violations. Type-aware; ratchets to error with the rest of the\n // type-aware family after TS strict lands. Kept at warn rather than off so the rule stays\n // part of the canonical rule set; revisit migrating to OXLint's fast path with Workstream 1.\n 'import-x/no-deprecated': 'warn',\n 'import-x/no-relative-packages': 'error',\n 'import-x/no-mutable-exports': 'error',\n 'import-x/no-extraneous-dependencies': 'error',\n // Consumers carve out routing/lazy/config/stories paths.\n 'import-x/no-default-export': 'error',\n 'import-x/order': [\n 'error',\n {\n groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'type'],\n 'newlines-between': 'always',\n alphabetize: { order: 'asc', caseInsensitive: true },\n },\n ],\n\n // ══════════════════════════════════════════════════════════════════\n // JSDoc.\n // ══════════════════════════════════════════════════════════════════\n 'jsdoc/check-alignment': 'error',\n\n // ══════════════════════════════════════════════════════════════════\n // Security: XSS guards (no-unsanitized).\n // ══════════════════════════════════════════════════════════════════\n 'no-unsanitized/method': 'error',\n 'no-unsanitized/property': 'error',\n\n // ══════════════════════════════════════════════════════════════════\n // Security: cherry-picked from eslint-plugin-security.\n // Most rules in this plugin are Node-specific and noisy in browser code; only the\n // browser-relevant detectors are enabled. Plugin defaults explicitly turned off below.\n // ══════════════════════════════════════════════════════════════════\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-unsafe-regex': 'error',\n 'security/detect-bidi-characters': 'error', // CVE-2021-42574 trojan-source guard.\n 'security/detect-non-literal-regexp': 'off',\n 'security/detect-pseudoRandomBytes': 'off',\n 'security/detect-non-literal-require': 'off',\n 'security/detect-non-literal-fs-filename': 'off',\n 'security/detect-object-injection': 'off',\n 'security/detect-buffer-noassert': 'off',\n 'security/detect-child-process': 'off',\n 'security/detect-disable-mustache-escape': 'off',\n 'security/detect-new-buffer': 'off',\n 'security/detect-no-csrf-before-method-override': 'off',\n 'security/detect-possible-timing-attacks': 'off',\n\n // ══════════════════════════════════════════════════════════════════\n // RxJS hygiene (eslint-plugin-rxjs-x).\n // Some rules use type info; land at warn until TS strict, ratchet after.\n // ══════════════════════════════════════════════════════════════════\n 'rxjs-x/no-async-subscribe': 'warn',\n 'rxjs-x/no-implicit-any-catch': 'warn',\n 'rxjs-x/no-nested-subscribe': 'warn',\n 'rxjs-x/no-unsafe-takeuntil': 'warn',\n 'rxjs-x/no-ignored-subscription': 'warn',\n\n // ══════════════════════════════════════════════════════════════════\n // Core ESLint — error.\n // ══════════════════════════════════════════════════════════════════\n 'arrow-body-style': 'error',\n complexity: ['warn', 15],\n 'constructor-super': 'error',\n curly: 'error',\n 'default-case-last': 'error',\n eqeqeq: ['error', 'always'],\n 'guard-for-in': 'error',\n 'id-denylist': ['error', 'any', 'Number', 'number', 'String', 'string', 'Boolean', 'boolean', 'Undefined', 'undefined'],\n 'max-classes-per-file': 'off',\n 'max-depth': ['warn', 4],\n 'max-nested-callbacks': ['warn', 3],\n 'max-params': ['warn', 5],\n 'no-bitwise': 'error',\n 'no-caller': 'error',\n 'no-cond-assign': 'error',\n 'no-console': [\n 'error',\n {\n allow: [\n 'warn', 'dir', 'timeLog', 'assert', 'clear', 'count', 'countReset', 'group', 'groupEnd',\n 'table', 'dirxml', 'error', 'groupCollapsed', 'Console', 'profile', 'profileEnd',\n 'timeStamp', 'context',\n ],\n },\n ],\n 'no-debugger': 'error',\n 'no-empty': 'off',\n 'no-empty-function': 'off',\n 'no-eval': 'error',\n 'no-fallthrough': 'error',\n 'no-implicit-coercion': 'error',\n 'no-invalid-this': 'off',\n 'no-new-wrappers': 'error',\n 'no-param-reassign': 'error',\n 'no-restricted-imports': [\n 'error',\n {\n paths: [\n { name: 'rxjs/Rx', message: 'Use the rxjs barrel (`rxjs`) instead.' },\n { name: 'lodash', message: 'Import per-method from lodash (e.g., `lodash/cloneDeep`) for tree-shaking.' },\n { name: 'moment', message: 'Use date-fns (already a project dep).' },\n ],\n },\n ],\n // Block direct DomSanitizer.bypassSecurityTrust* calls — production callers should use\n // sanitization wrapper pipes. Consumers carve out the wrappers themselves.\n 'no-restricted-syntax': [\n 'error',\n {\n selector: \"CallExpression[callee.property.name=/^bypassSecurityTrust(Html|Script|Url|ResourceUrl|Style)$/]\",\n message: 'Use the bypass-sanitization-{html,url}.pipe.ts wrappers in src/@testgorilla/pipes instead of calling DomSanitizer.bypassSecurityTrust* directly. If a TS-side bypass is genuinely required, add an inline eslint-disable-next-line with a SECURITY comment explaining why.',\n },\n ],\n 'no-script-url': 'error',\n 'no-template-curly-in-string': 'error',\n 'no-throw-literal': 'error',\n 'no-undef-init': 'error',\n 'no-underscore-dangle': ['error', { allow: ['_state'], allowAfterThis: true }],\n 'no-unsafe-finally': 'error',\n 'no-unused-labels': 'error',\n 'no-use-before-define': 'off',\n 'no-useless-concat': 'error',\n 'no-useless-return': 'error',\n 'no-var': 'error',\n 'object-shorthand': 'error',\n 'one-var': ['error', 'never'],\n 'prefer-arrow-callback': 'error',\n 'prefer-const': 'error',\n 'prefer-object-spread': 'error',\n 'prefer-template': 'error',\n 'quote-props': ['error', 'as-needed'],\n radix: 'error',\n 'use-isnan': 'error',\n yoda: 'error',\n\n // ── Off — Prettier owns formatting. eslint-config-prettier disables most of these;\n // listing explicitly overrides any preset that re-enables them.\n 'arrow-parens': 'off',\n 'brace-style': 'off',\n 'comma-dangle': 'off',\n 'eol-last': 'off',\n 'linebreak-style': 'off',\n 'max-len': 'off',\n 'new-parens': 'off',\n 'newline-per-chained-call': 'off',\n 'no-extra-semi': 'off',\n 'no-irregular-whitespace': 'off',\n 'no-multiple-empty-lines': 'off',\n 'no-trailing-spaces': 'off',\n 'padded-blocks': 'off',\n quotes: 'off',\n semi: 'off',\n 'space-in-parens': 'off',\n },\n },\n\n // ── HTML template files (*.html) ─────────────────────────────────────\n // a11y rule set is deferred to a separate workstream.\n {\n files: htmlFiles,\n languageOptions: {\n parser: angularTemplateParser,\n },\n plugins: {\n '@angular-eslint/template': angularTemplate,\n tgo: tgoPlugin,\n },\n rules: {\n ...(angularTemplate.configs.recommended.rules as RulesRecord),\n 'tgo/require-data-testid': 'error',\n '@angular-eslint/template/prefer-control-flow': 'error',\n },\n },\n\n // ── Spec files (*.spec.ts, *.integration.spec.ts) — relax type/style rules ──\n {\n files: specFiles,\n rules: {\n '@typescript-eslint/unbound-method': 'off',\n '@typescript-eslint/no-unsafe-call': 'off',\n '@typescript-eslint/no-unsafe-member-access': 'off',\n '@typescript-eslint/no-unsafe-assignment': 'off',\n '@typescript-eslint/no-unsafe-return': 'off',\n '@typescript-eslint/no-unsafe-argument': 'off',\n '@typescript-eslint/no-explicit-any': 'off',\n '@typescript-eslint/naming-convention': 'off',\n 'max-params': 'off',\n 'max-nested-callbacks': 'off',\n },\n },\n\n // ── JS files ─────────────────────────────────────────────────────────\n {\n files: ['**/*.js'],\n languageOptions: {\n ecmaVersion: 2020,\n sourceType: 'module',\n },\n rules: {\n '@typescript-eslint/no-require-imports': 'off',\n },\n },\n )\n}\n"]}
1
+ {"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../../../../packages/tgo-linting/src/configs/recommended.ts"],"names":[],"mappings":"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","sourcesContent":["import angular from '@angular-eslint/eslint-plugin';\nimport angularTemplate from '@angular-eslint/eslint-plugin-template';\n// `@angular-eslint/template-parser` is a TypeScript-compiled ES module with\n// `__esModule: true` and only named exports — there is no `default`. A default\n// import via `__importDefault` resolves to `undefined`, silently dropping the\n// parser and letting ESLint fall back to espree (parser errors on every `.html`).\n// Namespace import preserves the parse/parseForESLint functions ESLint expects.\nimport * as angularTemplateParser from '@angular-eslint/template-parser';\nimport prettierConfig from 'eslint-config-prettier';\nimport importX from 'eslint-plugin-import-x';\nimport jsdoc from 'eslint-plugin-jsdoc';\nimport noUnsanitized from 'eslint-plugin-no-unsanitized';\nimport rxjsX from 'eslint-plugin-rxjs-x';\nimport security from 'eslint-plugin-security';\nimport tseslint, { type ConfigArray } from 'typescript-eslint';\n\nimport { tgoPlugin } from '../plugin';\n\n// `tseslint.configs.recommended` etc. are arrays of mixed config objects\n// (some carry `name`, some carry `rules`, etc.). Flatten their rule maps via\n// reduce; cast the result to a permissive record so the spread into the\n// strongly-typed `rules` block below doesn't leak unrelated config keys.\ntype RulesRecord = Record<string, unknown>;\n\nconst tseslintRecommended = tseslint.configs.recommended.reduce<RulesRecord>(\n (acc, cfg) => ({ ...acc, ...(cfg.rules ?? {}) }),\n {}\n);\nconst tseslintRecommendedTypeChecked = tseslint.configs.recommendedTypeChecked.reduce<RulesRecord>(\n (acc, cfg) => ({ ...acc, ...(cfg.rules ?? {}) }),\n {}\n);\n\nexport interface RecommendedOptions {\n /** Absolute path to the consumer repo root. Pass `import.meta.dirname`. */\n tsconfigRootDir: string;\n /** tsconfig path (relative to tsconfigRootDir). Default: 'tsconfig.json'. */\n project?: string;\n /** Glob for source TS files. Default: ['src/**\\/*.ts']. */\n tsFiles?: string[];\n /** Glob for HTML templates. Default: ['src/**\\/*.html']. */\n htmlFiles?: string[];\n /** Glob for spec files (relaxations applied). Default: ['src/**\\/*.spec.ts', 'src/**\\/*.integration.spec.ts']. */\n specFiles?: string[];\n}\n\n/**\n * Strict default ESLint flat-config preset for TGO Angular frontends.\n *\n * Type-aware rules (no-unsafe-*, restrict-*, no-floating-promises, etc.) are\n * kept at `warn` until consumer tsconfig moves to TS strict. Ratchet to error\n * after the strict tsconfig migration (Phase 1, Workstream 3).\n */\nexport function recommended(opts: RecommendedOptions): ConfigArray {\n const {\n tsconfigRootDir,\n project = 'tsconfig.json',\n tsFiles = ['src/**/*.ts'],\n htmlFiles = ['src/**/*.html'],\n specFiles = ['src/**/*.spec.ts', 'src/**/*.integration.spec.ts'],\n } = opts;\n\n return tseslint.config(\n // ── TypeScript files (*.ts) ──────────────────────────────────────────\n {\n files: tsFiles,\n languageOptions: {\n parser: tseslint.parser,\n parserOptions: {\n project,\n tsconfigRootDir,\n sourceType: 'module',\n },\n },\n settings: {\n 'import-x/resolver': {\n typescript: { project },\n node: true,\n },\n },\n plugins: {\n '@typescript-eslint': tseslint.plugin,\n '@angular-eslint': angular,\n 'import-x': importX,\n jsdoc,\n 'no-unsanitized': noUnsanitized,\n security,\n 'rxjs-x': rxjsX,\n },\n rules: {\n // Spread recommended + recommendedTypeChecked, then disable ESLint formatting\n // rules that conflict with Prettier. Prettier runs separately in consumer\n // pipelines (pre-commit / lint-staged / CI), not as an ESLint rule.\n ...tseslintRecommended,\n ...tseslintRecommendedTypeChecked,\n ...prettierConfig.rules,\n\n // ══════════════════════════════════════════════════════════════════\n // Type-aware rules — DEFERRED at warn until TS strict lands.\n // Cleanup PRs ratchet these to error after tsconfig.json gets `strict: true`.\n // ══════════════════════════════════════════════════════════════════\n '@typescript-eslint/no-unused-vars': 'warn',\n '@typescript-eslint/no-unsafe-assignment': 'warn',\n '@typescript-eslint/no-unsafe-call': 'warn',\n '@typescript-eslint/no-unsafe-member-access': 'warn',\n '@typescript-eslint/no-unsafe-return': 'warn',\n '@typescript-eslint/no-unsafe-argument': 'warn',\n '@typescript-eslint/no-unsafe-enum-comparison': 'warn',\n '@typescript-eslint/no-unsafe-unary-minus': 'warn',\n '@typescript-eslint/no-floating-promises': 'warn',\n '@typescript-eslint/no-misused-promises': 'warn',\n '@typescript-eslint/await-thenable': 'warn',\n '@typescript-eslint/only-throw-error': 'warn',\n '@typescript-eslint/prefer-promise-reject-errors': 'warn',\n '@typescript-eslint/require-await': 'warn',\n '@typescript-eslint/return-await': ['warn', 'in-try-catch'],\n '@typescript-eslint/no-base-to-string': 'warn',\n '@typescript-eslint/restrict-template-expressions': 'warn',\n '@typescript-eslint/restrict-plus-operands': 'warn',\n '@typescript-eslint/no-unnecessary-type-assertion': 'warn',\n '@typescript-eslint/no-redundant-type-constituents': 'warn',\n '@typescript-eslint/no-deprecated': 'warn',\n '@typescript-eslint/no-meaningless-void-operator': 'warn',\n '@typescript-eslint/prefer-readonly': 'warn',\n '@typescript-eslint/prefer-nullish-coalescing': 'warn',\n '@typescript-eslint/prefer-optional-chain': 'warn',\n '@typescript-eslint/prefer-includes': 'warn',\n '@typescript-eslint/prefer-string-starts-ends-with': 'warn',\n '@typescript-eslint/prefer-literal-enum-member': 'warn',\n '@typescript-eslint/no-mixed-enums': 'warn',\n '@typescript-eslint/switch-exhaustiveness-check': 'warn',\n '@typescript-eslint/use-unknown-in-catch-callback-variable': 'warn',\n '@typescript-eslint/unbound-method': 'warn',\n '@typescript-eslint/no-wrapper-object-types': 'warn',\n '@typescript-eslint/no-unsafe-function-type': 'off',\n 'dot-notation': 'off',\n '@typescript-eslint/dot-notation': ['warn', { allowIndexSignaturePropertyAccess: true }],\n\n // ══════════════════════════════════════════════════════════════════\n // Type-aware rules at error — purely syntactic, safe without TS strict.\n // ══════════════════════════════════════════════════════════════════\n '@typescript-eslint/no-explicit-any': 'error',\n '@typescript-eslint/no-non-null-assertion': 'error',\n '@typescript-eslint/no-namespace': 'error',\n '@typescript-eslint/no-misused-new': 'error',\n '@typescript-eslint/no-empty-object-type': 'error',\n '@typescript-eslint/triple-slash-reference': [\n 'error',\n { path: 'always', types: 'prefer-import', lib: 'always' },\n ],\n '@typescript-eslint/unified-signatures': 'error',\n '@typescript-eslint/prefer-function-type': 'error',\n '@typescript-eslint/prefer-namespace-keyword': 'error',\n '@typescript-eslint/prefer-for-of': 'error',\n '@typescript-eslint/adjacent-overload-signatures': 'error',\n '@typescript-eslint/consistent-type-assertions': 'error',\n '@typescript-eslint/no-inferrable-types': ['error', { ignoreParameters: true }],\n '@typescript-eslint/no-shadow': ['error', { hoist: 'all' }],\n '@typescript-eslint/no-unused-expressions': 'error',\n '@typescript-eslint/no-this-alias': 'error',\n '@typescript-eslint/no-for-in-array': 'error',\n '@typescript-eslint/ban-ts-comment': 'error',\n // consistent-type-imports — disabled preset-wide. The rule is not\n // Angular-aware: it converts constructor-injected service imports to\n // `import type { X }`, which then fails the Angular AOT compiler with\n // TS-992003 (\"No suitable injection token\") because Angular reads the\n // parameter type as a runtime DI token. The escape is one\n // `eslint-disable-next-line` comment per DI import, which scales with\n // the number of constructor-injected services in the codebase. Off\n // until either (a) consumer codebases migrate from constructor DI to\n // `inject()` everywhere — at which point the rule becomes safe and\n // valuable — or (b) we adopt a typescript-eslint variant that\n // recognises Angular DI sites.\n '@typescript-eslint/consistent-type-imports': 'off',\n '@typescript-eslint/no-import-type-side-effects': 'error',\n\n // High-friction rules — explicitly off (see plan rationale).\n '@typescript-eslint/explicit-function-return-type': 'off',\n '@typescript-eslint/no-empty-function': 'off',\n '@typescript-eslint/no-use-before-define': 'off',\n '@typescript-eslint/no-require-imports': 'off',\n '@typescript-eslint/array-type': 'off',\n '@typescript-eslint/parameter-properties': 'off',\n '@typescript-eslint/explicit-member-accessibility': ['off', { accessibility: 'explicit' }],\n\n // Naming convention — Angular-friendly, lenient. Land at warn, ratchet later.\n '@typescript-eslint/naming-convention': [\n 'warn',\n {\n selector: 'default',\n format: ['camelCase'],\n leadingUnderscore: 'allow',\n trailingUnderscore: 'allow',\n },\n {\n selector: 'variable',\n format: ['camelCase', 'UPPER_CASE', 'PascalCase'],\n leadingUnderscore: 'allow',\n },\n { selector: 'parameter', format: ['camelCase'], leadingUnderscore: 'allow' },\n {\n selector: 'memberLike',\n modifiers: ['private'],\n format: ['camelCase'],\n leadingUnderscore: 'allow',\n },\n { selector: 'typeLike', format: ['PascalCase'] },\n { selector: 'enumMember', format: ['PascalCase', 'UPPER_CASE'] },\n // API payloads commonly use snake_case — opt out of property naming entirely.\n { selector: 'objectLiteralProperty', format: null },\n { selector: 'import', format: null },\n ],\n\n '@typescript-eslint/no-restricted-types': [\n 'error',\n {\n types: {\n Object: {\n message: 'Avoid using the `Object` type. Did you mean `object`?',\n fixWith: 'object',\n },\n Function: {\n message: 'Avoid using the `Function` type. Prefer a specific function type.',\n fixWith: '() => void',\n },\n Boolean: {\n message: 'Avoid using the `Boolean` type. Did you mean `boolean`?',\n fixWith: 'boolean',\n },\n Number: {\n message: 'Avoid using the `Number` type. Did you mean `number`?',\n fixWith: 'number',\n },\n String: {\n message: 'Avoid using the `String` type. Did you mean `string`?',\n fixWith: 'string',\n },\n Symbol: {\n message: 'Avoid using the `Symbol` type. Did you mean `symbol`?',\n fixWith: 'symbol',\n },\n },\n },\n ],\n\n // ══════════════════════════════════════════════════════════════════\n // Angular structural rules — error.\n // ══════════════════════════════════════════════════════════════════\n '@angular-eslint/component-class-suffix': 'error',\n '@angular-eslint/component-selector': [\n 'error',\n { type: 'element', prefix: 'tgo', style: 'kebab-case' },\n ],\n '@angular-eslint/contextual-lifecycle': 'error',\n '@angular-eslint/directive-class-suffix': 'error',\n '@angular-eslint/directive-selector': [\n 'error',\n { type: 'attribute', prefix: 'tgo', style: 'camelCase' },\n ],\n '@angular-eslint/no-conflicting-lifecycle': 'error',\n '@angular-eslint/no-input-rename': 'error',\n '@angular-eslint/no-inputs-metadata-property': 'error',\n '@angular-eslint/no-output-native': 'error',\n '@angular-eslint/no-output-on-prefix': 'error',\n '@angular-eslint/no-output-rename': 'error',\n '@angular-eslint/no-outputs-metadata-property': 'error',\n '@angular-eslint/use-lifecycle-interface': 'error',\n '@angular-eslint/use-pipe-transform-interface': 'error',\n '@angular-eslint/prefer-standalone': 'error',\n '@angular-eslint/prefer-on-push-component-change-detection': 'error',\n '@angular-eslint/use-component-view-encapsulation': 'error',\n '@angular-eslint/no-queries-metadata-property': 'error',\n '@angular-eslint/no-duplicates-in-metadata-arrays': 'error',\n '@angular-eslint/no-async-lifecycle-method': 'error',\n '@angular-eslint/no-empty-lifecycle-method': 'error',\n\n // ══════════════════════════════════════════════════════════════════\n // Import discipline (eslint-plugin-import-x).\n // ══════════════════════════════════════════════════════════════════\n // PERF NOTE — full-repo lint with this rule enabled costs ~+45s wall and ~+1 GB peak RSS\n // (measured: 92.8s / 3.38 GB OFF vs 138.6s / 4.44 GB ON across 2,337 files). It walks the\n // full import graph and finds zero violations today. Kept active to preserve the rule as\n // part of the canonical rule set; revisit moving it to OXLint's fast path as part of the\n // toolchain decision (Phase 1, Workstream 1) rather than disabling.\n 'import-x/no-self-import': 'error',\n 'import-x/no-duplicates': 'error',\n // PERF NOTE — TIMING profile shows this rule at 64-75% of total rule execution time\n // (~1.1-1.3s per file). It walks every import looking for @deprecated JSDoc tags and\n // currently reports zero violations. Type-aware; ratchets to error with the rest of the\n // type-aware family after TS strict lands. Kept at warn rather than off so the rule stays\n // part of the canonical rule set; revisit migrating to OXLint's fast path with Workstream 1.\n 'import-x/no-deprecated': 'warn',\n 'import-x/no-relative-packages': 'error',\n 'import-x/no-mutable-exports': 'error',\n 'import-x/no-extraneous-dependencies': 'error',\n // Consumers carve out routing/lazy/config/stories paths.\n 'import-x/no-default-export': 'error',\n 'import-x/order': [\n 'error',\n {\n groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'type'],\n 'newlines-between': 'always',\n alphabetize: { order: 'asc', caseInsensitive: true },\n },\n ],\n\n // ══════════════════════════════════════════════════════════════════\n // JSDoc.\n // ══════════════════════════════════════════════════════════════════\n 'jsdoc/check-alignment': 'error',\n\n // ══════════════════════════════════════════════════════════════════\n // Security: XSS guards (no-unsanitized).\n // ══════════════════════════════════════════════════════════════════\n 'no-unsanitized/method': 'error',\n 'no-unsanitized/property': 'error',\n\n // ══════════════════════════════════════════════════════════════════\n // Security: cherry-picked from eslint-plugin-security.\n // Most rules in this plugin are Node-specific and noisy in browser code; only the\n // browser-relevant detectors are enabled. Plugin defaults explicitly turned off below.\n // ══════════════════════════════════════════════════════════════════\n 'security/detect-eval-with-expression': 'error',\n 'security/detect-unsafe-regex': 'error',\n 'security/detect-bidi-characters': 'error', // CVE-2021-42574 trojan-source guard.\n 'security/detect-non-literal-regexp': 'off',\n 'security/detect-pseudoRandomBytes': 'off',\n 'security/detect-non-literal-require': 'off',\n 'security/detect-non-literal-fs-filename': 'off',\n 'security/detect-object-injection': 'off',\n 'security/detect-buffer-noassert': 'off',\n 'security/detect-child-process': 'off',\n 'security/detect-disable-mustache-escape': 'off',\n 'security/detect-new-buffer': 'off',\n 'security/detect-no-csrf-before-method-override': 'off',\n 'security/detect-possible-timing-attacks': 'off',\n\n // ══════════════════════════════════════════════════════════════════\n // RxJS hygiene (eslint-plugin-rxjs-x).\n // Some rules use type info; land at warn until TS strict, ratchet after.\n // ══════════════════════════════════════════════════════════════════\n 'rxjs-x/no-async-subscribe': 'warn',\n 'rxjs-x/no-implicit-any-catch': 'warn',\n 'rxjs-x/no-nested-subscribe': 'warn',\n 'rxjs-x/no-unsafe-takeuntil': 'warn',\n 'rxjs-x/no-ignored-subscription': 'warn',\n\n // ══════════════════════════════════════════════════════════════════\n // Core ESLint — error.\n // ══════════════════════════════════════════════════════════════════\n 'arrow-body-style': 'error',\n complexity: ['warn', 15],\n 'constructor-super': 'error',\n curly: 'error',\n 'default-case-last': 'error',\n eqeqeq: ['error', 'always'],\n 'guard-for-in': 'error',\n 'id-denylist': [\n 'error',\n 'any',\n 'Number',\n 'number',\n 'String',\n 'string',\n 'Boolean',\n 'boolean',\n 'Undefined',\n 'undefined',\n ],\n 'max-classes-per-file': 'off',\n 'max-depth': ['warn', 4],\n 'max-nested-callbacks': ['warn', 3],\n 'max-params': ['warn', 5],\n 'no-bitwise': 'error',\n 'no-caller': 'error',\n 'no-cond-assign': 'error',\n 'no-console': [\n 'error',\n {\n allow: [\n 'warn',\n 'dir',\n 'timeLog',\n 'assert',\n 'clear',\n 'count',\n 'countReset',\n 'group',\n 'groupEnd',\n 'table',\n 'dirxml',\n 'error',\n 'groupCollapsed',\n 'Console',\n 'profile',\n 'profileEnd',\n 'timeStamp',\n 'context',\n ],\n },\n ],\n 'no-debugger': 'error',\n 'no-empty': 'off',\n 'no-empty-function': 'off',\n 'no-eval': 'error',\n 'no-fallthrough': 'error',\n 'no-implicit-coercion': 'error',\n 'no-invalid-this': 'off',\n 'no-new-wrappers': 'error',\n 'no-param-reassign': 'error',\n 'no-restricted-imports': [\n 'error',\n {\n paths: [\n { name: 'rxjs/Rx', message: 'Use the rxjs barrel (`rxjs`) instead.' },\n {\n name: 'lodash',\n message:\n 'Import per-method from lodash (e.g., `lodash/cloneDeep`) for tree-shaking.',\n },\n { name: 'moment', message: 'Use date-fns (already a project dep).' },\n ],\n },\n ],\n // Block direct DomSanitizer.bypassSecurityTrust* calls — production callers should use\n // sanitization wrapper pipes. Consumers carve out the wrappers themselves.\n 'no-restricted-syntax': [\n 'error',\n {\n selector:\n 'CallExpression[callee.property.name=/^bypassSecurityTrust(Html|Script|Url|ResourceUrl|Style)$/]',\n message:\n 'Use the bypass-sanitization-{html,url}.pipe.ts wrappers in src/@testgorilla/pipes instead of calling DomSanitizer.bypassSecurityTrust* directly. If a TS-side bypass is genuinely required, add an inline eslint-disable-next-line with a SECURITY comment explaining why.',\n },\n ],\n 'no-script-url': 'error',\n 'no-template-curly-in-string': 'error',\n 'no-throw-literal': 'error',\n 'no-undef-init': 'error',\n 'no-underscore-dangle': ['error', { allow: ['_state'], allowAfterThis: true }],\n 'no-unsafe-finally': 'error',\n 'no-unused-labels': 'error',\n 'no-use-before-define': 'off',\n 'no-useless-concat': 'error',\n 'no-useless-return': 'error',\n 'no-var': 'error',\n 'object-shorthand': 'error',\n 'one-var': ['error', 'never'],\n 'prefer-arrow-callback': 'error',\n 'prefer-const': 'error',\n 'prefer-object-spread': 'error',\n 'prefer-template': 'error',\n 'quote-props': ['error', 'as-needed'],\n radix: 'error',\n 'use-isnan': 'error',\n yoda: 'error',\n\n // ── Off — Prettier owns formatting. eslint-config-prettier disables most of these;\n // listing explicitly overrides any preset that re-enables them.\n 'arrow-parens': 'off',\n 'brace-style': 'off',\n 'comma-dangle': 'off',\n 'eol-last': 'off',\n 'linebreak-style': 'off',\n 'max-len': 'off',\n 'new-parens': 'off',\n 'newline-per-chained-call': 'off',\n 'no-extra-semi': 'off',\n 'no-irregular-whitespace': 'off',\n 'no-multiple-empty-lines': 'off',\n 'no-trailing-spaces': 'off',\n 'padded-blocks': 'off',\n quotes: 'off',\n semi: 'off',\n 'space-in-parens': 'off',\n },\n },\n\n // ── HTML template files (*.html) ─────────────────────────────────────\n // a11y rule set is deferred to a separate workstream.\n {\n files: htmlFiles,\n languageOptions: {\n parser: angularTemplateParser,\n },\n plugins: {\n '@angular-eslint/template': angularTemplate,\n tgo: tgoPlugin,\n },\n rules: {\n ...(angularTemplate.configs.recommended.rules as RulesRecord),\n 'tgo/require-data-testid': 'error',\n '@angular-eslint/template/prefer-control-flow': 'error',\n },\n },\n\n // ── Spec files (*.spec.ts, *.integration.spec.ts) — relax type/style rules ──\n {\n files: specFiles,\n rules: {\n '@typescript-eslint/unbound-method': 'off',\n '@typescript-eslint/no-unsafe-call': 'off',\n '@typescript-eslint/no-unsafe-member-access': 'off',\n '@typescript-eslint/no-unsafe-assignment': 'off',\n '@typescript-eslint/no-unsafe-return': 'off',\n '@typescript-eslint/no-unsafe-argument': 'off',\n '@typescript-eslint/no-explicit-any': 'off',\n '@typescript-eslint/naming-convention': 'off',\n 'max-params': 'off',\n 'max-nested-callbacks': 'off',\n },\n },\n\n // ── JS files ─────────────────────────────────────────────────────────\n {\n files: ['**/*.js'],\n languageOptions: {\n ecmaVersion: 2020,\n sourceType: 'module',\n },\n rules: {\n '@typescript-eslint/no-require-imports': 'off',\n },\n }\n );\n}\n"]}