@brandlab-digital/eslint-plugin 1.0.12 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,7 +18,7 @@ The recommended config enables every published rule as an error.
18
18
 
19
19
  | Rule | Purpose | Preferred implementation |
20
20
  |---|---|---|
21
- | `brandlab/no-retired-analytics-events` | Rejects retired event names such as `contact_form_submission`. | Use the canonical `phone_call` and `contact_form` contracts. |
21
+ | `brandlab/no-retired-analytics-events` | Rejects retired event names such as `contact_form_submission` and `phone_call`. | Use `contact_form` for accepted forms and `phone_link_click` for telephone-link diagnostics. |
22
22
  | `brandlab/no-raw-json-ld` | Rejects raw JSON-LD `<script>` and `createElement` output in consumers. | Render typed graphs through `@brandlab-digital/site-next/schema`. |
23
23
  | `brandlab/no-allow-indexing-true` | Rejects the ambiguous `ALLOW_INDEXING=true` override. | Use the supported explicit value `ALLOW_INDEXING=1`. |
24
24
  | `brandlab/no-unsafe-rich-text-sinks` | Rejects statically visible unsanitized rich-text sinks. | Use a tested sanitizer-backed renderer. |
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM;QACpB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAA;KACpC,CAAA;IACD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC9C,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAA;KACpC,CAAA;CACF,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;;;;;;;;;EASV,CAAA;AAmuBX,eAAO,MAAM,KAAK;;;;;;;;;CAcoB,CAAA;AAEtC,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,OAAO,EAAE;QACP,WAAW,EAAE;YACX,OAAO,EAAE;gBACP,QAAQ,EAAE,OAAO,CAAA;aAClB,CAAA;YACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAC/B,CAAA;KACF,CAAA;CACF,CAAA;AAMD,QAAA,MAAM,MAAM,EAAE,cAUb,CAAA;AAID,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC9B,CAAA;AAED,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,MAAM,CAAA;IAC1B,aAAa,CAAC,EAAE,MAAM;QACpB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAA;KACpC,CAAA;IACD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC9C,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,CAAA;KACpC,CAAA;CACF,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;;;;;;;;;EASV,CAAA;AAouBX,eAAO,MAAM,KAAK;;;;;;;;;CAcoB,CAAA;AAEtC,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,OAAO,EAAE;QACP,WAAW,EAAE;YACX,OAAO,EAAE;gBACP,QAAQ,EAAE,OAAO,CAAA;aAClB,CAAA;YACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAC/B,CAAA;KACF,CAAA;CACF,CAAA;AAMD,QAAA,MAAM,MAAM,EAAE,cAUb,CAAA;AAID,eAAe,MAAM,CAAA"}
package/dist/index.js CHANGED
@@ -122,6 +122,7 @@ const noAllowIndexingTrueRule = defineRule({
122
122
  });
