@ttt-productions/repo-guards 0.1.13 → 0.1.14

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.
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/modules/frontend-reads/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/modules/frontend-reads/cache.ts"],"names":[],"mappings":"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"}
@@ -55,45 +55,57 @@ export function clearCalls(file) {
55
55
  return { index: name, call: collapse(callSpan(file.code, name, open)) };
56
56
  });
57
57
  }
58
+ /** The text of the line holding `index`, so a match is judged by the statement it starts in. */
59
+ function lineAt(code, index) {
60
+ const start = code.lastIndexOf('\n', index - 1) + 1;
61
+ const end = code.indexOf('\n', index);
62
+ return code.slice(start, end === -1 ? code.length : end);
63
+ }
58
64
  /** Key families some live query reads: a `queryKey` built from a key method outside a cache call, or a key object handed whole. */
59
65
  export function readKeyFamilies(files, objects, familySuffix) {
60
66
  const read = new Set();
61
67
  const names = alternation(objects);
68
+ // Matched over the whole file, so a key Prettier wraps onto the next line still reads; a match is
69
+ // skipped when the line it starts on is a cache call's.
62
70
  for (const { code } of files) {
63
- for (const line of code.split('\n')) {
64
- if (CACHE_WRITE_CALL.test(line))
65
- continue;
66
- for (const m of line.matchAll(new RegExp(`\\bqueryKey\\s*[:=]\\s*(${names})\\.(\\w+)`, 'g')))
71
+ for (const m of code.matchAll(new RegExp(`\\bqueryKey\\s*[:=]\\s*(${names})\\.(\\w+)`, 'g')))
72
+ if (!CACHE_WRITE_CALL.test(lineAt(code, m.index ?? 0)))
67
73
  read.add(familyOf(`${m[1]}.${m[2]}`, familySuffix));
68
- for (const m of line.matchAll(new RegExp(`[\\w$]+\\s*:\\s*(${names})\\b(?![\\w$]|\\s*\\.)`, 'g')))
74
+ for (const m of code.matchAll(new RegExp(`[\\w$]+\\s*:\\s*(${names})\\b(?![\\w$]|\\s*\\.)`, 'g')))
75
+ if (!CACHE_WRITE_CALL.test(lineAt(code, m.index ?? 0)))
69
76
  read.add(`${m[1]}.*`);
70
- }
71
77
  }
72
78
  return read;
73
79
  }
74
- /** The argument count of the call whose `(` is at `open`, or null when there is no call there. */
80
+ /**
81
+ * The argument count of the call whose `(` is at `open`, or null when there is no call there. A
82
+ * trailing comma (the one Prettier writes after the last argument of a wrapped call) ends no
83
+ * argument, so it adds none.
84
+ */
75
85
  function argCountAt(code, open) {
76
86
  if (code[open] !== '(')
77
87
  return null;
78
88
  let depth = 0;
79
89
  let count = 0;
80
- let sawToken = false;
90
+ let argOpen = false;
81
91
  for (let i = open; i < code.length; i += 1) {
82
92
  const ch = code[i];
83
93
  if ('([{'.includes(ch)) {
84
94
  depth += 1;
85
95
  if (depth > 1)
86
- sawToken = true;
96
+ argOpen = true;
87
97
  }
88
98
  else if (')]}'.includes(ch)) {
89
99
  depth -= 1;
90
100
  if (depth === 0)
91
- return sawToken ? count + 1 : 0;
101
+ return count + (argOpen ? 1 : 0);
92
102
  }
93
- else if (ch === ',' && depth === 1)
103
+ else if (ch === ',' && depth === 1) {
94
104
  count += 1;
105
+ argOpen = false;
106
+ }
95
107
  else if (depth >= 1 && !/\s/.test(ch))
96
- sawToken = true;
108
+ argOpen = true;
97
109
  }
98
110
  return null;
99
111
  }
