@brandlab-digital/eslint-plugin 3.8.0 → 3.10.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/README.md CHANGED
@@ -28,7 +28,21 @@ import brandlab from '@brandlab-digital/eslint-plugin'
28
28
  export default [brandlab.configs.recommended]
29
29
  ```
30
30
 
31
- The recommended config enables every published rule as an error.
31
+ The recommended config enables every rule in the table below as an error except the three marked "site-system config", which the next section covers.
32
+
33
+ ## Site System config
34
+
35
+ `configs['site-system']` is `configs.recommended` plus the three Site System rules (`no-literal-tel-links`, `no-header-hover-timers`, `no-ui-kit-deep-imports`), all errors. A site adds it when it declares a `siteSystem` tier in `brandlab.config.ts`, so fleet bumps and security patches stay green until a site adopts the shared shell:
36
+
37
+ ```js
38
+ import brandlab from '@brandlab-digital/eslint-plugin'
39
+
40
+ export default [...brandlab.configs.next, brandlab.configs['site-system']]
41
+ ```
42
+
43
+ The conformance engineering check accepts exactly two `eslint.config.mjs` default exports: `export default brandlab.configs.next`, and the form above (`brandlab.configs["site-system"]` with double quotes is also accepted, and so is a trailing comma or the array split over lines). Any other array fails the `tool-preset` check.
44
+
45
+ For a non-Next consumer, `[brandlab.configs['site-system']]` alone enables all ten rules. `SITE_SYSTEM_RULE_IDS` lists the three IDs.
32
46
 
33
47
  ## Stable rule IDs
34
48
 
@@ -41,8 +55,11 @@ The recommended config enables every published rule as an error.
41
55
  | `brandlab/no-analytics-pii` | Rejects statically provable lead PII, message and attachment data in known analytics sinks. | Send only shared allowlisted event parameters. |
42
56
  | `brandlab/no-unsafe-external-links` | Rejects script-bearing link schemes and external new-context links with opener access when the URL is static. | Use safe schemes and `rel="noopener"`; keep runtime URL validation at the trust boundary. |
43
57
  | `brandlab/no-raw-image-elements` | Rejects raw website `<img>` and `createElement('img')` output. | Use `next/image`; the documented `getImageProps` art-direction pattern and email renderer files remain exempt. |
58
+ | `brandlab/no-literal-tel-links` (site-system config) | Rejects a JSX `href` that is a string, template or concatenation starting with `tel:`, in any case, or a condition with such a branch. Test files, email renderers and installed packages are exempt. | Use `PhoneLink` from `@brandlab-digital/site-next/ui-kit/primitives`; it sends one `phone_link_click` per tap. |
59
+ | `brandlab/no-header-hover-timers` (site-system config) | In files under `src/` whose path (below `src/`) or exported component name contains Header, Nav, Menu or Drawer, rejects `setTimeout` and `clearTimeout` reached from pointer or mouse enter and leave handlers. Test files are exempt. | Use the shared header from `@brandlab-digital/site-next/ui-kit/shell`; its hover behaviour and timings are locked in the library. |
60
+ | `brandlab/no-ui-kit-deep-imports` (site-system config) | Rejects `import`, `export ... from`, `import()` and `require` of `@brandlab-digital/site-next/dist` or any path into it, including a `node_modules` path. | Import the published subpaths, for example `@brandlab-digital/site-next/ui-kit/primitives`. |
44
61
 
45
- `RULE_IDS` is exported for tools that need the canonical IDs without duplicating strings. The 3.0 release removed `brandlab/no-allow-indexing-true` together with the `ALLOW_INDEXING` path it guarded; indexing is decided by the deployment environment.
62
+ `RULE_IDS` (all ten) is exported for tools that need the canonical IDs without duplicating strings. The 3.0 release removed `brandlab/no-allow-indexing-true` together with the `ALLOW_INDEXING` path it guarded; indexing is decided by the deployment environment.
46
63
 
47
64
  ## Deliberate boundaries
48
65
 
@@ -51,5 +68,8 @@ The recommended config enables every published rule as an error.
51
68
  - The link rule acts only on statically resolvable URLs. Dynamic destinations require runtime validation and behavioural verification.
52
69
  - The image rule applies to website UI. Raw image markup remains available to non-Next renderers when the file is clearly located or named as an email renderer.
53
70
  - Shared implementations in `site-core`, `site-next` and installed `@brandlab-digital` packages are not treated as consumer reimplementations.
71
+ - The telephone-link rule reads the `href` attribute where it is written. A link built elsewhere (a `telHref` variable, a config object, `createElement`) is out of reach; conformance reads the rendered links.
72
+ - The hover-timer rule follows handlers declared in the same file: inline, named, wrapped in a call such as `useCallback`, or reached through local helper functions. A timer in an imported hook, or in an effect driven by hover state, is not found. It ignores files outside `src/` and files whose path and exports do not name a header, nav, menu or drawer.
73
+ - The deep-import rule covers `@brandlab-digital/site-next` only.
54
74
 
55
75
  These constraints keep linting deterministic and editor-fast while the conformance engine owns deeper AST, behavioural and rendered-output evidence.
package/dist/index.d.ts CHANGED
@@ -4,10 +4,24 @@ type ReportDescriptor = {
4
4
  message?: string;
5
5
  data?: Record<string, string>;
6
6
  };
7
+ type ScopeVariable = {
8
+ defs: ReadonlyArray<{
9
+ type?: string;
10
+ node?: unknown;
11
+ }>;
12
+ };
13
+ type Scope = {
14
+ set: ReadonlyMap<string, ScopeVariable>;
15
+ upper: Scope | null;
16
+ };
7
17
  type RuleContext = {
8
18
  filename?: string;
9
19
  getFilename?: () => string;
10
20
  physicalFilename?: string;
21
+ cwd?: string;
22
+ sourceCode?: {
23
+ getScope?: (node: unknown) => Scope;
24
+ };
11
25
  report: (descriptor: ReportDescriptor) => void;
12
26
  };
13
27
  type Visitor = Record<string, (node: unknown) => void>;
@@ -31,7 +45,15 @@ export declare const RULE_IDS: Readonly<{
31
45
  readonly noAnalyticsPii: "no-analytics-pii";
32
46
  readonly noUnsafeExternalLinks: "no-unsafe-external-links";
33
47
  readonly noRawImageElements: "no-raw-image-elements";
48
+ readonly noLiteralTelLinks: "no-literal-tel-links";
49
+ readonly noHeaderHoverTimers: "no-header-hover-timers";
50
+ readonly noUiKitDeepImports: "no-ui-kit-deep-imports";
34
51
  }>;
52
+ /**
53
+ * Rules that only `configs['site-system']` enables. They are held back from `recommended` so a fleet bump or security
54
+ * patch does not turn every site red; a site adds the config when it declares a `siteSystem` tier.
55
+ */
56
+ export declare const SITE_SYSTEM_RULE_IDS: readonly ["no-literal-tel-links", "no-header-hover-timers", "no-ui-kit-deep-imports"];
35
57
  export declare const rules: {
36
58
  "no-retired-analytics-events": RuleModule;
37
59
  "no-raw-json-ld": RuleModule;
@@ -40,6 +62,9 @@ export declare const rules: {
40
62
  "no-analytics-pii": RuleModule;
41
63
  "no-unsafe-external-links": RuleModule;
42
64
  "no-raw-image-elements": RuleModule;
65
+ "no-literal-tel-links": RuleModule;
66
+ "no-header-hover-timers": RuleModule;
67
+ "no-ui-kit-deep-imports": RuleModule;
43
68
  };
44
69
  /** A flat-config object; kept structural so ESLint stays a peer, not a type dependency. */
45
70
  export type BrandlabFlatConfig = {
@@ -50,17 +75,21 @@ export type BrandlabFlatConfig = {
50
75
  rules?: Record<string, unknown>;
51
76
  [key: string]: unknown;
52
77
  };
53
- type BrandlabRecommendedConfig = {
54
- name: 'brandlab/recommended';
78
+ type BrandlabRulesConfig<Name extends string> = {
79
+ name: Name;
55
80
  plugins: {
56
81
  brandlab: unknown;
57
82
  };
58
83
  rules: Record<string, 'error'>;
59
84
  };
85
+ type BrandlabRecommendedConfig = BrandlabRulesConfig<'brandlab/recommended'>;
86
+ type BrandlabSiteSystemConfig = BrandlabRulesConfig<'brandlab/site-system'>;
60
87
  type BrandlabPlugin = {
61
88
  rules: typeof rules;
62
89
  configs: {
63
90
  recommended: BrandlabRecommendedConfig;
91
+ /** Recommended plus the Site System rules; added by a site that declares a `siteSystem` tier. */
92
+ 'site-system': BrandlabSiteSystemConfig;
64
93
  /** Next core-web-vitals + next/typescript + Brandlab recommended + standard ignores. */
65
94
  readonly next: readonly BrandlabFlatConfig[];
66
95
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAA;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC/C,CAAA;AAWD,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAA;AAEtD,KAAK,UAAU,GAAG;IAChB,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS,CAAA;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,CAAA;YACnB,WAAW,EAAE,OAAO,CAAA;SACrB,CAAA;QACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAChC,MAAM,EAAE,EAAE,CAAA;KACX,CAAA;IACD,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAA;CAC1C,CAAA;AAED,eAAO,MAAM,QAAQ;;;;;;;;EAQV,CAAA;AAitBX,eAAO,MAAM,KAAK;;;;;;;;CAaoB,CAAA;AAEtC,2FAA2F;AAC3F,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACzB,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,KAAK,yBAAyB,GAAG;IAC/B,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,EAAE;QACP,QAAQ,EAAE,OAAO,CAAA;KAClB,CAAA;IACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,CAAA;AAED,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,OAAO,EAAE;QACP,WAAW,EAAE,yBAAyB,CAAA;QACtC,wFAAwF;QACxF,QAAQ,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE,CAAA;KAC7C,CAAA;CACF,CAAA;AAED,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,mBAU9B,CAAA;AAwBF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,aAAa,EAAE,SAAS,kBAAkB,EAAE,CAAA;IAC5C,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAA;CAC1C,GAAG,SAAS,kBAAkB,EAAE,CAchC;AAsBD,QAAA,MAAM,MAAM,EAAE,cASb,CAAA;AAID,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,7 +13,19 @@ export const RULE_IDS = Object.freeze({
13
13
  noAnalyticsPii: 'no-analytics-pii',
14
14
  noUnsafeExternalLinks: 'no-unsafe-external-links',
15
15
  noRawImageElements: 'no-raw-image-elements',
16
+ noLiteralTelLinks: 'no-literal-tel-links',
17
+ noHeaderHoverTimers: 'no-header-hover-timers',
18
+ noUiKitDeepImports: 'no-ui-kit-deep-imports',
16
19
  });
20
+ /**
21
+ * Rules that only `configs['site-system']` enables. They are held back from `recommended` so a fleet bump or security
22
+ * patch does not turn every site red; a site adds the config when it declares a `siteSystem` tier.
23
+ */
24
+ export const SITE_SYSTEM_RULE_IDS = Object.freeze([
25
+ RULE_IDS.noLiteralTelLinks,
26
+ RULE_IDS.noHeaderHoverTimers,
27
+ RULE_IDS.noUiKitDeepImports,
28
+ ]);
17
29
  function asNode(value) {
18
30
  return value && typeof value === 'object' ? value : null;
19
31
  }
@@ -60,7 +72,7 @@ function defineRule(options) {
60
72
  type: 'problem',
61
73
  docs: {
62
74
  description: options.description,
63
- recommended: true,
75
+ recommended: options.recommended ?? true,
64
76
  },
65
77
  messages: options.messages,
66
78
  schema: [],
@@ -659,6 +671,366 @@ const noUnsafeRichTextSinksRule = defineRule({
659
671
  };
660
672
  },
661
673
  });
674
+ function getModuleSpecifier(value) {
675
+ const node = asNode(value);
676
+ return node?.type === 'Literal' || node?.type === 'TemplateLiteral' ? getStaticString(node) : null;
677
+ }
678
+ function isInstalledPackageFile(context) {
679
+ return /(?:^|\/)node_modules\//.test(getContextFilename(context));
680
+ }
681
+ /**
682
+ * The file's path inside the project, so a checkout that happens to live under a directory called test or e2e is not
683
+ * mistaken for test code. Without a project root only the file name is left to judge.
684
+ */
685
+ function getProjectRelativePath(context) {
686
+ const filename = getContextFilename(context);
687
+ if (!filename.startsWith('/') && !/^[A-Za-z]:\//.test(filename))
688
+ return filename;
689
+ const cwd = (context.cwd ?? '').replaceAll('\\', '/').replace(/\/+$/, '');
690
+ if (cwd && filename.startsWith(`${cwd}/`))
691
+ return filename.slice(cwd.length + 1);
692
+ const underSrc = getPathUnderSrc(filename);
693
+ return underSrc === null ? filename.slice(filename.lastIndexOf('/') + 1) : `src/${underSrc}`;
694
+ }
695
+ function isTestFile(context) {
696
+ const path = getProjectRelativePath(context);
697
+ return (/\.(?:test|spec)\.[cm]?[jt]sx?$/.test(path) ||
698
+ /(?:^|\/)(?:__tests__|__mocks__|tests?|e2e)\//.test(path));
699
+ }
700
+ function isTelUrl(value) {
701
+ return /^[\u0000-\u0020]*tel:/i.test(value);
702
+ }
703
+ /** True when the href value is statically a tel: URL: a literal, a template or concatenation that starts with one, or a branch of either. */
704
+ function startsWithTelScheme(value) {
705
+ const node = asNode(value);
706
+ if (!node)
707
+ return false;
708
+ switch (node.type) {
709
+ case 'Literal':
710
+ return typeof node.value === 'string' && isTelUrl(node.value);
711
+ case 'TemplateLiteral': {
712
+ const quasis = Array.isArray(node.quasis) ? node.quasis : [];
713
+ const first = asNode(asNode(quasis[0])?.value);
714
+ const text = first?.cooked ?? first?.raw;
715
+ return typeof text === 'string' && isTelUrl(text);
716
+ }
717
+ case 'BinaryExpression':
718
+ return node.operator === '+' && startsWithTelScheme(node.left);
719
+ case 'ConditionalExpression':
720
+ return startsWithTelScheme(node.consequent) || startsWithTelScheme(node.alternate);
721
+ case 'LogicalExpression':
722
+ return startsWithTelScheme(node.left) || startsWithTelScheme(node.right);
723
+ case 'JSXExpressionContainer':
724
+ case 'ChainExpression':
725
+ case 'TSAsExpression':
726
+ case 'TSNonNullExpression':
727
+ case 'TSSatisfiesExpression':
728
+ return startsWithTelScheme(node.expression);
729
+ default:
730
+ return false;
731
+ }
732
+ }
733
+ const noLiteralTelLinksRule = defineRule({
734
+ description: 'Disallow literal tel: links; telephone links come from the shared PhoneLink.',
735
+ recommended: false,
736
+ messages: {
737
+ literalTelLink: 'Literal tel: links bypass the shared phone link and its phone_link_click instrumentation. Use PhoneLink from @brandlab-digital/site-next/ui-kit/primitives.',
738
+ },
739
+ create(context) {
740
+ // Email markup cannot render PhoneLink, so email renderers (as for raw images) are exempt.
741
+ if (isInstalledPackageFile(context) ||
742
+ isTestFile(context) ||
743
+ isSharedPlatformImplementation(context) ||
744
+ isEmailRenderingFile(context)) {
745
+ return {};
746
+ }
747
+ function inspectAttribute(nodeValue) {
748
+ const node = asNode(nodeValue);
749
+ if (getIdentifierName(node?.name) !== 'href')
750
+ return;
751
+ if (startsWithTelScheme(node?.value)) {
752
+ context.report({ node: nodeValue, messageId: 'literalTelLink' });
753
+ }
754
+ }
755
+ return { JSXAttribute: inspectAttribute };
756
+ },
757
+ });
758
+ const hoverHandlerNames = new Set([
759
+ 'onmouseenter',
760
+ 'onmouseleave',
761
+ 'onpointerenter',
762
+ 'onpointerleave',
763
+ ]);
764
+ const hoverEventNames = new Set(['mouseenter', 'mouseleave', 'pointerenter', 'pointerleave']);
765
+ /** Names that mark a site file as header code: its path under src/, or a component it exports. */
766
+ const headerPathPattern = /header|nav|menu|drawer/i;
767
+ const headerExportPattern = /Header|Nav|Menu|Drawer/;
768
+ /** The path below the last src/ segment, or null for a file that is not under src/. */
769
+ function getPathUnderSrc(filename) {
770
+ const normalized = filename.startsWith('/') ? filename : `/${filename}`;
771
+ const marker = normalized.lastIndexOf('/src/');
772
+ return marker === -1 ? null : normalized.slice(marker + '/src/'.length);
773
+ }
774
+ function getExportedValueNames(value) {
775
+ const node = asNode(value);
776
+ if (!node)
777
+ return [];
778
+ if (node.type === 'Identifier')
779
+ return [getIdentifierName(node)].filter((name) => name !== null);
780
+ if (node.type === 'FunctionDeclaration' ||
781
+ node.type === 'FunctionExpression' ||
782
+ node.type === 'ClassDeclaration' ||
783
+ node.type === 'ClassExpression') {
784
+ return [getIdentifierName(node.id)].filter((name) => name !== null);
785
+ }
786
+ if (node.type === 'CallExpression') {
787
+ const args = Array.isArray(node.arguments) ? node.arguments : [];
788
+ return args.flatMap(getExportedValueNames);
789
+ }
790
+ if (node.type === 'TSAsExpression' || node.type === 'TSSatisfiesExpression') {
791
+ return getExportedValueNames(node.expression);
792
+ }
793
+ return [];
794
+ }
795
+ function getExportedNames(nodeValue) {
796
+ const node = asNode(nodeValue);
797
+ if (node?.type === 'ExportDefaultDeclaration')
798
+ return getExportedValueNames(node.declaration);
799
+ if (node?.type !== 'ExportNamedDeclaration')
800
+ return [];
801
+ const declaration = asNode(node.declaration);
802
+ const declared = declaration?.type === 'VariableDeclaration'
803
+ ? (Array.isArray(declaration.declarations) ? declaration.declarations : []).map((declarator) => getIdentifierName(asNode(declarator)?.id))
804
+ : [getIdentifierName(declaration?.id)];
805
+ const specifiers = Array.isArray(node.specifiers) ? node.specifiers : [];
806
+ const specified = specifiers.flatMap((specifier) => [
807
+ getStaticString(asNode(specifier)?.exported),
808
+ getStaticString(asNode(specifier)?.local),
809
+ ]);
810
+ return [...declared, ...specified].filter((name) => Boolean(name));
811
+ }
812
+ function walkAst(value, visit) {
813
+ if (Array.isArray(value)) {
814
+ for (const item of value)
815
+ walkAst(item, visit);
816
+ return;
817
+ }
818
+ const node = asNode(value);
819
+ if (!node || typeof node.type !== 'string')
820
+ return;
821
+ visit(node);
822
+ for (const [key, child] of Object.entries(node)) {
823
+ if (key === 'parent' || key === 'loc' || key === 'range' || key === 'tokens' || key === 'comments') {
824
+ continue;
825
+ }
826
+ walkAst(child, visit);
827
+ }
828
+ }
829
+ function findVariable(context, identifier) {
830
+ const name = getIdentifierName(identifier);
831
+ if (!name)
832
+ return null;
833
+ let scope = context.sourceCode?.getScope?.(identifier) ?? null;
834
+ while (scope) {
835
+ const variable = scope.set.get(name);
836
+ if (variable)
837
+ return variable;
838
+ scope = scope.upper;
839
+ }
840
+ return null;
841
+ }
842
+ /** The functions a handler expression can be: inline, named in this file, wrapped in a call or chosen by a condition. */
843
+ function createFunctionResolver(context) {
844
+ function resolve(value, seen) {
845
+ const node = asNode(value);
846
+ if (!node || seen.has(node))
847
+ return [];
848
+ seen.add(node);
849
+ switch (node.type) {
850
+ case 'ArrowFunctionExpression':
851
+ case 'FunctionExpression':
852
+ case 'FunctionDeclaration':
853
+ return [node];
854
+ case 'ConditionalExpression':
855
+ return [...resolve(node.consequent, seen), ...resolve(node.alternate, seen)];
856
+ case 'LogicalExpression':
857
+ return [...resolve(node.left, seen), ...resolve(node.right, seen)];
858
+ case 'ChainExpression':
859
+ case 'TSAsExpression':
860
+ case 'TSNonNullExpression':
861
+ case 'TSSatisfiesExpression':
862
+ return resolve(node.expression, seen);
863
+ case 'CallExpression': {
864
+ const args = Array.isArray(node.arguments) ? node.arguments : [];
865
+ return [node.callee, ...args].flatMap((part) => resolve(part, seen));
866
+ }
867
+ case 'Identifier':
868
+ return (findVariable(context, node)?.defs ?? []).flatMap((definition) => {
869
+ const defined = asNode(definition.node);
870
+ if (definition.type === 'FunctionName')
871
+ return resolve(defined, seen);
872
+ if (definition.type === 'Variable' && getIdentifierName(defined?.id) === node.name) {
873
+ return resolve(defined?.init, seen);
874
+ }
875
+ return [];
876
+ });
877
+ default:
878
+ return [];
879
+ }
880
+ }
881
+ return (value) => resolve(value, new Set());
882
+ }
883
+ function getTimerCallName(callee) {
884
+ const path = getMemberPath(callee);
885
+ return path && /^(?:(?:window|globalThis|self)\.)?(?:setTimeout|clearTimeout)$/.test(path)
886
+ ? path
887
+ : null;
888
+ }
889
+ const noHeaderHoverTimersRule = defineRule({
890
+ description: 'Disallow setTimeout and clearTimeout in pointer or mouse enter and leave handlers of site header, nav, menu and drawer code.',
891
+ recommended: false,
892
+ messages: {
893
+ headerHoverTimer: '{{name}} in a pointer or mouse enter or leave handler is a hover timer. Use the shared header from @brandlab-digital/site-next/ui-kit/shell; its hover behaviour and timings are locked in the library.',
894
+ },
895
+ create(context) {
896
+ if (isInstalledPackageFile(context) ||
897
+ isTestFile(context) ||
898
+ isSharedPlatformImplementation(context)) {
899
+ return {};
900
+ }
901
+ const pathUnderSrc = getPathUnderSrc(getContextFilename(context));
902
+ if (pathUnderSrc === null)
903
+ return {};
904
+ const handlers = [];
905
+ const exportedNames = [];
906
+ function inspectExport(node) {
907
+ exportedNames.push(...getExportedNames(node));
908
+ }
909
+ function inspectAttribute(nodeValue) {
910
+ const node = asNode(nodeValue);
911
+ const name = getIdentifierName(node?.name);
912
+ const container = asNode(node?.value);
913
+ if (name && hoverHandlerNames.has(name.toLowerCase()) && container?.type === 'JSXExpressionContainer') {
914
+ handlers.push(container.expression);
915
+ }
916
+ }
917
+ function inspectProperty(nodeValue) {
918
+ const node = asNode(nodeValue);
919
+ const name = node ? getPropertyName(node) : null;
920
+ if (node && name && hoverHandlerNames.has(name.toLowerCase()))
921
+ handlers.push(node.value);
922
+ }
923
+ function inspectAssignment(nodeValue) {
924
+ const node = asNode(nodeValue);
925
+ const target = asNode(node?.left);
926
+ if (target?.type !== 'MemberExpression')
927
+ return;
928
+ const name = target.computed ? getStaticString(target.property) : getIdentifierName(target.property);
929
+ if (node && name && hoverHandlerNames.has(name.toLowerCase()))
930
+ handlers.push(node.right);
931
+ }
932
+ function inspectCall(nodeValue) {
933
+ const node = asNode(nodeValue);
934
+ const callee = asNode(node?.callee);
935
+ if (callee?.type !== 'MemberExpression')
936
+ return;
937
+ const method = callee.computed ? getStaticString(callee.property) : getIdentifierName(callee.property);
938
+ if (method !== 'addEventListener')
939
+ return;
940
+ const args = Array.isArray(node?.arguments) ? node.arguments : [];
941
+ const eventName = getModuleSpecifier(args[0]);
942
+ if (eventName && hoverEventNames.has(eventName.toLowerCase()))
943
+ handlers.push(args[1]);
944
+ }
945
+ function reportTimers() {
946
+ if (!headerPathPattern.test(pathUnderSrc ?? '') &&
947
+ !exportedNames.some((name) => headerExportPattern.test(name))) {
948
+ return;
949
+ }
950
+ const resolve = createFunctionResolver(context);
951
+ const visited = new Set();
952
+ const reported = new Set();
953
+ function visitFunction(fn) {
954
+ if (visited.has(fn))
955
+ return;
956
+ visited.add(fn);
957
+ walkAst(fn, (node) => {
958
+ if (node.type !== 'CallExpression')
959
+ return;
960
+ const timer = getTimerCallName(node.callee);
961
+ if (timer) {
962
+ if (reported.has(node))
963
+ return;
964
+ reported.add(node);
965
+ context.report({ node, messageId: 'headerHoverTimer', data: { name: timer } });
966
+ return;
967
+ }
968
+ for (const helper of resolve(node.callee))
969
+ visitFunction(helper);
970
+ });
971
+ }
972
+ for (const handler of handlers) {
973
+ for (const fn of resolve(handler))
974
+ visitFunction(fn);
975
+ }
976
+ }
977
+ return {
978
+ AssignmentExpression: inspectAssignment,
979
+ CallExpression: inspectCall,
980
+ ExportDefaultDeclaration: inspectExport,
981
+ ExportNamedDeclaration: inspectExport,
982
+ JSXAttribute: inspectAttribute,
983
+ Property: inspectProperty,
984
+ 'Program:exit': reportTimers,
985
+ };
986
+ },
987
+ });
988
+ /** Any path into site-next's dist: the bare package path, or a node_modules path to it. */
989
+ const siteNextDistPattern = /(?:^|\/)@brandlab-digital\/site-next\/dist(?:\/|$)/;
990
+ const noUiKitDeepImportsRule = defineRule({
991
+ description: 'Disallow imports from the dist of @brandlab-digital/site-next; use the published subpaths.',
992
+ recommended: false,
993
+ messages: {
994
+ uiKitDeepImport: "Do not import from the dist of @brandlab-digital/site-next. Use its published subpaths, for example '@brandlab-digital/site-next/ui-kit/primitives'.",
995
+ },
996
+ create(context) {
997
+ function inspectSpecifier(value) {
998
+ const specifier = getModuleSpecifier(value);
999
+ if (specifier && siteNextDistPattern.test(specifier.replaceAll('\\', '/'))) {
1000
+ context.report({ node: value, messageId: 'uiKitDeepImport' });
1001
+ }
1002
+ }
1003
+ function inspectSource(nodeValue) {
1004
+ inspectSpecifier(asNode(nodeValue)?.source);
1005
+ }
1006
+ function inspectCall(nodeValue) {
1007
+ const node = asNode(nodeValue);
1008
+ const callee = getMemberPath(node?.callee);
1009
+ if (callee !== 'require' && callee !== 'require.resolve')
1010
+ return;
1011
+ const args = Array.isArray(node?.arguments) ? node.arguments : [];
1012
+ inspectSpecifier(args[0]);
1013
+ }
1014
+ function inspectExternalModuleReference(nodeValue) {
1015
+ inspectSpecifier(asNode(nodeValue)?.expression);
1016
+ }
1017
+ function inspectImportType(nodeValue) {
1018
+ const node = asNode(nodeValue);
1019
+ // `source` replaced the deprecated `argument` (a literal type) in typescript-eslint 8.
1020
+ const argument = asNode(node?.source ?? node?.argument);
1021
+ inspectSpecifier(argument?.type === 'TSLiteralType' ? argument.literal : argument);
1022
+ }
1023
+ return {
1024
+ CallExpression: inspectCall,
1025
+ ExportAllDeclaration: inspectSource,
1026
+ ExportNamedDeclaration: inspectSource,
1027
+ ImportDeclaration: inspectSource,
1028
+ ImportExpression: inspectSource,
1029
+ TSExternalModuleReference: inspectExternalModuleReference,
1030
+ TSImportType: inspectImportType,
1031
+ };
1032
+ },
1033
+ });
662
1034
  export const rules = {
663
1035
  [RULE_IDS.noRetiredAnalyticsEvents]: createTextRule({
664
1036
  description: 'Disallow retired Brandlab analytics event names.',
@@ -672,6 +1044,9 @@ export const rules = {
672
1044
  [RULE_IDS.noAnalyticsPii]: noAnalyticsPiiRule,
673
1045
  [RULE_IDS.noUnsafeExternalLinks]: noUnsafeExternalLinksRule,
674
1046
  [RULE_IDS.noRawImageElements]: noRawImageElementsRule,
1047
+ [RULE_IDS.noLiteralTelLinks]: noLiteralTelLinksRule,
1048
+ [RULE_IDS.noHeaderHoverTimers]: noHeaderHoverTimersRule,
1049
+ [RULE_IDS.noUiKitDeepImports]: noUiKitDeepImportsRule,
675
1050
  };
676
1051
  /** Build and test output that is never project source. */
677
1052
  export const NEXT_CONFIG_IGNORES = Object.freeze([
@@ -685,7 +1060,11 @@ export const NEXT_CONFIG_IGNORES = Object.freeze([
685
1060
  'public/**',
686
1061
  'next-env.d.ts',
687
1062
  ]);
688
- const recommendedRules = Object.fromEntries(Object.keys(rules).map((ruleId) => [`brandlab/${ruleId}`, 'error']));
1063
+ const siteSystemRuleIds = new Set(SITE_SYSTEM_RULE_IDS);
1064
+ function errorRules(ruleIds) {
1065
+ return Object.fromEntries(ruleIds.map((ruleId) => [`brandlab/${ruleId}`, 'error']));
1066
+ }
1067
+ const recommendedRules = errorRules(Object.keys(rules).filter((ruleId) => !siteSystemRuleIds.has(ruleId)));
689
1068
  const recommended = {
690
1069
  name: 'brandlab/recommended',
691
1070
  plugins: {
@@ -693,6 +1072,13 @@ const recommended = {
693
1072
  },
694
1073
  rules: recommendedRules,
695
1074
  };
1075
+ const siteSystem = {
1076
+ name: 'brandlab/site-system',
1077
+ plugins: {
1078
+ brandlab: undefined,
1079
+ },
1080
+ rules: { ...recommendedRules, ...errorRules(SITE_SYSTEM_RULE_IDS) },
1081
+ };
696
1082
  function toConfigArray(value, specifier) {
697
1083
  const exported = Array.isArray(value)
698
1084
  ? value
@@ -742,6 +1128,7 @@ const plugin = {
742
1128
  rules,
743
1129
  configs: {
744
1130
  recommended,
1131
+ 'site-system': siteSystem,
745
1132
  get next() {
746
1133
  nextConfig ??= loadNextConfig();
747
1134
  return nextConfig;
@@ -749,5 +1136,6 @@ const plugin = {
749
1136
  },
750
1137
  };
751
1138
  recommended.plugins.brandlab = plugin;
1139
+ siteSystem.plugins.brandlab = plugin;
752
1140
  export default plugin;
753
1141
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from 'node:module'\n\ntype AstNode = {\n type?: string\n [key: string]: unknown\n}\n\ntype ReportDescriptor = {\n node: unknown\n messageId?: string\n message?: string\n data?: Record<string, string>\n}\n\ntype RuleContext = {\n filename?: string\n getFilename?: () => string\n physicalFilename?: string\n report: (descriptor: ReportDescriptor) => void\n}\n\nfunction getContextFilename(context: RuleContext): string {\n return (\n context.filename ??\n context.physicalFilename ??\n context.getFilename?.() ??\n ''\n ).replaceAll('\\\\', '/')\n}\n\ntype Visitor = Record<string, (node: unknown) => void>\n\ntype RuleModule = {\n meta: {\n type: 'problem'\n docs: {\n description: string\n recommended: boolean\n }\n messages: Record<string, string>\n schema: []\n }\n create: (context: RuleContext) => Visitor\n}\n\nexport const RULE_IDS = Object.freeze({\n noRetiredAnalyticsEvents: 'no-retired-analytics-events',\n noRawJsonLd: 'no-raw-json-ld',\n noUnsafeRichTextSinks: 'no-unsafe-rich-text-sinks',\n noProtectedPlatformReimplementation: 'no-protected-platform-reimplementation',\n noAnalyticsPii: 'no-analytics-pii',\n noUnsafeExternalLinks: 'no-unsafe-external-links',\n noRawImageElements: 'no-raw-image-elements',\n} as const)\n\nfunction asNode(value: unknown): AstNode | null {\n return value && typeof value === 'object' ? (value as AstNode) : null\n}\n\nfunction getStaticString(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n if (node.type === 'TemplateElement') {\n const templateValue = asNode(node.value)\n return typeof templateValue?.raw === 'string' ? templateValue.raw : null\n }\n if (node.type === 'TemplateLiteral') {\n const expressions = Array.isArray(node.expressions) ? node.expressions : []\n const quasis = Array.isArray(node.quasis) ? node.quasis : []\n if (expressions.length > 0) return null\n return quasis.map(getStaticString).join('')\n }\n if (node.type === 'JSXExpressionContainer') return getStaticString(node.expression)\n if (node.type === 'JSXAttribute') return getStaticString(node.value)\n if (node.type === 'ChainExpression') return getStaticString(node.expression)\n\n return null\n}\n\nfunction getIdentifierName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n return null\n}\n\nfunction defineRule(options: {\n description: string\n messages: Record<string, string>\n create: (context: RuleContext) => Visitor\n}): RuleModule {\n return {\n meta: {\n type: 'problem',\n docs: {\n description: options.description,\n recommended: true,\n },\n messages: options.messages,\n schema: [],\n },\n create: options.create,\n }\n}\n\nfunction createTextRule(options: {\n description: string\n messageId: string\n message: string\n matcher: (text: string, context: RuleContext) => boolean\n}): RuleModule {\n return defineRule({\n description: options.description,\n messages: { [options.messageId]: options.message },\n create(context) {\n function inspect(node: unknown) {\n const text = getStaticString(node)\n if (text && options.matcher(text, context)) {\n context.report({ node, messageId: options.messageId })\n }\n }\n\n return {\n Literal: inspect,\n TemplateElement: inspect,\n }\n },\n })\n}\n\nconst retiredAnalyticsEvents = new Set([\n 'contact_form_submission',\n 'phone_call',\n 'phone_calls',\n 'form_start',\n 'form_submit',\n 'generate_lead',\n 'cta_click',\n])\n\nconst protectedPlatformNames = new Set([\n 'BrandlabBreadcrumbs',\n 'ContactFormEmail',\n 'SchemaScript',\n 'buildBrandlabMetadata',\n 'buildLocalBusinessSchema',\n 'buildNextMetadata',\n 'buildRobotsMetadata',\n 'buildSchemaGraph',\n 'buildSitemapEntries',\n 'createRouteAwareMdxBlogAdapter',\n 'createRouteAwareStructuredBlogAdapter',\n 'createBrandlabContactRuntime',\n 'createNextMetadataBuilder',\n 'defineAnalyticsContract',\n 'defineBrandlabBusiness',\n 'defineBrandlabContact',\n 'defineBrandlabProject',\n 'defineBreadcrumbTrail',\n 'defineContactContract',\n 'defineRouteCatalog',\n 'installPhoneClickListener',\n 'renderContactEmail',\n 'sitemapIndexXmlResponse',\n 'sitemapXmlResponse',\n 'trackBrandlabBrowserEvent',\n])\n\nconst protectedDirectCalls = new Set([\n 'dataLayer.push',\n 'globalThis.dataLayer.push',\n 'globalThis.gtag',\n 'gtag',\n 'window.dataLayer.push',\n 'window.gtag',\n])\n\nfunction isSharedPlatformImplementation(context: RuleContext): boolean {\n const filename = getContextFilename(context)\n return (\n filename.includes('/node_modules/@brandlab-digital/') ||\n /(?:^|\\/)standards\\/source\\/packages\\/(?:site-core|site-next)\\//.test(filename)\n )\n}\n\nfunction getMemberPath(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n if (node.type === 'ChainExpression') return getMemberPath(node.expression)\n if (node.type === 'Identifier') return getIdentifierName(node)\n if (node.type === 'ThisExpression') return 'this'\n if (node.type !== 'MemberExpression') return null\n\n const objectPath = getMemberPath(node.object)\n const propertyName = node.computed\n ? getStaticString(node.property)\n : getIdentifierName(node.property)\n return objectPath && propertyName ? `${objectPath}.${propertyName}` : null\n}\n\nfunction getDeclarationName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n return getIdentifierName(node.id)\n}\n\nconst noProtectedPlatformReimplementationRule = defineRule({\n description: 'Disallow local reimplementation of protected Brandlab runtime surfaces.',\n messages: {\n protectedDeclaration:\n '{{name}} is a protected Brandlab platform surface. Import the shared implementation instead of declaring it locally.',\n protectedCall:\n '{{name}} bypasses protected Brandlab delivery or analytics behaviour. Use the shared platform adapter.',\n },\n create(context) {\n if (isSharedPlatformImplementation(context)) return {} as Visitor\n\n function inspectDeclaration(node: unknown) {\n const name = getDeclarationName(node)\n if (name && protectedPlatformNames.has(name)) {\n context.report({\n node,\n messageId: 'protectedDeclaration',\n data: { name },\n })\n }\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const callPath = getMemberPath(node?.callee)\n if (!callPath) return\n if (protectedDirectCalls.has(callPath) || callPath.endsWith('.emails.send')) {\n context.report({\n node: nodeValue,\n messageId: 'protectedCall',\n data: { name: callPath },\n })\n }\n }\n\n return {\n CallExpression: inspectCall,\n ClassDeclaration: inspectDeclaration,\n FunctionDeclaration: inspectDeclaration,\n VariableDeclarator: inspectDeclaration,\n }\n },\n})\n\nfunction getJsxElementName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n const direct = getIdentifierName(node)\n if (direct) return direct\n if (node.type !== 'JSXMemberExpression') return null\n const objectName = getJsxElementName(node.object)\n const propertyName = getJsxElementName(node.property)\n return objectName && propertyName ? `${objectName}.${propertyName}` : null\n}\n\nfunction getJsxAttribute(openingElement: AstNode, name: string): AstNode | null {\n const attributes = Array.isArray(openingElement.attributes) ? openingElement.attributes : []\n return (\n attributes\n .map(asNode)\n .find(\n (attribute) =>\n attribute?.type === 'JSXAttribute' &&\n getIdentifierName(attribute.name)?.toLowerCase() === name.toLowerCase(),\n ) ?? null\n )\n}\n\nfunction getObjectProperty(value: unknown, key: string): AstNode | null {\n const node = asNode(value)\n if (node?.type !== 'ObjectExpression') return null\n const properties = Array.isArray(node.properties) ? node.properties : []\n return (\n properties\n .map(asNode)\n .find(\n (property) =>\n property?.type === 'Property' &&\n getPropertyName(property)?.toLowerCase() === key.toLowerCase(),\n ) ?? null\n )\n}\n\nfunction getPropertyName(property: AstNode): string | null {\n return property.computed\n ? getStaticString(property.key)\n : getIdentifierName(property.key) ?? getStaticString(property.key)\n}\n\nfunction isRawJsonLdCreateElement(value: unknown): boolean {\n const node = asNode(value)\n if (node?.type !== 'CallExpression') return false\n const callee = getMemberPath(node.callee)\n if (callee !== 'createElement' && callee !== 'React.createElement') return false\n const args = Array.isArray(node.arguments) ? node.arguments : []\n if (getStaticString(args[0])?.toLowerCase() !== 'script') return false\n const typeProperty = getObjectProperty(args[1], 'type')\n return getStaticString(typeProperty?.value)?.toLowerCase() === 'application/ld+json'\n}\n\nconst noRawJsonLdRule = defineRule({\n description: 'Disallow raw JSON-LD scripts outside the shared Brandlab schema adapter.',\n messages: {\n rawJsonLd: 'Render JSON-LD through @brandlab-digital/site-next/schema.',\n },\n create(context) {\n if (isSharedPlatformImplementation(context)) return {} as Visitor\n\n function inspectOpeningElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (!node || getJsxElementName(node.name)?.toLowerCase() !== 'script') return\n const typeAttribute = getJsxAttribute(node, 'type')\n if (getStaticString(typeAttribute)?.toLowerCase() === 'application/ld+json') {\n context.report({ node: nodeValue, messageId: 'rawJsonLd' })\n }\n }\n\n function inspectCall(node: unknown) {\n if (isRawJsonLdCreateElement(node)) {\n context.report({ node, messageId: 'rawJsonLd' })\n }\n }\n\n function inspectLiteral(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (getStaticString(node)?.toLowerCase() !== 'application/ld+json') return\n const parentType = asNode(node?.parent)?.type\n if (parentType !== 'JSXAttribute' && parentType !== 'Property') {\n context.report({ node: nodeValue, messageId: 'rawJsonLd' })\n }\n }\n\n return {\n CallExpression: inspectCall,\n JSXOpeningElement: inspectOpeningElement,\n Literal: inspectLiteral,\n TemplateElement: inspectLiteral,\n }\n },\n})\n\nconst strictPiiTokens = new Set([\n 'attachment',\n 'attachment_name',\n 'contact_email',\n 'contact_name',\n 'customer_name',\n 'email',\n 'email_address',\n 'enquiry_message',\n 'file_name',\n 'filename',\n 'first_name',\n 'form_message',\n 'full_name',\n 'last_name',\n 'message',\n 'mobile',\n 'mobile_number',\n 'phone',\n 'phone_number',\n 'residential_address',\n 'street_address',\n 'user_email',\n 'user_phone',\n])\n\nconst contactOnlyPiiTokens = new Set(['address', 'name'])\n\nfunction normalizeToken(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n}\n\nfunction isPiiToken(value: string | null, includeContactOnly: boolean): boolean {\n if (!value) return false\n const normalized = normalizeToken(value)\n return (\n strictPiiTokens.has(normalized) ||\n (includeContactOnly && contactOnlyPiiTokens.has(normalized))\n )\n}\n\nfunction isAnalyticsSink(value: unknown): boolean {\n const path = getMemberPath(value)\n return (\n path === 'gtag' ||\n path === 'window.gtag' ||\n path === 'globalThis.gtag' ||\n path === 'dataLayer.push' ||\n path === 'window.dataLayer.push' ||\n path === 'globalThis.dataLayer.push' ||\n path === 'sendGAEvent' ||\n path === 'sendGTMEvent' ||\n path === 'trackBrandlabBrowserEvent' ||\n path === 'trackBrandlabEvent' ||\n path === 'ReactGA.event'\n )\n}\n\n/** Lead and phone events, current or retired, whose payloads must never carry contact details. */\nconst contactAnalyticsEvents = new Set([\n 'contact_form',\n 'phone_link_click',\n 'phone_call',\n 'generate_lead',\n 'form_submit',\n])\n\nfunction isContactAnalyticsCall(node: AstNode): boolean {\n const args = Array.isArray(node.arguments) ? node.arguments : []\n return args.some((argument) => {\n const value = getStaticString(argument)\n return value !== null && contactAnalyticsEvents.has(value)\n })\n}\n\nfunction looksLikeLiteralPii(value: string): boolean {\n const normalized = value.trim()\n if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalized)) return true\n const digits = normalized.replace(/[^0-9]/g, '')\n return /^\\+?[0-9 ()-]+$/.test(normalized) && digits.length >= 10 && digits.length <= 15\n}\n\nfunction containsPiiReference(value: unknown, includeContactOnly: boolean): boolean {\n const node = asNode(value)\n if (!node) return false\n if (node.type === 'Identifier') {\n return isPiiToken(getIdentifierName(node), includeContactOnly)\n }\n if (node.type === 'MemberExpression') {\n const path = getMemberPath(node)\n const finalSegment = path?.split('.').at(-1) ?? null\n return isPiiToken(finalSegment, includeContactOnly)\n }\n if (node.type === 'Literal') {\n return typeof node.value === 'string' && looksLikeLiteralPii(node.value)\n }\n if (node.type === 'TemplateLiteral') {\n const expressions = Array.isArray(node.expressions) ? node.expressions : []\n return (\n expressions.some((expression) => containsPiiReference(expression, includeContactOnly)) ||\n (getStaticString(node) ? looksLikeLiteralPii(getStaticString(node) ?? '') : false)\n )\n }\n if (node.type === 'CallExpression') {\n const args = Array.isArray(node.arguments) ? node.arguments : []\n return args.some((argument) => containsPiiReference(argument, includeContactOnly))\n }\n if (node.type === 'ConditionalExpression') {\n return (\n containsPiiReference(node.consequent, includeContactOnly) ||\n containsPiiReference(node.alternate, includeContactOnly)\n )\n }\n if (node.type === 'LogicalExpression' || node.type === 'BinaryExpression') {\n return (\n containsPiiReference(node.left, includeContactOnly) ||\n containsPiiReference(node.right, includeContactOnly)\n )\n }\n return false\n}\n\nfunction collectPiiNodes(value: unknown, includeContactOnly: boolean): AstNode[] {\n const node = asNode(value)\n if (!node) return []\n if (node.type === 'ObjectExpression') {\n const properties = Array.isArray(node.properties) ? node.properties : []\n return properties.flatMap((property) => collectPiiNodes(property, includeContactOnly))\n }\n if (node.type === 'Property') {\n const key = getPropertyName(node)\n if (\n isPiiToken(key, includeContactOnly) ||\n containsPiiReference(node.value, includeContactOnly)\n ) {\n return [node]\n }\n return collectPiiNodes(node.value, includeContactOnly)\n }\n if (node.type === 'SpreadElement' || node.type === 'ExperimentalSpreadProperty') {\n return containsPiiReference(node.argument, includeContactOnly) ? [node] : []\n }\n if (node.type === 'ArrayExpression') {\n const elements = Array.isArray(node.elements) ? node.elements : []\n return elements.flatMap((element) => collectPiiNodes(element, includeContactOnly))\n }\n if (containsPiiReference(node, includeContactOnly)) return [node]\n return []\n}\n\nconst noAnalyticsPiiRule = defineRule({\n description: 'Disallow statically provable lead PII in analytics event payloads.',\n messages: {\n analyticsPii:\n 'Do not send lead PII or attachment details to analytics. Use the shared Brandlab analytics allowlist.',\n },\n create(context) {\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'CallExpression' || !isAnalyticsSink(node.callee)) return\n const includeContactOnly = isContactAnalyticsCall(node)\n const args = Array.isArray(node.arguments) ? node.arguments : []\n const reported = new Set<AstNode>()\n for (const argument of args) {\n for (const piiNode of collectPiiNodes(argument, includeContactOnly)) {\n if (reported.has(piiNode)) continue\n reported.add(piiNode)\n context.report({ node: piiNode, messageId: 'analyticsPii' })\n }\n }\n }\n\n return { CallExpression: inspectCall }\n },\n})\n\nfunction normalizeStaticUrl(value: string): string {\n return value.trim().replace(/[\\u0000-\\u0020]+/g, '').toLowerCase()\n}\n\nfunction isDangerousStaticUrl(value: string): boolean {\n return /^(?:javascript|vbscript):/.test(normalizeStaticUrl(value)) ||\n /^data:text\\/html(?:;|,)/.test(normalizeStaticUrl(value))\n}\n\nfunction isExternalStaticUrl(value: string): boolean {\n return /^(?:https?:)?\\/\\//i.test(value.trim())\n}\n\nfunction relHasNoopener(value: string | null): boolean {\n return Boolean(value?.toLowerCase().split(/\\s+/).includes('noopener'))\n}\n\nconst noUnsafeExternalLinksRule = defineRule({\n description: 'Disallow statically provable unsafe link schemes and external opener access.',\n messages: {\n unsafeLinkScheme: 'Do not use javascript:, vbscript:, or HTML data URLs in links.',\n missingNoopener:\n 'External links opened in a new context must include rel=\"noopener\".',\n },\n create(context) {\n function inspectOpeningElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const elementName = getJsxElementName(node?.name)?.toLowerCase()\n if (!node || (elementName !== 'a' && elementName !== 'link')) return\n const href = getStaticString(getJsxAttribute(node, 'href'))\n if (!href) return\n if (isDangerousStaticUrl(href)) {\n context.report({ node: nodeValue, messageId: 'unsafeLinkScheme' })\n return\n }\n const target = getStaticString(getJsxAttribute(node, 'target'))\n if (\n isExternalStaticUrl(href) &&\n target?.toLowerCase() === '_blank' &&\n !relHasNoopener(getStaticString(getJsxAttribute(node, 'rel')))\n ) {\n context.report({ node: nodeValue, messageId: 'missingNoopener' })\n }\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'CallExpression' || getMemberPath(node.callee) !== 'window.open') return\n const args = Array.isArray(node.arguments) ? node.arguments : []\n const url = getStaticString(args[0])\n if (!url) return\n if (isDangerousStaticUrl(url)) {\n context.report({ node: nodeValue, messageId: 'unsafeLinkScheme' })\n return\n }\n const target = getStaticString(args[1]) ?? '_blank'\n const features = getStaticString(args[2])\n if (\n isExternalStaticUrl(url) &&\n target.toLowerCase() === '_blank' &&\n !features?.toLowerCase().split(/\\s*,\\s*/).includes('noopener') &&\n !features?.toLowerCase().split(/\\s*,\\s*/).includes('noreferrer')\n ) {\n context.report({ node: nodeValue, messageId: 'missingNoopener' })\n }\n }\n\n return {\n CallExpression: inspectCall,\n JSXOpeningElement: inspectOpeningElement,\n }\n },\n})\n\nfunction isEmailRenderingFile(context: RuleContext): boolean {\n const filename = getContextFilename(context)\n return (\n /\\/(?:email|emails|contact-email)\\//i.test(filename) ||\n /(?:Email|EmailTemplate|ContactFormEmail)\\.(?:jsx|tsx)$/i.test(filename)\n )\n}\n\nconst noRawImageElementsRule = defineRule({\n description: 'Require Next.js-owned image delivery for website UI.',\n messages: {\n rawImage:\n 'Use next/image for website UI images. Raw image markup is reserved for reviewed getImageProps art direction and non-Next renderers such as email.',\n },\n create(context) {\n if (isEmailRenderingFile(context)) return {} as Visitor\n\n const getImagePropsBindings = new Set<string>()\n const nextImagePropBindings = new Set<string>()\n\n function inspectImport(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'ImportDeclaration' || getStaticString(node.source) !== 'next/image') {\n return\n }\n const specifiers = Array.isArray(node.specifiers) ? node.specifiers : []\n for (const specifierValue of specifiers) {\n const specifier = asNode(specifierValue)\n if (\n specifier?.type === 'ImportSpecifier' &&\n getIdentifierName(specifier.imported) === 'getImageProps'\n ) {\n const localName = getIdentifierName(specifier.local)\n if (localName) getImagePropsBindings.add(localName)\n }\n }\n }\n\n function inspectVariable(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const initializer = asNode(node?.init)\n if (node?.type !== 'VariableDeclarator' || initializer?.type !== 'CallExpression') {\n return\n }\n const calleeName = getIdentifierName(initializer.callee)\n if (!calleeName || !getImagePropsBindings.has(calleeName)) return\n\n const pattern = asNode(node.id)\n if (pattern?.type !== 'ObjectPattern') return\n const properties = Array.isArray(pattern.properties) ? pattern.properties : []\n const propsProperty = properties\n .map(asNode)\n .find(\n (property) =>\n property?.type === 'Property' &&\n getIdentifierName(property.key) === 'props',\n )\n const propsPattern = asNode(propsProperty?.value)\n const directBinding = getIdentifierName(propsPattern)\n if (directBinding) {\n nextImagePropBindings.add(directBinding)\n return\n }\n if (propsPattern?.type !== 'ObjectPattern') return\n const nestedProperties = Array.isArray(propsPattern.properties)\n ? propsPattern.properties\n : []\n for (const propertyValue of nestedProperties) {\n const property = asNode(propertyValue)\n if (property?.type !== 'RestElement') continue\n const binding = getIdentifierName(property.argument)\n if (binding) nextImagePropBindings.add(binding)\n }\n }\n\n function usesReviewedNextImageProps(node: AstNode) {\n if (getJsxAttribute(node, 'src') || getJsxAttribute(node, 'srcSet')) return false\n const attributes = Array.isArray(node.attributes) ? node.attributes : []\n return attributes.some((attributeValue) => {\n const attribute = asNode(attributeValue)\n return (\n attribute?.type === 'JSXSpreadAttribute' &&\n nextImagePropBindings.has(getIdentifierName(attribute.argument) ?? '')\n )\n })\n }\n\n function inspectOpeningElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (\n node &&\n getJsxElementName(node.name)?.toLowerCase() === 'img' &&\n !usesReviewedNextImageProps(node)\n ) {\n context.report({ node: nodeValue, messageId: 'rawImage' })\n }\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'CallExpression') return\n const callee = getMemberPath(node.callee)\n const args = Array.isArray(node.arguments) ? node.arguments : []\n if (\n (callee === 'createElement' || callee === 'React.createElement') &&\n getStaticString(args[0])?.toLowerCase() === 'img'\n ) {\n context.report({ node: nodeValue, messageId: 'rawImage' })\n }\n }\n\n return {\n CallExpression: inspectCall,\n ImportDeclaration: inspectImport,\n JSXOpeningElement: inspectOpeningElement,\n VariableDeclarator: inspectVariable,\n }\n },\n})\n\nconst RAW_HTML_PROPERTY = 'dangerouslySetInnerHTML'\n\nconst noUnsafeRichTextSinksRule = defineRule({\n description:\n 'Disallow project-owned raw HTML; only the shared SchemaScript and SafeRichText renderers may inject markup.',\n messages: {\n unsafeRichTextSink:\n 'Project-owned raw HTML is not permitted. Render JSON-LD with SchemaScript and rich text with SafeRichText from @brandlab-digital/site-next.',\n },\n create(context) {\n if (isSharedPlatformImplementation(context)) return {} as Visitor\n\n function inspectJsxAttribute(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (getIdentifierName(node?.name) === RAW_HTML_PROPERTY) {\n context.report({ node: nodeValue, messageId: 'unsafeRichTextSink' })\n }\n }\n\n function inspectProperty(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type === 'Property' && getPropertyName(node) === RAW_HTML_PROPERTY) {\n context.report({ node: nodeValue, messageId: 'unsafeRichTextSink' })\n }\n }\n\n function inspectAssignment(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const target = asNode(node?.left)\n if (target?.type !== 'MemberExpression') return\n const propertyName = target.computed\n ? getStaticString(target.property)\n : getIdentifierName(target.property)\n if (propertyName === RAW_HTML_PROPERTY) {\n context.report({ node: nodeValue, messageId: 'unsafeRichTextSink' })\n }\n }\n\n return {\n AssignmentExpression: inspectAssignment,\n JSXAttribute: inspectJsxAttribute,\n Property: inspectProperty,\n }\n },\n})\n\nexport const rules = {\n [RULE_IDS.noRetiredAnalyticsEvents]: createTextRule({\n description: 'Disallow retired Brandlab analytics event names.',\n messageId: 'retiredAnalyticsEvent',\n message: 'Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.',\n matcher: (text) => retiredAnalyticsEvents.has(text),\n }),\n [RULE_IDS.noRawJsonLd]: noRawJsonLdRule,\n [RULE_IDS.noUnsafeRichTextSinks]: noUnsafeRichTextSinksRule,\n [RULE_IDS.noProtectedPlatformReimplementation]: noProtectedPlatformReimplementationRule,\n [RULE_IDS.noAnalyticsPii]: noAnalyticsPiiRule,\n [RULE_IDS.noUnsafeExternalLinks]: noUnsafeExternalLinksRule,\n [RULE_IDS.noRawImageElements]: noRawImageElementsRule,\n} satisfies Record<string, RuleModule>\n\n/** A flat-config object; kept structural so ESLint stays a peer, not a type dependency. */\nexport type BrandlabFlatConfig = {\n name?: string\n files?: readonly string[]\n ignores?: readonly string[]\n plugins?: Record<string, unknown>\n rules?: Record<string, unknown>\n [key: string]: unknown\n}\n\ntype BrandlabRecommendedConfig = {\n name: 'brandlab/recommended'\n plugins: {\n brandlab: unknown\n }\n rules: Record<string, 'error'>\n}\n\ntype BrandlabPlugin = {\n rules: typeof rules\n configs: {\n recommended: BrandlabRecommendedConfig\n /** Next core-web-vitals + next/typescript + Brandlab recommended + standard ignores. */\n readonly next: readonly BrandlabFlatConfig[]\n }\n}\n\n/** Build and test output that is never project source. */\nexport const NEXT_CONFIG_IGNORES = Object.freeze([\n '.next/**',\n 'out/**',\n 'build/**',\n 'coverage/**',\n 'playwright-report/**',\n 'test-results/**',\n '.vercel/**',\n 'public/**',\n 'next-env.d.ts',\n])\n\nconst recommendedRules = Object.fromEntries(\n Object.keys(rules).map((ruleId) => [`brandlab/${ruleId}`, 'error' as const]),\n) as Record<string, 'error'>\n\nconst recommended: BrandlabRecommendedConfig = {\n name: 'brandlab/recommended',\n plugins: {\n brandlab: undefined,\n },\n rules: recommendedRules,\n}\n\nfunction toConfigArray(value: unknown, specifier: string): BrandlabFlatConfig[] {\n const exported = Array.isArray(value)\n ? value\n : Array.isArray(asNode(value)?.default)\n ? (asNode(value)?.default as unknown[])\n : null\n if (!exported) throw new Error(`${specifier} did not export a flat config array.`)\n return exported as BrandlabFlatConfig[]\n}\n\n/**\n * The complete client preset: `export default brandlab.configs.next`.\n * eslint-config-next is an optional peer, so it loads only when this preset is used.\n */\nexport function createBrandlabNextConfig(presets: {\n coreWebVitals: readonly BrandlabFlatConfig[]\n typescript: readonly BrandlabFlatConfig[]\n}): readonly BrandlabFlatConfig[] {\n return Object.freeze([\n ...presets.coreWebVitals,\n ...presets.typescript,\n recommended,\n {\n name: 'brandlab/next',\n rules: {\n // Apostrophes and quotes are ordinary Australian English copy in JSX text.\n 'react/no-unescaped-entities': 'off',\n },\n },\n { name: 'brandlab/next-ignores', ignores: NEXT_CONFIG_IGNORES },\n ])\n}\n\nfunction loadNextConfig(): readonly BrandlabFlatConfig[] {\n const require = createRequire(import.meta.url)\n const load = (specifier: string) => {\n try {\n return toConfigArray(require(specifier), specifier)\n } catch (error) {\n throw new Error(\n `brandlab.configs.next requires ${specifier}. Install eslint-config-next at the exact version of next.`,\n { cause: error },\n )\n }\n }\n return createBrandlabNextConfig({\n coreWebVitals: load('eslint-config-next/core-web-vitals'),\n typescript: load('eslint-config-next/typescript'),\n })\n}\n\nlet nextConfig: readonly BrandlabFlatConfig[] | undefined\n\nconst plugin: BrandlabPlugin = {\n rules,\n configs: {\n recommended,\n get next() {\n nextConfig ??= loadNextConfig()\n return nextConfig\n },\n },\n}\n\nrecommended.plugins.brandlab = plugin\n\nexport default plugin\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRequire } from 'node:module'\n\ntype AstNode = {\n type?: string\n [key: string]: unknown\n}\n\ntype ReportDescriptor = {\n node: unknown\n messageId?: string\n message?: string\n data?: Record<string, string>\n}\n\ntype ScopeVariable = {\n defs: ReadonlyArray<{ type?: string; node?: unknown }>\n}\n\ntype Scope = {\n set: ReadonlyMap<string, ScopeVariable>\n upper: Scope | null\n}\n\ntype RuleContext = {\n filename?: string\n getFilename?: () => string\n physicalFilename?: string\n cwd?: string\n sourceCode?: { getScope?: (node: unknown) => Scope }\n report: (descriptor: ReportDescriptor) => void\n}\n\nfunction getContextFilename(context: RuleContext): string {\n return (\n context.filename ??\n context.physicalFilename ??\n context.getFilename?.() ??\n ''\n ).replaceAll('\\\\', '/')\n}\n\ntype Visitor = Record<string, (node: unknown) => void>\n\ntype RuleModule = {\n meta: {\n type: 'problem'\n docs: {\n description: string\n recommended: boolean\n }\n messages: Record<string, string>\n schema: []\n }\n create: (context: RuleContext) => Visitor\n}\n\nexport const RULE_IDS = Object.freeze({\n noRetiredAnalyticsEvents: 'no-retired-analytics-events',\n noRawJsonLd: 'no-raw-json-ld',\n noUnsafeRichTextSinks: 'no-unsafe-rich-text-sinks',\n noProtectedPlatformReimplementation: 'no-protected-platform-reimplementation',\n noAnalyticsPii: 'no-analytics-pii',\n noUnsafeExternalLinks: 'no-unsafe-external-links',\n noRawImageElements: 'no-raw-image-elements',\n noLiteralTelLinks: 'no-literal-tel-links',\n noHeaderHoverTimers: 'no-header-hover-timers',\n noUiKitDeepImports: 'no-ui-kit-deep-imports',\n} as const)\n\n/**\n * Rules that only `configs['site-system']` enables. They are held back from `recommended` so a fleet bump or security\n * patch does not turn every site red; a site adds the config when it declares a `siteSystem` tier.\n */\nexport const SITE_SYSTEM_RULE_IDS = Object.freeze([\n RULE_IDS.noLiteralTelLinks,\n RULE_IDS.noHeaderHoverTimers,\n RULE_IDS.noUiKitDeepImports,\n] as const)\n\nfunction asNode(value: unknown): AstNode | null {\n return value && typeof value === 'object' ? (value as AstNode) : null\n}\n\nfunction getStaticString(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n if (node.type === 'TemplateElement') {\n const templateValue = asNode(node.value)\n return typeof templateValue?.raw === 'string' ? templateValue.raw : null\n }\n if (node.type === 'TemplateLiteral') {\n const expressions = Array.isArray(node.expressions) ? node.expressions : []\n const quasis = Array.isArray(node.quasis) ? node.quasis : []\n if (expressions.length > 0) return null\n return quasis.map(getStaticString).join('')\n }\n if (node.type === 'JSXExpressionContainer') return getStaticString(node.expression)\n if (node.type === 'JSXAttribute') return getStaticString(node.value)\n if (node.type === 'ChainExpression') return getStaticString(node.expression)\n\n return null\n}\n\nfunction getIdentifierName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n return null\n}\n\nfunction defineRule(options: {\n description: string\n /** False for rules a config other than `recommended` enables. Defaults to true. */\n recommended?: boolean\n messages: Record<string, string>\n create: (context: RuleContext) => Visitor\n}): RuleModule {\n return {\n meta: {\n type: 'problem',\n docs: {\n description: options.description,\n recommended: options.recommended ?? true,\n },\n messages: options.messages,\n schema: [],\n },\n create: options.create,\n }\n}\n\nfunction createTextRule(options: {\n description: string\n messageId: string\n message: string\n matcher: (text: string, context: RuleContext) => boolean\n}): RuleModule {\n return defineRule({\n description: options.description,\n messages: { [options.messageId]: options.message },\n create(context) {\n function inspect(node: unknown) {\n const text = getStaticString(node)\n if (text && options.matcher(text, context)) {\n context.report({ node, messageId: options.messageId })\n }\n }\n\n return {\n Literal: inspect,\n TemplateElement: inspect,\n }\n },\n })\n}\n\nconst retiredAnalyticsEvents = new Set([\n 'contact_form_submission',\n 'phone_call',\n 'phone_calls',\n 'form_start',\n 'form_submit',\n 'generate_lead',\n 'cta_click',\n])\n\nconst protectedPlatformNames = new Set([\n 'BrandlabBreadcrumbs',\n 'ContactFormEmail',\n 'SchemaScript',\n 'buildBrandlabMetadata',\n 'buildLocalBusinessSchema',\n 'buildNextMetadata',\n 'buildRobotsMetadata',\n 'buildSchemaGraph',\n 'buildSitemapEntries',\n 'createRouteAwareMdxBlogAdapter',\n 'createRouteAwareStructuredBlogAdapter',\n 'createBrandlabContactRuntime',\n 'createNextMetadataBuilder',\n 'defineAnalyticsContract',\n 'defineBrandlabBusiness',\n 'defineBrandlabContact',\n 'defineBrandlabProject',\n 'defineBreadcrumbTrail',\n 'defineContactContract',\n 'defineRouteCatalog',\n 'installPhoneClickListener',\n 'renderContactEmail',\n 'sitemapIndexXmlResponse',\n 'sitemapXmlResponse',\n 'trackBrandlabBrowserEvent',\n])\n\nconst protectedDirectCalls = new Set([\n 'dataLayer.push',\n 'globalThis.dataLayer.push',\n 'globalThis.gtag',\n 'gtag',\n 'window.dataLayer.push',\n 'window.gtag',\n])\n\nfunction isSharedPlatformImplementation(context: RuleContext): boolean {\n const filename = getContextFilename(context)\n return (\n filename.includes('/node_modules/@brandlab-digital/') ||\n /(?:^|\\/)standards\\/source\\/packages\\/(?:site-core|site-next)\\//.test(filename)\n )\n}\n\nfunction getMemberPath(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n if (node.type === 'ChainExpression') return getMemberPath(node.expression)\n if (node.type === 'Identifier') return getIdentifierName(node)\n if (node.type === 'ThisExpression') return 'this'\n if (node.type !== 'MemberExpression') return null\n\n const objectPath = getMemberPath(node.object)\n const propertyName = node.computed\n ? getStaticString(node.property)\n : getIdentifierName(node.property)\n return objectPath && propertyName ? `${objectPath}.${propertyName}` : null\n}\n\nfunction getDeclarationName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n return getIdentifierName(node.id)\n}\n\nconst noProtectedPlatformReimplementationRule = defineRule({\n description: 'Disallow local reimplementation of protected Brandlab runtime surfaces.',\n messages: {\n protectedDeclaration:\n '{{name}} is a protected Brandlab platform surface. Import the shared implementation instead of declaring it locally.',\n protectedCall:\n '{{name}} bypasses protected Brandlab delivery or analytics behaviour. Use the shared platform adapter.',\n },\n create(context) {\n if (isSharedPlatformImplementation(context)) return {} as Visitor\n\n function inspectDeclaration(node: unknown) {\n const name = getDeclarationName(node)\n if (name && protectedPlatformNames.has(name)) {\n context.report({\n node,\n messageId: 'protectedDeclaration',\n data: { name },\n })\n }\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const callPath = getMemberPath(node?.callee)\n if (!callPath) return\n if (protectedDirectCalls.has(callPath) || callPath.endsWith('.emails.send')) {\n context.report({\n node: nodeValue,\n messageId: 'protectedCall',\n data: { name: callPath },\n })\n }\n }\n\n return {\n CallExpression: inspectCall,\n ClassDeclaration: inspectDeclaration,\n FunctionDeclaration: inspectDeclaration,\n VariableDeclarator: inspectDeclaration,\n }\n },\n})\n\nfunction getJsxElementName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n const direct = getIdentifierName(node)\n if (direct) return direct\n if (node.type !== 'JSXMemberExpression') return null\n const objectName = getJsxElementName(node.object)\n const propertyName = getJsxElementName(node.property)\n return objectName && propertyName ? `${objectName}.${propertyName}` : null\n}\n\nfunction getJsxAttribute(openingElement: AstNode, name: string): AstNode | null {\n const attributes = Array.isArray(openingElement.attributes) ? openingElement.attributes : []\n return (\n attributes\n .map(asNode)\n .find(\n (attribute) =>\n attribute?.type === 'JSXAttribute' &&\n getIdentifierName(attribute.name)?.toLowerCase() === name.toLowerCase(),\n ) ?? null\n )\n}\n\nfunction getObjectProperty(value: unknown, key: string): AstNode | null {\n const node = asNode(value)\n if (node?.type !== 'ObjectExpression') return null\n const properties = Array.isArray(node.properties) ? node.properties : []\n return (\n properties\n .map(asNode)\n .find(\n (property) =>\n property?.type === 'Property' &&\n getPropertyName(property)?.toLowerCase() === key.toLowerCase(),\n ) ?? null\n )\n}\n\nfunction getPropertyName(property: AstNode): string | null {\n return property.computed\n ? getStaticString(property.key)\n : getIdentifierName(property.key) ?? getStaticString(property.key)\n}\n\nfunction isRawJsonLdCreateElement(value: unknown): boolean {\n const node = asNode(value)\n if (node?.type !== 'CallExpression') return false\n const callee = getMemberPath(node.callee)\n if (callee !== 'createElement' && callee !== 'React.createElement') return false\n const args = Array.isArray(node.arguments) ? node.arguments : []\n if (getStaticString(args[0])?.toLowerCase() !== 'script') return false\n const typeProperty = getObjectProperty(args[1], 'type')\n return getStaticString(typeProperty?.value)?.toLowerCase() === 'application/ld+json'\n}\n\nconst noRawJsonLdRule = defineRule({\n description: 'Disallow raw JSON-LD scripts outside the shared Brandlab schema adapter.',\n messages: {\n rawJsonLd: 'Render JSON-LD through @brandlab-digital/site-next/schema.',\n },\n create(context) {\n if (isSharedPlatformImplementation(context)) return {} as Visitor\n\n function inspectOpeningElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (!node || getJsxElementName(node.name)?.toLowerCase() !== 'script') return\n const typeAttribute = getJsxAttribute(node, 'type')\n if (getStaticString(typeAttribute)?.toLowerCase() === 'application/ld+json') {\n context.report({ node: nodeValue, messageId: 'rawJsonLd' })\n }\n }\n\n function inspectCall(node: unknown) {\n if (isRawJsonLdCreateElement(node)) {\n context.report({ node, messageId: 'rawJsonLd' })\n }\n }\n\n function inspectLiteral(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (getStaticString(node)?.toLowerCase() !== 'application/ld+json') return\n const parentType = asNode(node?.parent)?.type\n if (parentType !== 'JSXAttribute' && parentType !== 'Property') {\n context.report({ node: nodeValue, messageId: 'rawJsonLd' })\n }\n }\n\n return {\n CallExpression: inspectCall,\n JSXOpeningElement: inspectOpeningElement,\n Literal: inspectLiteral,\n TemplateElement: inspectLiteral,\n }\n },\n})\n\nconst strictPiiTokens = new Set([\n 'attachment',\n 'attachment_name',\n 'contact_email',\n 'contact_name',\n 'customer_name',\n 'email',\n 'email_address',\n 'enquiry_message',\n 'file_name',\n 'filename',\n 'first_name',\n 'form_message',\n 'full_name',\n 'last_name',\n 'message',\n 'mobile',\n 'mobile_number',\n 'phone',\n 'phone_number',\n 'residential_address',\n 'street_address',\n 'user_email',\n 'user_phone',\n])\n\nconst contactOnlyPiiTokens = new Set(['address', 'name'])\n\nfunction normalizeToken(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n}\n\nfunction isPiiToken(value: string | null, includeContactOnly: boolean): boolean {\n if (!value) return false\n const normalized = normalizeToken(value)\n return (\n strictPiiTokens.has(normalized) ||\n (includeContactOnly && contactOnlyPiiTokens.has(normalized))\n )\n}\n\nfunction isAnalyticsSink(value: unknown): boolean {\n const path = getMemberPath(value)\n return (\n path === 'gtag' ||\n path === 'window.gtag' ||\n path === 'globalThis.gtag' ||\n path === 'dataLayer.push' ||\n path === 'window.dataLayer.push' ||\n path === 'globalThis.dataLayer.push' ||\n path === 'sendGAEvent' ||\n path === 'sendGTMEvent' ||\n path === 'trackBrandlabBrowserEvent' ||\n path === 'trackBrandlabEvent' ||\n path === 'ReactGA.event'\n )\n}\n\n/** Lead and phone events, current or retired, whose payloads must never carry contact details. */\nconst contactAnalyticsEvents = new Set([\n 'contact_form',\n 'phone_link_click',\n 'phone_call',\n 'generate_lead',\n 'form_submit',\n])\n\nfunction isContactAnalyticsCall(node: AstNode): boolean {\n const args = Array.isArray(node.arguments) ? node.arguments : []\n return args.some((argument) => {\n const value = getStaticString(argument)\n return value !== null && contactAnalyticsEvents.has(value)\n })\n}\n\nfunction looksLikeLiteralPii(value: string): boolean {\n const normalized = value.trim()\n if (/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(normalized)) return true\n const digits = normalized.replace(/[^0-9]/g, '')\n return /^\\+?[0-9 ()-]+$/.test(normalized) && digits.length >= 10 && digits.length <= 15\n}\n\nfunction containsPiiReference(value: unknown, includeContactOnly: boolean): boolean {\n const node = asNode(value)\n if (!node) return false\n if (node.type === 'Identifier') {\n return isPiiToken(getIdentifierName(node), includeContactOnly)\n }\n if (node.type === 'MemberExpression') {\n const path = getMemberPath(node)\n const finalSegment = path?.split('.').at(-1) ?? null\n return isPiiToken(finalSegment, includeContactOnly)\n }\n if (node.type === 'Literal') {\n return typeof node.value === 'string' && looksLikeLiteralPii(node.value)\n }\n if (node.type === 'TemplateLiteral') {\n const expressions = Array.isArray(node.expressions) ? node.expressions : []\n return (\n expressions.some((expression) => containsPiiReference(expression, includeContactOnly)) ||\n (getStaticString(node) ? looksLikeLiteralPii(getStaticString(node) ?? '') : false)\n )\n }\n if (node.type === 'CallExpression') {\n const args = Array.isArray(node.arguments) ? node.arguments : []\n return args.some((argument) => containsPiiReference(argument, includeContactOnly))\n }\n if (node.type === 'ConditionalExpression') {\n return (\n containsPiiReference(node.consequent, includeContactOnly) ||\n containsPiiReference(node.alternate, includeContactOnly)\n )\n }\n if (node.type === 'LogicalExpression' || node.type === 'BinaryExpression') {\n return (\n containsPiiReference(node.left, includeContactOnly) ||\n containsPiiReference(node.right, includeContactOnly)\n )\n }\n return false\n}\n\nfunction collectPiiNodes(value: unknown, includeContactOnly: boolean): AstNode[] {\n const node = asNode(value)\n if (!node) return []\n if (node.type === 'ObjectExpression') {\n const properties = Array.isArray(node.properties) ? node.properties : []\n return properties.flatMap((property) => collectPiiNodes(property, includeContactOnly))\n }\n if (node.type === 'Property') {\n const key = getPropertyName(node)\n if (\n isPiiToken(key, includeContactOnly) ||\n containsPiiReference(node.value, includeContactOnly)\n ) {\n return [node]\n }\n return collectPiiNodes(node.value, includeContactOnly)\n }\n if (node.type === 'SpreadElement' || node.type === 'ExperimentalSpreadProperty') {\n return containsPiiReference(node.argument, includeContactOnly) ? [node] : []\n }\n if (node.type === 'ArrayExpression') {\n const elements = Array.isArray(node.elements) ? node.elements : []\n return elements.flatMap((element) => collectPiiNodes(element, includeContactOnly))\n }\n if (containsPiiReference(node, includeContactOnly)) return [node]\n return []\n}\n\nconst noAnalyticsPiiRule = defineRule({\n description: 'Disallow statically provable lead PII in analytics event payloads.',\n messages: {\n analyticsPii:\n 'Do not send lead PII or attachment details to analytics. Use the shared Brandlab analytics allowlist.',\n },\n create(context) {\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'CallExpression' || !isAnalyticsSink(node.callee)) return\n const includeContactOnly = isContactAnalyticsCall(node)\n const args = Array.isArray(node.arguments) ? node.arguments : []\n const reported = new Set<AstNode>()\n for (const argument of args) {\n for (const piiNode of collectPiiNodes(argument, includeContactOnly)) {\n if (reported.has(piiNode)) continue\n reported.add(piiNode)\n context.report({ node: piiNode, messageId: 'analyticsPii' })\n }\n }\n }\n\n return { CallExpression: inspectCall }\n },\n})\n\nfunction normalizeStaticUrl(value: string): string {\n return value.trim().replace(/[\\u0000-\\u0020]+/g, '').toLowerCase()\n}\n\nfunction isDangerousStaticUrl(value: string): boolean {\n return /^(?:javascript|vbscript):/.test(normalizeStaticUrl(value)) ||\n /^data:text\\/html(?:;|,)/.test(normalizeStaticUrl(value))\n}\n\nfunction isExternalStaticUrl(value: string): boolean {\n return /^(?:https?:)?\\/\\//i.test(value.trim())\n}\n\nfunction relHasNoopener(value: string | null): boolean {\n return Boolean(value?.toLowerCase().split(/\\s+/).includes('noopener'))\n}\n\nconst noUnsafeExternalLinksRule = defineRule({\n description: 'Disallow statically provable unsafe link schemes and external opener access.',\n messages: {\n unsafeLinkScheme: 'Do not use javascript:, vbscript:, or HTML data URLs in links.',\n missingNoopener:\n 'External links opened in a new context must include rel=\"noopener\".',\n },\n create(context) {\n function inspectOpeningElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const elementName = getJsxElementName(node?.name)?.toLowerCase()\n if (!node || (elementName !== 'a' && elementName !== 'link')) return\n const href = getStaticString(getJsxAttribute(node, 'href'))\n if (!href) return\n if (isDangerousStaticUrl(href)) {\n context.report({ node: nodeValue, messageId: 'unsafeLinkScheme' })\n return\n }\n const target = getStaticString(getJsxAttribute(node, 'target'))\n if (\n isExternalStaticUrl(href) &&\n target?.toLowerCase() === '_blank' &&\n !relHasNoopener(getStaticString(getJsxAttribute(node, 'rel')))\n ) {\n context.report({ node: nodeValue, messageId: 'missingNoopener' })\n }\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'CallExpression' || getMemberPath(node.callee) !== 'window.open') return\n const args = Array.isArray(node.arguments) ? node.arguments : []\n const url = getStaticString(args[0])\n if (!url) return\n if (isDangerousStaticUrl(url)) {\n context.report({ node: nodeValue, messageId: 'unsafeLinkScheme' })\n return\n }\n const target = getStaticString(args[1]) ?? '_blank'\n const features = getStaticString(args[2])\n if (\n isExternalStaticUrl(url) &&\n target.toLowerCase() === '_blank' &&\n !features?.toLowerCase().split(/\\s*,\\s*/).includes('noopener') &&\n !features?.toLowerCase().split(/\\s*,\\s*/).includes('noreferrer')\n ) {\n context.report({ node: nodeValue, messageId: 'missingNoopener' })\n }\n }\n\n return {\n CallExpression: inspectCall,\n JSXOpeningElement: inspectOpeningElement,\n }\n },\n})\n\nfunction isEmailRenderingFile(context: RuleContext): boolean {\n const filename = getContextFilename(context)\n return (\n /\\/(?:email|emails|contact-email)\\//i.test(filename) ||\n /(?:Email|EmailTemplate|ContactFormEmail)\\.(?:jsx|tsx)$/i.test(filename)\n )\n}\n\nconst noRawImageElementsRule = defineRule({\n description: 'Require Next.js-owned image delivery for website UI.',\n messages: {\n rawImage:\n 'Use next/image for website UI images. Raw image markup is reserved for reviewed getImageProps art direction and non-Next renderers such as email.',\n },\n create(context) {\n if (isEmailRenderingFile(context)) return {} as Visitor\n\n const getImagePropsBindings = new Set<string>()\n const nextImagePropBindings = new Set<string>()\n\n function inspectImport(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'ImportDeclaration' || getStaticString(node.source) !== 'next/image') {\n return\n }\n const specifiers = Array.isArray(node.specifiers) ? node.specifiers : []\n for (const specifierValue of specifiers) {\n const specifier = asNode(specifierValue)\n if (\n specifier?.type === 'ImportSpecifier' &&\n getIdentifierName(specifier.imported) === 'getImageProps'\n ) {\n const localName = getIdentifierName(specifier.local)\n if (localName) getImagePropsBindings.add(localName)\n }\n }\n }\n\n function inspectVariable(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const initializer = asNode(node?.init)\n if (node?.type !== 'VariableDeclarator' || initializer?.type !== 'CallExpression') {\n return\n }\n const calleeName = getIdentifierName(initializer.callee)\n if (!calleeName || !getImagePropsBindings.has(calleeName)) return\n\n const pattern = asNode(node.id)\n if (pattern?.type !== 'ObjectPattern') return\n const properties = Array.isArray(pattern.properties) ? pattern.properties : []\n const propsProperty = properties\n .map(asNode)\n .find(\n (property) =>\n property?.type === 'Property' &&\n getIdentifierName(property.key) === 'props',\n )\n const propsPattern = asNode(propsProperty?.value)\n const directBinding = getIdentifierName(propsPattern)\n if (directBinding) {\n nextImagePropBindings.add(directBinding)\n return\n }\n if (propsPattern?.type !== 'ObjectPattern') return\n const nestedProperties = Array.isArray(propsPattern.properties)\n ? propsPattern.properties\n : []\n for (const propertyValue of nestedProperties) {\n const property = asNode(propertyValue)\n if (property?.type !== 'RestElement') continue\n const binding = getIdentifierName(property.argument)\n if (binding) nextImagePropBindings.add(binding)\n }\n }\n\n function usesReviewedNextImageProps(node: AstNode) {\n if (getJsxAttribute(node, 'src') || getJsxAttribute(node, 'srcSet')) return false\n const attributes = Array.isArray(node.attributes) ? node.attributes : []\n return attributes.some((attributeValue) => {\n const attribute = asNode(attributeValue)\n return (\n attribute?.type === 'JSXSpreadAttribute' &&\n nextImagePropBindings.has(getIdentifierName(attribute.argument) ?? '')\n )\n })\n }\n\n function inspectOpeningElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (\n node &&\n getJsxElementName(node.name)?.toLowerCase() === 'img' &&\n !usesReviewedNextImageProps(node)\n ) {\n context.report({ node: nodeValue, messageId: 'rawImage' })\n }\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type !== 'CallExpression') return\n const callee = getMemberPath(node.callee)\n const args = Array.isArray(node.arguments) ? node.arguments : []\n if (\n (callee === 'createElement' || callee === 'React.createElement') &&\n getStaticString(args[0])?.toLowerCase() === 'img'\n ) {\n context.report({ node: nodeValue, messageId: 'rawImage' })\n }\n }\n\n return {\n CallExpression: inspectCall,\n ImportDeclaration: inspectImport,\n JSXOpeningElement: inspectOpeningElement,\n VariableDeclarator: inspectVariable,\n }\n },\n})\n\nconst RAW_HTML_PROPERTY = 'dangerouslySetInnerHTML'\n\nconst noUnsafeRichTextSinksRule = defineRule({\n description:\n 'Disallow project-owned raw HTML; only the shared SchemaScript and SafeRichText renderers may inject markup.',\n messages: {\n unsafeRichTextSink:\n 'Project-owned raw HTML is not permitted. Render JSON-LD with SchemaScript and rich text with SafeRichText from @brandlab-digital/site-next.',\n },\n create(context) {\n if (isSharedPlatformImplementation(context)) return {} as Visitor\n\n function inspectJsxAttribute(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (getIdentifierName(node?.name) === RAW_HTML_PROPERTY) {\n context.report({ node: nodeValue, messageId: 'unsafeRichTextSink' })\n }\n }\n\n function inspectProperty(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (node?.type === 'Property' && getPropertyName(node) === RAW_HTML_PROPERTY) {\n context.report({ node: nodeValue, messageId: 'unsafeRichTextSink' })\n }\n }\n\n function inspectAssignment(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const target = asNode(node?.left)\n if (target?.type !== 'MemberExpression') return\n const propertyName = target.computed\n ? getStaticString(target.property)\n : getIdentifierName(target.property)\n if (propertyName === RAW_HTML_PROPERTY) {\n context.report({ node: nodeValue, messageId: 'unsafeRichTextSink' })\n }\n }\n\n return {\n AssignmentExpression: inspectAssignment,\n JSXAttribute: inspectJsxAttribute,\n Property: inspectProperty,\n }\n },\n})\n\nfunction getModuleSpecifier(value: unknown): string | null {\n const node = asNode(value)\n return node?.type === 'Literal' || node?.type === 'TemplateLiteral' ? getStaticString(node) : null\n}\n\nfunction isInstalledPackageFile(context: RuleContext): boolean {\n return /(?:^|\\/)node_modules\\//.test(getContextFilename(context))\n}\n\n/**\n * The file's path inside the project, so a checkout that happens to live under a directory called test or e2e is not\n * mistaken for test code. Without a project root only the file name is left to judge.\n */\nfunction getProjectRelativePath(context: RuleContext): string {\n const filename = getContextFilename(context)\n if (!filename.startsWith('/') && !/^[A-Za-z]:\\//.test(filename)) return filename\n const cwd = (context.cwd ?? '').replaceAll('\\\\', '/').replace(/\\/+$/, '')\n if (cwd && filename.startsWith(`${cwd}/`)) return filename.slice(cwd.length + 1)\n const underSrc = getPathUnderSrc(filename)\n return underSrc === null ? filename.slice(filename.lastIndexOf('/') + 1) : `src/${underSrc}`\n}\n\nfunction isTestFile(context: RuleContext): boolean {\n const path = getProjectRelativePath(context)\n return (\n /\\.(?:test|spec)\\.[cm]?[jt]sx?$/.test(path) ||\n /(?:^|\\/)(?:__tests__|__mocks__|tests?|e2e)\\//.test(path)\n )\n}\n\nfunction isTelUrl(value: string): boolean {\n return /^[\\u0000-\\u0020]*tel:/i.test(value)\n}\n\n/** True when the href value is statically a tel: URL: a literal, a template or concatenation that starts with one, or a branch of either. */\nfunction startsWithTelScheme(value: unknown): boolean {\n const node = asNode(value)\n if (!node) return false\n switch (node.type) {\n case 'Literal':\n return typeof node.value === 'string' && isTelUrl(node.value)\n case 'TemplateLiteral': {\n const quasis = Array.isArray(node.quasis) ? node.quasis : []\n const first = asNode(asNode(quasis[0])?.value)\n const text = first?.cooked ?? first?.raw\n return typeof text === 'string' && isTelUrl(text)\n }\n case 'BinaryExpression':\n return node.operator === '+' && startsWithTelScheme(node.left)\n case 'ConditionalExpression':\n return startsWithTelScheme(node.consequent) || startsWithTelScheme(node.alternate)\n case 'LogicalExpression':\n return startsWithTelScheme(node.left) || startsWithTelScheme(node.right)\n case 'JSXExpressionContainer':\n case 'ChainExpression':\n case 'TSAsExpression':\n case 'TSNonNullExpression':\n case 'TSSatisfiesExpression':\n return startsWithTelScheme(node.expression)\n default:\n return false\n }\n}\n\nconst noLiteralTelLinksRule = defineRule({\n description: 'Disallow literal tel: links; telephone links come from the shared PhoneLink.',\n recommended: false,\n messages: {\n literalTelLink:\n 'Literal tel: links bypass the shared phone link and its phone_link_click instrumentation. Use PhoneLink from @brandlab-digital/site-next/ui-kit/primitives.',\n },\n create(context) {\n // Email markup cannot render PhoneLink, so email renderers (as for raw images) are exempt.\n if (\n isInstalledPackageFile(context) ||\n isTestFile(context) ||\n isSharedPlatformImplementation(context) ||\n isEmailRenderingFile(context)\n ) {\n return {} as Visitor\n }\n\n function inspectAttribute(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (getIdentifierName(node?.name) !== 'href') return\n if (startsWithTelScheme(node?.value)) {\n context.report({ node: nodeValue, messageId: 'literalTelLink' })\n }\n }\n\n return { JSXAttribute: inspectAttribute }\n },\n})\n\nconst hoverHandlerNames = new Set([\n 'onmouseenter',\n 'onmouseleave',\n 'onpointerenter',\n 'onpointerleave',\n])\n\nconst hoverEventNames = new Set(['mouseenter', 'mouseleave', 'pointerenter', 'pointerleave'])\n\n/** Names that mark a site file as header code: its path under src/, or a component it exports. */\nconst headerPathPattern = /header|nav|menu|drawer/i\nconst headerExportPattern = /Header|Nav|Menu|Drawer/\n\n/** The path below the last src/ segment, or null for a file that is not under src/. */\nfunction getPathUnderSrc(filename: string): string | null {\n const normalized = filename.startsWith('/') ? filename : `/${filename}`\n const marker = normalized.lastIndexOf('/src/')\n return marker === -1 ? null : normalized.slice(marker + '/src/'.length)\n}\n\nfunction getExportedValueNames(value: unknown): string[] {\n const node = asNode(value)\n if (!node) return []\n if (node.type === 'Identifier') return [getIdentifierName(node)].filter((name) => name !== null)\n if (\n node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ClassDeclaration' ||\n node.type === 'ClassExpression'\n ) {\n return [getIdentifierName(node.id)].filter((name) => name !== null)\n }\n if (node.type === 'CallExpression') {\n const args = Array.isArray(node.arguments) ? node.arguments : []\n return args.flatMap(getExportedValueNames)\n }\n if (node.type === 'TSAsExpression' || node.type === 'TSSatisfiesExpression') {\n return getExportedValueNames(node.expression)\n }\n return []\n}\n\nfunction getExportedNames(nodeValue: unknown): string[] {\n const node = asNode(nodeValue)\n if (node?.type === 'ExportDefaultDeclaration') return getExportedValueNames(node.declaration)\n if (node?.type !== 'ExportNamedDeclaration') return []\n const declaration = asNode(node.declaration)\n const declared =\n declaration?.type === 'VariableDeclaration'\n ? (Array.isArray(declaration.declarations) ? declaration.declarations : []).map((declarator) =>\n getIdentifierName(asNode(declarator)?.id),\n )\n : [getIdentifierName(declaration?.id)]\n const specifiers = Array.isArray(node.specifiers) ? node.specifiers : []\n const specified = specifiers.flatMap((specifier) => [\n getStaticString(asNode(specifier)?.exported),\n getStaticString(asNode(specifier)?.local),\n ])\n return [...declared, ...specified].filter((name): name is string => Boolean(name))\n}\n\nfunction walkAst(value: unknown, visit: (node: AstNode) => void): void {\n if (Array.isArray(value)) {\n for (const item of value) walkAst(item, visit)\n return\n }\n const node = asNode(value)\n if (!node || typeof node.type !== 'string') return\n visit(node)\n for (const [key, child] of Object.entries(node)) {\n if (key === 'parent' || key === 'loc' || key === 'range' || key === 'tokens' || key === 'comments') {\n continue\n }\n walkAst(child, visit)\n }\n}\n\nfunction findVariable(context: RuleContext, identifier: AstNode): ScopeVariable | null {\n const name = getIdentifierName(identifier)\n if (!name) return null\n let scope = context.sourceCode?.getScope?.(identifier) ?? null\n while (scope) {\n const variable = scope.set.get(name)\n if (variable) return variable\n scope = scope.upper\n }\n return null\n}\n\n/** The functions a handler expression can be: inline, named in this file, wrapped in a call or chosen by a condition. */\nfunction createFunctionResolver(context: RuleContext) {\n function resolve(value: unknown, seen: Set<AstNode>): AstNode[] {\n const node = asNode(value)\n if (!node || seen.has(node)) return []\n seen.add(node)\n switch (node.type) {\n case 'ArrowFunctionExpression':\n case 'FunctionExpression':\n case 'FunctionDeclaration':\n return [node]\n case 'ConditionalExpression':\n return [...resolve(node.consequent, seen), ...resolve(node.alternate, seen)]\n case 'LogicalExpression':\n return [...resolve(node.left, seen), ...resolve(node.right, seen)]\n case 'ChainExpression':\n case 'TSAsExpression':\n case 'TSNonNullExpression':\n case 'TSSatisfiesExpression':\n return resolve(node.expression, seen)\n case 'CallExpression': {\n const args = Array.isArray(node.arguments) ? node.arguments : []\n return [node.callee, ...args].flatMap((part) => resolve(part, seen))\n }\n case 'Identifier':\n return (findVariable(context, node)?.defs ?? []).flatMap((definition) => {\n const defined = asNode(definition.node)\n if (definition.type === 'FunctionName') return resolve(defined, seen)\n if (definition.type === 'Variable' && getIdentifierName(defined?.id) === node.name) {\n return resolve(defined?.init, seen)\n }\n return []\n })\n default:\n return []\n }\n }\n return (value: unknown) => resolve(value, new Set())\n}\n\nfunction getTimerCallName(callee: unknown): string | null {\n const path = getMemberPath(callee)\n return path && /^(?:(?:window|globalThis|self)\\.)?(?:setTimeout|clearTimeout)$/.test(path)\n ? path\n : null\n}\n\nconst noHeaderHoverTimersRule = defineRule({\n description:\n 'Disallow setTimeout and clearTimeout in pointer or mouse enter and leave handlers of site header, nav, menu and drawer code.',\n recommended: false,\n messages: {\n headerHoverTimer:\n '{{name}} in a pointer or mouse enter or leave handler is a hover timer. Use the shared header from @brandlab-digital/site-next/ui-kit/shell; its hover behaviour and timings are locked in the library.',\n },\n create(context) {\n if (\n isInstalledPackageFile(context) ||\n isTestFile(context) ||\n isSharedPlatformImplementation(context)\n ) {\n return {} as Visitor\n }\n const pathUnderSrc = getPathUnderSrc(getContextFilename(context))\n if (pathUnderSrc === null) return {} as Visitor\n\n const handlers: unknown[] = []\n const exportedNames: string[] = []\n\n function inspectExport(node: unknown) {\n exportedNames.push(...getExportedNames(node))\n }\n\n function inspectAttribute(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const name = getIdentifierName(node?.name)\n const container = asNode(node?.value)\n if (name && hoverHandlerNames.has(name.toLowerCase()) && container?.type === 'JSXExpressionContainer') {\n handlers.push(container.expression)\n }\n }\n\n function inspectProperty(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const name = node ? getPropertyName(node) : null\n if (node && name && hoverHandlerNames.has(name.toLowerCase())) handlers.push(node.value)\n }\n\n function inspectAssignment(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const target = asNode(node?.left)\n if (target?.type !== 'MemberExpression') return\n const name = target.computed ? getStaticString(target.property) : getIdentifierName(target.property)\n if (node && name && hoverHandlerNames.has(name.toLowerCase())) handlers.push(node.right)\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const callee = asNode(node?.callee)\n if (callee?.type !== 'MemberExpression') return\n const method = callee.computed ? getStaticString(callee.property) : getIdentifierName(callee.property)\n if (method !== 'addEventListener') return\n const args = Array.isArray(node?.arguments) ? node.arguments : []\n const eventName = getModuleSpecifier(args[0])\n if (eventName && hoverEventNames.has(eventName.toLowerCase())) handlers.push(args[1])\n }\n\n function reportTimers() {\n if (\n !headerPathPattern.test(pathUnderSrc ?? '') &&\n !exportedNames.some((name) => headerExportPattern.test(name))\n ) {\n return\n }\n const resolve = createFunctionResolver(context)\n const visited = new Set<AstNode>()\n const reported = new Set<AstNode>()\n\n function visitFunction(fn: AstNode) {\n if (visited.has(fn)) return\n visited.add(fn)\n walkAst(fn, (node) => {\n if (node.type !== 'CallExpression') return\n const timer = getTimerCallName(node.callee)\n if (timer) {\n if (reported.has(node)) return\n reported.add(node)\n context.report({ node, messageId: 'headerHoverTimer', data: { name: timer } })\n return\n }\n for (const helper of resolve(node.callee)) visitFunction(helper)\n })\n }\n\n for (const handler of handlers) {\n for (const fn of resolve(handler)) visitFunction(fn)\n }\n }\n\n return {\n AssignmentExpression: inspectAssignment,\n CallExpression: inspectCall,\n ExportDefaultDeclaration: inspectExport,\n ExportNamedDeclaration: inspectExport,\n JSXAttribute: inspectAttribute,\n Property: inspectProperty,\n 'Program:exit': reportTimers,\n }\n },\n})\n\n/** Any path into site-next's dist: the bare package path, or a node_modules path to it. */\nconst siteNextDistPattern = /(?:^|\\/)@brandlab-digital\\/site-next\\/dist(?:\\/|$)/\n\nconst noUiKitDeepImportsRule = defineRule({\n description: 'Disallow imports from the dist of @brandlab-digital/site-next; use the published subpaths.',\n recommended: false,\n messages: {\n uiKitDeepImport:\n \"Do not import from the dist of @brandlab-digital/site-next. Use its published subpaths, for example '@brandlab-digital/site-next/ui-kit/primitives'.\",\n },\n create(context) {\n function inspectSpecifier(value: unknown) {\n const specifier = getModuleSpecifier(value)\n if (specifier && siteNextDistPattern.test(specifier.replaceAll('\\\\', '/'))) {\n context.report({ node: value, messageId: 'uiKitDeepImport' })\n }\n }\n\n function inspectSource(nodeValue: unknown) {\n inspectSpecifier(asNode(nodeValue)?.source)\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const callee = getMemberPath(node?.callee)\n if (callee !== 'require' && callee !== 'require.resolve') return\n const args = Array.isArray(node?.arguments) ? node.arguments : []\n inspectSpecifier(args[0])\n }\n\n function inspectExternalModuleReference(nodeValue: unknown) {\n inspectSpecifier(asNode(nodeValue)?.expression)\n }\n\n function inspectImportType(nodeValue: unknown) {\n const node = asNode(nodeValue)\n // `source` replaced the deprecated `argument` (a literal type) in typescript-eslint 8.\n const argument = asNode(node?.source ?? node?.argument)\n inspectSpecifier(argument?.type === 'TSLiteralType' ? argument.literal : argument)\n }\n\n return {\n CallExpression: inspectCall,\n ExportAllDeclaration: inspectSource,\n ExportNamedDeclaration: inspectSource,\n ImportDeclaration: inspectSource,\n ImportExpression: inspectSource,\n TSExternalModuleReference: inspectExternalModuleReference,\n TSImportType: inspectImportType,\n }\n },\n})\n\nexport const rules = {\n [RULE_IDS.noRetiredAnalyticsEvents]: createTextRule({\n description: 'Disallow retired Brandlab analytics event names.',\n messageId: 'retiredAnalyticsEvent',\n message: 'Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.',\n matcher: (text) => retiredAnalyticsEvents.has(text),\n }),\n [RULE_IDS.noRawJsonLd]: noRawJsonLdRule,\n [RULE_IDS.noUnsafeRichTextSinks]: noUnsafeRichTextSinksRule,\n [RULE_IDS.noProtectedPlatformReimplementation]: noProtectedPlatformReimplementationRule,\n [RULE_IDS.noAnalyticsPii]: noAnalyticsPiiRule,\n [RULE_IDS.noUnsafeExternalLinks]: noUnsafeExternalLinksRule,\n [RULE_IDS.noRawImageElements]: noRawImageElementsRule,\n [RULE_IDS.noLiteralTelLinks]: noLiteralTelLinksRule,\n [RULE_IDS.noHeaderHoverTimers]: noHeaderHoverTimersRule,\n [RULE_IDS.noUiKitDeepImports]: noUiKitDeepImportsRule,\n} satisfies Record<string, RuleModule>\n\n/** A flat-config object; kept structural so ESLint stays a peer, not a type dependency. */\nexport type BrandlabFlatConfig = {\n name?: string\n files?: readonly string[]\n ignores?: readonly string[]\n plugins?: Record<string, unknown>\n rules?: Record<string, unknown>\n [key: string]: unknown\n}\n\ntype BrandlabRulesConfig<Name extends string> = {\n name: Name\n plugins: {\n brandlab: unknown\n }\n rules: Record<string, 'error'>\n}\n\ntype BrandlabRecommendedConfig = BrandlabRulesConfig<'brandlab/recommended'>\ntype BrandlabSiteSystemConfig = BrandlabRulesConfig<'brandlab/site-system'>\n\ntype BrandlabPlugin = {\n rules: typeof rules\n configs: {\n recommended: BrandlabRecommendedConfig\n /** Recommended plus the Site System rules; added by a site that declares a `siteSystem` tier. */\n 'site-system': BrandlabSiteSystemConfig\n /** Next core-web-vitals + next/typescript + Brandlab recommended + standard ignores. */\n readonly next: readonly BrandlabFlatConfig[]\n }\n}\n\n/** Build and test output that is never project source. */\nexport const NEXT_CONFIG_IGNORES = Object.freeze([\n '.next/**',\n 'out/**',\n 'build/**',\n 'coverage/**',\n 'playwright-report/**',\n 'test-results/**',\n '.vercel/**',\n 'public/**',\n 'next-env.d.ts',\n])\n\nconst siteSystemRuleIds: ReadonlySet<string> = new Set(SITE_SYSTEM_RULE_IDS)\n\nfunction errorRules(ruleIds: readonly string[]): Record<string, 'error'> {\n return Object.fromEntries(ruleIds.map((ruleId) => [`brandlab/${ruleId}`, 'error' as const]))\n}\n\nconst recommendedRules = errorRules(\n Object.keys(rules).filter((ruleId) => !siteSystemRuleIds.has(ruleId)),\n)\n\nconst recommended: BrandlabRecommendedConfig = {\n name: 'brandlab/recommended',\n plugins: {\n brandlab: undefined,\n },\n rules: recommendedRules,\n}\n\nconst siteSystem: BrandlabSiteSystemConfig = {\n name: 'brandlab/site-system',\n plugins: {\n brandlab: undefined,\n },\n rules: { ...recommendedRules, ...errorRules(SITE_SYSTEM_RULE_IDS) },\n}\n\nfunction toConfigArray(value: unknown, specifier: string): BrandlabFlatConfig[] {\n const exported = Array.isArray(value)\n ? value\n : Array.isArray(asNode(value)?.default)\n ? (asNode(value)?.default as unknown[])\n : null\n if (!exported) throw new Error(`${specifier} did not export a flat config array.`)\n return exported as BrandlabFlatConfig[]\n}\n\n/**\n * The complete client preset: `export default brandlab.configs.next`.\n * eslint-config-next is an optional peer, so it loads only when this preset is used.\n */\nexport function createBrandlabNextConfig(presets: {\n coreWebVitals: readonly BrandlabFlatConfig[]\n typescript: readonly BrandlabFlatConfig[]\n}): readonly BrandlabFlatConfig[] {\n return Object.freeze([\n ...presets.coreWebVitals,\n ...presets.typescript,\n recommended,\n {\n name: 'brandlab/next',\n rules: {\n // Apostrophes and quotes are ordinary Australian English copy in JSX text.\n 'react/no-unescaped-entities': 'off',\n },\n },\n { name: 'brandlab/next-ignores', ignores: NEXT_CONFIG_IGNORES },\n ])\n}\n\nfunction loadNextConfig(): readonly BrandlabFlatConfig[] {\n const require = createRequire(import.meta.url)\n const load = (specifier: string) => {\n try {\n return toConfigArray(require(specifier), specifier)\n } catch (error) {\n throw new Error(\n `brandlab.configs.next requires ${specifier}. Install eslint-config-next at the exact version of next.`,\n { cause: error },\n )\n }\n }\n return createBrandlabNextConfig({\n coreWebVitals: load('eslint-config-next/core-web-vitals'),\n typescript: load('eslint-config-next/typescript'),\n })\n}\n\nlet nextConfig: readonly BrandlabFlatConfig[] | undefined\n\nconst plugin: BrandlabPlugin = {\n rules,\n configs: {\n recommended,\n 'site-system': siteSystem,\n get next() {\n nextConfig ??= loadNextConfig()\n return nextConfig\n },\n },\n}\n\nrecommended.plugins.brandlab = plugin\nsiteSystem.plugins.brandlab = plugin\n\nexport default plugin\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandlab-digital/eslint-plugin",
3
- "version": "3.8.0",
3
+ "version": "3.10.0",
4
4
  "license": "UNLICENSED",
5
5
  "repository": {
6
6
  "type": "git",