123
123
  const retiredAnalyticsEvents = new Set([
124
124
  'contact_form_submission',
125
+ 'phone_call',
125
126
  'phone_calls',
126
127
  'form_start',
127
128
  'cta_click',
@@ -375,7 +376,7 @@ function isContactAnalyticsCall(node) {
375
376
  const args = Array.isArray(node.arguments) ? node.arguments : [];
376
377
  return args.some((argument) => {
377
378
  const value = getStaticString(argument);
378
- return value === 'contact_form' || value === 'phone_call';
379
+ return value === 'contact_form' || value === 'phone_link_click' || value === 'phone_call';
379
380
  });
380
381
  }
381
382
  function looksLikeLiteralPii(value) {
@@ -674,7 +675,7 @@ export const rules = {
674
675
  [RULE_IDS.noRetiredAnalyticsEvents]: createTextRule({
675
676
  description: 'Disallow retired Brandlab analytics event names.',
676
677
  messageId: 'retiredAnalyticsEvent',
677
- message: 'Use the canonical Brandlab lead events: phone_call or contact_form.',
678
+ message: 'Use contact_form for accepted forms and phone_link_click for telephone-link diagnostics.',
678
679
  matcher: (text) => retiredAnalyticsEvents.has(text),
679
680
  }),
680
681
  [RULE_IDS.noRawJsonLd]: noRawJsonLdRule,
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":["type AstNode = {\n type?: string\n [key: string]: unknown\n}\n\ntype ReportDescriptor = {\n node: unknown\n messageId?: string\n message?: string\n data?: Record<string, string>\n}\n\ntype RuleContext = {\n filename?: string\n getFilename?: () => string\n getSourceCode?: () => {\n getText?: (node: unknown) => string\n }\n physicalFilename?: string\n report: (descriptor: ReportDescriptor) => void\n sourceCode?: {\n getText?: (node: unknown) => string\n }\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 noAllowIndexingTrue: 'no-allow-indexing-true',\n noUnsafeRichTextSinks: 'no-unsafe-rich-text-sinks',\n noProtectedPlatformReimplementation: 'no-protected-platform-reimplementation',\n noAnalyticsPii: 'no-analytics-pii',\n noUnsafeExternalLinks: 'no-unsafe-external-links',\n noRawImageElements: 'no-raw-image-elements',\n} as const)\n\nfunction asNode(value: unknown): AstNode | null {\n return value && typeof value === 'object' ? (value as AstNode) : null\n}\n\nfunction getStaticString(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n if (node.type === 'TemplateElement') {\n const templateValue = asNode(node.value)\n return typeof templateValue?.raw === 'string' ? templateValue.raw : null\n }\n if (node.type === 'TemplateLiteral') {\n const expressions = Array.isArray(node.expressions) ? node.expressions : []\n const quasis = Array.isArray(node.quasis) ? node.quasis : []\n if (expressions.length > 0) return null\n return quasis.map(getStaticString).join('')\n }\n if (node.type === 'JSXExpressionContainer') return getStaticString(node.expression)\n if (node.type === 'JSXAttribute') return getStaticString(node.value)\n if (node.type === 'ChainExpression') return getStaticString(node.expression)\n\n return null\n}\n\nfunction getIdentifierName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n return null\n}\n\nfunction getSourceText(context: RuleContext, node: unknown): string {\n const sourceCode = context.sourceCode ?? context.getSourceCode?.()\n return sourceCode?.getText?.(node) ?? ''\n}\n\nfunction defineRule(options: {\n description: string\n messages: Record<string, string>\n create: (context: RuleContext) => Visitor\n}): RuleModule {\n return {\n meta: {\n type: 'problem',\n docs: {\n description: options.description,\n recommended: true,\n },\n messages: options.messages,\n schema: [],\n },\n create: options.create,\n }\n}\n\nfunction createTextRule(options: {\n description: string\n messageId: string\n message: string\n matcher: (text: string, context: RuleContext) => boolean\n}): RuleModule {\n return defineRule({\n description: options.description,\n messages: { [options.messageId]: options.message },\n create(context) {\n function inspect(node: unknown) {\n const text = getStaticString(node)\n if (text && options.matcher(text, context)) {\n context.report({ node, messageId: options.messageId })\n }\n }\n\n return {\n Literal: inspect,\n TemplateElement: inspect,\n }\n },\n })\n}\n\nfunction containsAllowIndexingTrue(text: string): boolean {\n return (\n text.includes('ALLOW_INDEXING=true') ||\n /ALLOW_INDEXING[\\s\\S]{0,80}['\"]true['\"]/.test(text)\n )\n}\n\nconst noAllowIndexingTrueRule = defineRule({\n description: 'Disallow ALLOW_INDEXING=true; only ALLOW_INDEXING=1 is supported.',\n messages: {\n allowIndexingTrue: 'Use ALLOW_INDEXING=1 as the only explicit indexing override.',\n },\n create(context) {\n function inspectStringNode(node: unknown) {\n const text = getStaticString(node)\n if (text && containsAllowIndexingTrue(text)) {\n context.report({ node, messageId: 'allowIndexingTrue' })\n }\n }\n\n function inspectSourceNode(node: unknown) {\n const text = getSourceText(context, node)\n if (text && containsAllowIndexingTrue(text)) {\n context.report({ node, messageId: 'allowIndexingTrue' })\n }\n }\n\n return {\n BinaryExpression: inspectSourceNode,\n Literal: inspectStringNode,\n Property: inspectSourceNode,\n TemplateElement: inspectStringNode,\n }\n },\n})\n\nconst retiredAnalyticsEvents = new Set([\n 'contact_form_submission',\n 'phone_calls',\n 'form_start',\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\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 === 'contact_form' || value === 'phone_call'\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 noUnsafeRichTextSinksRule = defineRule({\n description: 'Disallow visible rich text sinks that bypass a sanitizer.',\n messages: {\n unsafeRichTextSink: 'Visible rich text must be sanitizer-backed and tested.',\n },\n create(context) {\n function inspectSourceNode(node: unknown) {\n const text = getSourceText(context, node)\n if (\n text.includes('dangerouslySetInnerHTML') &&\n !/saniti[sz](?:e|ed|er)/i.test(text)\n ) {\n context.report({ node, messageId: 'unsafeRichTextSink' })\n }\n }\n\n function inspectStringNode(node: unknown) {\n const text = getStaticString(node)\n if (\n text?.includes('dangerouslySetInnerHTML') &&\n !/saniti[sz](?:e|ed|er)/i.test(text)\n ) {\n context.report({ node, messageId: 'unsafeRichTextSink' })\n }\n }\n\n return {\n JSXAttribute: inspectSourceNode,\n Literal: inspectStringNode,\n Property: inspectSourceNode,\n TemplateElement: inspectStringNode,\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 the canonical Brandlab lead events: phone_call or contact_form.',\n matcher: (text) => retiredAnalyticsEvents.has(text),\n }),\n [RULE_IDS.noRawJsonLd]: noRawJsonLdRule,\n [RULE_IDS.noAllowIndexingTrue]: noAllowIndexingTrueRule,\n [RULE_IDS.noUnsafeRichTextSinks]: noUnsafeRichTextSinksRule,\n [RULE_IDS.noProtectedPlatformReimplementation]: noProtectedPlatformReimplementationRule,\n [RULE_IDS.noAnalyticsPii]: noAnalyticsPiiRule,\n [RULE_IDS.noUnsafeExternalLinks]: noUnsafeExternalLinksRule,\n [RULE_IDS.noRawImageElements]: noRawImageElementsRule,\n} satisfies Record<string, RuleModule>\n\ntype BrandlabPlugin = {\n rules: typeof rules\n configs: {\n recommended: {\n plugins: {\n brandlab: unknown\n }\n rules: Record<string, 'error'>\n }\n }\n}\n\nconst recommendedRules = Object.fromEntries(\n Object.keys(rules).map((ruleId) => [`brandlab/${ruleId}`, 'error' as const]),\n) as Record<string, 'error'>\n\nconst plugin: BrandlabPlugin = {\n rules,\n configs: {\n recommended: {\n plugins: {\n brandlab: undefined,\n },\n rules: recommendedRules,\n },\n },\n}\n\nplugin.configs.recommended.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":["type AstNode = {\n type?: string\n [key: string]: unknown\n}\n\ntype ReportDescriptor = {\n node: unknown\n messageId?: string\n message?: string\n data?: Record<string, string>\n}\n\ntype RuleContext = {\n filename?: string\n getFilename?: () => string\n getSourceCode?: () => {\n getText?: (node: unknown) => string\n }\n physicalFilename?: string\n report: (descriptor: ReportDescriptor) => void\n sourceCode?: {\n getText?: (node: unknown) => string\n }\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 noAllowIndexingTrue: 'no-allow-indexing-true',\n noUnsafeRichTextSinks: 'no-unsafe-rich-text-sinks',\n noProtectedPlatformReimplementation: 'no-protected-platform-reimplementation',\n noAnalyticsPii: 'no-analytics-pii',\n noUnsafeExternalLinks: 'no-unsafe-external-links',\n noRawImageElements: 'no-raw-image-elements',\n} as const)\n\nfunction asNode(value: unknown): AstNode | null {\n return value && typeof value === 'object' ? (value as AstNode) : null\n}\n\nfunction getStaticString(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n if (node.type === 'TemplateElement') {\n const templateValue = asNode(node.value)\n return typeof templateValue?.raw === 'string' ? templateValue.raw : null\n }\n if (node.type === 'TemplateLiteral') {\n const expressions = Array.isArray(node.expressions) ? node.expressions : []\n const quasis = Array.isArray(node.quasis) ? node.quasis : []\n if (expressions.length > 0) return null\n return quasis.map(getStaticString).join('')\n }\n if (node.type === 'JSXExpressionContainer') return getStaticString(node.expression)\n if (node.type === 'JSXAttribute') return getStaticString(node.value)\n if (node.type === 'ChainExpression') return getStaticString(node.expression)\n\n return null\n}\n\nfunction getIdentifierName(value: unknown): string | null {\n const node = asNode(value)\n if (!node) return null\n if (node.type === 'Identifier' || node.type === 'JSXIdentifier') {\n return typeof node.name === 'string' ? node.name : null\n }\n return null\n}\n\nfunction getSourceText(context: RuleContext, node: unknown): string {\n const sourceCode = context.sourceCode ?? context.getSourceCode?.()\n return sourceCode?.getText?.(node) ?? ''\n}\n\nfunction defineRule(options: {\n description: string\n messages: Record<string, string>\n create: (context: RuleContext) => Visitor\n}): RuleModule {\n return {\n meta: {\n type: 'problem',\n docs: {\n description: options.description,\n recommended: true,\n },\n messages: options.messages,\n schema: [],\n },\n create: options.create,\n }\n}\n\nfunction createTextRule(options: {\n description: string\n messageId: string\n message: string\n matcher: (text: string, context: RuleContext) => boolean\n}): RuleModule {\n return defineRule({\n description: options.description,\n messages: { [options.messageId]: options.message },\n create(context) {\n function inspect(node: unknown) {\n const text = getStaticString(node)\n if (text && options.matcher(text, context)) {\n context.report({ node, messageId: options.messageId })\n }\n }\n\n return {\n Literal: inspect,\n TemplateElement: inspect,\n }\n },\n })\n}\n\nfunction containsAllowIndexingTrue(text: string): boolean {\n return (\n text.includes('ALLOW_INDEXING=true') ||\n /ALLOW_INDEXING[\\s\\S]{0,80}['\"]true['\"]/.test(text)\n )\n}\n\nconst noAllowIndexingTrueRule = defineRule({\n description: 'Disallow ALLOW_INDEXING=true; only ALLOW_INDEXING=1 is supported.',\n messages: {\n allowIndexingTrue: 'Use ALLOW_INDEXING=1 as the only explicit indexing override.',\n },\n create(context) {\n function inspectStringNode(node: unknown) {\n const text = getStaticString(node)\n if (text && containsAllowIndexingTrue(text)) {\n context.report({ node, messageId: 'allowIndexingTrue' })\n }\n }\n\n function inspectSourceNode(node: unknown) {\n const text = getSourceText(context, node)\n if (text && containsAllowIndexingTrue(text)) {\n context.report({ node, messageId: 'allowIndexingTrue' })\n }\n }\n\n return {\n BinaryExpression: inspectSourceNode,\n Literal: inspectStringNode,\n Property: inspectSourceNode,\n TemplateElement: inspectStringNode,\n }\n },\n})\n\nconst retiredAnalyticsEvents = new Set([\n 'contact_form_submission',\n 'phone_call',\n 'phone_calls',\n 'form_start',\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\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 === 'contact_form' || value === 'phone_link_click' || value === 'phone_call'\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 noUnsafeRichTextSinksRule = defineRule({\n description: 'Disallow visible rich text sinks that bypass a sanitizer.',\n messages: {\n unsafeRichTextSink: 'Visible rich text must be sanitizer-backed and tested.',\n },\n create(context) {\n function inspectSourceNode(node: unknown) {\n const text = getSourceText(context, node)\n if (\n text.includes('dangerouslySetInnerHTML') &&\n !/saniti[sz](?:e|ed|er)/i.test(text)\n ) {\n context.report({ node, messageId: 'unsafeRichTextSink' })\n }\n }\n\n function inspectStringNode(node: unknown) {\n const text = getStaticString(node)\n if (\n text?.includes('dangerouslySetInnerHTML') &&\n !/saniti[sz](?:e|ed|er)/i.test(text)\n ) {\n context.report({ node, messageId: 'unsafeRichTextSink' })\n }\n }\n\n return {\n JSXAttribute: inspectSourceNode,\n Literal: inspectStringNode,\n Property: inspectSourceNode,\n TemplateElement: inspectStringNode,\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.noAllowIndexingTrue]: noAllowIndexingTrueRule,\n [RULE_IDS.noUnsafeRichTextSinks]: noUnsafeRichTextSinksRule,\n [RULE_IDS.noProtectedPlatformReimplementation]: noProtectedPlatformReimplementationRule,\n [RULE_IDS.noAnalyticsPii]: noAnalyticsPiiRule,\n [RULE_IDS.noUnsafeExternalLinks]: noUnsafeExternalLinksRule,\n [RULE_IDS.noRawImageElements]: noRawImageElementsRule,\n} satisfies Record<string, RuleModule>\n\ntype BrandlabPlugin = {\n rules: typeof rules\n configs: {\n recommended: {\n plugins: {\n brandlab: unknown\n }\n rules: Record<string, 'error'>\n }\n }\n}\n\nconst recommendedRules = Object.fromEntries(\n Object.keys(rules).map((ruleId) => [`brandlab/${ruleId}`, 'error' as const]),\n) as Record<string, 'error'>\n\nconst plugin: BrandlabPlugin = {\n rules,\n configs: {\n recommended: {\n plugins: {\n brandlab: undefined,\n },\n rules: recommendedRules,\n },\n },\n}\n\nplugin.configs.recommended.plugins.brandlab = plugin\n\nexport default plugin\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brandlab-digital/eslint-plugin",
3
- "version": "1.0.12",
3
+ "version": "1.1.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/RomieDandan/brandlab.git",