@@ -102,16 +114,14 @@ export function readArgCounts(files, objects) {
102
114
  const counts = new Map();
103
115
  const re = new RegExp(`\\bqueryKey\\s*[:=]\\s*(${alternation(objects)})\\.(\\w+)\\(`, 'g');
104
116
  for (const { code } of files) {
105
- for (const line of code.split('\n')) {
106
- if (CACHE_WRITE_CALL.test(line))
117
+ for (const m of code.matchAll(re)) {
118
+ if (CACHE_WRITE_CALL.test(lineAt(code, m.index ?? 0)))
107
119
  continue;
108
- for (const m of line.matchAll(re)) {
109
- const n = argCountAt(line, (m.index ?? 0) + m[0].length - 1);
110
- if (n === null)
111
- continue;
112
- const ref = `${m[1]}.${m[2]}`;
113
- counts.set(ref, (counts.get(ref) ?? new Set()).add(n));
114
- }
120
+ const n = argCountAt(code, (m.index ?? 0) + m[0].length - 1);
121
+ if (n === null)
122
+ continue;
123
+ const ref = `${m[1]}.${m[2]}`;
124
+ counts.set(ref, (counts.get(ref) ?? new Set()).add(n));
115
125
  }
116
126
  }
117
127
  return counts;
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/modules/frontend-reads/cache.ts"],"names":[],"mappings":"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","sourcesContent":["// What may touch the query cache, and how: invalidation only through the domain-event registry,\n// aimed at keys a live query reads and never at an infinite list; an infinite list never reloaded\n// by an action; a whole-cache drop only by the session-retirement owner; and a registry whose every\n// event is produced, well formed, and awaited.\n\nimport ts from 'typescript';\nimport type { GenericGuardDefinition } from '../../node/suite/config.js';\nimport type { Finding, Guard, GuardContext } from '../../guard.js';\nimport type { FileView } from '../../reader/view.js';\nimport {\n identifierProblem,\n loaderProblem,\n pathProblem,\n reviewedProblems,\n type Loader,\n} from '../../support/facts.js';\nimport { escapeRegExp } from '../../support/text.js';\nimport {\n APP_CODE,\n alternation,\n callSpan,\n collapse,\n familyOf,\n filesUnder,\n identifierListProblem,\n infiniteKeyFamilies,\n isPrefix,\n keyModuleProblem,\n loadKeyObjects,\n pathListProblem,\n reachesInfinite,\n requiredFile,\n reviewedCallProblem,\n sampleKey,\n type KeyBuilders,\n type KeyModuleFacts,\n type ReviewedCall,\n} from './shared.js';\n\n/** query-core's registry factory and the two invalidation builders a registry entry uses. */\nconst REGISTRY_FACTORY = 'createDomainEventInvalidator';\nconst EXACT = 'exact';\n\n/** The registry: where it is. */\nexport interface RegistryFacts {\n path: string;\n}\n\n/** The object literal the registry module hands to query-core's registry factory, as code. */\nexport function registryObjectCode(file: FileView): { name: string; code: string } | null {\n const sf = file.sourceFile;\n let name: string | null = null;\n const find = (node: ts.Node) => {\n if (\n !name &&\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === REGISTRY_FACTORY &&\n node.arguments[0] &&\n ts.isIdentifier(node.arguments[0])\n ) {\n name = node.arguments[0].text;\n }\n ts.forEachChild(node, find);\n };\n find(sf);\n if (!name) return null;\n let found: { name: string; code: string } | null = null;\n const visit = (node: ts.Node) => {\n if (\n !found &&\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === name &&\n node.initializer\n ) {\n found = {\n name: name!,\n code: file.code.slice(node.initializer.getStart(sf), node.initializer.getEnd()),\n };\n }\n ts.forEachChild(node, visit);\n };\n visit(sf);\n return found;\n}\n\nconst keyRefPattern = (objects: readonly string[]) =>\n new RegExp(`\\\\b(${alternation(objects)})\\\\.(\\\\w+)`, 'g');\n\n// =============================================================================================\n// Cache invalidation only through the registry; the registry's targets are read, and never an infinite list.\n// =============================================================================================\n\nexport interface CacheInvalidationFacts {\n registry: RegistryFacts;\n keyModule: KeyModuleFacts;\n /** The trees whose `queryKey:` sites are the app's live reads (hooks, components, pages). */\n readTrees: readonly string[];\n /** The suffix the key module names a family helper with (`listPrefix()` → `Prefix`). */\n familySuffix: string;\n}\n\n/** What the registry rule leaves to the other cache owners: the session-retirement owner, and a person's own refreshes. */\ninterface OwnedElsewhere {\n sessionOwner: string;\n memberRefreshes: readonly ReviewedCall[];\n}\n\nconst CLEAR_CALL = /\\.\\s*(invalidateQueries|removeQueries|resetQueries)(\\s*\\()/g;\nconst CACHE_WRITE_CALL =\n /\\b(refetchQueries|resetQueries|cancelQueries|setQueryData|setQueriesData|getQueryData|getQueriesData|invalidateQueries|removeQueries|ensureQueryData|prefetchQuery)\\b/;\n\n/** Every invalidate / remove / reset call in a file, as its collapsed text from the method name on. */\nexport function clearCalls(file: FileView): Array<{ index: number; call: string }> {\n return [...file.code.matchAll(CLEAR_CALL)].map((m) => {\n const name = (m.index ?? 0) + m[0].indexOf(m[1]);\n const open = (m.index ?? 0) + m[0].length - 1;\n return { index: name, call: collapse(callSpan(file.code, name, open)) };\n });\n}\n\n/** Key families some live query reads: a `queryKey` built from a key method outside a cache call, or a key object handed whole. */\nexport function readKeyFamilies(\n files: ReadonlyArray<{ code: string }>,\n objects: readonly string[],\n familySuffix: string,\n): Set<string> {\n const read = new Set<string>();\n const names = alternation(objects);\n for (const { code } of files) {\n for (const line of code.split('\\n')) {\n if (CACHE_WRITE_CALL.test(line)) continue;\n for (const m of line.matchAll(new RegExp(`\\\\bqueryKey\\\\s*[:=]\\\\s*(${names})\\\\.(\\\\w+)`, 'g')))\n read.add(familyOf(`${m[1]}.${m[2]}`, familySuffix));\n for (const m of line.matchAll(\n new RegExp(`[\\\\w$]+\\\\s*:\\\\s*(${names})\\\\b(?![\\\\w$]|\\\\s*\\\\.)`, 'g'),\n ))\n read.add(`${m[1]}.*`);\n }\n }\n return read;\n}\n\n/** The argument count of the call whose `(` is at `open`, or null when there is no call there. */\nfunction argCountAt(code: string, open: number): number | null {\n if (code[open] !== '(') return null;\n let depth = 0;\n let count = 0;\n let sawToken = false;\n for (let i = open; i < code.length; i += 1) {\n const ch = code[i];\n if ('([{'.includes(ch)) {\n depth += 1;\n if (depth > 1) sawToken = true;\n } else if (')]}'.includes(ch)) {\n depth -= 1;\n if (depth === 0) return sawToken ? count + 1 : 0;\n } else if (ch === ',' && depth === 1) count += 1;\n else if (depth >= 1 && !/\\s/.test(ch)) sawToken = true;\n }\n return null;\n}\n\n/** Each key method → the argument counts the app's live reads build it with. */\nexport function readArgCounts(\n files: ReadonlyArray<{ code: string }>,\n objects: readonly string[],\n): Map<string, Set<number>> {\n const counts = new Map<string, Set<number>>();\n const re = new RegExp(`\\\\bqueryKey\\\\s*[:=]\\\\s*(${alternation(objects)})\\\\.(\\\\w+)\\\\(`, 'g');\n for (const { code } of files) {\n for (const line of code.split('\\n')) {\n if (CACHE_WRITE_CALL.test(line)) continue;\n for (const m of line.matchAll(re)) {\n const n = argCountAt(line, (m.index ?? 0) + m[0].length - 1);\n if (n === null) continue;\n const ref = `${m[1]}.${m[2]}`;\n counts.set(ref, (counts.get(ref) ?? new Set()).add(n));\n }\n }\n }\n return counts;\n}\n\n/** Registry targets that miss: unread, an exact on a family, an exact shaped unlike every read, or one reaching an infinite list. */\nexport function registryTargetProblems(input: {\n registryCode: string;\n reads: ReadonlyArray<{ code: string }>;\n builders: KeyBuilders;\n familySuffix: string;\n}): string[] {\n const { registryCode, reads, builders, familySuffix } = input;\n const objects = Object.keys(builders);\n const refs = [\n ...new Set([...registryCode.matchAll(keyRefPattern(objects))].map((m) => `${m[1]}.${m[2]}`)),\n ];\n const read = readKeyFamilies(reads, objects, familySuffix);\n const readKeys = [...read]\n .map((f) => sampleKey(f, builders))\n .filter((k): k is unknown[] => k !== null);\n const problems: string[] = [];\n for (const ref of refs) {\n if (read.has(familyOf(ref, familySuffix)) || read.has(`${ref.split('.')[0]}.*`)) continue;\n const key = sampleKey(ref, builders);\n if (key === null || !readKeys.some((readKey) => isPrefix(key, readKey)))\n problems.push(`${ref}: no live query reads this key`);\n }\n const counts = readArgCounts(reads, objects);\n const exactRe = new RegExp(`\\\\b${EXACT}\\\\(\\\\s*(${alternation(objects)})\\\\.(\\\\w+)`, 'g');\n const shaped = new Set<string>();\n for (const m of registryCode.matchAll(exactRe)) {\n const ref = `${m[1]}.${m[2]}`;\n if (shaped.has(ref)) continue;\n if (m[2] === 'all' || (m[2].endsWith(familySuffix) && m[2] !== familySuffix)) {\n shaped.add(ref);\n problems.push(\n `${ref}: an exact target on a key family (only a prefix target reaches a family)`,\n );\n continue;\n }\n const n = argCountAt(registryCode, (m.index ?? 0) + m[0].length);\n const readCounts = counts.get(ref);\n if (n !== null && readCounts && !readCounts.has(n)) {\n shaped.add(ref);\n problems.push(\n `${ref}: an exact target built with ${n} argument(s), which no live read builds`,\n );\n }\n }\n const infinite = infiniteKeyFamilies(reads, objects, familySuffix);\n for (const ref of refs)\n if (reachesInfinite(ref, infinite, builders, familySuffix))\n problems.push(`${ref}: reaches an infinite list`);\n return problems;\n}\n\nfunction registryProblem(value: unknown, problems: string[]): void {\n const facts = value as RegistryFacts | undefined;\n if (!facts || typeof facts !== 'object') problems.push('registry is missing');\n else pathProblem(facts.path, 'registry.path', problems);\n}\n\nconst cacheInvalidationProblems = (facts: CacheInvalidationFacts) => {\n const problems: string[] = [];\n registryProblem(facts?.registry, problems);\n keyModuleProblem(facts?.keyModule, problems);\n pathListProblem(facts?.readTrees, 'readTrees', problems);\n identifierProblem(facts?.familySuffix, 'familySuffix', problems);\n return problems;\n};\n\nconst cacheInvalidationGuards = (facts: CacheInvalidationFacts, owned: OwnedElsewhere): Guard[] => [\n {\n title: 'saved reads are refreshed, removed, or reset only through the domain-event registry',\n description:\n `${facts.registry.path} — the object it hands to query-core's ${REGISTRY_FACTORY} — is the one place that turns something that ` +\n 'happened into what the cache does: refresh, remove, or reset. No other file calls invalidateQueries, removeQueries, or ' +\n 'resetQueries: emit the domain event instead, and patch an infinite list in place. The only other owners are the session-' +\n `retirement owner (${owned.sessionOwner}) and a person's own refresh, declared once beside the list-reload rule.`,\n run(context) {\n const { file: registry, findings } = requiredFile(\n context,\n facts.registry.path,\n 'the domain-event registry',\n );\n if (registry && !registryObjectCode(registry))\n findings.push({\n file: registry.path,\n detail: `no registry object handed to ${REGISTRY_FACTORY}`,\n });\n const refreshes = new Set(owned.memberRefreshes.map((r) => `${r.path} ${r.call}`));\n for (const file of context.files(APP_CODE)) {\n if (file.path === facts.registry.path || file.path === owned.sessionOwner) continue;\n for (const { index, call } of clearCalls(file)) {\n if (refreshes.has(`${file.path} ${call}`)) continue;\n findings.push({\n file: file.path,\n line: file.lineOf(index),\n detail: `outside the registry: ${call.slice(0, 120)}`,\n });\n }\n }\n return findings;\n },\n },\n {\n title: 'every registry cache target is a key a live query reads, and never an infinite list',\n description:\n `Every key the registry in ${facts.registry.path} writes is reached by a live query's key (a queryKey built from the same key ` +\n `method in ${facts.readTrees.join(', ')}, or a key object handed whole to a reader); an exact target names a leaf the reads build ` +\n `with the same arguments, never a family (all, or a …${facts.familySuffix} helper); and no target reaches an infinite list — named, ` +\n 'through its family helper, or through its scope. A write aimed at a key nothing reads is a silent no-op, and invalidating an ' +\n 'infinite list re-runs every loaded page.',\n timeoutMs: 120_000,\n async run(context: GuardContext): Promise<Finding[]> {\n const { file: registry, findings } = requiredFile(\n context,\n facts.registry.path,\n 'the domain-event registry',\n );\n if (!registry) return findings;\n const object = registryObjectCode(registry);\n if (!object)\n return [\n { file: registry.path, detail: `no registry object handed to ${REGISTRY_FACTORY}` },\n ];\n const builders = await loadKeyObjects(facts.keyModule);\n const { files, findings: missing } = filesUnder(context, facts.readTrees);\n findings.push(...missing);\n for (const detail of registryTargetProblems({\n registryCode: object.code,\n reads: files,\n builders,\n familySuffix: facts.familySuffix,\n })) {\n findings.push({ file: registry.path, detail });\n }\n return findings;\n },\n },\n];\n\n// =============================================================================================\n// No action-driven reload of an infinite list.\n// =============================================================================================\n\nexport interface ListResetFacts {\n keyModule: KeyModuleFacts;\n familySuffix: string;\n /** The app predicate that is true for a query holding loaded pages; a reload filtered by its negation reloads no shown list. */\n loadedPagesPredicate: string;\n /** A person's own refreshes (pull-to-refresh, a Refresh button): each call site with its why. */\n memberRefreshes: readonly ReviewedCall[];\n /** Hooks that run a member's own refresh, each handed only to its refresh control on the named prop; [] for none. */\n refreshHandoffs: ReadonlyArray<{ hook: string; control: string; prop: string }>;\n}\n\nconst RELOAD_CALL = /\\b(resetQueries|refetchQueries|removeQueries)\\s*\\(/g;\nconst PATCH_CALL = /\\b(setQueryData|setQueriesData)\\s*(?:<[^>]*>)?\\s*\\(/g;\nconst FIRST_PAGE_TRIM =\n /\\bpages\\.slice\\(\\s*0\\s*,\\s*1\\s*\\)|\\bpageParams\\.slice\\(\\s*0\\s*,\\s*1\\s*\\)|\\bpages\\s*:\\s*\\[\\s*[\\w.?]+\\.pages\\[0\\]\\s*\\]/;\n\n/** The key refs a call targets: its key method, or every one a constant map it indexes holds; null when unresolved. */\nfunction targetRefs(call: string, code: string, objects: readonly string[]): string[] | null {\n const names = alternation(objects);\n const direct = call.match(new RegExp(`\\\\bqueryKey\\\\s*:\\\\s*(${names})\\\\.(\\\\w+)`));\n if (direct) return [`${direct[1]}.${direct[2]}`];\n const indexed = call.match(/\\bqueryKey\\s*:\\s*([A-Za-z_]\\w*)\\[/);\n if (!indexed) return null;\n const decl = code.match(new RegExp(`\\\\bconst \\\\s*${escapeRegExp(indexed[1])}\\\\b[^=]*=\\\\s*\\\\{`));\n if (!decl) return null;\n const open = (decl.index ?? 0) + decl[0].length - 1;\n const refs = [...callSpan(code, open, open).matchAll(keyRefPattern(objects))].map(\n (m) => `${m[1]}.${m[2]}`,\n );\n return refs.length ? refs : null;\n}\n\n/** Every call that reloads or trims an infinite list, outside the reviewed reloads. */\nexport function listReloads(\n files: readonly FileView[],\n builders: KeyBuilders,\n facts: Pick<ListResetFacts, 'familySuffix' | 'loadedPagesPredicate' | 'memberRefreshes'>,\n sessionOwner?: string,\n) {\n const objects = Object.keys(builders);\n const infinite = infiniteKeyFamilies(files, objects, facts.familySuffix);\n const pinned = new Set(facts.memberRefreshes.map((r) => `${r.path} ${r.call}`));\n const excluded = new RegExp(`!${escapeRegExp(facts.loadedPagesPredicate)}\\\\(\\\\s*query\\\\s*\\\\)`);\n const found: Finding[] = [];\n const present = new Set<string>();\n for (const file of files) {\n if (file.path === sessionOwner) continue;\n const code = file.code;\n for (const m of code.matchAll(RELOAD_CALL)) {\n const call = collapse(callSpan(code, m.index ?? 0, (m.index ?? 0) + m[0].length - 1));\n present.add(`${file.path} ${call}`);\n if (pinned.has(`${file.path} ${call}`)) continue;\n const refs = targetRefs(call, code, objects);\n const reloads = refs\n ? refs.some((ref) => reachesInfinite(ref, infinite, builders, facts.familySuffix))\n : !excluded.test(call);\n if (reloads)\n found.push({\n file: file.path,\n line: file.lineOf(m.index ?? 0),\n detail: `${refs ? 'reloads an infinite list' : 'reloads queries its key does not name'}: ${call.slice(0, 120)}`,\n });\n }\n for (const m of code.matchAll(PATCH_CALL)) {\n const call = callSpan(code, m.index ?? 0, (m.index ?? 0) + m[0].length - 1);\n if (FIRST_PAGE_TRIM.test(call))\n found.push({\n file: file.path,\n line: file.lineOf(m.index ?? 0),\n detail: `trims a list to its first page: ${collapse(call).slice(0, 120)}`,\n });\n }\n }\n for (const r of facts.memberRefreshes)\n if (!present.has(`${r.path} ${r.call}`))\n found.push({ file: r.path, detail: `stale member refresh: ${r.call} is no longer there` });\n return { infinite, findings: found };\n}\n\n/** Each refresh hook's result used anywhere but on its refresh control's prop, and each hook no file calls. */\nexport function refreshHandoffMisuses(\n files: readonly FileView[],\n handoffs: ListResetFacts['refreshHandoffs'],\n): Finding[] {\n const findings: Finding[] = [];\n for (const { hook, control, prop } of handoffs) {\n let callers = 0;\n for (const file of files) {\n for (const m of file.code.matchAll(\n new RegExp(`const\\\\s+(\\\\w+)\\\\s*=\\\\s*${escapeRegExp(hook)}\\\\(`, 'g'),\n )) {\n callers += 1;\n const name = m[1];\n const uses = [...file.code.matchAll(new RegExp(`\\\\b${name}\\\\b`, 'g'))].length - 1;\n const handed = [\n ...file.code.matchAll(\n new RegExp(`<${escapeRegExp(control)}[^>]*${escapeRegExp(prop)}=\\\\{${name}\\\\}`, 'g'),\n ),\n ].length;\n if (uses !== handed)\n findings.push({\n file: file.path,\n line: file.lineOf(m.index ?? 0),\n detail: `${hook}()'s refresh is used other than as <${control} ${prop}>`,\n });\n }\n }\n if (!callers)\n findings.push({ file: '(refreshHandoffs)', detail: `stale entry: nothing calls ${hook}` });\n }\n return findings;\n}\n\nconst listResetProblems = (facts: ListResetFacts) => {\n const problems: string[] = [];\n keyModuleProblem(facts?.keyModule, problems);\n identifierProblem(facts?.familySuffix, 'familySuffix', problems);\n identifierProblem(facts?.loadedPagesPredicate, 'loadedPagesPredicate', problems);\n reviewedCallProblem(facts?.memberRefreshes, 'memberRefreshes', problems);\n if (!Array.isArray(facts?.refreshHandoffs))\n problems.push('refreshHandoffs is missing (declare [] when there is none)');\n else\n facts.refreshHandoffs.forEach((h, i) => {\n identifierProblem(h?.hook, `refreshHandoffs[${i}].hook`, problems);\n identifierProblem(h?.control, `refreshHandoffs[${i}].control`, problems);\n identifierProblem(h?.prop, `refreshHandoffs[${i}].prop`, problems);\n });\n return problems;\n};\n\nconst listResetGuards = (facts: ListResetFacts, sessionOwner: string): Guard[] => [\n {\n title: 'an action never reloads an infinite list',\n description:\n \"An action's change is placed, moved, or patched in place in an infinite list; no resetQueries / refetchQueries / removeQueries \" +\n `whose key reaches one (directly, through its family helper or scope, or through a constant map of keys), none whose key cannot ` +\n `be resolved unless its predicate excludes every query holding loaded pages (!${facts.loadedPagesPredicate}(query)), and no cache ` +\n \"write that trims a list to its first page. A person's own refresh is declared with its why, and a refresh hook's result is only \" +\n 'ever handed to its refresh control.',\n timeoutMs: 120_000,\n async run(context) {\n const builders = await loadKeyObjects(facts.keyModule);\n const files = context.files(APP_CODE);\n const { infinite, findings } = listReloads(files, builders, facts, sessionOwner);\n if (!infinite.size)\n findings.push({\n file: facts.keyModule.path,\n detail: 'no infinite list found in the app, so the guard checks nothing',\n });\n findings.push(...refreshHandoffMisuses(files, facts.refreshHandoffs));\n return findings;\n },\n },\n];\n\n// =============================================================================================\n// An unscoped cancel or a whole-cache clear only by session retirement.\n// =============================================================================================\n\nexport interface SessionRetirementFacts {\n /** The session-retirement owner. */\n owner: string;\n /** Retirements beyond a session's end that the owner runs by predicate (a member leaving a group), each with its why; [] for none. */\n predicateRetirements: ReadonlyArray<{ trigger: string; why: string }>;\n}\n\nconst WHOLE_CACHE_DROP = [\n /\\bcancelQueries\\(\\s*\\)/g,\n /\\bcancelQueries\\(\\s*undefined\\b/g,\n /\\bcancelQueries\\(\\s*\\{(?![^}]*\\bqueryKey\\b)/g,\n /\\bget(?:Query|Mutation)Cache\\(\\)\\s*\\.clear\\(/g,\n /\\b\\w*[cC]lient\\s*\\.clear\\(\\s*\\)/g,\n];\n\nexport function wholeCacheDrops(file: FileView): Array<{ index: number; text: string }> {\n return WHOLE_CACHE_DROP.flatMap((re) =>\n [...file.code.matchAll(re)].map((m) => ({ index: m.index ?? 0, text: m[0] })),\n ).sort((a, b) => a.index - b.index);\n}\n\nconst sessionRetirementPart = {\n factProblems(facts: SessionRetirementFacts) {\n const problems: string[] = [];\n pathProblem(facts?.owner, 'owner', problems);\n reviewedProblems(facts?.predicateRetirements, 'predicateRetirements', problems, {\n key: 'trigger',\n });\n return problems;\n },\n build: (facts: SessionRetirementFacts): Guard[] => [\n {\n title: 'an unscoped cancel or a whole-cache clear runs only in the session-retirement owner',\n description:\n `A cancelQueries with no key (bare, or selected by a predicate) and a query or mutation cache clear drop reads the call site ` +\n `cannot name, so only ${facts.owner} runs them: when a session ends it cancels every query and clears the query cache` +\n (facts.predicateRetirements.length\n ? `, and it cancels by predicate for ${facts.predicateRetirements.map((r) => r.trigger).join('; ')}`\n : '') +\n '. Everywhere else a cancel names its key, and nothing clears a cache.',\n run(context) {\n const { file: owner, findings } = requiredFile(\n context,\n facts.owner,\n 'the session-retirement owner',\n );\n for (const file of context.files(APP_CODE)) {\n if (file.path === facts.owner) continue;\n for (const drop of wholeCacheDrops(file))\n findings.push({\n file: file.path,\n line: file.lineOf(drop.index),\n detail: `outside the session-retirement owner: ${drop.text}`,\n });\n }\n if (owner) {\n if (!/\\bcancelQueries\\(\\s*\\)/.test(owner.code))\n findings.push({\n file: owner.path,\n detail: 'the owner no longer cancels every query when a session ends',\n });\n if (!/getQueryCache\\(\\)\\s*\\.clear\\(/.test(owner.code))\n findings.push({\n file: owner.path,\n detail: 'the owner no longer clears the query cache when a session ends',\n });\n const byPredicate = [...owner.code.matchAll(/\\bcancelQueries\\(\\s*\\{\\s*predicate\\s*:/g)]\n .length;\n if (byPredicate !== facts.predicateRetirements.length) {\n findings.push({\n file: owner.path,\n detail: `the owner cancels by predicate ${byPredicate} time(s); ${facts.predicateRetirements.length} predicate retirement(s) are reviewed`,\n });\n }\n }\n return findings;\n },\n },\n ],\n};\n\n// =============================================================================================\n// The domain-event registry: every event produced, every variant registered and well formed, every\n// notification handed on.\n// =============================================================================================\n\nexport interface DomainEventRegistryFacts {\n registry: RegistryFacts & {\n /** A loader of the registry object itself (event type → invalidation builder). */\n load: Loader<Record<string, unknown>>;\n };\n /** A loader of the core's domain-event schema: a discriminated union on `type`, each variant carrying an `ids` object. */\n eventSchema: Loader<unknown>;\n /** The app's functions that dispatch a domain event and return the refresh's promise. */\n notifiers: readonly string[];\n}\n\ntype ZodLike = {\n def?: any;\n _def?: any;\n shape?: Record<string, ZodLike>;\n options?: unknown[];\n value?: unknown;\n};\nconst defOf = (field: ZodLike) => field?.def ?? field?._def ?? {};\nconst kindOf = (field: ZodLike): 'optional' | 'nullable' | 'enum' | 'required' => {\n const type = defOf(field).type;\n return type === 'optional' || type === 'nullable' || type === 'enum' ? type : 'required';\n};\n\n/** Synthetic `ids` for one variant: every field filled, then each optional field dropped in turn. */\nexport function syntheticIds(idsSchema: ZodLike): Array<Record<string, unknown>> {\n const baseline: Record<string, unknown> = {};\n const optional: string[] = [];\n for (const [key, field] of Object.entries(idsSchema?.shape ?? {})) {\n const kind = kindOf(field);\n if (kind === 'enum') baseline[key] = (field.options as unknown[])[0];\n else if (kind === 'optional') {\n optional.push(key);\n const inner = defOf(field).innerType as ZodLike;\n baseline[key] = kindOf(inner) === 'enum' ? (inner.options as unknown[])[0] : `test-${key}`;\n } else baseline[key] = `test-${key}`;\n }\n return [\n { ...baseline },\n ...optional.map((key) =>\n Object.fromEntries(Object.entries(baseline).filter(([k]) => k !== key)),\n ),\n ];\n}\n\n/** What a query-core registry entry may do to the reads it matches, and how a refresh refetches. */\nconst CACHE_ACTIONS: ReadonlySet<unknown> = new Set([undefined, 'refresh', 'remove', 'reset']);\nconst REFETCH_TYPES: ReadonlySet<unknown> = new Set([undefined, 'active', 'all', 'none']);\n\n/** Why a builder's answer is not a list of well-formed invalidations, or null. */\nexport function malformedInvalidations(answer: unknown): string | null {\n if (!Array.isArray(answer)) return 'does not answer a list of invalidations';\n for (const inv of answer as Array<Record<string, unknown>>) {\n if (inv?.kind === 'exact' || inv?.kind === 'prefix') {\n if (!Array.isArray(inv.queryKey) || !inv.queryKey.length)\n return `a ${inv.kind} invalidation with no key`;\n } else if (inv?.kind === 'predicate') {\n if (\n typeof inv.description !== 'string' ||\n !inv.description ||\n typeof inv.match !== 'function'\n )\n return 'a predicate invalidation with no description or matcher';\n } else return `an invalidation of unknown kind ${String(inv?.kind)}`;\n if (!CACHE_ACTIONS.has(inv.action))\n return `a ${inv.kind} invalidation with unknown action ${String(inv.action)}`;\n if (!REFETCH_TYPES.has(inv.refetchType))\n return `a ${inv.kind} invalidation with unknown refetchType ${String(inv.refetchType)}`;\n if ((inv.action === 'remove' || inv.action === 'reset') && inv.refetchType !== undefined) {\n return `a ${inv.action} invalidation with a refetchType, which only a refresh takes`;\n }\n }\n return null;\n}\n\n/** Whether the call at `index` starts a statement, so its promise is dropped. */\nfunction startsStatement(code: string, index: number): boolean {\n const before = code.slice(0, index).trimEnd();\n return before.length === 0 || ';{})'.includes(before.charAt(before.length - 1));\n}\n\nexport function droppedNotifications(\n file: FileView,\n notifiers: readonly string[],\n): Array<{ index: number; name: string }> {\n const hits: Array<{ index: number; name: string }> = [];\n for (const m of file.code.matchAll(new RegExp(`\\\\b(${alternation(notifiers)})\\\\(`, 'g'))) {\n const index = m.index ?? 0;\n if (/function\\s+$/.test(file.code.slice(0, index))) continue;\n if (startsStatement(file.code, index)) hits.push({ index, name: m[1] });\n }\n return hits;\n}\n\nexport const domainEventRegistryGuard: GenericGuardDefinition<DomainEventRegistryFacts> = {\n id: 'domainEventRegistry',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n registryProblem(facts?.registry, problems);\n loaderProblem(facts?.registry?.load, 'registry.load', problems);\n loaderProblem(facts?.eventSchema, 'eventSchema', problems);\n identifierListProblem(facts?.notifiers, 'notifiers', problems, { nonEmpty: true });\n return problems;\n },\n build: (facts) => [\n {\n title: 'every registered domain event has a producer in the app',\n description:\n `Every event type the registry in ${facts.registry.path} handles is emitted somewhere in the app's own code (its quoted type ` +\n \"outside the registry, in the client or functions tree); the core's schema holds every variant by construction, so it is no \" +\n 'evidence. Restore the producer, or delete the event from the core and the registry.',\n async run(context) {\n const registry = (await facts.registry.load()) ?? {};\n const findings: Finding[] = [];\n const haystack = context\n .files({\n roots: ['app', 'functions'],\n optionalRoots: ['functions'],\n kinds: ['code'],\n tests: false,\n })\n .filter((f) => f.path !== facts.registry.path)\n .map((f) => f.code)\n .join('\\n');\n const produced = (type: string) =>\n haystack.includes(`'${type}'`) || haystack.includes(`\"${type}\"`);\n for (const type of Object.keys(registry))\n if (!produced(type))\n findings.push({ file: facts.registry.path, detail: `${type}: no producer in the app` });\n return findings;\n },\n },\n {\n title: 'every core domain-event variant has a registry entry with well-formed invalidations',\n description:\n `Every variant of the core's domain-event schema has an entry in the registry in ${facts.registry.path}, and the entry answers, ` +\n 'for every shape of its ids (each optional id present and absent), a list of invalidations that are each an exact or prefix ' +\n 'target with a non-empty key, or a predicate with a description and a matcher.',\n async run(context) {\n // The loaded registry is judged, but the file the facts name must be the one it comes from.\n if (!context.reader.exists(facts.registry.path))\n return [{ file: facts.registry.path, detail: 'the registry file does not exist' }];\n context.file(facts.registry.path);\n const registry = (await facts.registry.load()) ?? {};\n const schema = (await facts.eventSchema()) as ZodLike;\n const variants = (schema?.options ?? []) as ZodLike[];\n if (!variants.length)\n return [\n {\n file: '(eventSchema)',\n detail: 'the loader did not answer a discriminated union of variants',\n },\n ];\n const findings: Finding[] = [];\n for (const variant of variants) {\n const type = String(variant.shape?.type?.value ?? '');\n if (!type) {\n findings.push({ file: '(eventSchema)', detail: 'a variant carries no literal type' });\n continue;\n }\n const build = registry[type];\n if (typeof build !== 'function') {\n findings.push({ file: facts.registry.path, detail: `${type}: no registry entry` });\n continue;\n }\n for (const ids of syntheticIds(variant.shape?.ids as ZodLike)) {\n let problem: string | null;\n try {\n problem = malformedInvalidations((build as (ids: unknown) => unknown)(ids));\n } catch (err) {\n problem = `throws for ids ${JSON.stringify(ids)}: ${(err as Error)?.message ?? err}`;\n }\n if (problem)\n findings.push({ file: facts.registry.path, detail: `${type}: ${problem}` });\n }\n }\n return findings;\n },\n },\n {\n title: 'every domain-event notification hands its refresh promise on',\n description:\n `A call to ${facts.notifiers.join(' / ')} returns the promise of the refresh it starts; a mutation returns or awaits it so it stays ` +\n 'pending until the refreshed data is on screen. A call in statement position drops it silently: return it, await it, pass it ' +\n 'on, or mark a deliberate fire-and-forget with void.',\n run(context) {\n const findings: Finding[] = [];\n let calls = 0;\n const callRe = new RegExp(`\\\\b(?:${alternation(facts.notifiers)})\\\\(`, 'g');\n for (const file of context.files(APP_CODE)) {\n calls += [...file.code.matchAll(callRe)].length;\n for (const hit of droppedNotifications(file, facts.notifiers)) {\n findings.push({\n file: file.path,\n line: file.lineOf(hit.index),\n detail: `${hit.name}(…) in statement position drops its refresh`,\n });\n }\n }\n if (!calls)\n findings.push({\n file: '(notifiers)',\n detail: `nothing in the app calls ${facts.notifiers.join(' / ')}, so the guard checks nothing`,\n });\n return findings;\n },\n },\n ],\n};\n\n/**\n * Every fact the query-cache owners need, declared once: the registry (the one place something that\n * happened changes saved reads), a person's own refreshes, and the session-retirement owner.\n */\nexport interface QueryCacheFacts extends CacheInvalidationFacts {\n loadedPagesPredicate: string;\n memberRefreshes: readonly ReviewedCall[];\n refreshHandoffs: ListResetFacts['refreshHandoffs'];\n sessionOwner: string;\n predicateRetirements: SessionRetirementFacts['predicateRetirements'];\n}\n\nconst listFacts = (f: QueryCacheFacts | undefined): ListResetFacts => ({\n keyModule: f?.keyModule as KeyModuleFacts,\n familySuffix: f?.familySuffix as string,\n loadedPagesPredicate: f?.loadedPagesPredicate as string,\n memberRefreshes: f?.memberRefreshes as readonly ReviewedCall[],\n refreshHandoffs: f?.refreshHandoffs as ListResetFacts['refreshHandoffs'],\n});\n\nexport const queryCacheGuard: GenericGuardDefinition<QueryCacheFacts> = {\n id: 'queryCache',\n absentWhen: false,\n factProblems: (f) => [\n ...new Set([\n ...cacheInvalidationProblems(f),\n ...listResetProblems(listFacts(f)),\n ...sessionRetirementPart\n .factProblems({ owner: f?.sessionOwner, predicateRetirements: f?.predicateRetirements })\n .map((p) => (p.startsWith('owner') ? `session${p[0].toUpperCase()}${p.slice(1)}` : p)),\n ]),\n ],\n build: (f) => [\n ...cacheInvalidationGuards(f, {\n sessionOwner: f.sessionOwner,\n memberRefreshes: f.memberRefreshes,\n }),\n ...listResetGuards(listFacts(f), f.sessionOwner),\n ...sessionRetirementPart.build({\n owner: f.sessionOwner,\n predicateRetirements: f.predicateRetirements,\n }),\n ],\n};\n\nexport const CACHE_GUARDS = [queryCacheGuard, domainEventRegistryGuard] as const;\n"]}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/modules/frontend-reads/cache.ts"],"names":[],"mappings":"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","sourcesContent":["// What may touch the query cache, and how: invalidation only through the domain-event registry,\n// aimed at keys a live query reads and never at an infinite list; an infinite list never reloaded\n// by an action; a whole-cache drop only by the session-retirement owner; and a registry whose every\n// event is produced, well formed, and awaited.\n\nimport ts from 'typescript';\nimport type { GenericGuardDefinition } from '../../node/suite/config.js';\nimport type { Finding, Guard, GuardContext } from '../../guard.js';\nimport type { FileView } from '../../reader/view.js';\nimport {\n identifierProblem,\n loaderProblem,\n pathProblem,\n reviewedProblems,\n type Loader,\n} from '../../support/facts.js';\nimport { escapeRegExp } from '../../support/text.js';\nimport {\n APP_CODE,\n alternation,\n callSpan,\n collapse,\n familyOf,\n filesUnder,\n identifierListProblem,\n infiniteKeyFamilies,\n isPrefix,\n keyModuleProblem,\n loadKeyObjects,\n pathListProblem,\n reachesInfinite,\n requiredFile,\n reviewedCallProblem,\n sampleKey,\n type KeyBuilders,\n type KeyModuleFacts,\n type ReviewedCall,\n} from './shared.js';\n\n/** query-core's registry factory and the two invalidation builders a registry entry uses. */\nconst REGISTRY_FACTORY = 'createDomainEventInvalidator';\nconst EXACT = 'exact';\n\n/** The registry: where it is. */\nexport interface RegistryFacts {\n path: string;\n}\n\n/** The object literal the registry module hands to query-core's registry factory, as code. */\nexport function registryObjectCode(file: FileView): { name: string; code: string } | null {\n const sf = file.sourceFile;\n let name: string | null = null;\n const find = (node: ts.Node) => {\n if (\n !name &&\n ts.isCallExpression(node) &&\n ts.isIdentifier(node.expression) &&\n node.expression.text === REGISTRY_FACTORY &&\n node.arguments[0] &&\n ts.isIdentifier(node.arguments[0])\n ) {\n name = node.arguments[0].text;\n }\n ts.forEachChild(node, find);\n };\n find(sf);\n if (!name) return null;\n let found: { name: string; code: string } | null = null;\n const visit = (node: ts.Node) => {\n if (\n !found &&\n ts.isVariableDeclaration(node) &&\n ts.isIdentifier(node.name) &&\n node.name.text === name &&\n node.initializer\n ) {\n found = {\n name: name!,\n code: file.code.slice(node.initializer.getStart(sf), node.initializer.getEnd()),\n };\n }\n ts.forEachChild(node, visit);\n };\n visit(sf);\n return found;\n}\n\nconst keyRefPattern = (objects: readonly string[]) =>\n new RegExp(`\\\\b(${alternation(objects)})\\\\.(\\\\w+)`, 'g');\n\n// =============================================================================================\n// Cache invalidation only through the registry; the registry's targets are read, and never an infinite list.\n// =============================================================================================\n\nexport interface CacheInvalidationFacts {\n registry: RegistryFacts;\n keyModule: KeyModuleFacts;\n /** The trees whose `queryKey:` sites are the app's live reads (hooks, components, pages). */\n readTrees: readonly string[];\n /** The suffix the key module names a family helper with (`listPrefix()` → `Prefix`). */\n familySuffix: string;\n}\n\n/** What the registry rule leaves to the other cache owners: the session-retirement owner, and a person's own refreshes. */\ninterface OwnedElsewhere {\n sessionOwner: string;\n memberRefreshes: readonly ReviewedCall[];\n}\n\nconst CLEAR_CALL = /\\.\\s*(invalidateQueries|removeQueries|resetQueries)(\\s*\\()/g;\nconst CACHE_WRITE_CALL =\n /\\b(refetchQueries|resetQueries|cancelQueries|setQueryData|setQueriesData|getQueryData|getQueriesData|invalidateQueries|removeQueries|ensureQueryData|prefetchQuery)\\b/;\n\n/** Every invalidate / remove / reset call in a file, as its collapsed text from the method name on. */\nexport function clearCalls(file: FileView): Array<{ index: number; call: string }> {\n return [...file.code.matchAll(CLEAR_CALL)].map((m) => {\n const name = (m.index ?? 0) + m[0].indexOf(m[1]);\n const open = (m.index ?? 0) + m[0].length - 1;\n return { index: name, call: collapse(callSpan(file.code, name, open)) };\n });\n}\n\n/** The text of the line holding `index`, so a match is judged by the statement it starts in. */\nfunction lineAt(code: string, index: number): string {\n const start = code.lastIndexOf('\\n', index - 1) + 1;\n const end = code.indexOf('\\n', index);\n return code.slice(start, end === -1 ? code.length : end);\n}\n\n/** Key families some live query reads: a `queryKey` built from a key method outside a cache call, or a key object handed whole. */\nexport function readKeyFamilies(\n files: ReadonlyArray<{ code: string }>,\n objects: readonly string[],\n familySuffix: string,\n): Set<string> {\n const read = new Set<string>();\n const names = alternation(objects);\n // Matched over the whole file, so a key Prettier wraps onto the next line still reads; a match is\n // skipped when the line it starts on is a cache call's.\n for (const { code } of files) {\n for (const m of code.matchAll(new RegExp(`\\\\bqueryKey\\\\s*[:=]\\\\s*(${names})\\\\.(\\\\w+)`, 'g')))\n if (!CACHE_WRITE_CALL.test(lineAt(code, m.index ?? 0)))\n read.add(familyOf(`${m[1]}.${m[2]}`, familySuffix));\n for (const m of code.matchAll(\n new RegExp(`[\\\\w$]+\\\\s*:\\\\s*(${names})\\\\b(?![\\\\w$]|\\\\s*\\\\.)`, 'g'),\n ))\n if (!CACHE_WRITE_CALL.test(lineAt(code, m.index ?? 0))) read.add(`${m[1]}.*`);\n }\n return read;\n}\n\n/**\n * The argument count of the call whose `(` is at `open`, or null when there is no call there. A\n * trailing comma (the one Prettier writes after the last argument of a wrapped call) ends no\n * argument, so it adds none.\n */\nfunction argCountAt(code: string, open: number): number | null {\n if (code[open] !== '(') return null;\n let depth = 0;\n let count = 0;\n let argOpen = false;\n for (let i = open; i < code.length; i += 1) {\n const ch = code[i];\n if ('([{'.includes(ch)) {\n depth += 1;\n if (depth > 1) argOpen = true;\n } else if (')]}'.includes(ch)) {\n depth -= 1;\n if (depth === 0) return count + (argOpen ? 1 : 0);\n } else if (ch === ',' && depth === 1) {\n count += 1;\n argOpen = false;\n } else if (depth >= 1 && !/\\s/.test(ch)) argOpen = true;\n }\n return null;\n}\n\n/** Each key method → the argument counts the app's live reads build it with. */\nexport function readArgCounts(\n files: ReadonlyArray<{ code: string }>,\n objects: readonly string[],\n): Map<string, Set<number>> {\n const counts = new Map<string, Set<number>>();\n const re = new RegExp(`\\\\bqueryKey\\\\s*[:=]\\\\s*(${alternation(objects)})\\\\.(\\\\w+)\\\\(`, 'g');\n for (const { code } of files) {\n for (const m of code.matchAll(re)) {\n if (CACHE_WRITE_CALL.test(lineAt(code, m.index ?? 0))) continue;\n const n = argCountAt(code, (m.index ?? 0) + m[0].length - 1);\n if (n === null) continue;\n const ref = `${m[1]}.${m[2]}`;\n counts.set(ref, (counts.get(ref) ?? new Set()).add(n));\n }\n }\n return counts;\n}\n\n/** Registry targets that miss: unread, an exact on a family, an exact shaped unlike every read, or one reaching an infinite list. */\nexport function registryTargetProblems(input: {\n registryCode: string;\n reads: ReadonlyArray<{ code: string }>;\n builders: KeyBuilders;\n familySuffix: string;\n}): string[] {\n const { registryCode, reads, builders, familySuffix } = input;\n const objects = Object.keys(builders);\n const refs = [\n ...new Set([...registryCode.matchAll(keyRefPattern(objects))].map((m) => `${m[1]}.${m[2]}`)),\n ];\n const read = readKeyFamilies(reads, objects, familySuffix);\n const readKeys = [...read]\n .map((f) => sampleKey(f, builders))\n .filter((k): k is unknown[] => k !== null);\n const problems: string[] = [];\n for (const ref of refs) {\n if (read.has(familyOf(ref, familySuffix)) || read.has(`${ref.split('.')[0]}.*`)) continue;\n const key = sampleKey(ref, builders);\n if (key === null || !readKeys.some((readKey) => isPrefix(key, readKey)))\n problems.push(`${ref}: no live query reads this key`);\n }\n const counts = readArgCounts(reads, objects);\n const exactRe = new RegExp(`\\\\b${EXACT}\\\\(\\\\s*(${alternation(objects)})\\\\.(\\\\w+)`, 'g');\n const shaped = new Set<string>();\n for (const m of registryCode.matchAll(exactRe)) {\n const ref = `${m[1]}.${m[2]}`;\n if (shaped.has(ref)) continue;\n if (m[2] === 'all' || (m[2].endsWith(familySuffix) && m[2] !== familySuffix)) {\n shaped.add(ref);\n problems.push(\n `${ref}: an exact target on a key family (only a prefix target reaches a family)`,\n );\n continue;\n }\n const n = argCountAt(registryCode, (m.index ?? 0) + m[0].length);\n const readCounts = counts.get(ref);\n if (n !== null && readCounts && !readCounts.has(n)) {\n shaped.add(ref);\n problems.push(\n `${ref}: an exact target built with ${n} argument(s), which no live read builds`,\n );\n }\n }\n const infinite = infiniteKeyFamilies(reads, objects, familySuffix);\n for (const ref of refs)\n if (reachesInfinite(ref, infinite, builders, familySuffix))\n problems.push(`${ref}: reaches an infinite list`);\n return problems;\n}\n\nfunction registryProblem(value: unknown, problems: string[]): void {\n const facts = value as RegistryFacts | undefined;\n if (!facts || typeof facts !== 'object') problems.push('registry is missing');\n else pathProblem(facts.path, 'registry.path', problems);\n}\n\nconst cacheInvalidationProblems = (facts: CacheInvalidationFacts) => {\n const problems: string[] = [];\n registryProblem(facts?.registry, problems);\n keyModuleProblem(facts?.keyModule, problems);\n pathListProblem(facts?.readTrees, 'readTrees', problems);\n identifierProblem(facts?.familySuffix, 'familySuffix', problems);\n return problems;\n};\n\nconst cacheInvalidationGuards = (facts: CacheInvalidationFacts, owned: OwnedElsewhere): Guard[] => [\n {\n title: 'saved reads are refreshed, removed, or reset only through the domain-event registry',\n description:\n `${facts.registry.path} — the object it hands to query-core's ${REGISTRY_FACTORY} — is the one place that turns something that ` +\n 'happened into what the cache does: refresh, remove, or reset. No other file calls invalidateQueries, removeQueries, or ' +\n 'resetQueries: emit the domain event instead, and patch an infinite list in place. The only other owners are the session-' +\n `retirement owner (${owned.sessionOwner}) and a person's own refresh, declared once beside the list-reload rule.`,\n run(context) {\n const { file: registry, findings } = requiredFile(\n context,\n facts.registry.path,\n 'the domain-event registry',\n );\n if (registry && !registryObjectCode(registry))\n findings.push({\n file: registry.path,\n detail: `no registry object handed to ${REGISTRY_FACTORY}`,\n });\n const refreshes = new Set(owned.memberRefreshes.map((r) => `${r.path} ${r.call}`));\n for (const file of context.files(APP_CODE)) {\n if (file.path === facts.registry.path || file.path === owned.sessionOwner) continue;\n for (const { index, call } of clearCalls(file)) {\n if (refreshes.has(`${file.path} ${call}`)) continue;\n findings.push({\n file: file.path,\n line: file.lineOf(index),\n detail: `outside the registry: ${call.slice(0, 120)}`,\n });\n }\n }\n return findings;\n },\n },\n {\n title: 'every registry cache target is a key a live query reads, and never an infinite list',\n description:\n `Every key the registry in ${facts.registry.path} writes is reached by a live query's key (a queryKey built from the same key ` +\n `method in ${facts.readTrees.join(', ')}, or a key object handed whole to a reader); an exact target names a leaf the reads build ` +\n `with the same arguments, never a family (all, or a …${facts.familySuffix} helper); and no target reaches an infinite list — named, ` +\n 'through its family helper, or through its scope. A write aimed at a key nothing reads is a silent no-op, and invalidating an ' +\n 'infinite list re-runs every loaded page.',\n timeoutMs: 120_000,\n async run(context: GuardContext): Promise<Finding[]> {\n const { file: registry, findings } = requiredFile(\n context,\n facts.registry.path,\n 'the domain-event registry',\n );\n if (!registry) return findings;\n const object = registryObjectCode(registry);\n if (!object)\n return [\n { file: registry.path, detail: `no registry object handed to ${REGISTRY_FACTORY}` },\n ];\n const builders = await loadKeyObjects(facts.keyModule);\n const { files, findings: missing } = filesUnder(context, facts.readTrees);\n findings.push(...missing);\n for (const detail of registryTargetProblems({\n registryCode: object.code,\n reads: files,\n builders,\n familySuffix: facts.familySuffix,\n })) {\n findings.push({ file: registry.path, detail });\n }\n return findings;\n },\n },\n];\n\n// =============================================================================================\n// No action-driven reload of an infinite list.\n// =============================================================================================\n\nexport interface ListResetFacts {\n keyModule: KeyModuleFacts;\n familySuffix: string;\n /** The app predicate that is true for a query holding loaded pages; a reload filtered by its negation reloads no shown list. */\n loadedPagesPredicate: string;\n /** A person's own refreshes (pull-to-refresh, a Refresh button): each call site with its why. */\n memberRefreshes: readonly ReviewedCall[];\n /** Hooks that run a member's own refresh, each handed only to its refresh control on the named prop; [] for none. */\n refreshHandoffs: ReadonlyArray<{ hook: string; control: string; prop: string }>;\n}\n\nconst RELOAD_CALL = /\\b(resetQueries|refetchQueries|removeQueries)\\s*\\(/g;\nconst PATCH_CALL = /\\b(setQueryData|setQueriesData)\\s*(?:<[^>]*>)?\\s*\\(/g;\nconst FIRST_PAGE_TRIM =\n /\\bpages\\.slice\\(\\s*0\\s*,\\s*1\\s*\\)|\\bpageParams\\.slice\\(\\s*0\\s*,\\s*1\\s*\\)|\\bpages\\s*:\\s*\\[\\s*[\\w.?]+\\.pages\\[0\\]\\s*\\]/;\n\n/** The key refs a call targets: its key method, or every one a constant map it indexes holds; null when unresolved. */\nfunction targetRefs(call: string, code: string, objects: readonly string[]): string[] | null {\n const names = alternation(objects);\n const direct = call.match(new RegExp(`\\\\bqueryKey\\\\s*:\\\\s*(${names})\\\\.(\\\\w+)`));\n if (direct) return [`${direct[1]}.${direct[2]}`];\n const indexed = call.match(/\\bqueryKey\\s*:\\s*([A-Za-z_]\\w*)\\[/);\n if (!indexed) return null;\n const decl = code.match(new RegExp(`\\\\bconst \\\\s*${escapeRegExp(indexed[1])}\\\\b[^=]*=\\\\s*\\\\{`));\n if (!decl) return null;\n const open = (decl.index ?? 0) + decl[0].length - 1;\n const refs = [...callSpan(code, open, open).matchAll(keyRefPattern(objects))].map(\n (m) => `${m[1]}.${m[2]}`,\n );\n return refs.length ? refs : null;\n}\n\n/** Every call that reloads or trims an infinite list, outside the reviewed reloads. */\nexport function listReloads(\n files: readonly FileView[],\n builders: KeyBuilders,\n facts: Pick<ListResetFacts, 'familySuffix' | 'loadedPagesPredicate' | 'memberRefreshes'>,\n sessionOwner?: string,\n) {\n const objects = Object.keys(builders);\n const infinite = infiniteKeyFamilies(files, objects, facts.familySuffix);\n const pinned = new Set(facts.memberRefreshes.map((r) => `${r.path} ${r.call}`));\n const excluded = new RegExp(`!${escapeRegExp(facts.loadedPagesPredicate)}\\\\(\\\\s*query\\\\s*\\\\)`);\n const found: Finding[] = [];\n const present = new Set<string>();\n for (const file of files) {\n if (file.path === sessionOwner) continue;\n const code = file.code;\n for (const m of code.matchAll(RELOAD_CALL)) {\n const call = collapse(callSpan(code, m.index ?? 0, (m.index ?? 0) + m[0].length - 1));\n present.add(`${file.path} ${call}`);\n if (pinned.has(`${file.path} ${call}`)) continue;\n const refs = targetRefs(call, code, objects);\n const reloads = refs\n ? refs.some((ref) => reachesInfinite(ref, infinite, builders, facts.familySuffix))\n : !excluded.test(call);\n if (reloads)\n found.push({\n file: file.path,\n line: file.lineOf(m.index ?? 0),\n detail: `${refs ? 'reloads an infinite list' : 'reloads queries its key does not name'}: ${call.slice(0, 120)}`,\n });\n }\n for (const m of code.matchAll(PATCH_CALL)) {\n const call = callSpan(code, m.index ?? 0, (m.index ?? 0) + m[0].length - 1);\n if (FIRST_PAGE_TRIM.test(call))\n found.push({\n file: file.path,\n line: file.lineOf(m.index ?? 0),\n detail: `trims a list to its first page: ${collapse(call).slice(0, 120)}`,\n });\n }\n }\n for (const r of facts.memberRefreshes)\n if (!present.has(`${r.path} ${r.call}`))\n found.push({ file: r.path, detail: `stale member refresh: ${r.call} is no longer there` });\n return { infinite, findings: found };\n}\n\n/** Each refresh hook's result used anywhere but on its refresh control's prop, and each hook no file calls. */\nexport function refreshHandoffMisuses(\n files: readonly FileView[],\n handoffs: ListResetFacts['refreshHandoffs'],\n): Finding[] {\n const findings: Finding[] = [];\n for (const { hook, control, prop } of handoffs) {\n let callers = 0;\n for (const file of files) {\n for (const m of file.code.matchAll(\n new RegExp(`const\\\\s+(\\\\w+)\\\\s*=\\\\s*${escapeRegExp(hook)}\\\\(`, 'g'),\n )) {\n callers += 1;\n const name = m[1];\n const uses = [...file.code.matchAll(new RegExp(`\\\\b${name}\\\\b`, 'g'))].length - 1;\n const handed = [\n ...file.code.matchAll(\n new RegExp(`<${escapeRegExp(control)}[^>]*${escapeRegExp(prop)}=\\\\{${name}\\\\}`, 'g'),\n ),\n ].length;\n if (uses !== handed)\n findings.push({\n file: file.path,\n line: file.lineOf(m.index ?? 0),\n detail: `${hook}()'s refresh is used other than as <${control} ${prop}>`,\n });\n }\n }\n if (!callers)\n findings.push({ file: '(refreshHandoffs)', detail: `stale entry: nothing calls ${hook}` });\n }\n return findings;\n}\n\nconst listResetProblems = (facts: ListResetFacts) => {\n const problems: string[] = [];\n keyModuleProblem(facts?.keyModule, problems);\n identifierProblem(facts?.familySuffix, 'familySuffix', problems);\n identifierProblem(facts?.loadedPagesPredicate, 'loadedPagesPredicate', problems);\n reviewedCallProblem(facts?.memberRefreshes, 'memberRefreshes', problems);\n if (!Array.isArray(facts?.refreshHandoffs))\n problems.push('refreshHandoffs is missing (declare [] when there is none)');\n else\n facts.refreshHandoffs.forEach((h, i) => {\n identifierProblem(h?.hook, `refreshHandoffs[${i}].hook`, problems);\n identifierProblem(h?.control, `refreshHandoffs[${i}].control`, problems);\n identifierProblem(h?.prop, `refreshHandoffs[${i}].prop`, problems);\n });\n return problems;\n};\n\nconst listResetGuards = (facts: ListResetFacts, sessionOwner: string): Guard[] => [\n {\n title: 'an action never reloads an infinite list',\n description:\n \"An action's change is placed, moved, or patched in place in an infinite list; no resetQueries / refetchQueries / removeQueries \" +\n `whose key reaches one (directly, through its family helper or scope, or through a constant map of keys), none whose key cannot ` +\n `be resolved unless its predicate excludes every query holding loaded pages (!${facts.loadedPagesPredicate}(query)), and no cache ` +\n \"write that trims a list to its first page. A person's own refresh is declared with its why, and a refresh hook's result is only \" +\n 'ever handed to its refresh control.',\n timeoutMs: 120_000,\n async run(context) {\n const builders = await loadKeyObjects(facts.keyModule);\n const files = context.files(APP_CODE);\n const { infinite, findings } = listReloads(files, builders, facts, sessionOwner);\n if (!infinite.size)\n findings.push({\n file: facts.keyModule.path,\n detail: 'no infinite list found in the app, so the guard checks nothing',\n });\n findings.push(...refreshHandoffMisuses(files, facts.refreshHandoffs));\n return findings;\n },\n },\n];\n\n// =============================================================================================\n// An unscoped cancel or a whole-cache clear only by session retirement.\n// =============================================================================================\n\nexport interface SessionRetirementFacts {\n /** The session-retirement owner. */\n owner: string;\n /** Retirements beyond a session's end that the owner runs by predicate (a member leaving a group), each with its why; [] for none. */\n predicateRetirements: ReadonlyArray<{ trigger: string; why: string }>;\n}\n\nconst WHOLE_CACHE_DROP = [\n /\\bcancelQueries\\(\\s*\\)/g,\n /\\bcancelQueries\\(\\s*undefined\\b/g,\n /\\bcancelQueries\\(\\s*\\{(?![^}]*\\bqueryKey\\b)/g,\n /\\bget(?:Query|Mutation)Cache\\(\\)\\s*\\.clear\\(/g,\n /\\b\\w*[cC]lient\\s*\\.clear\\(\\s*\\)/g,\n];\n\nexport function wholeCacheDrops(file: FileView): Array<{ index: number; text: string }> {\n return WHOLE_CACHE_DROP.flatMap((re) =>\n [...file.code.matchAll(re)].map((m) => ({ index: m.index ?? 0, text: m[0] })),\n ).sort((a, b) => a.index - b.index);\n}\n\nconst sessionRetirementPart = {\n factProblems(facts: SessionRetirementFacts) {\n const problems: string[] = [];\n pathProblem(facts?.owner, 'owner', problems);\n reviewedProblems(facts?.predicateRetirements, 'predicateRetirements', problems, {\n key: 'trigger',\n });\n return problems;\n },\n build: (facts: SessionRetirementFacts): Guard[] => [\n {\n title: 'an unscoped cancel or a whole-cache clear runs only in the session-retirement owner',\n description:\n `A cancelQueries with no key (bare, or selected by a predicate) and a query or mutation cache clear drop reads the call site ` +\n `cannot name, so only ${facts.owner} runs them: when a session ends it cancels every query and clears the query cache` +\n (facts.predicateRetirements.length\n ? `, and it cancels by predicate for ${facts.predicateRetirements.map((r) => r.trigger).join('; ')}`\n : '') +\n '. Everywhere else a cancel names its key, and nothing clears a cache.',\n run(context) {\n const { file: owner, findings } = requiredFile(\n context,\n facts.owner,\n 'the session-retirement owner',\n );\n for (const file of context.files(APP_CODE)) {\n if (file.path === facts.owner) continue;\n for (const drop of wholeCacheDrops(file))\n findings.push({\n file: file.path,\n line: file.lineOf(drop.index),\n detail: `outside the session-retirement owner: ${drop.text}`,\n });\n }\n if (owner) {\n if (!/\\bcancelQueries\\(\\s*\\)/.test(owner.code))\n findings.push({\n file: owner.path,\n detail: 'the owner no longer cancels every query when a session ends',\n });\n if (!/getQueryCache\\(\\)\\s*\\.clear\\(/.test(owner.code))\n findings.push({\n file: owner.path,\n detail: 'the owner no longer clears the query cache when a session ends',\n });\n const byPredicate = [...owner.code.matchAll(/\\bcancelQueries\\(\\s*\\{\\s*predicate\\s*:/g)]\n .length;\n if (byPredicate !== facts.predicateRetirements.length) {\n findings.push({\n file: owner.path,\n detail: `the owner cancels by predicate ${byPredicate} time(s); ${facts.predicateRetirements.length} predicate retirement(s) are reviewed`,\n });\n }\n }\n return findings;\n },\n },\n ],\n};\n\n// =============================================================================================\n// The domain-event registry: every event produced, every variant registered and well formed, every\n// notification handed on.\n// =============================================================================================\n\nexport interface DomainEventRegistryFacts {\n registry: RegistryFacts & {\n /** A loader of the registry object itself (event type → invalidation builder). */\n load: Loader<Record<string, unknown>>;\n };\n /** A loader of the core's domain-event schema: a discriminated union on `type`, each variant carrying an `ids` object. */\n eventSchema: Loader<unknown>;\n /** The app's functions that dispatch a domain event and return the refresh's promise. */\n notifiers: readonly string[];\n}\n\ntype ZodLike = {\n def?: any;\n _def?: any;\n shape?: Record<string, ZodLike>;\n options?: unknown[];\n value?: unknown;\n};\nconst defOf = (field: ZodLike) => field?.def ?? field?._def ?? {};\nconst kindOf = (field: ZodLike): 'optional' | 'nullable' | 'enum' | 'required' => {\n const type = defOf(field).type;\n return type === 'optional' || type === 'nullable' || type === 'enum' ? type : 'required';\n};\n\n/** Synthetic `ids` for one variant: every field filled, then each optional field dropped in turn. */\nexport function syntheticIds(idsSchema: ZodLike): Array<Record<string, unknown>> {\n const baseline: Record<string, unknown> = {};\n const optional: string[] = [];\n for (const [key, field] of Object.entries(idsSchema?.shape ?? {})) {\n const kind = kindOf(field);\n if (kind === 'enum') baseline[key] = (field.options as unknown[])[0];\n else if (kind === 'optional') {\n optional.push(key);\n const inner = defOf(field).innerType as ZodLike;\n baseline[key] = kindOf(inner) === 'enum' ? (inner.options as unknown[])[0] : `test-${key}`;\n } else baseline[key] = `test-${key}`;\n }\n return [\n { ...baseline },\n ...optional.map((key) =>\n Object.fromEntries(Object.entries(baseline).filter(([k]) => k !== key)),\n ),\n ];\n}\n\n/** What a query-core registry entry may do to the reads it matches, and how a refresh refetches. */\nconst CACHE_ACTIONS: ReadonlySet<unknown> = new Set([undefined, 'refresh', 'remove', 'reset']);\nconst REFETCH_TYPES: ReadonlySet<unknown> = new Set([undefined, 'active', 'all', 'none']);\n\n/** Why a builder's answer is not a list of well-formed invalidations, or null. */\nexport function malformedInvalidations(answer: unknown): string | null {\n if (!Array.isArray(answer)) return 'does not answer a list of invalidations';\n for (const inv of answer as Array<Record<string, unknown>>) {\n if (inv?.kind === 'exact' || inv?.kind === 'prefix') {\n if (!Array.isArray(inv.queryKey) || !inv.queryKey.length)\n return `a ${inv.kind} invalidation with no key`;\n } else if (inv?.kind === 'predicate') {\n if (\n typeof inv.description !== 'string' ||\n !inv.description ||\n typeof inv.match !== 'function'\n )\n return 'a predicate invalidation with no description or matcher';\n } else return `an invalidation of unknown kind ${String(inv?.kind)}`;\n if (!CACHE_ACTIONS.has(inv.action))\n return `a ${inv.kind} invalidation with unknown action ${String(inv.action)}`;\n if (!REFETCH_TYPES.has(inv.refetchType))\n return `a ${inv.kind} invalidation with unknown refetchType ${String(inv.refetchType)}`;\n if ((inv.action === 'remove' || inv.action === 'reset') && inv.refetchType !== undefined) {\n return `a ${inv.action} invalidation with a refetchType, which only a refresh takes`;\n }\n }\n return null;\n}\n\n/** Whether the call at `index` starts a statement, so its promise is dropped. */\nfunction startsStatement(code: string, index: number): boolean {\n const before = code.slice(0, index).trimEnd();\n return before.length === 0 || ';{})'.includes(before.charAt(before.length - 1));\n}\n\nexport function droppedNotifications(\n file: FileView,\n notifiers: readonly string[],\n): Array<{ index: number; name: string }> {\n const hits: Array<{ index: number; name: string }> = [];\n for (const m of file.code.matchAll(new RegExp(`\\\\b(${alternation(notifiers)})\\\\(`, 'g'))) {\n const index = m.index ?? 0;\n if (/function\\s+$/.test(file.code.slice(0, index))) continue;\n if (startsStatement(file.code, index)) hits.push({ index, name: m[1] });\n }\n return hits;\n}\n\nexport const domainEventRegistryGuard: GenericGuardDefinition<DomainEventRegistryFacts> = {\n id: 'domainEventRegistry',\n absentWhen: false,\n factProblems(facts) {\n const problems: string[] = [];\n registryProblem(facts?.registry, problems);\n loaderProblem(facts?.registry?.load, 'registry.load', problems);\n loaderProblem(facts?.eventSchema, 'eventSchema', problems);\n identifierListProblem(facts?.notifiers, 'notifiers', problems, { nonEmpty: true });\n return problems;\n },\n build: (facts) => [\n {\n title: 'every registered domain event has a producer in the app',\n description:\n `Every event type the registry in ${facts.registry.path} handles is emitted somewhere in the app's own code (its quoted type ` +\n \"outside the registry, in the client or functions tree); the core's schema holds every variant by construction, so it is no \" +\n 'evidence. Restore the producer, or delete the event from the core and the registry.',\n async run(context) {\n const registry = (await facts.registry.load()) ?? {};\n const findings: Finding[] = [];\n const haystack = context\n .files({\n roots: ['app', 'functions'],\n optionalRoots: ['functions'],\n kinds: ['code'],\n tests: false,\n })\n .filter((f) => f.path !== facts.registry.path)\n .map((f) => f.code)\n .join('\\n');\n const produced = (type: string) =>\n haystack.includes(`'${type}'`) || haystack.includes(`\"${type}\"`);\n for (const type of Object.keys(registry))\n if (!produced(type))\n findings.push({ file: facts.registry.path, detail: `${type}: no producer in the app` });\n return findings;\n },\n },\n {\n title: 'every core domain-event variant has a registry entry with well-formed invalidations',\n description:\n `Every variant of the core's domain-event schema has an entry in the registry in ${facts.registry.path}, and the entry answers, ` +\n 'for every shape of its ids (each optional id present and absent), a list of invalidations that are each an exact or prefix ' +\n 'target with a non-empty key, or a predicate with a description and a matcher.',\n async run(context) {\n // The loaded registry is judged, but the file the facts name must be the one it comes from.\n if (!context.reader.exists(facts.registry.path))\n return [{ file: facts.registry.path, detail: 'the registry file does not exist' }];\n context.file(facts.registry.path);\n const registry = (await facts.registry.load()) ?? {};\n const schema = (await facts.eventSchema()) as ZodLike;\n const variants = (schema?.options ?? []) as ZodLike[];\n if (!variants.length)\n return [\n {\n file: '(eventSchema)',\n detail: 'the loader did not answer a discriminated union of variants',\n },\n ];\n const findings: Finding[] = [];\n for (const variant of variants) {\n const type = String(variant.shape?.type?.value ?? '');\n if (!type) {\n findings.push({ file: '(eventSchema)', detail: 'a variant carries no literal type' });\n continue;\n }\n const build = registry[type];\n if (typeof build !== 'function') {\n findings.push({ file: facts.registry.path, detail: `${type}: no registry entry` });\n continue;\n }\n for (const ids of syntheticIds(variant.shape?.ids as ZodLike)) {\n let problem: string | null;\n try {\n problem = malformedInvalidations((build as (ids: unknown) => unknown)(ids));\n } catch (err) {\n problem = `throws for ids ${JSON.stringify(ids)}: ${(err as Error)?.message ?? err}`;\n }\n if (problem)\n findings.push({ file: facts.registry.path, detail: `${type}: ${problem}` });\n }\n }\n return findings;\n },\n },\n {\n title: 'every domain-event notification hands its refresh promise on',\n description:\n `A call to ${facts.notifiers.join(' / ')} returns the promise of the refresh it starts; a mutation returns or awaits it so it stays ` +\n 'pending until the refreshed data is on screen. A call in statement position drops it silently: return it, await it, pass it ' +\n 'on, or mark a deliberate fire-and-forget with void.',\n run(context) {\n const findings: Finding[] = [];\n let calls = 0;\n const callRe = new RegExp(`\\\\b(?:${alternation(facts.notifiers)})\\\\(`, 'g');\n for (const file of context.files(APP_CODE)) {\n calls += [...file.code.matchAll(callRe)].length;\n for (const hit of droppedNotifications(file, facts.notifiers)) {\n findings.push({\n file: file.path,\n line: file.lineOf(hit.index),\n detail: `${hit.name}(…) in statement position drops its refresh`,\n });\n }\n }\n if (!calls)\n findings.push({\n file: '(notifiers)',\n detail: `nothing in the app calls ${facts.notifiers.join(' / ')}, so the guard checks nothing`,\n });\n return findings;\n },\n },\n ],\n};\n\n/**\n * Every fact the query-cache owners need, declared once: the registry (the one place something that\n * happened changes saved reads), a person's own refreshes, and the session-retirement owner.\n */\nexport interface QueryCacheFacts extends CacheInvalidationFacts {\n loadedPagesPredicate: string;\n memberRefreshes: readonly ReviewedCall[];\n refreshHandoffs: ListResetFacts['refreshHandoffs'];\n sessionOwner: string;\n predicateRetirements: SessionRetirementFacts['predicateRetirements'];\n}\n\nconst listFacts = (f: QueryCacheFacts | undefined): ListResetFacts => ({\n keyModule: f?.keyModule as KeyModuleFacts,\n familySuffix: f?.familySuffix as string,\n loadedPagesPredicate: f?.loadedPagesPredicate as string,\n memberRefreshes: f?.memberRefreshes as readonly ReviewedCall[],\n refreshHandoffs: f?.refreshHandoffs as ListResetFacts['refreshHandoffs'],\n});\n\nexport const queryCacheGuard: GenericGuardDefinition<QueryCacheFacts> = {\n id: 'queryCache',\n absentWhen: false,\n factProblems: (f) => [\n ...new Set([\n ...cacheInvalidationProblems(f),\n ...listResetProblems(listFacts(f)),\n ...sessionRetirementPart\n .factProblems({ owner: f?.sessionOwner, predicateRetirements: f?.predicateRetirements })\n .map((p) => (p.startsWith('owner') ? `session${p[0].toUpperCase()}${p.slice(1)}` : p)),\n ]),\n ],\n build: (f) => [\n ...cacheInvalidationGuards(f, {\n sessionOwner: f.sessionOwner,\n memberRefreshes: f.memberRefreshes,\n }),\n ...listResetGuards(listFacts(f), f.sessionOwner),\n ...sessionRetirementPart.build({\n owner: f.sessionOwner,\n predicateRetirements: f.predicateRetirements,\n }),\n ],\n};\n\nexport const CACHE_GUARDS = [queryCacheGuard, domainEventRegistryGuard] as const;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttt-productions/repo-guards",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ttt-productions/ttt-packages.git",