@ttt-productions/repo-guards 0.1.34 → 0.1.35

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.
@@ -406,7 +406,7 @@ export const readRetryStateGuard = {
406
406
  },
407
407
  ],
408
408
  };
409
- const FAILURE_FIELDS = new Set(['error', 'isError', 'status']);
409
+ const FAILURE_FIELDS = new Set(['error', 'isError', 'status', 'retryState']);
410
410
  function isEmptyAnswer(node) {
411
411
  return ((ts.isArrayLiteralExpression(node) && node.elements.length === 0) ||
412
412
  (ts.isObjectLiteralExpression(node) && node.properties.length === 0) ||
@@ -560,7 +560,7 @@ export const hookReadDefaultGuard = {
560
560
  {
561
561
  title: 'a hook never returns a default its consumers cannot tell from data',
562
562
  description: `In ${facts.hooksTree}, a read's data defaulted to an empty answer (q.data ?? [], const { data = [] } = useQ()) is allowed only ` +
563
- `where the same function also carries that read's failure (error / isError / status, or the read handed to ${RETRY_STATE_HELPERS[0]}), ` +
563
+ `where the same function also carries that read's failure (error / isError / status / retryState, or the read handed to ${RETRY_STATE_HELPERS[0]}), ` +
564
564
  'and no exported hook collapses a read into a bare boolean, where an unknown read would read as "no". Return the read state ' +
565
565
  '(pending / failed / answered) or carry the failure beside the defaulted data.',
566
566
  run(context) {
@@ -656,7 +656,7 @@ export const defaultedReadBindingGuard = {
656
656
  const guard = reviewedAllowlist({
657
657
  title: 'a render surface that defaults a read binds its failure',
658
658
  description: `A render surface (${facts.surfaceTrees.join(', ')}) that defaults a read's data (const { data: rows = [] } = useRows()) binds ` +
659
- `that same read's failure (error / isError / status${held}) in the same destructure, and renders the pending and failed states ` +
659
+ `that same read's failure (error / isError / status / retryState${held}) in the same destructure, and renders the pending and failed states ` +
660
660
  'before the default is used; otherwise a failed read renders as an empty list, a zero, or a negative answer that decides a control. ' +
661
661
  'A reviewed default names the gate that holds its surface back until the read answered, and that gate must still be there.',
662
662
  scope: APP_CODE,
@@ -1 +1 @@
1
- {"version":3,"file":"read-failures.js","sourceRoot":"","sources":["../../../src/modules/frontend-reads/read-failures.ts"],"names":[],"mappings":"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","sourcesContent":["import ts from 'typescript';\nimport type { GenericGuardDefinition } from '../../node/suite/config.js';\nimport type { Finding, GuardContext } from '../../guard.js';\nimport type { FileView } from '../../reader/view.js';\nimport { matchPattern, ownerOnly, reviewedAllowlist, type Hit } from '../../shapes/shapes.js';\nimport type { Reviewed } from '../../node/layout.js';\nimport { forEachNode, lineOfNode } from '../../support/ast.js';\nimport { identifierProblem, pathProblem, reviewedProblems, isList } from '../../support/facts.js';\nimport { escapeRegExp, isUnder } from '../../support/text.js';\nimport {\n APP_CODE,\n filesUnder,\n identifierListProblem,\n isHookName,\n pathListProblem,\n requiredFile,\n} from './shared.js';\n\nconst RETRY_STATE_HELPERS = ['useReadRetryState', 'useReadRetryStates'] as const;\nconst RETRY_STATE_FIELD = 'isRetrying';\nconst HELD_ANSWER_FIELD = 'retrying';\n\nexport interface FailureSeat {\n component: string;\n retryProp: string;\n pendingProp: string;\n}\n\nfunction seatProblems(seat: FailureSeat | undefined): string[] {\n if (!seat || typeof seat !== 'object') return ['seat is missing'];\n const problems: string[] = [];\n identifierProblem(seat.component, 'seat.component', problems);\n identifierProblem(seat.retryProp, 'seat.retryProp', problems);\n identifierProblem(seat.pendingProp, 'seat.pendingProp', problems);\n return problems;\n}\n\nexport interface ReadStateOwnerFacts {\n module: string;\n seatComponent: string;\n laterPageRetry: string;\n}\n\nexport const readStateOwnerGuard: GenericGuardDefinition<ReadStateOwnerFacts> = {\n id: 'readStateOwner',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.module, 'module', problems);\n identifierProblem(facts?.seatComponent, 'seatComponent', problems);\n identifierProblem(facts?.laterPageRetry, 'laterPageRetry', problems);\n return problems;\n },\n build: (facts) => [\n ownerOnly({\n title: 'read failures render only through the read-state module',\n description:\n `Every read's pending, failed, and empty states render through ${facts.module}, so every failure offers Try again ` +\n `held through its retry. Nothing outside it renders <${facts.seatComponent}> or calls ${facts.laterPageRetry}(); ` +\n 'render the read through the module instead.',\n scope: APP_CODE,\n match: matchPattern(\n new RegExp(\n `<${escapeRegExp(facts.seatComponent)}\\\\b|\\\\b${escapeRegExp(facts.laterPageRetry)}\\\\s*\\\\(`,\n ),\n ),\n owners: [facts.module],\n samples: {\n flags: [\n `return <${facts.seatComponent} thing=\"rows\" />;`,\n `const retry = ${facts.laterPageRetry}(list);`,\n ],\n passes: [\n `// <${facts.seatComponent} /> named in prose only\\nconst rows = 1;`,\n `import { ${facts.seatComponent} } from './seat';`,\n ],\n },\n }),\n ],\n};\n\nexport interface ReadRetryStateFacts {\n seat: FailureSeat;\n controlPendingProp: string;\n}\n\nconst FAILURE_FLAG = String.raw`[\\w$.?]*\\b(?:isError|error)\\b`;\nconst FETCHING = String.raw`[\\w$.?]*\\bisFetching\\b`;\nconst LIVE_FLAG_PAIRS: ReadonlyArray<{ name: string; re: RegExp }> = [\n { name: 'failure flag && isFetching', re: new RegExp(`${FAILURE_FLAG}\\\\s*&&\\\\s*${FETCHING}`) },\n { name: 'isFetching && failure flag', re: new RegExp(`${FETCHING}\\\\s*&&\\\\s*${FAILURE_FLAG}`) },\n];\n\nconst FETCHING_FLAG =\n /^(?:is(?:Re)?[Ff]etching|fetchingCount|useIsFetching|fetchStatus|sourceState)$/;\n\nconst fieldName = (name: ts.Node): string | null =>\n ts.isIdentifier(name) || ts.isStringLiteralLike(name) ? name.text : null;\n\nfunction retryStateExpressions(\n file: FileView,\n fields: readonly string[],\n): Array<{ index: number; expression: ts.Expression }> {\n const sf = file.sourceFile;\n const wanted = new Set(fields);\n const found: Array<{ index: number; expression: ts.Expression }> = [];\n const add = (name: ts.Node, expression: ts.Expression | undefined) => {\n if (expression && wanted.has(fieldName(name) ?? ''))\n found.push({ index: name.getStart(sf), expression });\n };\n forEachNode(sf, (node) => {\n if (ts.isPropertyAssignment(node) || ts.isVariableDeclaration(node))\n add(node.name, node.initializer);\n else if (ts.isJsxAttribute(node) && node.initializer && ts.isJsxExpression(node.initializer))\n add(node.name, node.initializer.expression);\n else if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {\n add(ts.isPropertyAccessExpression(node.left) ? node.left.name : node.left, node.right);\n }\n });\n return found;\n}\n\nconst FAILURE_NAME = /^(?:isError|error)$/;\n\nfunction readsFetchingFlag(expression: ts.Node, file: FileView): boolean {\n return readsFlag(expression, file, FETCHING_FLAG);\n}\n\nfunction readsFlag(\n expression: ts.Node,\n file: FileView,\n flag: RegExp,\n seen: Set<string> = new Set(),\n): boolean {\n let reads = false;\n const bound: string[] = [];\n forEachNode(expression, (node) => {\n if (!ts.isIdentifier(node) || reads) return;\n if (flag.test(node.text)) reads = true;\n const parent = node.parent;\n const receiverOrCallee =\n (ts.isPropertyAccessExpression(parent) &&\n (parent.expression === node || parent.name === node)) ||\n (ts.isCallExpression(parent) && parent.expression === node);\n if (!receiverOrCallee) bound.push(node.text);\n });\n if (reads) return true;\n return bound.some((name) => {\n if (seen.has(name)) return false;\n seen.add(name);\n let declared: ts.Expression | undefined;\n let renamed = false;\n forEachNode(file.sourceFile, (node) => {\n if (\n ts.isBindingElement(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === name &&\n node.propertyName &&\n flag.test(fieldName(node.propertyName) ?? '')\n ) {\n renamed = true;\n } else if (\n !declared &&\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === name &&\n node.initializer\n ) {\n declared = node.initializer;\n }\n });\n if (renamed) return true;\n if (!declared) return false;\n const value = declared;\n const fromHelper =\n ts.isCallExpression(value) &&\n ts.isIdentifier(value.expression) &&\n (RETRY_STATE_HELPERS as readonly string[]).includes(value.expression.text);\n return !fromHelper && readsFlag(value, file, flag, seen);\n });\n}\n\nfunction branchConditionsAbove(node: ts.Node): ts.Expression[] {\n const conditions: ts.Expression[] = [];\n for (let child = node, parent = node.parent; parent; child = parent, parent = parent.parent) {\n if (ts.isIfStatement(parent) && parent.thenStatement === child)\n conditions.push(parent.expression);\n else if (ts.isConditionalExpression(parent) && parent.whenTrue === child)\n conditions.push(parent.condition);\n else if (\n ts.isBinaryExpression(parent) &&\n parent.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken &&\n parent.right === child\n )\n conditions.push(parent.left);\n }\n return conditions;\n}\n\nexport function failureBranchLivePending(file: FileView, controlPendingProp: string): Hit[] {\n const sf = file.sourceFile;\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n if (\n !ts.isJsxAttribute(node) ||\n fieldName(node.name) !== controlPendingProp ||\n !node.initializer ||\n !ts.isJsxExpression(node.initializer) ||\n !node.initializer.expression\n )\n return;\n const pending = node.initializer.expression;\n if (!readsFetchingFlag(pending, file)) return;\n if (!branchConditionsAbove(node).some((c) => readsFlag(c, file, FAILURE_NAME))) return;\n hits.push({\n index: node.getStart(sf),\n detail: `a failure's retry pending from a fetching flag: ${pending.getText(sf).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n });\n return hits;\n}\n\nconst LOADING_FIELD = 'isLoading';\nconst READ_FAILURE_FIELDS = new Set(['error', 'isError', 'retryState']);\nconst HELD_RECEIVER = /retry/i;\n\ninterface Destructured {\n field: string;\n receiver: string;\n scope: ts.Node;\n}\n\ntype Bindings = Map<string, Destructured[]>;\n\nfunction scopeOf(node: ts.Node): ts.Node {\n return enclosingFunctionOf(node) ?? node.getSourceFile();\n}\n\nfunction destructuredBindings(sf: ts.SourceFile): Bindings {\n const bindings: Bindings = new Map();\n forEachNode(sf, (node) => {\n if (\n !ts.isVariableDeclaration(node) ||\n !ts.isObjectBindingPattern(node.name) ||\n !node.initializer ||\n !ts.isIdentifier(node.initializer)\n )\n return;\n const receiver = node.initializer.text;\n const scope = scopeOf(node);\n for (const element of node.name.elements) {\n if (!ts.isIdentifier(element.name)) continue;\n const field = element.propertyName ? fieldName(element.propertyName) : element.name.text;\n if (!field) continue;\n const named = bindings.get(element.name.text) ?? [];\n named.push({ field, receiver, scope });\n bindings.set(element.name.text, named);\n }\n });\n return bindings;\n}\n\nfunction declaresParameter(fn: ts.SignatureDeclaration, name: string): boolean {\n let declares = false;\n for (const parameter of fn.parameters)\n forEachNode(parameter.name, (node) => {\n if (ts.isIdentifier(node) && node.text === name) declares = true;\n });\n return declares;\n}\n\nfunction bindingFor(use: ts.Identifier, bindings: Bindings): Destructured | undefined {\n const named = bindings.get(use.text);\n if (!named) return undefined;\n for (let scope: ts.Node | undefined = scopeOf(use); scope;) {\n const found = named.find((binding) => binding.scope === scope);\n if (found) return found;\n if (ts.isFunctionLike(scope) && declaresParameter(scope, use.text)) return undefined;\n scope = ts.isSourceFile(scope) ? undefined : scopeOf(scope);\n }\n return undefined;\n}\n\nfunction rootIdentifier(node: ts.Expression): string | null {\n let current: ts.Expression = node;\n while (ts.isPropertyAccessExpression(current) || ts.isNonNullExpression(current))\n current = current.expression;\n return ts.isIdentifier(current) ? current.text : null;\n}\n\ninterface ReadField {\n receiver: string;\n index: number;\n}\n\nfunction readFieldsIn(\n scope: ts.Node,\n bindings: Bindings,\n wanted: (field: string) => boolean,\n): ReadField[] {\n const sf = scope.getSourceFile();\n const found: ReadField[] = [];\n forEachNode(scope, (node) => {\n if (ts.isPropertyAccessExpression(node) && wanted(node.name.text)) {\n const receiver = rootIdentifier(node.expression);\n if (receiver && !HELD_RECEIVER.test(node.expression.getText(sf)))\n found.push({ receiver, index: node.getStart(sf) });\n } else if (\n ts.isIdentifier(node) &&\n !(ts.isPropertyAccessExpression(node.parent) && node.parent.name === node)\n ) {\n const bound = bindingFor(node, bindings);\n if (bound && wanted(bound.field) && !HELD_RECEIVER.test(bound.receiver))\n found.push({ receiver: bound.receiver, index: node.getStart(sf) });\n }\n });\n return found;\n}\n\nfunction enclosingFunctionOf(node: ts.Node): ts.Node | undefined {\n for (let p = node.parent; p; p = p.parent) if (ts.isFunctionLike(p)) return p;\n return undefined;\n}\n\nfunction branchCondition(node: ts.Node): ts.Expression | undefined {\n if (ts.isIfStatement(node)) return node.expression;\n if (ts.isConditionalExpression(node)) return node.condition;\n if (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken &&\n ts.isJsxExpression(node.parent)\n )\n return node.left;\n return undefined;\n}\n\nexport function liveLoadingBeforeFailure(file: FileView): Hit[] {\n const sf = file.sourceFile;\n const bindings = destructuredBindings(sf);\n const isLoading = (field: string) => field === LOADING_FIELD;\n const isFailure = (field: string) => READ_FAILURE_FIELDS.has(field);\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n const condition = branchCondition(node);\n const fn = condition && enclosingFunctionOf(node);\n if (!condition || !fn) return;\n const tested = new Set(readFieldsIn(condition, bindings, isFailure).map((r) => r.receiver));\n const end = condition.getEnd();\n const later = readFieldsIn(fn, bindings, isFailure).filter((r) => r.index >= end);\n const loading = readFieldsIn(condition, bindings, isLoading).find(\n (r) => !tested.has(r.receiver) && later.some((f) => f.receiver === r.receiver),\n );\n if (loading)\n hits.push({\n index: loading.index,\n detail: `a live loading flag tested before the read's failure: ${condition.getText(sf).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n });\n return hits;\n}\n\nexport function liveFlagRetryStates(file: FileView, seat: FailureSeat): Hit[] {\n const code = file.code;\n const hits = new Map<number, Hit>();\n let offset = 0;\n for (const line of code.split('\\n')) {\n for (const shape of LIVE_FLAG_PAIRS) {\n const m = shape.re.exec(line);\n if (m)\n hits.set(file.lineOf(offset + m.index), {\n index: offset + m.index,\n detail: `${shape.name}: ${line.trim().slice(0, 120)}`,\n });\n }\n offset += line.length + 1;\n }\n for (const { index, expression } of retryStateExpressions(file, [\n RETRY_STATE_FIELD,\n HELD_ANSWER_FIELD,\n seat.pendingProp,\n ])) {\n if (!readsFetchingFlag(expression, file)) continue;\n const line = file.lineOf(index);\n if (!hits.has(line))\n hits.set(line, {\n index,\n detail: `retry state from a fetching flag: ${expression.getText(file.sourceFile).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n }\n return [...hits.values()].sort((a, b) => a.index - b.index);\n}\n\nconst isHookFunction = (node: ts.Node, sf: ts.SourceFile): boolean => {\n if ((ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node)) && node.name)\n return isHookName(node.name.text);\n if (\n (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) &&\n ts.isVariableDeclaration(node.parent)\n )\n return isHookName(node.parent.name.getText(sf));\n return false;\n};\n\nexport function failedAnswersWithoutRetrying(file: FileView): Hit[] {\n const sf = file.sourceFile;\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n if (!ts.isObjectLiteralExpression(node)) return;\n const named = (name: string) =>\n node.properties.find(\n (p) =>\n (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&\n p.name.getText(sf) === name,\n );\n const status = named('status');\n if (\n !status ||\n !ts.isPropertyAssignment(status) ||\n !ts.isStringLiteralLike(status.initializer) ||\n status.initializer.text !== 'failed'\n )\n return;\n if (!named('error') || named(HELD_ANSWER_FIELD) || node.properties.some(ts.isSpreadAssignment))\n return;\n let inHook = false;\n for (let p: ts.Node | undefined = node.parent; p && !inHook; p = p.parent)\n inHook = isHookFunction(p, sf);\n if (inHook)\n hits.push({\n index: node.getStart(sf),\n detail: `a failed answer with no ${HELD_ANSWER_FIELD}: ${node.getText(sf).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n });\n return hits;\n}\n\nexport function seatRetriesWithoutPending(file: FileView, seat: FailureSeat): Hit[] {\n const hits: Hit[] = [];\n const element = new RegExp(`<${escapeRegExp(seat.component)}\\\\b[\\\\s\\\\S]*?\\\\/>`, 'g');\n for (const match of file.code.matchAll(element)) {\n const text = match[0];\n if (\n new RegExp(`\\\\b${escapeRegExp(seat.retryProp)}=`).test(text) &&\n !new RegExp(`\\\\b${escapeRegExp(seat.pendingProp)}=`).test(text) &&\n !/\\{\\s*\\.\\.\\./.test(text)\n ) {\n hits.push({\n index: match.index ?? 0,\n detail: `<${seat.component} ${seat.retryProp}=…> without ${seat.pendingProp}`,\n });\n }\n }\n return hits;\n}\n\nexport const readRetryStateGuard: GenericGuardDefinition<ReadRetryStateFacts> = {\n id: 'readRetryState',\n absentWhen: false,\n factProblems(facts) {\n const problems = seatProblems(facts?.seat);\n identifierProblem(facts?.controlPendingProp, 'controlPendingProp', problems);\n return problems;\n },\n build: (facts) => [\n {\n title: \"a read's retry state comes from its one owner, never the live fetching flags\",\n description:\n 'TanStack Query puts a query that never succeeded back to pending and clears its error the moment a refetch starts, so a retry ' +\n 'state built from isFetching / isRefetching / fetchStatus with isError or error reads false for the retry of a failed first read, ' +\n `and the failure turns into a loading state under the pressed retry. Hold the failure with query-core's ${RETRY_STATE_HELPERS.join(' / ')} ` +\n `(exposed from the read's hook) and pass its ${RETRY_STATE_FIELD}; a lookup hands out its held ${HELD_ANSWER_FIELD}, and a hook ` +\n `that answers with a status gives its failed answer the held ${HELD_ANSWER_FIELD} beside the error, never one built from a ` +\n `fetching flag; and every <${facts.seat.component}> given ${facts.seat.retryProp} also takes ${facts.seat.pendingProp}, so the ` +\n `pressed retry shows it is running. The same live flags decide no failure surface: a control's ${facts.controlPendingProp} ` +\n \"inside a failure branch reads the held isRetrying, never a fetching flag, and a branch never tests a read's live isLoading \" +\n \"ahead of that read's failure — the held retryState decides the failure first, then its isLoading.\",\n run(context: GuardContext): Finding[] {\n const findings: Finding[] = [];\n for (const file of context.files(APP_CODE)) {\n const hits = [\n ...liveFlagRetryStates(file, facts.seat),\n ...seatRetriesWithoutPending(file, facts.seat),\n ...failedAnswersWithoutRetrying(file),\n ...failureBranchLivePending(file, facts.controlPendingProp),\n ...liveLoadingBeforeFailure(file),\n ];\n for (const hit of hits) {\n findings.push({\n file: file.path,\n line: file.lineOf(hit.index),\n detail: hit.detail ?? '',\n });\n }\n }\n return findings;\n },\n },\n ],\n};\n\nexport interface HookReadDefaultFacts {\n hooksTree: string;\n readCollapsers: readonly string[];\n}\n\nconst FAILURE_FIELDS = new Set(['error', 'isError', 'status']);\n\nfunction isEmptyAnswer(node: ts.Expression): boolean {\n return (\n (ts.isArrayLiteralExpression(node) && node.elements.length === 0) ||\n (ts.isObjectLiteralExpression(node) && node.properties.length === 0) ||\n node.kind === ts.SyntaxKind.FalseKeyword ||\n node.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isNumericLiteral(node) && node.text === '0') ||\n (ts.isStringLiteral(node) && node.text === '')\n );\n}\n\nfunction enclosingFunction(node: ts.Node): ts.Node | undefined {\n let current: ts.Node | undefined = node.parent;\n while (current && !ts.isFunctionLike(current)) current = current.parent;\n return current;\n}\n\nfunction readsFailureOf(scope: ts.Node, receiver: string, sf: ts.SourceFile): boolean {\n let found = false;\n forEachNode(scope, (n) => {\n if (\n ts.isPropertyAccessExpression(n) &&\n FAILURE_FIELDS.has(n.name.text) &&\n n.expression.getText(sf) === receiver\n )\n found = true;\n if (\n ts.isCallExpression(n) &&\n n.expression.getText(sf) === RETRY_STATE_HELPERS[0] &&\n n.arguments[0]?.getText(sf) === receiver\n )\n found = true;\n });\n return found;\n}\n\nfunction exportedHookBody(\n node: ts.Node,\n sf: ts.SourceFile,\n): { name: string; body: ts.ConciseBody } | undefined {\n const isExported = (n: ts.Node) =>\n ts.canHaveModifiers(n) &&\n (ts.getModifiers(n) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (\n ts.isFunctionDeclaration(node) &&\n node.name &&\n isHookName(node.name.text) &&\n isExported(node) &&\n node.body\n ) {\n return { name: node.name.text, body: node.body };\n }\n if (\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n isHookName(node.name.text) &&\n node.initializer &&\n (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer)) &&\n isExported(node.parent.parent)\n ) {\n return { name: node.name.getText(sf), body: node.initializer.body };\n }\n return undefined;\n}\n\nfunction returnedExpressions(body: ts.ConciseBody): ts.Expression[] {\n if (!ts.isBlock(body)) return [body];\n const out: ts.Expression[] = [];\n const visit = (n: ts.Node) => {\n if (ts.isFunctionLike(n)) return;\n if (ts.isReturnStatement(n) && n.expression) out.push(n.expression);\n ts.forEachChild(n, visit);\n };\n ts.forEachChild(body, visit);\n return out;\n}\n\nfunction readsData(node: ts.Node): boolean {\n let found = false;\n forEachNode(node, (n) => {\n if (ts.isPropertyAccessExpression(n) && n.name.text === 'data') found = true;\n });\n return found;\n}\n\nconst COMPARISONS = new Set([\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n ts.SyntaxKind.ExclamationEqualsEqualsToken,\n ts.SyntaxKind.GreaterThanToken,\n ts.SyntaxKind.LessThanToken,\n ts.SyntaxKind.GreaterThanEqualsToken,\n ts.SyntaxKind.LessThanEqualsToken,\n]);\n\nfunction collapsesReadToBoolean(\n expr: ts.Expression,\n sf: ts.SourceFile,\n collapsers: ReadonlySet<string>,\n): boolean {\n let e = expr;\n while (ts.isParenthesizedExpression(e)) e = e.expression;\n if (ts.isCallExpression(e) && collapsers.has(e.expression.getText(sf))) return true;\n if (ts.isPrefixUnaryExpression(e) && e.operator === ts.SyntaxKind.ExclamationToken)\n return readsData(e);\n if (ts.isBinaryExpression(e) && COMPARISONS.has(e.operatorToken.kind)) return readsData(e);\n if (ts.isCallExpression(e) && e.expression.getText(sf) === 'Boolean') return readsData(e);\n return false;\n}\n\nexport function hookReadDefaults(\n file: FileView,\n collapsers: readonly string[],\n): Array<{ line: number; detail: string }> {\n const sf = file.sourceFile;\n const names = new Set(collapsers);\n const hits: Array<{ line: number; detail: string }> = [];\n forEachNode(sf, (node) => {\n if (\n ts.isBinaryExpression(node) &&\n (node.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken ||\n node.operatorToken.kind === ts.SyntaxKind.BarBarToken) &&\n ts.isPropertyAccessExpression(node.left) &&\n node.left.name.text === 'data' &&\n isEmptyAnswer(node.right)\n ) {\n const scope = enclosingFunction(node);\n if (!scope || !readsFailureOf(scope, node.left.expression.getText(sf), sf)) {\n hits.push({\n line: lineOfNode(file, node),\n detail: `a defaulted read with no failure beside it: ${node.getText(sf)}`,\n });\n }\n }\n if (\n ts.isVariableDeclaration(node) &&\n node.initializer &&\n ts.isObjectBindingPattern(node.name)\n ) {\n const init = node.initializer;\n if (ts.isCallExpression(init) && isHookName(init.expression.getText(sf))) {\n const keyOf = (el: ts.BindingElement) => (el.propertyName ?? el.name).getText(sf);\n const elements = node.name.elements;\n const defaultsData = elements.some(\n (el) => keyOf(el) === 'data' && el.initializer !== undefined,\n );\n const carriesFailure = elements.some(\n (el) => el.dotDotDotToken || FAILURE_FIELDS.has(keyOf(el)),\n );\n if (defaultsData && !carriesFailure)\n hits.push({\n line: lineOfNode(file, node),\n detail: `a defaulted read with no failure beside it: ${node.name.getText(sf)}`,\n });\n }\n }\n const hook = exportedHookBody(node, sf);\n if (hook) {\n for (const returned of returnedExpressions(hook.body)) {\n if (collapsesReadToBoolean(returned, sf, names))\n hits.push({\n line: lineOfNode(file, returned),\n detail: `${hook.name} returns a boolean from a read`,\n });\n }\n }\n });\n return hits;\n}\n\nexport const hookReadDefaultGuard: GenericGuardDefinition<HookReadDefaultFacts> = {\n id: 'hookReadDefault',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.hooksTree, 'hooksTree', problems);\n identifierListProblem(facts?.readCollapsers, 'readCollapsers', problems, { nonEmpty: false });\n return problems;\n },\n build: (facts) => [\n {\n title: 'a hook never returns a default its consumers cannot tell from data',\n description:\n `In ${facts.hooksTree}, a read's data defaulted to an empty answer (q.data ?? [], const { data = [] } = useQ()) is allowed only ` +\n `where the same function also carries that read's failure (error / isError / status, or the read handed to ${RETRY_STATE_HELPERS[0]}), ` +\n 'and no exported hook collapses a read into a bare boolean, where an unknown read would read as \"no\". Return the read state ' +\n '(pending / failed / answered) or carry the failure beside the defaulted data.',\n run(context) {\n const { files, findings } = filesUnder(context, [facts.hooksTree]);\n for (const file of files)\n for (const hit of hookReadDefaults(file, facts.readCollapsers))\n findings.push({ file: file.path, ...hit });\n return findings;\n },\n },\n ],\n};\n\nexport interface DefaultedReadBindingFacts {\n surfaceTrees: readonly string[];\n heldFailureFields: readonly string[];\n allowlist: ReadonlyArray<Reviewed & { gate: ReadGate }>;\n}\n\nexport interface ReadGate {\n file: string;\n code: string;\n}\n\nconst squashed = (text: string) => text.replace(/\\s+/g, ' ').trim();\n\nfunction gateProblems(allowlist: unknown): string[] {\n if (!isList(allowlist)) return [];\n const problems: string[] = [];\n for (const entry of allowlist as Array<{ path?: string; gate?: Partial<ReadGate> }>) {\n const what = `allowlist entry ${String(entry?.path)}`;\n if (!entry?.gate || typeof entry.gate !== 'object')\n problems.push(\n `${what} names no gate (the file and the code that hold its surface back until the read answered)`,\n );\n else {\n pathProblem(entry.gate.file, `${what}'s gate file`, problems);\n if (typeof entry.gate.code !== 'string' || !entry.gate.code.trim())\n problems.push(`${what}'s gate names no code`);\n }\n }\n return problems;\n}\n\nfunction missingGates(\n context: GuardContext,\n allowlist: DefaultedReadBindingFacts['allowlist'],\n): Finding[] {\n const findings: Finding[] = [];\n for (const { path, gate } of allowlist) {\n if (!context.reader.exists(gate.file))\n findings.push({\n file: gate.file,\n detail: `the gate ${path} relies on is gone: the file no longer exists`,\n });\n else if (!squashed(context.file(gate.file).code).includes(squashed(gate.code))) {\n findings.push({\n file: gate.file,\n detail: `the gate ${path} relies on is gone: no longer holds ${squashed(gate.code)}`,\n });\n }\n }\n return findings;\n}\n\nexport function unguardedDataDefaults(file: FileView, heldFailureFields: readonly string[]): Hit[] {\n const sf = file.sourceFile;\n const failureBindings = new Set([...FAILURE_FIELDS, ...heldFailureFields]);\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n if (\n !ts.isVariableDeclaration(node) ||\n !node.initializer ||\n !ts.isObjectBindingPattern(node.name)\n )\n return;\n let init: ts.Expression = node.initializer;\n if (ts.isAwaitExpression(init)) init = init.expression;\n if (!ts.isCallExpression(init)) return;\n const callee = init.expression.getText(sf);\n if (!isHookName(callee)) return;\n const elements = node.name.elements;\n if (elements.some((el) => el.dotDotDotToken)) return;\n const keyOf = (el: ts.BindingElement) => (el.propertyName ?? el.name).getText(sf);\n if (!elements.some((el) => keyOf(el) === 'data' && el.initializer !== undefined)) return;\n if (elements.some((el) => failureBindings.has(keyOf(el)))) return;\n hits.push({\n index: node.getStart(sf),\n detail: `${callee}() defaults data with no failure bound`,\n });\n });\n return hits;\n}\n\nexport const defaultedReadBindingGuard: GenericGuardDefinition<DefaultedReadBindingFacts> = {\n id: 'defaultedReadBinding',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathListProblem(facts?.surfaceTrees, 'surfaceTrees', problems);\n identifierListProblem(facts?.heldFailureFields, 'heldFailureFields', problems, {\n nonEmpty: false,\n });\n reviewedProblems(facts?.allowlist, 'allowlist', problems);\n return [...problems, ...gateProblems(facts?.allowlist)];\n },\n build: (facts) => {\n const held = facts.heldFailureFields.length ? ` / ${facts.heldFailureFields.join(' / ')}` : '';\n const guard = reviewedAllowlist({\n title: 'a render surface that defaults a read binds its failure',\n description:\n `A render surface (${facts.surfaceTrees.join(', ')}) that defaults a read's data (const { data: rows = [] } = useRows()) binds ` +\n `that same read's failure (error / isError / status${held}) in the same destructure, and renders the pending and failed states ` +\n 'before the default is used; otherwise a failed read renders as an empty list, a zero, or a negative answer that decides a control. ' +\n 'A reviewed default names the gate that holds its surface back until the read answered, and that gate must still be there.',\n scope: APP_CODE,\n match: (file) =>\n facts.surfaceTrees.some((tree) => isUnder(file.path, tree))\n ? unguardedDataDefaults(file, facts.heldFailureFields)\n : [],\n allowlist: facts.allowlist,\n samples: {\n flags: [\n {\n path: `${facts.surfaceTrees[0]}/sample.tsx`,\n text: 'const { data: rows = [] } = useRows(id);',\n },\n ],\n passes: [\n {\n path: `${facts.surfaceTrees[0]}/sample.tsx`,\n text: 'const { data: rows = [], isError } = useRows(id);',\n },\n ],\n },\n });\n return [\n {\n ...guard,\n run: async (context) => [\n ...(await guard.run(context)),\n ...missingGates(context, facts.allowlist),\n ],\n },\n ];\n },\n};\n\nexport interface LaterPageFailureFacts {\n hooksTree: string;\n readStateModule: string;\n listRoutes: ReadonlyArray<{ component: string; prop?: string }>;\n handOffProp: string;\n}\n\nconst LOADS_MORE = /\\bfetchNextPage\\b/;\n\nfunction routedPattern(routes: LaterPageFailureFacts['listRoutes']): RegExp {\n return new RegExp(\n routes\n .map(({ component, prop }) =>\n prop\n ? `<${escapeRegExp(component)}\\\\s[^>]*?\\\\b${escapeRegExp(prop)}=`\n : `<${escapeRegExp(component)}\\\\b`,\n )\n .join('|'),\n );\n}\n\nexport function unroutedPagingSurfaces(\n files: readonly FileView[],\n facts: LaterPageFailureFacts,\n): FileView[] {\n const routed = routedPattern(facts.listRoutes);\n const routing = new Set(\n files\n .filter((f) => routed.test(f.code))\n .flatMap((f) => [...f.code.matchAll(/export function ([A-Z]\\w*)/g)].map((m) => m[1])),\n );\n const handOff = new RegExp(`<([A-Z]\\\\w*)\\\\s[^>]*?\\\\b${escapeRegExp(facts.handOffProp)}=\\\\{`, 'g');\n return files.filter((f) => {\n if (routed.test(f.code)) return false;\n const handedTo = [...f.code.matchAll(handOff)].map((m) => m[1]);\n if (!LOADS_MORE.test(f.code) && !handedTo.length) return false;\n return !handedTo.some((component) => routing.has(component));\n });\n}\n\nexport const laterPageFailureGuard: GenericGuardDefinition<LaterPageFailureFacts> = {\n id: 'laterPageFailure',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.hooksTree, 'hooksTree', problems);\n pathProblem(facts?.readStateModule, 'readStateModule', problems);\n identifierProblem(facts?.handOffProp, 'handOffProp', problems);\n if (!isList(facts?.listRoutes) || !facts.listRoutes.length)\n problems.push('listRoutes names no component');\n else\n facts.listRoutes.forEach((r, i) => {\n identifierProblem(r?.component, `listRoutes[${i}].component`, problems);\n if (r?.prop !== undefined) identifierProblem(r.prop, `listRoutes[${i}].prop`, problems);\n });\n return problems;\n },\n build: (facts) => [\n {\n title: \"an infinite list's later-page failure routes through the read-state module\",\n description:\n `Every surface that loads more of an infinite list (fetchNextPage) or hands a list on (${facts.handOffProp}=…) renders it through ` +\n `${facts.listRoutes.map((r) => `<${r.component}${r.prop ? ` ${r.prop}=…` : ''}>`).join(' or ')} from ${facts.readStateModule}, ` +\n 'or hands it to a component whose own file does, so a failed load-more retries that page instead of ' +\n 'refetching the whole list. A page-by-page list, and a count that only reads hasNextPage, load nothing more and are not counted.',\n run(context) {\n const { findings, file: module } = requiredFile(\n context,\n facts.readStateModule,\n 'the read-state module',\n );\n if (!module) return findings;\n const surfaces = context\n .files(APP_CODE)\n .filter((f) => !isUnder(f.path, facts.hooksTree) && f.path !== facts.readStateModule);\n for (const file of unroutedPagingSurfaces(surfaces, facts)) {\n findings.push({\n file: file.path,\n detail:\n 'pages an infinite list without routing its later-page failure through the read-state module',\n });\n }\n return findings;\n },\n },\n ],\n};\n\nexport interface ReadFailureCopyFacts {\n owner: string;\n allowlist: readonly Reviewed[];\n}\n\nexport const READ_FAILURE_SENTENCE =\n /(?:could not|couldn['’]?t|failed to|unable to)\\s+(?:load|search|fetch|read|retrieve|check|find)\\b|error\\s+(?:loading|searching|fetching|reading)\\b/i;\n\nexport const readFailureCopyGuard: GenericGuardDefinition<ReadFailureCopyFacts> = {\n id: 'readFailureCopy',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.owner, 'owner', problems);\n reviewedProblems(facts?.allowlist, 'allowlist', problems);\n if (isList(facts?.allowlist) && facts.allowlist.some((e) => e?.path === facts.owner))\n problems.push('the owner is listed in the allowlist');\n return problems;\n },\n build: (facts) => [\n reviewedAllowlist({\n title: \"a read failure's copy comes from its one owner\",\n description:\n `Every read-failure sentence a person sees is built by ${facts.owner} from the short noun the surface names; no other file ` +\n 'hand-writes one (\"could not load\", \"failed to load\", \"error loading\", or the same around another read verb, in any casing). ' +\n 'Render the owner (with surface-specific guidance as its hint), or — for text never shown to a person — add a reviewed entry with its why.',\n scope: APP_CODE,\n match: matchPattern(READ_FAILURE_SENTENCE),\n allowlist: [\n { path: facts.owner, why: 'the one owner of read-failure copy' },\n ...facts.allowlist,\n ],\n samples: {\n flags: [\n '<p>Could not load the rows.</p>',\n '<AlertTitle>Error Loading Rows</AlertTitle>',\n 'const m = \"Couldn\\'t fetch the list.\";',\n ],\n passes: [\n 'hint=\"a list that could not be read is not an empty list.\"',\n '<LoadingState label=\"Loading rows\" />',\n ],\n },\n }),\n ],\n};\n\nexport const READ_FAILURE_GUARDS = [\n readStateOwnerGuard,\n readRetryStateGuard,\n hookReadDefaultGuard,\n defaultedReadBindingGuard,\n laterPageFailureGuard,\n readFailureCopyGuard,\n] as const;\n"]}
1
+ {"version":3,"file":"read-failures.js","sourceRoot":"","sources":["../../../src/modules/frontend-reads/read-failures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAY,MAAM,wBAAwB,CAAC;AAE9F,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,QAAQ,EACR,UAAU,EACV,qBAAqB,EACrB,UAAU,EACV,eAAe,EACf,YAAY,GACb,MAAM,aAAa,CAAC;AAErB,MAAM,mBAAmB,GAAG,CAAC,mBAAmB,EAAE,oBAAoB,CAAU,CAAC;AACjF,MAAM,iBAAiB,GAAG,YAAY,CAAC;AACvC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAQrC,SAAS,YAAY,CAAC,IAA6B;IACjD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC9D,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;IAC9D,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAQD,MAAM,CAAC,MAAM,mBAAmB,GAAgD;IAC9E,EAAE,EAAE,gBAAgB;IACpB,UAAU,EAAE,KAAK;IACjB,YAAY,CAAC,KAAK;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC/C,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;QACnE,iBAAiB,CAAC,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;QACrE,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,SAAS,CAAC;YACR,KAAK,EAAE,yDAAyD;YAChE,WAAW,EACT,iEAAiE,KAAK,CAAC,MAAM,sCAAsC;gBACnH,uDAAuD,KAAK,CAAC,aAAa,cAAc,KAAK,CAAC,cAAc,MAAM;gBAClH,6CAA6C;YAC/C,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,YAAY,CACjB,IAAI,MAAM,CACR,IAAI,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,UAAU,YAAY,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAC3F,CACF;YACD,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;YACtB,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,WAAW,KAAK,CAAC,aAAa,mBAAmB;oBACjD,iBAAiB,KAAK,CAAC,cAAc,SAAS;iBAC/C;gBACD,MAAM,EAAE;oBACN,OAAO,KAAK,CAAC,aAAa,0CAA0C;oBACpE,YAAY,KAAK,CAAC,aAAa,mBAAmB;iBACnD;aACF;SACF,CAAC;KACH;CACF,CAAC;AAOF,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA,+BAA+B,CAAC;AAC/D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAA,wBAAwB,CAAC;AACpD,MAAM,eAAe,GAAgD;IACnE,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,EAAE,IAAI,MAAM,CAAC,GAAG,YAAY,aAAa,QAAQ,EAAE,CAAC,EAAE;IAC9F,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,EAAE,IAAI,MAAM,CAAC,GAAG,QAAQ,aAAa,YAAY,EAAE,CAAC,EAAE;CAC/F,CAAC;AAEF,MAAM,aAAa,GACjB,gFAAgF,CAAC;AAEnF,MAAM,SAAS,GAAG,CAAC,IAAa,EAAiB,EAAE,CACjD,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAE3E,SAAS,qBAAqB,CAC5B,IAAc,EACd,MAAyB;IAEzB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAwD,EAAE,CAAC;IACtE,MAAM,GAAG,GAAG,CAAC,IAAa,EAAE,UAAqC,EAAE,EAAE;QACnE,IAAI,UAAU,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC;IACF,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;aAC9B,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1F,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;aACzC,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;YAC9F,GAAG,CAAC,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACzF,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAE3C,SAAS,iBAAiB,CAAC,UAAmB,EAAE,IAAc;IAC5D,OAAO,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,SAAS,CAChB,UAAmB,EACnB,IAAc,EACd,IAAY,EACZ,OAAoB,IAAI,GAAG,EAAE;IAE7B,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,WAAW,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK;YAAE,OAAO;QAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,GAAG,IAAI,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,gBAAgB,GACpB,CAAC,EAAE,CAAC,0BAA0B,CAAC,MAAM,CAAC;YACpC,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACvD,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,QAAmC,CAAC;QACxC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;YACpC,IACE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;gBACvB,IAAI,CAAC,YAAY;gBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAC7C,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,IACL,CAAC,QAAQ;gBACT,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;gBAC9B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI;gBACvB,IAAI,CAAC,WAAW,EAChB,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,OAAO;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC;QACvB,MAAM,UAAU,GACd,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAC1B,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC;YAChC,mBAAyC,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7E,OAAO,CAAC,UAAU,IAAI,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAa;IAC1C,MAAM,UAAU,GAAoB,EAAE,CAAC;IACvC,KAAK,IAAI,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5F,IAAI,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK;YAC5D,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aAChC,IAAI,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;YACtE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aAC/B,IACH,EAAE,CAAC,kBAAkB,CAAC,MAAM,CAAC;YAC7B,MAAM,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACnE,MAAM,CAAC,KAAK,KAAK,KAAK;YAEtB,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAc,EAAE,kBAA0B;IACjF,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,IACE,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,kBAAkB;YAC3C,CAAC,IAAI,CAAC,WAAW;YACjB,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YACrC,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU;YAE5B,OAAO;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC5C,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC;YAAE,OAAO;QAC9C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;YAAE,OAAO;QACvF,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,mDAAmD,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;SACpH,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,aAAa,GAAG,WAAW,CAAC;AAClC,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AACxE,MAAM,aAAa,GAAG,QAAQ,CAAC;AAU/B,SAAS,OAAO,CAAC,IAAa;IAC5B,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAiB;IAC7C,MAAM,QAAQ,GAAa,IAAI,GAAG,EAAE,CAAC;IACrC,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,IACE,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAC/B,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,CAAC,IAAI,CAAC,WAAW;YACjB,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;YAElC,OAAO;QACT,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QACvC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACzF,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,EAA2B,EAAE,IAAY;IAClE,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,SAAS,IAAI,EAAE,CAAC,UAAU;QACnC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;YACnC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;gBAAE,QAAQ,GAAG,IAAI,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,GAAkB,EAAE,QAAkB;IACxD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,KAAK,IAAI,KAAK,GAAwB,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QAC/D,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,IAAI,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QACrF,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,IAAmB;IACzC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,OAAO,EAAE,CAAC,0BAA0B,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC;QAC9E,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAC/B,OAAO,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAOD,SAAS,YAAY,CACnB,KAAc,EACd,QAAkB,EAClB,MAAkC;IAElC,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;IACjC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,WAAW,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QAC1B,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,IACL,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC;YACrB,CAAC,CAAC,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,EAC1E,CAAC;YACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;gBACrE,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAa;IACxC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM;QAAE,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC9E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC;IACnD,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC;IAC5D,IACE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;QAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;QACjE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAE/B,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,KAAK,aAAa,CAAC;IAC7D,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,EAAE,GAAG,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,IAAI,CAAC,EAAE;YAAE,OAAO;QAC9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5F,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,IAAI,CAC/D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,CAC/E,CAAC;QACF,IAAI,OAAO;YACT,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,yDAAyD,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aAC5H,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAc,EAAE,IAAiB;IACnE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;IACpC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE;oBACtC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK;oBACvB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;iBACtD,CAAC,CAAC;QACP,CAAC;QACD,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,qBAAqB,CAAC,IAAI,EAAE;QAC9D,iBAAiB;QACjB,iBAAiB;QACjB,IAAI,CAAC,WAAW;KACjB,CAAC,EAAE,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC;YAAE,SAAS;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;gBACb,KAAK;gBACL,MAAM,EAAE,qCAAqC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aACtH,CAAC,CAAC;IACP,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAa,EAAE,EAAiB,EAAW,EAAE;IACnE,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI;QAChF,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,IACE,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC3D,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;QAErC,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,UAAU,4BAA4B,CAAC,IAAc;IACzD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,IAAI,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC;YAAE,OAAO;QAChD,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7B,IAAI,CAAC,UAAU,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,IAAI,CAC9B,CAAC;QACJ,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/B,IACE,CAAC,MAAM;YACP,CAAC,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC;YAChC,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,WAAW,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ;YAEpC,OAAO;QACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,kBAAkB,CAAC;YAC5F,OAAO;QACT,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,KAAK,IAAI,CAAC,GAAwB,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM;YACvE,MAAM,GAAG,cAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,MAAM;YACR,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxB,MAAM,EAAE,2BAA2B,iBAAiB,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;aAC/G,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAc,EAAE,IAAiB;IACzE,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACrF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IACE,IAAI,MAAM,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5D,CAAC,IAAI,MAAM,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/D,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EACzB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC;gBACvB,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,WAAW,EAAE;aAC9E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAgD;IAC9E,EAAE,EAAE,gBAAgB;IACpB,UAAU,EAAE,KAAK;IACjB,YAAY,CAAC,KAAK;QAChB,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3C,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,QAAQ,CAAC,CAAC;QAC7E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB;YACE,KAAK,EAAE,8EAA8E;YACrF,WAAW,EACT,gIAAgI;gBAChI,mIAAmI;gBACnI,0GAA0G,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG;gBAC5I,+CAA+C,iBAAiB,iCAAiC,iBAAiB,eAAe;gBACjI,+DAA+D,iBAAiB,4CAA4C;gBAC5H,6BAA6B,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,KAAK,CAAC,IAAI,CAAC,SAAS,eAAe,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW;gBAChI,iGAAiG,KAAK,CAAC,kBAAkB,GAAG;gBAC5H,6HAA6H;gBAC7H,mGAAmG;YACrG,GAAG,CAAC,OAAqB;gBACvB,MAAM,QAAQ,GAAc,EAAE,CAAC;gBAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC3C,MAAM,IAAI,GAAG;wBACX,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;wBACxC,GAAG,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;wBAC9C,GAAG,4BAA4B,CAAC,IAAI,CAAC;wBACrC,GAAG,wBAAwB,CAAC,IAAI,EAAE,KAAK,CAAC,kBAAkB,CAAC;wBAC3D,GAAG,wBAAwB,CAAC,IAAI,CAAC;qBAClC,CAAC;oBACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;4BAC5B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;yBACzB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;SACF;KACF;CACF,CAAC;AAOF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AAE7E,SAAS,aAAa,CAAC,IAAmB;IACxC,OAAO,CACL,CAAC,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC;QACjE,CAAC,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY;QACxC,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;QACvC,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC;QAChD,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAC/C,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,OAAO,GAAwB,IAAI,CAAC,MAAM,CAAC;IAC/C,OAAO,OAAO,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;QAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IACxE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,QAAgB,EAAE,EAAiB;IACzE,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE;QACvB,IACE,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC;YAChC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/B,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,QAAQ;YAErC,KAAK,GAAG,IAAI,CAAC;QACf,IACE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACtB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACnD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,QAAQ;YAExC,KAAK,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAa,EACb,EAAiB;IAEjB,MAAM,UAAU,GAAG,CAAC,CAAU,EAAE,EAAE,CAChC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACtB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjF,IACE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,IAAI;QACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,EACT,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACnD,CAAC;IACD,IACE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;QAC9B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,WAAW;QAChB,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAC9B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAoB;IAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,CAAC,CAAU,EAAE,EAAE;QAC3B,IAAI,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;YAAE,OAAO;QACjC,IAAI,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACpE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IACF,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,IAAa;IAC9B,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;QACtB,IAAI,EAAE,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,KAAK,GAAG,IAAI,CAAC;IAC/E,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,EAAE,CAAC,UAAU,CAAC,uBAAuB;IACrC,EAAE,CAAC,UAAU,CAAC,4BAA4B;IAC1C,EAAE,CAAC,UAAU,CAAC,gBAAgB;IAC9B,EAAE,CAAC,UAAU,CAAC,aAAa;IAC3B,EAAE,CAAC,UAAU,CAAC,sBAAsB;IACpC,EAAE,CAAC,UAAU,CAAC,mBAAmB;CAClC,CAAC,CAAC;AAEH,SAAS,sBAAsB,CAC7B,IAAmB,EACnB,EAAiB,EACjB,UAA+B;IAE/B,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,OAAO,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC;IACzD,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpF,IAAI,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,EAAE,CAAC,UAAU,CAAC,gBAAgB;QAChF,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3F,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,IAAc,EACd,UAA6B;IAE7B,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,IAAI,GAA4C,EAAE,CAAC;IACzD,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,IACE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC3B,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,qBAAqB;gBAC9D,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YACxD,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;YAC9B,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EACzB,CAAC;YACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC3E,IAAI,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;oBAC5B,MAAM,EAAE,+CAA+C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;iBAC1E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,IACE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,WAAW;YAChB,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EACpC,CAAC;YACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;YAC9B,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACzE,MAAM,KAAK,GAAG,CAAC,EAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;gBACpC,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAChC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,WAAW,KAAK,SAAS,CAC7D,CAAC;gBACF,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAClC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAC3D,CAAC;gBACF,IAAI,YAAY,IAAI,CAAC,cAAc;oBACjC,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC;wBAC5B,MAAM,EAAE,+CAA+C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;qBAC/E,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QACD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,MAAM,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,IAAI,sBAAsB,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,CAAC;oBAC7C,IAAI,CAAC,IAAI,CAAC;wBACR,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;wBAChC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,gCAAgC;qBACrD,CAAC,CAAC;YACP,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAiD;IAChF,EAAE,EAAE,iBAAiB;IACrB,UAAU,EAAE,KAAK;IACjB,YAAY,CAAC,KAAK;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrD,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9F,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB;YACE,KAAK,EAAE,oEAAoE;YAC3E,WAAW,EACT,MAAM,KAAK,CAAC,SAAS,4GAA4G;gBACjI,0HAA0H,mBAAmB,CAAC,CAAC,CAAC,KAAK;gBACrJ,6HAA6H;gBAC7H,+EAA+E;YACjF,GAAG,CAAC,OAAO;gBACT,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnE,KAAK,MAAM,IAAI,IAAI,KAAK;oBACtB,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC;wBAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;gBAC/C,OAAO,QAAQ,CAAC;YAClB,CAAC;SACF;KACF;CACF,CAAC;AAaF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAEpE,SAAS,YAAY,CAAC,SAAkB;IACtC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,KAAK,IAAI,SAA+D,EAAE,CAAC;QACpF,MAAM,IAAI,GAAG,mBAAmB,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAChD,QAAQ,CAAC,IAAI,CACX,GAAG,IAAI,2FAA2F,CACnG,CAAC;aACC,CAAC;YACJ,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAChE,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,uBAAuB,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CACnB,OAAqB,EACrB,SAAiD;IAEjD,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,YAAY,IAAI,+CAA+C;aACxE,CAAC,CAAC;aACA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC/E,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,YAAY,IAAI,uCAAuC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACrF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,iBAAoC;IACxF,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3B,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,cAAc,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAU,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,IACE,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAC/B,CAAC,IAAI,CAAC,WAAW;YACjB,CAAC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;YAErC,OAAO;QACT,IAAI,IAAI,GAAkB,IAAI,CAAC,WAAW,CAAC;QAC3C,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;QACvD,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAAE,OAAO;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO;QAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACpC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC;YAAE,OAAO;QACrD,MAAM,KAAK,GAAG,CAAC,EAAqB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,WAAW,KAAK,SAAS,CAAC;YAAE,OAAO;QACzF,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO;QAClE,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,MAAM,wCAAwC;SAC1D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAsD;IAC1F,EAAE,EAAE,sBAAsB;IAC1B,UAAU,EAAE,KAAK;IACjB,YAAY,CAAC,KAAK;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC/D,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,QAAQ,EAAE;YAC7E,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QACH,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,QAAQ,EAAE,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,MAAM,KAAK,GAAG,iBAAiB,CAAC;YAC9B,KAAK,EAAE,yDAAyD;YAChE,WAAW,EACT,qBAAqB,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,8EAA8E;gBAChI,kEAAkE,IAAI,uEAAuE;gBAC7I,qIAAqI;gBACrI,2HAA2H;YAC7H,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CACd,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACzD,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,KAAK,CAAC,iBAAiB,CAAC;gBACtD,CAAC,CAAC,EAAE;YACR,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;wBAC3C,IAAI,EAAE,0CAA0C;qBACjD;iBACF;gBACD,MAAM,EAAE;oBACN;wBACE,IAAI,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa;wBAC3C,IAAI,EAAE,mDAAmD;qBAC1D;iBACF;aACF;SACF,CAAC,CAAC;QACH,OAAO;YACL;gBACE,GAAG,KAAK;gBACR,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;oBACtB,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC7B,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;iBAC1C;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AASF,MAAM,UAAU,GAAG,mBAAmB,CAAC;AAEvC,SAAS,aAAa,CAAC,MAA2C;IAChE,OAAO,IAAI,MAAM,CACf,MAAM;SACH,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,CAC3B,IAAI;QACF,CAAC,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,eAAe,YAAY,CAAC,IAAI,CAAC,GAAG;QACjE,CAAC,CAAC,IAAI,YAAY,CAAC,SAAS,CAAC,KAAK,CACrC;SACA,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAA0B,EAC1B,KAA4B;IAE5B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,KAAK;SACF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAClC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,6BAA6B,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACxF,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,2BAA2B,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAkD;IAClF,EAAE,EAAE,kBAAkB;IACtB,UAAU,EAAE,KAAK;IACjB,YAAY,CAAC,KAAK;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrD,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACjE,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM;YACxD,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;;YAE/C,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChC,iBAAiB,CAAC,CAAC,EAAE,SAAS,EAAE,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;gBACxE,IAAI,CAAC,EAAE,IAAI,KAAK,SAAS;oBAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC1F,CAAC,CAAC,CAAC;QACL,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB;YACE,KAAK,EAAE,4EAA4E;YACnF,WAAW,EACT,yFAAyF,KAAK,CAAC,WAAW,yBAAyB;gBACnI,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,CAAC,eAAe,IAAI;gBAChI,qGAAqG;gBACrG,iIAAiI;YACnI,GAAG,CAAC,OAAO;gBACT,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAC7C,OAAO,EACP,KAAK,CAAC,eAAe,EACrB,uBAAuB,CACxB,CAAC;gBACF,IAAI,CAAC,MAAM;oBAAE,OAAO,QAAQ,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO;qBACrB,KAAK,CAAC,QAAQ,CAAC;qBACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,eAAe,CAAC,CAAC;gBACxF,KAAK,MAAM,IAAI,IAAI,sBAAsB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC3D,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,MAAM,EACJ,6FAA6F;qBAChG,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;SACF;KACF;CACF,CAAC;AAOF,MAAM,CAAC,MAAM,qBAAqB,GAChC,qJAAqJ,CAAC;AAExJ,MAAM,CAAC,MAAM,oBAAoB,GAAiD;IAChF,EAAE,EAAE,iBAAiB;IACrB,UAAU,EAAE,KAAK;IACjB,YAAY,CAAC,KAAK;QAChB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC7C,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC;YAClF,QAAQ,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,iBAAiB,CAAC;YAChB,KAAK,EAAE,gDAAgD;YACvD,WAAW,EACT,yDAAyD,KAAK,CAAC,KAAK,wDAAwD;gBAC5H,8HAA8H;gBAC9H,2IAA2I;YAC7I,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,YAAY,CAAC,qBAAqB,CAAC;YAC1C,SAAS,EAAE;gBACT,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,oCAAoC,EAAE;gBAChE,GAAG,KAAK,CAAC,SAAS;aACnB;YACD,OAAO,EAAE;gBACP,KAAK,EAAE;oBACL,iCAAiC;oBACjC,6CAA6C;oBAC7C,wCAAwC;iBACzC;gBACD,MAAM,EAAE;oBACN,4DAA4D;oBAC5D,uCAAuC;iBACxC;aACF;SACF,CAAC;KACH;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;IACpB,yBAAyB;IACzB,qBAAqB;IACrB,oBAAoB;CACZ,CAAC","sourcesContent":["import ts from 'typescript';\nimport type { GenericGuardDefinition } from '../../node/suite/config.js';\nimport type { Finding, GuardContext } from '../../guard.js';\nimport type { FileView } from '../../reader/view.js';\nimport { matchPattern, ownerOnly, reviewedAllowlist, type Hit } from '../../shapes/shapes.js';\nimport type { Reviewed } from '../../node/layout.js';\nimport { forEachNode, lineOfNode } from '../../support/ast.js';\nimport { identifierProblem, pathProblem, reviewedProblems, isList } from '../../support/facts.js';\nimport { escapeRegExp, isUnder } from '../../support/text.js';\nimport {\n APP_CODE,\n filesUnder,\n identifierListProblem,\n isHookName,\n pathListProblem,\n requiredFile,\n} from './shared.js';\n\nconst RETRY_STATE_HELPERS = ['useReadRetryState', 'useReadRetryStates'] as const;\nconst RETRY_STATE_FIELD = 'isRetrying';\nconst HELD_ANSWER_FIELD = 'retrying';\n\nexport interface FailureSeat {\n component: string;\n retryProp: string;\n pendingProp: string;\n}\n\nfunction seatProblems(seat: FailureSeat | undefined): string[] {\n if (!seat || typeof seat !== 'object') return ['seat is missing'];\n const problems: string[] = [];\n identifierProblem(seat.component, 'seat.component', problems);\n identifierProblem(seat.retryProp, 'seat.retryProp', problems);\n identifierProblem(seat.pendingProp, 'seat.pendingProp', problems);\n return problems;\n}\n\nexport interface ReadStateOwnerFacts {\n module: string;\n seatComponent: string;\n laterPageRetry: string;\n}\n\nexport const readStateOwnerGuard: GenericGuardDefinition<ReadStateOwnerFacts> = {\n id: 'readStateOwner',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.module, 'module', problems);\n identifierProblem(facts?.seatComponent, 'seatComponent', problems);\n identifierProblem(facts?.laterPageRetry, 'laterPageRetry', problems);\n return problems;\n },\n build: (facts) => [\n ownerOnly({\n title: 'read failures render only through the read-state module',\n description:\n `Every read's pending, failed, and empty states render through ${facts.module}, so every failure offers Try again ` +\n `held through its retry. Nothing outside it renders <${facts.seatComponent}> or calls ${facts.laterPageRetry}(); ` +\n 'render the read through the module instead.',\n scope: APP_CODE,\n match: matchPattern(\n new RegExp(\n `<${escapeRegExp(facts.seatComponent)}\\\\b|\\\\b${escapeRegExp(facts.laterPageRetry)}\\\\s*\\\\(`,\n ),\n ),\n owners: [facts.module],\n samples: {\n flags: [\n `return <${facts.seatComponent} thing=\"rows\" />;`,\n `const retry = ${facts.laterPageRetry}(list);`,\n ],\n passes: [\n `// <${facts.seatComponent} /> named in prose only\\nconst rows = 1;`,\n `import { ${facts.seatComponent} } from './seat';`,\n ],\n },\n }),\n ],\n};\n\nexport interface ReadRetryStateFacts {\n seat: FailureSeat;\n controlPendingProp: string;\n}\n\nconst FAILURE_FLAG = String.raw`[\\w$.?]*\\b(?:isError|error)\\b`;\nconst FETCHING = String.raw`[\\w$.?]*\\bisFetching\\b`;\nconst LIVE_FLAG_PAIRS: ReadonlyArray<{ name: string; re: RegExp }> = [\n { name: 'failure flag && isFetching', re: new RegExp(`${FAILURE_FLAG}\\\\s*&&\\\\s*${FETCHING}`) },\n { name: 'isFetching && failure flag', re: new RegExp(`${FETCHING}\\\\s*&&\\\\s*${FAILURE_FLAG}`) },\n];\n\nconst FETCHING_FLAG =\n /^(?:is(?:Re)?[Ff]etching|fetchingCount|useIsFetching|fetchStatus|sourceState)$/;\n\nconst fieldName = (name: ts.Node): string | null =>\n ts.isIdentifier(name) || ts.isStringLiteralLike(name) ? name.text : null;\n\nfunction retryStateExpressions(\n file: FileView,\n fields: readonly string[],\n): Array<{ index: number; expression: ts.Expression }> {\n const sf = file.sourceFile;\n const wanted = new Set(fields);\n const found: Array<{ index: number; expression: ts.Expression }> = [];\n const add = (name: ts.Node, expression: ts.Expression | undefined) => {\n if (expression && wanted.has(fieldName(name) ?? ''))\n found.push({ index: name.getStart(sf), expression });\n };\n forEachNode(sf, (node) => {\n if (ts.isPropertyAssignment(node) || ts.isVariableDeclaration(node))\n add(node.name, node.initializer);\n else if (ts.isJsxAttribute(node) && node.initializer && ts.isJsxExpression(node.initializer))\n add(node.name, node.initializer.expression);\n else if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken) {\n add(ts.isPropertyAccessExpression(node.left) ? node.left.name : node.left, node.right);\n }\n });\n return found;\n}\n\nconst FAILURE_NAME = /^(?:isError|error)$/;\n\nfunction readsFetchingFlag(expression: ts.Node, file: FileView): boolean {\n return readsFlag(expression, file, FETCHING_FLAG);\n}\n\nfunction readsFlag(\n expression: ts.Node,\n file: FileView,\n flag: RegExp,\n seen: Set<string> = new Set(),\n): boolean {\n let reads = false;\n const bound: string[] = [];\n forEachNode(expression, (node) => {\n if (!ts.isIdentifier(node) || reads) return;\n if (flag.test(node.text)) reads = true;\n const parent = node.parent;\n const receiverOrCallee =\n (ts.isPropertyAccessExpression(parent) &&\n (parent.expression === node || parent.name === node)) ||\n (ts.isCallExpression(parent) && parent.expression === node);\n if (!receiverOrCallee) bound.push(node.text);\n });\n if (reads) return true;\n return bound.some((name) => {\n if (seen.has(name)) return false;\n seen.add(name);\n let declared: ts.Expression | undefined;\n let renamed = false;\n forEachNode(file.sourceFile, (node) => {\n if (\n ts.isBindingElement(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === name &&\n node.propertyName &&\n flag.test(fieldName(node.propertyName) ?? '')\n ) {\n renamed = true;\n } else if (\n !declared &&\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === name &&\n node.initializer\n ) {\n declared = node.initializer;\n }\n });\n if (renamed) return true;\n if (!declared) return false;\n const value = declared;\n const fromHelper =\n ts.isCallExpression(value) &&\n ts.isIdentifier(value.expression) &&\n (RETRY_STATE_HELPERS as readonly string[]).includes(value.expression.text);\n return !fromHelper && readsFlag(value, file, flag, seen);\n });\n}\n\nfunction branchConditionsAbove(node: ts.Node): ts.Expression[] {\n const conditions: ts.Expression[] = [];\n for (let child = node, parent = node.parent; parent; child = parent, parent = parent.parent) {\n if (ts.isIfStatement(parent) && parent.thenStatement === child)\n conditions.push(parent.expression);\n else if (ts.isConditionalExpression(parent) && parent.whenTrue === child)\n conditions.push(parent.condition);\n else if (\n ts.isBinaryExpression(parent) &&\n parent.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken &&\n parent.right === child\n )\n conditions.push(parent.left);\n }\n return conditions;\n}\n\nexport function failureBranchLivePending(file: FileView, controlPendingProp: string): Hit[] {\n const sf = file.sourceFile;\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n if (\n !ts.isJsxAttribute(node) ||\n fieldName(node.name) !== controlPendingProp ||\n !node.initializer ||\n !ts.isJsxExpression(node.initializer) ||\n !node.initializer.expression\n )\n return;\n const pending = node.initializer.expression;\n if (!readsFetchingFlag(pending, file)) return;\n if (!branchConditionsAbove(node).some((c) => readsFlag(c, file, FAILURE_NAME))) return;\n hits.push({\n index: node.getStart(sf),\n detail: `a failure's retry pending from a fetching flag: ${pending.getText(sf).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n });\n return hits;\n}\n\nconst LOADING_FIELD = 'isLoading';\nconst READ_FAILURE_FIELDS = new Set(['error', 'isError', 'retryState']);\nconst HELD_RECEIVER = /retry/i;\n\ninterface Destructured {\n field: string;\n receiver: string;\n scope: ts.Node;\n}\n\ntype Bindings = Map<string, Destructured[]>;\n\nfunction scopeOf(node: ts.Node): ts.Node {\n return enclosingFunctionOf(node) ?? node.getSourceFile();\n}\n\nfunction destructuredBindings(sf: ts.SourceFile): Bindings {\n const bindings: Bindings = new Map();\n forEachNode(sf, (node) => {\n if (\n !ts.isVariableDeclaration(node) ||\n !ts.isObjectBindingPattern(node.name) ||\n !node.initializer ||\n !ts.isIdentifier(node.initializer)\n )\n return;\n const receiver = node.initializer.text;\n const scope = scopeOf(node);\n for (const element of node.name.elements) {\n if (!ts.isIdentifier(element.name)) continue;\n const field = element.propertyName ? fieldName(element.propertyName) : element.name.text;\n if (!field) continue;\n const named = bindings.get(element.name.text) ?? [];\n named.push({ field, receiver, scope });\n bindings.set(element.name.text, named);\n }\n });\n return bindings;\n}\n\nfunction declaresParameter(fn: ts.SignatureDeclaration, name: string): boolean {\n let declares = false;\n for (const parameter of fn.parameters)\n forEachNode(parameter.name, (node) => {\n if (ts.isIdentifier(node) && node.text === name) declares = true;\n });\n return declares;\n}\n\nfunction bindingFor(use: ts.Identifier, bindings: Bindings): Destructured | undefined {\n const named = bindings.get(use.text);\n if (!named) return undefined;\n for (let scope: ts.Node | undefined = scopeOf(use); scope;) {\n const found = named.find((binding) => binding.scope === scope);\n if (found) return found;\n if (ts.isFunctionLike(scope) && declaresParameter(scope, use.text)) return undefined;\n scope = ts.isSourceFile(scope) ? undefined : scopeOf(scope);\n }\n return undefined;\n}\n\nfunction rootIdentifier(node: ts.Expression): string | null {\n let current: ts.Expression = node;\n while (ts.isPropertyAccessExpression(current) || ts.isNonNullExpression(current))\n current = current.expression;\n return ts.isIdentifier(current) ? current.text : null;\n}\n\ninterface ReadField {\n receiver: string;\n index: number;\n}\n\nfunction readFieldsIn(\n scope: ts.Node,\n bindings: Bindings,\n wanted: (field: string) => boolean,\n): ReadField[] {\n const sf = scope.getSourceFile();\n const found: ReadField[] = [];\n forEachNode(scope, (node) => {\n if (ts.isPropertyAccessExpression(node) && wanted(node.name.text)) {\n const receiver = rootIdentifier(node.expression);\n if (receiver && !HELD_RECEIVER.test(node.expression.getText(sf)))\n found.push({ receiver, index: node.getStart(sf) });\n } else if (\n ts.isIdentifier(node) &&\n !(ts.isPropertyAccessExpression(node.parent) && node.parent.name === node)\n ) {\n const bound = bindingFor(node, bindings);\n if (bound && wanted(bound.field) && !HELD_RECEIVER.test(bound.receiver))\n found.push({ receiver: bound.receiver, index: node.getStart(sf) });\n }\n });\n return found;\n}\n\nfunction enclosingFunctionOf(node: ts.Node): ts.Node | undefined {\n for (let p = node.parent; p; p = p.parent) if (ts.isFunctionLike(p)) return p;\n return undefined;\n}\n\nfunction branchCondition(node: ts.Node): ts.Expression | undefined {\n if (ts.isIfStatement(node)) return node.expression;\n if (ts.isConditionalExpression(node)) return node.condition;\n if (\n ts.isBinaryExpression(node) &&\n node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken &&\n ts.isJsxExpression(node.parent)\n )\n return node.left;\n return undefined;\n}\n\nexport function liveLoadingBeforeFailure(file: FileView): Hit[] {\n const sf = file.sourceFile;\n const bindings = destructuredBindings(sf);\n const isLoading = (field: string) => field === LOADING_FIELD;\n const isFailure = (field: string) => READ_FAILURE_FIELDS.has(field);\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n const condition = branchCondition(node);\n const fn = condition && enclosingFunctionOf(node);\n if (!condition || !fn) return;\n const tested = new Set(readFieldsIn(condition, bindings, isFailure).map((r) => r.receiver));\n const end = condition.getEnd();\n const later = readFieldsIn(fn, bindings, isFailure).filter((r) => r.index >= end);\n const loading = readFieldsIn(condition, bindings, isLoading).find(\n (r) => !tested.has(r.receiver) && later.some((f) => f.receiver === r.receiver),\n );\n if (loading)\n hits.push({\n index: loading.index,\n detail: `a live loading flag tested before the read's failure: ${condition.getText(sf).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n });\n return hits;\n}\n\nexport function liveFlagRetryStates(file: FileView, seat: FailureSeat): Hit[] {\n const code = file.code;\n const hits = new Map<number, Hit>();\n let offset = 0;\n for (const line of code.split('\\n')) {\n for (const shape of LIVE_FLAG_PAIRS) {\n const m = shape.re.exec(line);\n if (m)\n hits.set(file.lineOf(offset + m.index), {\n index: offset + m.index,\n detail: `${shape.name}: ${line.trim().slice(0, 120)}`,\n });\n }\n offset += line.length + 1;\n }\n for (const { index, expression } of retryStateExpressions(file, [\n RETRY_STATE_FIELD,\n HELD_ANSWER_FIELD,\n seat.pendingProp,\n ])) {\n if (!readsFetchingFlag(expression, file)) continue;\n const line = file.lineOf(index);\n if (!hits.has(line))\n hits.set(line, {\n index,\n detail: `retry state from a fetching flag: ${expression.getText(file.sourceFile).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n }\n return [...hits.values()].sort((a, b) => a.index - b.index);\n}\n\nconst isHookFunction = (node: ts.Node, sf: ts.SourceFile): boolean => {\n if ((ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node)) && node.name)\n return isHookName(node.name.text);\n if (\n (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) &&\n ts.isVariableDeclaration(node.parent)\n )\n return isHookName(node.parent.name.getText(sf));\n return false;\n};\n\nexport function failedAnswersWithoutRetrying(file: FileView): Hit[] {\n const sf = file.sourceFile;\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n if (!ts.isObjectLiteralExpression(node)) return;\n const named = (name: string) =>\n node.properties.find(\n (p) =>\n (ts.isPropertyAssignment(p) || ts.isShorthandPropertyAssignment(p)) &&\n p.name.getText(sf) === name,\n );\n const status = named('status');\n if (\n !status ||\n !ts.isPropertyAssignment(status) ||\n !ts.isStringLiteralLike(status.initializer) ||\n status.initializer.text !== 'failed'\n )\n return;\n if (!named('error') || named(HELD_ANSWER_FIELD) || node.properties.some(ts.isSpreadAssignment))\n return;\n let inHook = false;\n for (let p: ts.Node | undefined = node.parent; p && !inHook; p = p.parent)\n inHook = isHookFunction(p, sf);\n if (inHook)\n hits.push({\n index: node.getStart(sf),\n detail: `a failed answer with no ${HELD_ANSWER_FIELD}: ${node.getText(sf).replace(/\\s+/g, ' ').slice(0, 120)}`,\n });\n });\n return hits;\n}\n\nexport function seatRetriesWithoutPending(file: FileView, seat: FailureSeat): Hit[] {\n const hits: Hit[] = [];\n const element = new RegExp(`<${escapeRegExp(seat.component)}\\\\b[\\\\s\\\\S]*?\\\\/>`, 'g');\n for (const match of file.code.matchAll(element)) {\n const text = match[0];\n if (\n new RegExp(`\\\\b${escapeRegExp(seat.retryProp)}=`).test(text) &&\n !new RegExp(`\\\\b${escapeRegExp(seat.pendingProp)}=`).test(text) &&\n !/\\{\\s*\\.\\.\\./.test(text)\n ) {\n hits.push({\n index: match.index ?? 0,\n detail: `<${seat.component} ${seat.retryProp}=…> without ${seat.pendingProp}`,\n });\n }\n }\n return hits;\n}\n\nexport const readRetryStateGuard: GenericGuardDefinition<ReadRetryStateFacts> = {\n id: 'readRetryState',\n absentWhen: false,\n factProblems(facts) {\n const problems = seatProblems(facts?.seat);\n identifierProblem(facts?.controlPendingProp, 'controlPendingProp', problems);\n return problems;\n },\n build: (facts) => [\n {\n title: \"a read's retry state comes from its one owner, never the live fetching flags\",\n description:\n 'TanStack Query puts a query that never succeeded back to pending and clears its error the moment a refetch starts, so a retry ' +\n 'state built from isFetching / isRefetching / fetchStatus with isError or error reads false for the retry of a failed first read, ' +\n `and the failure turns into a loading state under the pressed retry. Hold the failure with query-core's ${RETRY_STATE_HELPERS.join(' / ')} ` +\n `(exposed from the read's hook) and pass its ${RETRY_STATE_FIELD}; a lookup hands out its held ${HELD_ANSWER_FIELD}, and a hook ` +\n `that answers with a status gives its failed answer the held ${HELD_ANSWER_FIELD} beside the error, never one built from a ` +\n `fetching flag; and every <${facts.seat.component}> given ${facts.seat.retryProp} also takes ${facts.seat.pendingProp}, so the ` +\n `pressed retry shows it is running. The same live flags decide no failure surface: a control's ${facts.controlPendingProp} ` +\n \"inside a failure branch reads the held isRetrying, never a fetching flag, and a branch never tests a read's live isLoading \" +\n \"ahead of that read's failure — the held retryState decides the failure first, then its isLoading.\",\n run(context: GuardContext): Finding[] {\n const findings: Finding[] = [];\n for (const file of context.files(APP_CODE)) {\n const hits = [\n ...liveFlagRetryStates(file, facts.seat),\n ...seatRetriesWithoutPending(file, facts.seat),\n ...failedAnswersWithoutRetrying(file),\n ...failureBranchLivePending(file, facts.controlPendingProp),\n ...liveLoadingBeforeFailure(file),\n ];\n for (const hit of hits) {\n findings.push({\n file: file.path,\n line: file.lineOf(hit.index),\n detail: hit.detail ?? '',\n });\n }\n }\n return findings;\n },\n },\n ],\n};\n\nexport interface HookReadDefaultFacts {\n hooksTree: string;\n readCollapsers: readonly string[];\n}\n\nconst FAILURE_FIELDS = new Set(['error', 'isError', 'status', 'retryState']);\n\nfunction isEmptyAnswer(node: ts.Expression): boolean {\n return (\n (ts.isArrayLiteralExpression(node) && node.elements.length === 0) ||\n (ts.isObjectLiteralExpression(node) && node.properties.length === 0) ||\n node.kind === ts.SyntaxKind.FalseKeyword ||\n node.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isNumericLiteral(node) && node.text === '0') ||\n (ts.isStringLiteral(node) && node.text === '')\n );\n}\n\nfunction enclosingFunction(node: ts.Node): ts.Node | undefined {\n let current: ts.Node | undefined = node.parent;\n while (current && !ts.isFunctionLike(current)) current = current.parent;\n return current;\n}\n\nfunction readsFailureOf(scope: ts.Node, receiver: string, sf: ts.SourceFile): boolean {\n let found = false;\n forEachNode(scope, (n) => {\n if (\n ts.isPropertyAccessExpression(n) &&\n FAILURE_FIELDS.has(n.name.text) &&\n n.expression.getText(sf) === receiver\n )\n found = true;\n if (\n ts.isCallExpression(n) &&\n n.expression.getText(sf) === RETRY_STATE_HELPERS[0] &&\n n.arguments[0]?.getText(sf) === receiver\n )\n found = true;\n });\n return found;\n}\n\nfunction exportedHookBody(\n node: ts.Node,\n sf: ts.SourceFile,\n): { name: string; body: ts.ConciseBody } | undefined {\n const isExported = (n: ts.Node) =>\n ts.canHaveModifiers(n) &&\n (ts.getModifiers(n) ?? []).some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (\n ts.isFunctionDeclaration(node) &&\n node.name &&\n isHookName(node.name.text) &&\n isExported(node) &&\n node.body\n ) {\n return { name: node.name.text, body: node.body };\n }\n if (\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n isHookName(node.name.text) &&\n node.initializer &&\n (ts.isArrowFunction(node.initializer) || ts.isFunctionExpression(node.initializer)) &&\n isExported(node.parent.parent)\n ) {\n return { name: node.name.getText(sf), body: node.initializer.body };\n }\n return undefined;\n}\n\nfunction returnedExpressions(body: ts.ConciseBody): ts.Expression[] {\n if (!ts.isBlock(body)) return [body];\n const out: ts.Expression[] = [];\n const visit = (n: ts.Node) => {\n if (ts.isFunctionLike(n)) return;\n if (ts.isReturnStatement(n) && n.expression) out.push(n.expression);\n ts.forEachChild(n, visit);\n };\n ts.forEachChild(body, visit);\n return out;\n}\n\nfunction readsData(node: ts.Node): boolean {\n let found = false;\n forEachNode(node, (n) => {\n if (ts.isPropertyAccessExpression(n) && n.name.text === 'data') found = true;\n });\n return found;\n}\n\nconst COMPARISONS = new Set([\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n ts.SyntaxKind.ExclamationEqualsEqualsToken,\n ts.SyntaxKind.GreaterThanToken,\n ts.SyntaxKind.LessThanToken,\n ts.SyntaxKind.GreaterThanEqualsToken,\n ts.SyntaxKind.LessThanEqualsToken,\n]);\n\nfunction collapsesReadToBoolean(\n expr: ts.Expression,\n sf: ts.SourceFile,\n collapsers: ReadonlySet<string>,\n): boolean {\n let e = expr;\n while (ts.isParenthesizedExpression(e)) e = e.expression;\n if (ts.isCallExpression(e) && collapsers.has(e.expression.getText(sf))) return true;\n if (ts.isPrefixUnaryExpression(e) && e.operator === ts.SyntaxKind.ExclamationToken)\n return readsData(e);\n if (ts.isBinaryExpression(e) && COMPARISONS.has(e.operatorToken.kind)) return readsData(e);\n if (ts.isCallExpression(e) && e.expression.getText(sf) === 'Boolean') return readsData(e);\n return false;\n}\n\nexport function hookReadDefaults(\n file: FileView,\n collapsers: readonly string[],\n): Array<{ line: number; detail: string }> {\n const sf = file.sourceFile;\n const names = new Set(collapsers);\n const hits: Array<{ line: number; detail: string }> = [];\n forEachNode(sf, (node) => {\n if (\n ts.isBinaryExpression(node) &&\n (node.operatorToken.kind === ts.SyntaxKind.QuestionQuestionToken ||\n node.operatorToken.kind === ts.SyntaxKind.BarBarToken) &&\n ts.isPropertyAccessExpression(node.left) &&\n node.left.name.text === 'data' &&\n isEmptyAnswer(node.right)\n ) {\n const scope = enclosingFunction(node);\n if (!scope || !readsFailureOf(scope, node.left.expression.getText(sf), sf)) {\n hits.push({\n line: lineOfNode(file, node),\n detail: `a defaulted read with no failure beside it: ${node.getText(sf)}`,\n });\n }\n }\n if (\n ts.isVariableDeclaration(node) &&\n node.initializer &&\n ts.isObjectBindingPattern(node.name)\n ) {\n const init = node.initializer;\n if (ts.isCallExpression(init) && isHookName(init.expression.getText(sf))) {\n const keyOf = (el: ts.BindingElement) => (el.propertyName ?? el.name).getText(sf);\n const elements = node.name.elements;\n const defaultsData = elements.some(\n (el) => keyOf(el) === 'data' && el.initializer !== undefined,\n );\n const carriesFailure = elements.some(\n (el) => el.dotDotDotToken || FAILURE_FIELDS.has(keyOf(el)),\n );\n if (defaultsData && !carriesFailure)\n hits.push({\n line: lineOfNode(file, node),\n detail: `a defaulted read with no failure beside it: ${node.name.getText(sf)}`,\n });\n }\n }\n const hook = exportedHookBody(node, sf);\n if (hook) {\n for (const returned of returnedExpressions(hook.body)) {\n if (collapsesReadToBoolean(returned, sf, names))\n hits.push({\n line: lineOfNode(file, returned),\n detail: `${hook.name} returns a boolean from a read`,\n });\n }\n }\n });\n return hits;\n}\n\nexport const hookReadDefaultGuard: GenericGuardDefinition<HookReadDefaultFacts> = {\n id: 'hookReadDefault',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.hooksTree, 'hooksTree', problems);\n identifierListProblem(facts?.readCollapsers, 'readCollapsers', problems, { nonEmpty: false });\n return problems;\n },\n build: (facts) => [\n {\n title: 'a hook never returns a default its consumers cannot tell from data',\n description:\n `In ${facts.hooksTree}, a read's data defaulted to an empty answer (q.data ?? [], const { data = [] } = useQ()) is allowed only ` +\n `where the same function also carries that read's failure (error / isError / status / retryState, or the read handed to ${RETRY_STATE_HELPERS[0]}), ` +\n 'and no exported hook collapses a read into a bare boolean, where an unknown read would read as \"no\". Return the read state ' +\n '(pending / failed / answered) or carry the failure beside the defaulted data.',\n run(context) {\n const { files, findings } = filesUnder(context, [facts.hooksTree]);\n for (const file of files)\n for (const hit of hookReadDefaults(file, facts.readCollapsers))\n findings.push({ file: file.path, ...hit });\n return findings;\n },\n },\n ],\n};\n\nexport interface DefaultedReadBindingFacts {\n surfaceTrees: readonly string[];\n heldFailureFields: readonly string[];\n allowlist: ReadonlyArray<Reviewed & { gate: ReadGate }>;\n}\n\nexport interface ReadGate {\n file: string;\n code: string;\n}\n\nconst squashed = (text: string) => text.replace(/\\s+/g, ' ').trim();\n\nfunction gateProblems(allowlist: unknown): string[] {\n if (!isList(allowlist)) return [];\n const problems: string[] = [];\n for (const entry of allowlist as Array<{ path?: string; gate?: Partial<ReadGate> }>) {\n const what = `allowlist entry ${String(entry?.path)}`;\n if (!entry?.gate || typeof entry.gate !== 'object')\n problems.push(\n `${what} names no gate (the file and the code that hold its surface back until the read answered)`,\n );\n else {\n pathProblem(entry.gate.file, `${what}'s gate file`, problems);\n if (typeof entry.gate.code !== 'string' || !entry.gate.code.trim())\n problems.push(`${what}'s gate names no code`);\n }\n }\n return problems;\n}\n\nfunction missingGates(\n context: GuardContext,\n allowlist: DefaultedReadBindingFacts['allowlist'],\n): Finding[] {\n const findings: Finding[] = [];\n for (const { path, gate } of allowlist) {\n if (!context.reader.exists(gate.file))\n findings.push({\n file: gate.file,\n detail: `the gate ${path} relies on is gone: the file no longer exists`,\n });\n else if (!squashed(context.file(gate.file).code).includes(squashed(gate.code))) {\n findings.push({\n file: gate.file,\n detail: `the gate ${path} relies on is gone: no longer holds ${squashed(gate.code)}`,\n });\n }\n }\n return findings;\n}\n\nexport function unguardedDataDefaults(file: FileView, heldFailureFields: readonly string[]): Hit[] {\n const sf = file.sourceFile;\n const failureBindings = new Set([...FAILURE_FIELDS, ...heldFailureFields]);\n const hits: Hit[] = [];\n forEachNode(sf, (node) => {\n if (\n !ts.isVariableDeclaration(node) ||\n !node.initializer ||\n !ts.isObjectBindingPattern(node.name)\n )\n return;\n let init: ts.Expression = node.initializer;\n if (ts.isAwaitExpression(init)) init = init.expression;\n if (!ts.isCallExpression(init)) return;\n const callee = init.expression.getText(sf);\n if (!isHookName(callee)) return;\n const elements = node.name.elements;\n if (elements.some((el) => el.dotDotDotToken)) return;\n const keyOf = (el: ts.BindingElement) => (el.propertyName ?? el.name).getText(sf);\n if (!elements.some((el) => keyOf(el) === 'data' && el.initializer !== undefined)) return;\n if (elements.some((el) => failureBindings.has(keyOf(el)))) return;\n hits.push({\n index: node.getStart(sf),\n detail: `${callee}() defaults data with no failure bound`,\n });\n });\n return hits;\n}\n\nexport const defaultedReadBindingGuard: GenericGuardDefinition<DefaultedReadBindingFacts> = {\n id: 'defaultedReadBinding',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathListProblem(facts?.surfaceTrees, 'surfaceTrees', problems);\n identifierListProblem(facts?.heldFailureFields, 'heldFailureFields', problems, {\n nonEmpty: false,\n });\n reviewedProblems(facts?.allowlist, 'allowlist', problems);\n return [...problems, ...gateProblems(facts?.allowlist)];\n },\n build: (facts) => {\n const held = facts.heldFailureFields.length ? ` / ${facts.heldFailureFields.join(' / ')}` : '';\n const guard = reviewedAllowlist({\n title: 'a render surface that defaults a read binds its failure',\n description:\n `A render surface (${facts.surfaceTrees.join(', ')}) that defaults a read's data (const { data: rows = [] } = useRows()) binds ` +\n `that same read's failure (error / isError / status / retryState${held}) in the same destructure, and renders the pending and failed states ` +\n 'before the default is used; otherwise a failed read renders as an empty list, a zero, or a negative answer that decides a control. ' +\n 'A reviewed default names the gate that holds its surface back until the read answered, and that gate must still be there.',\n scope: APP_CODE,\n match: (file) =>\n facts.surfaceTrees.some((tree) => isUnder(file.path, tree))\n ? unguardedDataDefaults(file, facts.heldFailureFields)\n : [],\n allowlist: facts.allowlist,\n samples: {\n flags: [\n {\n path: `${facts.surfaceTrees[0]}/sample.tsx`,\n text: 'const { data: rows = [] } = useRows(id);',\n },\n ],\n passes: [\n {\n path: `${facts.surfaceTrees[0]}/sample.tsx`,\n text: 'const { data: rows = [], isError } = useRows(id);',\n },\n ],\n },\n });\n return [\n {\n ...guard,\n run: async (context) => [\n ...(await guard.run(context)),\n ...missingGates(context, facts.allowlist),\n ],\n },\n ];\n },\n};\n\nexport interface LaterPageFailureFacts {\n hooksTree: string;\n readStateModule: string;\n listRoutes: ReadonlyArray<{ component: string; prop?: string }>;\n handOffProp: string;\n}\n\nconst LOADS_MORE = /\\bfetchNextPage\\b/;\n\nfunction routedPattern(routes: LaterPageFailureFacts['listRoutes']): RegExp {\n return new RegExp(\n routes\n .map(({ component, prop }) =>\n prop\n ? `<${escapeRegExp(component)}\\\\s[^>]*?\\\\b${escapeRegExp(prop)}=`\n : `<${escapeRegExp(component)}\\\\b`,\n )\n .join('|'),\n );\n}\n\nexport function unroutedPagingSurfaces(\n files: readonly FileView[],\n facts: LaterPageFailureFacts,\n): FileView[] {\n const routed = routedPattern(facts.listRoutes);\n const routing = new Set(\n files\n .filter((f) => routed.test(f.code))\n .flatMap((f) => [...f.code.matchAll(/export function ([A-Z]\\w*)/g)].map((m) => m[1])),\n );\n const handOff = new RegExp(`<([A-Z]\\\\w*)\\\\s[^>]*?\\\\b${escapeRegExp(facts.handOffProp)}=\\\\{`, 'g');\n return files.filter((f) => {\n if (routed.test(f.code)) return false;\n const handedTo = [...f.code.matchAll(handOff)].map((m) => m[1]);\n if (!LOADS_MORE.test(f.code) && !handedTo.length) return false;\n return !handedTo.some((component) => routing.has(component));\n });\n}\n\nexport const laterPageFailureGuard: GenericGuardDefinition<LaterPageFailureFacts> = {\n id: 'laterPageFailure',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.hooksTree, 'hooksTree', problems);\n pathProblem(facts?.readStateModule, 'readStateModule', problems);\n identifierProblem(facts?.handOffProp, 'handOffProp', problems);\n if (!isList(facts?.listRoutes) || !facts.listRoutes.length)\n problems.push('listRoutes names no component');\n else\n facts.listRoutes.forEach((r, i) => {\n identifierProblem(r?.component, `listRoutes[${i}].component`, problems);\n if (r?.prop !== undefined) identifierProblem(r.prop, `listRoutes[${i}].prop`, problems);\n });\n return problems;\n },\n build: (facts) => [\n {\n title: \"an infinite list's later-page failure routes through the read-state module\",\n description:\n `Every surface that loads more of an infinite list (fetchNextPage) or hands a list on (${facts.handOffProp}=…) renders it through ` +\n `${facts.listRoutes.map((r) => `<${r.component}${r.prop ? ` ${r.prop}=…` : ''}>`).join(' or ')} from ${facts.readStateModule}, ` +\n 'or hands it to a component whose own file does, so a failed load-more retries that page instead of ' +\n 'refetching the whole list. A page-by-page list, and a count that only reads hasNextPage, load nothing more and are not counted.',\n run(context) {\n const { findings, file: module } = requiredFile(\n context,\n facts.readStateModule,\n 'the read-state module',\n );\n if (!module) return findings;\n const surfaces = context\n .files(APP_CODE)\n .filter((f) => !isUnder(f.path, facts.hooksTree) && f.path !== facts.readStateModule);\n for (const file of unroutedPagingSurfaces(surfaces, facts)) {\n findings.push({\n file: file.path,\n detail:\n 'pages an infinite list without routing its later-page failure through the read-state module',\n });\n }\n return findings;\n },\n },\n ],\n};\n\nexport interface ReadFailureCopyFacts {\n owner: string;\n allowlist: readonly Reviewed[];\n}\n\nexport const READ_FAILURE_SENTENCE =\n /(?:could not|couldn['’]?t|failed to|unable to)\\s+(?:load|search|fetch|read|retrieve|check|find)\\b|error\\s+(?:loading|searching|fetching|reading)\\b/i;\n\nexport const readFailureCopyGuard: GenericGuardDefinition<ReadFailureCopyFacts> = {\n id: 'readFailureCopy',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n pathProblem(facts?.owner, 'owner', problems);\n reviewedProblems(facts?.allowlist, 'allowlist', problems);\n if (isList(facts?.allowlist) && facts.allowlist.some((e) => e?.path === facts.owner))\n problems.push('the owner is listed in the allowlist');\n return problems;\n },\n build: (facts) => [\n reviewedAllowlist({\n title: \"a read failure's copy comes from its one owner\",\n description:\n `Every read-failure sentence a person sees is built by ${facts.owner} from the short noun the surface names; no other file ` +\n 'hand-writes one (\"could not load\", \"failed to load\", \"error loading\", or the same around another read verb, in any casing). ' +\n 'Render the owner (with surface-specific guidance as its hint), or — for text never shown to a person — add a reviewed entry with its why.',\n scope: APP_CODE,\n match: matchPattern(READ_FAILURE_SENTENCE),\n allowlist: [\n { path: facts.owner, why: 'the one owner of read-failure copy' },\n ...facts.allowlist,\n ],\n samples: {\n flags: [\n '<p>Could not load the rows.</p>',\n '<AlertTitle>Error Loading Rows</AlertTitle>',\n 'const m = \"Couldn\\'t fetch the list.\";',\n ],\n passes: [\n 'hint=\"a list that could not be read is not an empty list.\"',\n '<LoadingState label=\"Loading rows\" />',\n ],\n },\n }),\n ],\n};\n\nexport const READ_FAILURE_GUARDS = [\n readStateOwnerGuard,\n readRetryStateGuard,\n hookReadDefaultGuard,\n defaultedReadBindingGuard,\n laterPageFailureGuard,\n readFailureCopyGuard,\n] as const;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttt-productions/repo-guards",
3
- "version": "0.1.34",
3
+ "version": "0.1.35",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ttt-productions/ttt-packages.git",