@brandlab-digital/eslint-plugin 3.12.1 → 3.14.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 +7 -4
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,11 +28,11 @@ import brandlab from '@brandlab-digital/eslint-plugin'
|
|
|
28
28
|
export default [brandlab.configs.recommended]
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
The recommended config enables every rule in the table below as an error except the
|
|
31
|
+
The recommended config enables every rule in the table below as an error except the four marked "site-system config", which the next section covers.
|
|
32
32
|
|
|
33
33
|
## Site System config
|
|
34
34
|
|
|
35
|
-
`configs['site-system']` is `configs.recommended` plus the
|
|
35
|
+
`configs['site-system']` is `configs.recommended` plus the six Site System rules (`no-literal-tel-links`, `no-header-hover-timers`, `no-ui-kit-deep-imports`, `link-prefetch-policy`, `no-preferred-region`, `no-long-class-in-list`), 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
36
|
|
|
37
37
|
```js
|
|
38
38
|
import brandlab from '@brandlab-digital/eslint-plugin'
|
|
@@ -42,7 +42,7 @@ export default [...brandlab.configs.next, brandlab.configs['site-system']]
|
|
|
42
42
|
|
|
43
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
44
|
|
|
45
|
-
For a non-Next consumer, `[brandlab.configs['site-system']]` alone enables all
|
|
45
|
+
For a non-Next consumer, `[brandlab.configs['site-system']]` alone enables all eleven rules. `SITE_SYSTEM_RULE_IDS` lists the four IDs.
|
|
46
46
|
|
|
47
47
|
## Stable rule IDs
|
|
48
48
|
|
|
@@ -58,8 +58,11 @@ For a non-Next consumer, `[brandlab.configs['site-system']]` alone enables all t
|
|
|
58
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
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
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`. |
|
|
61
|
+
| `brandlab/link-prefetch-policy` (site-system config, from 3.13.0) | Rejects `import`, `export ... from`, `import()` and `require` of `next/link` outside site-next (type-only imports, tests and installed packages are exempt), and a `<Link>`, `<TextLink>` or `<ButtonLink>` (or a renamed `next/link` import) inside a `.map()` or `.flatMap()` callback without an explicit `prefetch` attribute. | Use `ButtonLink` and `TextLink` from `@brandlab-digital/site-next/ui-kit/primitives`; set `prefetch="intent"` on content cards and `prefetch={false}` on footer, area, nearby, map and finder lists (`LINK_PREFETCH_POLICY`). |
|
|
62
|
+
| `brandlab/no-preferred-region` (site-system config, 3.13.0) | Rejects an exported `preferredRegion` (a variable, function or `export { x as preferredRegion }`). It is deprecated, and on Vercel accepts only `auto`, `global` or `home`. | Leave the region to `vercel.json` `regions`, recorded in `brandlab.config.ts` `hosting.originRegion` (rule origin-region-v1). |
|
|
63
|
+
| `brandlab/no-long-class-in-list` (site-system config, 3.14.0) | Rejects a `className` (or `class`) string over 80 characters inside a `.map()` or `.flatMap()` callback: a literal, template text, or a string inside `cx()`, a ternary, `&&` or an array. Every item repeats it in the HTML and the RSC payload. Tests and installed packages are exempt. | Style the repeated item once in `src/site/skin.css` through its `data-slot` hook (`repeatedSlotSelector` for ui-kit parts), or keep the class at 80 characters or fewer. |
|
|
61
64
|
|
|
62
|
-
`RULE_IDS` (all
|
|
65
|
+
`RULE_IDS` (all twelve) 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.
|
|
63
66
|
|
|
64
67
|
## Deliberate boundaries
|
|
65
68
|
|
package/dist/index.d.ts
CHANGED
|
@@ -48,12 +48,17 @@ export declare const RULE_IDS: Readonly<{
|
|
|
48
48
|
readonly noLiteralTelLinks: "no-literal-tel-links";
|
|
49
49
|
readonly noHeaderHoverTimers: "no-header-hover-timers";
|
|
50
50
|
readonly noUiKitDeepImports: "no-ui-kit-deep-imports";
|
|
51
|
+
readonly linkPrefetchPolicy: "link-prefetch-policy";
|
|
52
|
+
readonly noPreferredRegion: "no-preferred-region";
|
|
53
|
+
readonly noLongClassInList: "no-long-class-in-list";
|
|
51
54
|
}>;
|
|
52
55
|
/**
|
|
53
56
|
* Rules that only `configs['site-system']` enables. They are held back from `recommended` so a fleet bump or security
|
|
54
57
|
* patch does not turn every site red; a site adds the config when it declares a `siteSystem` tier.
|
|
55
58
|
*/
|
|
56
|
-
export declare const SITE_SYSTEM_RULE_IDS: readonly ["no-literal-tel-links", "no-header-hover-timers", "no-ui-kit-deep-imports"];
|
|
59
|
+
export declare const SITE_SYSTEM_RULE_IDS: readonly ["no-literal-tel-links", "no-header-hover-timers", "no-ui-kit-deep-imports", "link-prefetch-policy", "no-preferred-region", "no-long-class-in-list"];
|
|
60
|
+
/** The longest class string a list item may carry literally (3.14.0); longer ones repeat on every item. */
|
|
61
|
+
export declare const LIST_CLASS_LITERAL_LIMIT = 80;
|
|
57
62
|
export declare const rules: {
|
|
58
63
|
"no-retired-analytics-events": RuleModule;
|
|
59
64
|
"no-raw-json-ld": RuleModule;
|
|
@@ -65,6 +70,9 @@ export declare const rules: {
|
|
|
65
70
|
"no-literal-tel-links": RuleModule;
|
|
66
71
|
"no-header-hover-timers": RuleModule;
|
|
67
72
|
"no-ui-kit-deep-imports": RuleModule;
|
|
73
|
+
"link-prefetch-policy": RuleModule;
|
|
74
|
+
"no-preferred-region": RuleModule;
|
|
75
|
+
"no-long-class-in-list": RuleModule;
|
|
68
76
|
};
|
|
69
77
|
/** A flat-config object; kept structural so ESLint stays a peer, not a type dependency. */
|
|
70
78
|
export type BrandlabFlatConfig = {
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,aAAa,GAAG;IACnB,IAAI,EAAE,aAAa,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACvD,CAAA;AAED,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB,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,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,CAAA;KAAE,CAAA;IACpD,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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -16,6 +16,9 @@ export const RULE_IDS = Object.freeze({
|
|
|
16
16
|
noLiteralTelLinks: 'no-literal-tel-links',
|
|
17
17
|
noHeaderHoverTimers: 'no-header-hover-timers',
|
|
18
18
|
noUiKitDeepImports: 'no-ui-kit-deep-imports',
|
|
19
|
+
linkPrefetchPolicy: 'link-prefetch-policy',
|
|
20
|
+
noPreferredRegion: 'no-preferred-region',
|
|
21
|
+
noLongClassInList: 'no-long-class-in-list',
|
|
19
22
|
});
|
|
20
23
|
/**
|
|
21
24
|
* Rules that only `configs['site-system']` enables. They are held back from `recommended` so a fleet bump or security
|
|
@@ -25,6 +28,9 @@ export const SITE_SYSTEM_RULE_IDS = Object.freeze([
|
|
|
25
28
|
RULE_IDS.noLiteralTelLinks,
|
|
26
29
|
RULE_IDS.noHeaderHoverTimers,
|
|
27
30
|
RULE_IDS.noUiKitDeepImports,
|
|
31
|
+
RULE_IDS.linkPrefetchPolicy,
|
|
32
|
+
RULE_IDS.noPreferredRegion,
|
|
33
|
+
RULE_IDS.noLongClassInList,
|
|
28
34
|
]);
|
|
29
35
|
function asNode(value) {
|
|
30
36
|
return value && typeof value === 'object' ? value : null;
|
|
@@ -1031,6 +1037,180 @@ const noUiKitDeepImportsRule = defineRule({
|
|
|
1031
1037
|
};
|
|
1032
1038
|
},
|
|
1033
1039
|
});
|
|
1040
|
+
/** site-next's own source (in this repository or installed), the one place next/link is imported directly. */
|
|
1041
|
+
function isSiteNextSource(context) {
|
|
1042
|
+
return /(?:^|\/)(?:packages\/site-next\/src|@brandlab-digital\/site-next)\//.test(getContextFilename(context));
|
|
1043
|
+
}
|
|
1044
|
+
/** Link components whose prefetch a list must set: the site-next primitives and the conventional Link name. */
|
|
1045
|
+
const listLinkNames = new Set(['Link', 'TextLink', 'ButtonLink']);
|
|
1046
|
+
const listCallNames = new Set(['map', 'flatMap']);
|
|
1047
|
+
/** True when the node sits inside the callback of a `.map()` or `.flatMap()` call. */
|
|
1048
|
+
function isInsideListCallback(value) {
|
|
1049
|
+
let node = asNode(value);
|
|
1050
|
+
while (node) {
|
|
1051
|
+
const parent = asNode(node.parent);
|
|
1052
|
+
if ((node.type === 'ArrowFunctionExpression' || node.type === 'FunctionExpression') &&
|
|
1053
|
+
parent?.type === 'CallExpression' &&
|
|
1054
|
+
Array.isArray(parent.arguments) &&
|
|
1055
|
+
parent.arguments.includes(node)) {
|
|
1056
|
+
const callee = asNode(parent.callee);
|
|
1057
|
+
const property = callee?.type === 'MemberExpression' && !callee.computed ? getIdentifierName(callee.property) : null;
|
|
1058
|
+
if (property && listCallNames.has(property))
|
|
1059
|
+
return true;
|
|
1060
|
+
}
|
|
1061
|
+
node = parent;
|
|
1062
|
+
}
|
|
1063
|
+
return false;
|
|
1064
|
+
}
|
|
1065
|
+
const linkPrefetchPolicyRule = defineRule({
|
|
1066
|
+
description: 'Site System sites link through the site-next primitives, and a link rendered from a list sets its prefetch (LINK_PREFETCH_POLICY).',
|
|
1067
|
+
recommended: false,
|
|
1068
|
+
messages: {
|
|
1069
|
+
directNextLink: "Import ButtonLink or TextLink from '@brandlab-digital/site-next/ui-kit/primitives' instead of next/link, so every link follows LINK_PREFETCH_POLICY.",
|
|
1070
|
+
listLinkPrefetch: "<{{name}}> inside .map() must set prefetch explicitly: prefetch=\"intent\" for content cards (8 at most) or prefetch={false} for footer, area, nearby, map and finder lists.",
|
|
1071
|
+
},
|
|
1072
|
+
create(context) {
|
|
1073
|
+
if (isInstalledPackageFile(context) || isTestFile(context) || isSiteNextSource(context))
|
|
1074
|
+
return {};
|
|
1075
|
+
const nextLinkNames = new Set();
|
|
1076
|
+
function isNextLink(value) {
|
|
1077
|
+
return getModuleSpecifier(value) === 'next/link';
|
|
1078
|
+
}
|
|
1079
|
+
function inspectImport(nodeValue) {
|
|
1080
|
+
const node = asNode(nodeValue);
|
|
1081
|
+
if (!isNextLink(node?.source) || node?.importKind === 'type')
|
|
1082
|
+
return;
|
|
1083
|
+
context.report({ node: nodeValue, messageId: 'directNextLink' });
|
|
1084
|
+
for (const specifier of Array.isArray(node?.specifiers) ? node.specifiers : []) {
|
|
1085
|
+
const local = getIdentifierName(asNode(specifier)?.local);
|
|
1086
|
+
if (local)
|
|
1087
|
+
nextLinkNames.add(local);
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
function inspectReexport(nodeValue) {
|
|
1091
|
+
if (isNextLink(asNode(nodeValue)?.source))
|
|
1092
|
+
context.report({ node: nodeValue, messageId: 'directNextLink' });
|
|
1093
|
+
}
|
|
1094
|
+
function inspectCall(nodeValue) {
|
|
1095
|
+
const node = asNode(nodeValue);
|
|
1096
|
+
if (getMemberPath(node?.callee) !== 'require')
|
|
1097
|
+
return;
|
|
1098
|
+
const args = Array.isArray(node?.arguments) ? node.arguments : [];
|
|
1099
|
+
if (isNextLink(args[0]))
|
|
1100
|
+
context.report({ node: nodeValue, messageId: 'directNextLink' });
|
|
1101
|
+
}
|
|
1102
|
+
function inspectDynamicImport(nodeValue) {
|
|
1103
|
+
if (isNextLink(asNode(nodeValue)?.source))
|
|
1104
|
+
context.report({ node: nodeValue, messageId: 'directNextLink' });
|
|
1105
|
+
}
|
|
1106
|
+
function inspectElement(nodeValue) {
|
|
1107
|
+
const node = asNode(nodeValue);
|
|
1108
|
+
const name = getJsxElementName(node?.name);
|
|
1109
|
+
if (!node || !name || !(listLinkNames.has(name) || nextLinkNames.has(name)))
|
|
1110
|
+
return;
|
|
1111
|
+
if (getJsxAttribute(node, 'prefetch') || !isInsideListCallback(node))
|
|
1112
|
+
return;
|
|
1113
|
+
context.report({ node: nodeValue, messageId: 'listLinkPrefetch', data: { name } });
|
|
1114
|
+
}
|
|
1115
|
+
return {
|
|
1116
|
+
ImportDeclaration: inspectImport,
|
|
1117
|
+
ExportAllDeclaration: inspectReexport,
|
|
1118
|
+
ExportNamedDeclaration: inspectReexport,
|
|
1119
|
+
ImportExpression: inspectDynamicImport,
|
|
1120
|
+
CallExpression: inspectCall,
|
|
1121
|
+
JSXOpeningElement: inspectElement,
|
|
1122
|
+
};
|
|
1123
|
+
},
|
|
1124
|
+
});
|
|
1125
|
+
const noPreferredRegionRule = defineRule({
|
|
1126
|
+
description: 'Disallow the deprecated preferredRegion route segment option; the origin region lives in vercel.json and brandlab.config.ts.',
|
|
1127
|
+
recommended: false,
|
|
1128
|
+
messages: {
|
|
1129
|
+
preferredRegion: "Do not export preferredRegion. It is deprecated, and on Vercel it accepts only 'auto', 'global' or 'home'. The site's function region is vercel.json regions, recorded in brandlab.config.ts hosting.originRegion (origin-region-v1).",
|
|
1130
|
+
},
|
|
1131
|
+
create(context) {
|
|
1132
|
+
if (isInstalledPackageFile(context))
|
|
1133
|
+
return {};
|
|
1134
|
+
return {
|
|
1135
|
+
ExportNamedDeclaration(nodeValue) {
|
|
1136
|
+
const node = asNode(nodeValue);
|
|
1137
|
+
const declaration = asNode(node?.declaration);
|
|
1138
|
+
const declarators = declaration?.type === 'VariableDeclaration' && Array.isArray(declaration.declarations) ? declaration.declarations : [];
|
|
1139
|
+
for (const declarator of declarators) {
|
|
1140
|
+
const id = asNode(asNode(declarator)?.id);
|
|
1141
|
+
if (getIdentifierName(id) === 'preferredRegion')
|
|
1142
|
+
context.report({ node: id, messageId: 'preferredRegion' });
|
|
1143
|
+
}
|
|
1144
|
+
if (declaration?.type === 'FunctionDeclaration' && getIdentifierName(declaration.id) === 'preferredRegion') {
|
|
1145
|
+
context.report({ node: declaration.id, messageId: 'preferredRegion' });
|
|
1146
|
+
}
|
|
1147
|
+
for (const specifier of Array.isArray(node?.specifiers) ? node.specifiers : []) {
|
|
1148
|
+
const exported = asNode(specifier)?.exported;
|
|
1149
|
+
if (getStaticString(exported) === 'preferredRegion')
|
|
1150
|
+
context.report({ node: exported, messageId: 'preferredRegion' });
|
|
1151
|
+
}
|
|
1152
|
+
},
|
|
1153
|
+
};
|
|
1154
|
+
},
|
|
1155
|
+
});
|
|
1156
|
+
/** The longest class string a list item may carry literally (3.14.0); longer ones repeat on every item. */
|
|
1157
|
+
export const LIST_CLASS_LITERAL_LIMIT = 80;
|
|
1158
|
+
/** Every static class string in a className value: literals and template text, through cx(), ternaries and arrays. */
|
|
1159
|
+
function classLiterals(value) {
|
|
1160
|
+
const node = asNode(value);
|
|
1161
|
+
if (!node)
|
|
1162
|
+
return [];
|
|
1163
|
+
switch (node.type) {
|
|
1164
|
+
case 'JSXExpressionContainer':
|
|
1165
|
+
return classLiterals(node.expression);
|
|
1166
|
+
case 'Literal':
|
|
1167
|
+
return typeof node.value === 'string' ? [node] : [];
|
|
1168
|
+
case 'TemplateLiteral':
|
|
1169
|
+
return [node, ...(Array.isArray(node.expressions) ? node.expressions.flatMap(classLiterals) : [])];
|
|
1170
|
+
case 'CallExpression':
|
|
1171
|
+
return Array.isArray(node.arguments) ? node.arguments.flatMap(classLiterals) : [];
|
|
1172
|
+
case 'ConditionalExpression':
|
|
1173
|
+
return [...classLiterals(node.consequent), ...classLiterals(node.alternate)];
|
|
1174
|
+
case 'LogicalExpression':
|
|
1175
|
+
case 'BinaryExpression':
|
|
1176
|
+
return [...classLiterals(node.left), ...classLiterals(node.right)];
|
|
1177
|
+
case 'ArrayExpression':
|
|
1178
|
+
return Array.isArray(node.elements) ? node.elements.flatMap(classLiterals) : [];
|
|
1179
|
+
default:
|
|
1180
|
+
return [];
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
function classLiteralText(node) {
|
|
1184
|
+
if (node.type === 'Literal')
|
|
1185
|
+
return String(node.value);
|
|
1186
|
+
const quasis = Array.isArray(node.quasis) ? node.quasis : [];
|
|
1187
|
+
return quasis.map((quasi) => getStaticString(quasi) ?? '').join('');
|
|
1188
|
+
}
|
|
1189
|
+
const noLongClassInListRule = defineRule({
|
|
1190
|
+
description: 'A className literal over 80 characters inside .map() repeats on every item; style repeated items from the skin stylesheet through their hooks.',
|
|
1191
|
+
recommended: false,
|
|
1192
|
+
messages: {
|
|
1193
|
+
longClassInList: 'This {{length}}-character class string sits inside .map(), so every item repeats it in the HTML and the RSC payload. Style the repeated item once in src/site/skin.css through its data-slot hook (or a short class of 80 characters at most).',
|
|
1194
|
+
},
|
|
1195
|
+
create(context) {
|
|
1196
|
+
if (isInstalledPackageFile(context) || isTestFile(context))
|
|
1197
|
+
return {};
|
|
1198
|
+
return {
|
|
1199
|
+
JSXAttribute(nodeValue) {
|
|
1200
|
+
const node = asNode(nodeValue);
|
|
1201
|
+
const name = getIdentifierName(node?.name);
|
|
1202
|
+
if (name !== 'className' && name !== 'class')
|
|
1203
|
+
return;
|
|
1204
|
+
const literals = classLiterals(node?.value).filter((literal) => classLiteralText(literal).trim().length > LIST_CLASS_LITERAL_LIMIT);
|
|
1205
|
+
if (literals.length === 0 || !isInsideListCallback(nodeValue))
|
|
1206
|
+
return;
|
|
1207
|
+
for (const literal of literals) {
|
|
1208
|
+
context.report({ node: literal, messageId: 'longClassInList', data: { length: String(classLiteralText(literal).trim().length) } });
|
|
1209
|
+
}
|
|
1210
|
+
},
|
|
1211
|
+
};
|
|
1212
|
+
},
|
|
1213
|
+
});
|
|
1034
1214
|
export const rules = {
|
|
1035
1215
|
[RULE_IDS.noRetiredAnalyticsEvents]: createTextRule({
|
|
1036
1216
|
description: 'Disallow retired Brandlab analytics event names.',
|
|
@@ -1047,6 +1227,9 @@ export const rules = {
|
|
|
1047
1227
|
[RULE_IDS.noLiteralTelLinks]: noLiteralTelLinksRule,
|
|
1048
1228
|
[RULE_IDS.noHeaderHoverTimers]: noHeaderHoverTimersRule,
|
|
1049
1229
|
[RULE_IDS.noUiKitDeepImports]: noUiKitDeepImportsRule,
|
|
1230
|
+
[RULE_IDS.linkPrefetchPolicy]: linkPrefetchPolicyRule,
|
|
1231
|
+
[RULE_IDS.noPreferredRegion]: noPreferredRegionRule,
|
|
1232
|
+
[RULE_IDS.noLongClassInList]: noLongClassInListRule,
|
|
1050
1233
|
};
|
|
1051
1234
|
/** Build and test output that is never project source. */
|
|
1052
1235
|
export const NEXT_CONFIG_IGNORES = Object.freeze([
|
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 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"]}
|
|
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 linkPrefetchPolicy: 'link-prefetch-policy',\n noPreferredRegion: 'no-preferred-region',\n noLongClassInList: 'no-long-class-in-list',\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 RULE_IDS.linkPrefetchPolicy,\n RULE_IDS.noPreferredRegion,\n RULE_IDS.noLongClassInList,\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\n/** site-next's own source (in this repository or installed), the one place next/link is imported directly. */\nfunction isSiteNextSource(context: RuleContext): boolean {\n return /(?:^|\\/)(?:packages\\/site-next\\/src|@brandlab-digital\\/site-next)\\//.test(getContextFilename(context))\n}\n\n/** Link components whose prefetch a list must set: the site-next primitives and the conventional Link name. */\nconst listLinkNames = new Set(['Link', 'TextLink', 'ButtonLink'])\nconst listCallNames = new Set(['map', 'flatMap'])\n\n/** True when the node sits inside the callback of a `.map()` or `.flatMap()` call. */\nfunction isInsideListCallback(value: unknown): boolean {\n let node = asNode(value)\n while (node) {\n const parent = asNode(node.parent)\n if (\n (node.type === 'ArrowFunctionExpression' || node.type === 'FunctionExpression') &&\n parent?.type === 'CallExpression' &&\n Array.isArray(parent.arguments) &&\n parent.arguments.includes(node)\n ) {\n const callee = asNode(parent.callee)\n const property = callee?.type === 'MemberExpression' && !callee.computed ? getIdentifierName(callee.property) : null\n if (property && listCallNames.has(property)) return true\n }\n node = parent\n }\n return false\n}\n\nconst linkPrefetchPolicyRule = defineRule({\n description:\n 'Site System sites link through the site-next primitives, and a link rendered from a list sets its prefetch (LINK_PREFETCH_POLICY).',\n recommended: false,\n messages: {\n directNextLink:\n \"Import ButtonLink or TextLink from '@brandlab-digital/site-next/ui-kit/primitives' instead of next/link, so every link follows LINK_PREFETCH_POLICY.\",\n listLinkPrefetch:\n \"<{{name}}> inside .map() must set prefetch explicitly: prefetch=\\\"intent\\\" for content cards (8 at most) or prefetch={false} for footer, area, nearby, map and finder lists.\",\n },\n create(context) {\n if (isInstalledPackageFile(context) || isTestFile(context) || isSiteNextSource(context)) return {} as Visitor\n const nextLinkNames = new Set<string>()\n\n function isNextLink(value: unknown) {\n return getModuleSpecifier(value) === 'next/link'\n }\n\n function inspectImport(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (!isNextLink(node?.source) || node?.importKind === 'type') return\n context.report({ node: nodeValue, messageId: 'directNextLink' })\n for (const specifier of Array.isArray(node?.specifiers) ? node.specifiers : []) {\n const local = getIdentifierName(asNode(specifier)?.local)\n if (local) nextLinkNames.add(local)\n }\n }\n\n function inspectReexport(nodeValue: unknown) {\n if (isNextLink(asNode(nodeValue)?.source)) context.report({ node: nodeValue, messageId: 'directNextLink' })\n }\n\n function inspectCall(nodeValue: unknown) {\n const node = asNode(nodeValue)\n if (getMemberPath(node?.callee) !== 'require') return\n const args = Array.isArray(node?.arguments) ? node.arguments : []\n if (isNextLink(args[0])) context.report({ node: nodeValue, messageId: 'directNextLink' })\n }\n\n function inspectDynamicImport(nodeValue: unknown) {\n if (isNextLink(asNode(nodeValue)?.source)) context.report({ node: nodeValue, messageId: 'directNextLink' })\n }\n\n function inspectElement(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const name = getJsxElementName(node?.name)\n if (!node || !name || !(listLinkNames.has(name) || nextLinkNames.has(name))) return\n if (getJsxAttribute(node, 'prefetch') || !isInsideListCallback(node)) return\n context.report({ node: nodeValue, messageId: 'listLinkPrefetch', data: { name } })\n }\n\n return {\n ImportDeclaration: inspectImport,\n ExportAllDeclaration: inspectReexport,\n ExportNamedDeclaration: inspectReexport,\n ImportExpression: inspectDynamicImport,\n CallExpression: inspectCall,\n JSXOpeningElement: inspectElement,\n }\n },\n})\n\nconst noPreferredRegionRule = defineRule({\n description: 'Disallow the deprecated preferredRegion route segment option; the origin region lives in vercel.json and brandlab.config.ts.',\n recommended: false,\n messages: {\n preferredRegion:\n \"Do not export preferredRegion. It is deprecated, and on Vercel it accepts only 'auto', 'global' or 'home'. The site's function region is vercel.json regions, recorded in brandlab.config.ts hosting.originRegion (origin-region-v1).\",\n },\n create(context) {\n if (isInstalledPackageFile(context)) return {} as Visitor\n return {\n ExportNamedDeclaration(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const declaration = asNode(node?.declaration)\n const declarators = declaration?.type === 'VariableDeclaration' && Array.isArray(declaration.declarations) ? declaration.declarations : []\n for (const declarator of declarators) {\n const id = asNode(asNode(declarator)?.id)\n if (getIdentifierName(id) === 'preferredRegion') context.report({ node: id, messageId: 'preferredRegion' })\n }\n if (declaration?.type === 'FunctionDeclaration' && getIdentifierName(declaration.id) === 'preferredRegion') {\n context.report({ node: declaration.id, messageId: 'preferredRegion' })\n }\n for (const specifier of Array.isArray(node?.specifiers) ? node.specifiers : []) {\n const exported = asNode(specifier)?.exported\n if (getStaticString(exported) === 'preferredRegion') context.report({ node: exported, messageId: 'preferredRegion' })\n }\n },\n }\n },\n})\n\n/** The longest class string a list item may carry literally (3.14.0); longer ones repeat on every item. */\nexport const LIST_CLASS_LITERAL_LIMIT = 80\n\n/** Every static class string in a className value: literals and template text, through cx(), ternaries and arrays. */\nfunction classLiterals(value: unknown): AstNode[] {\n const node = asNode(value)\n if (!node) return []\n switch (node.type) {\n case 'JSXExpressionContainer':\n return classLiterals(node.expression)\n case 'Literal':\n return typeof node.value === 'string' ? [node] : []\n case 'TemplateLiteral':\n return [node, ...(Array.isArray(node.expressions) ? node.expressions.flatMap(classLiterals) : [])]\n case 'CallExpression':\n return Array.isArray(node.arguments) ? node.arguments.flatMap(classLiterals) : []\n case 'ConditionalExpression':\n return [...classLiterals(node.consequent), ...classLiterals(node.alternate)]\n case 'LogicalExpression':\n case 'BinaryExpression':\n return [...classLiterals(node.left), ...classLiterals(node.right)]\n case 'ArrayExpression':\n return Array.isArray(node.elements) ? node.elements.flatMap(classLiterals) : []\n default:\n return []\n }\n}\n\nfunction classLiteralText(node: AstNode): string {\n if (node.type === 'Literal') return String(node.value)\n const quasis = Array.isArray(node.quasis) ? node.quasis : []\n return quasis.map((quasi) => getStaticString(quasi) ?? '').join('')\n}\n\nconst noLongClassInListRule = defineRule({\n description:\n 'A className literal over 80 characters inside .map() repeats on every item; style repeated items from the skin stylesheet through their hooks.',\n recommended: false,\n messages: {\n longClassInList:\n 'This {{length}}-character class string sits inside .map(), so every item repeats it in the HTML and the RSC payload. Style the repeated item once in src/site/skin.css through its data-slot hook (or a short class of 80 characters at most).',\n },\n create(context) {\n if (isInstalledPackageFile(context) || isTestFile(context)) return {} as Visitor\n return {\n JSXAttribute(nodeValue: unknown) {\n const node = asNode(nodeValue)\n const name = getIdentifierName(node?.name)\n if (name !== 'className' && name !== 'class') return\n const literals = classLiterals(node?.value).filter((literal) => classLiteralText(literal).trim().length > LIST_CLASS_LITERAL_LIMIT)\n if (literals.length === 0 || !isInsideListCallback(nodeValue)) return\n for (const literal of literals) {\n context.report({ node: literal, messageId: 'longClassInList', data: { length: String(classLiteralText(literal).trim().length) } })\n }\n },\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 [RULE_IDS.linkPrefetchPolicy]: linkPrefetchPolicyRule,\n [RULE_IDS.noPreferredRegion]: noPreferredRegionRule,\n [RULE_IDS.noLongClassInList]: noLongClassInListRule,\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"]}
|