@fairfox/polly 0.4.2 ā 0.5.1
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,16 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../vendor/verify/src/codegen/tla.ts", "../vendor/verify/src/runner/docker.ts", "../vendor/verify/src/cli.ts", "../vendor/analysis/src/extract/types.ts", "../vendor/analysis/src/extract/handlers.ts", "../vendor/verify/src/codegen/config.ts", "../vendor/verify/src/config/parser.ts"],
|
|
3
|
+
"sources": ["../vendor/verify/src/codegen/tla.ts", "../vendor/verify/src/runner/docker.ts", "../vendor/verify/src/cli.ts", "../vendor/analysis/src/extract/types.ts", "../vendor/analysis/src/extract/handlers.ts", "../vendor/analysis/src/extract/relationships.ts", "../vendor/verify/src/codegen/config.ts", "../vendor/verify/src/config/parser.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"// TLA+ specification generator\n\nimport type { VerificationConfig, CodebaseAnalysis } from \"../types\";\nimport type { MessageHandler } from \"../core/model\";\n\nexport class TLAGenerator {\n private lines: string[] = [];\n private indent = 0;\n\n generate(\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n ): {\n spec: string;\n cfg: string;\n } {\n this.lines = [];\n this.indent = 0;\n\n const spec = this.generateSpec(config, analysis);\n const cfg = this.generateConfig(config, analysis);\n\n return { spec, cfg };\n }\n\n private generateSpec(config: VerificationConfig, analysis: CodebaseAnalysis): string {\n this.lines = [];\n this.indent = 0;\n\n this.addHeader();\n this.addExtends();\n this.addConstants(config, analysis);\n this.addMessageTypes(config, analysis);\n this.addStateType(config, analysis);\n this.addVariables();\n this.addInit(config, analysis);\n this.addActions(config, analysis);\n this.addRouteWithHandlers(config, analysis);\n this.addNext(config, analysis);\n this.addSpec();\n this.addInvariants(config, analysis);\n\n return this.lines.join(\"\\n\");\n }\n\n private generateConfig(config: VerificationConfig, analysis: CodebaseAnalysis): string {\n const lines: string[] = [];\n\n lines.push(\"SPECIFICATION UserSpec\");\n lines.push(\"\");\n lines.push(\"\\\\* Constants\");\n lines.push(\"CONSTANTS\");\n\n // Generate context set (reduced for faster verification)\n lines.push(\" Contexts = {background, content, popup}\");\n\n // Message bounds (defaults chosen for reasonable verification time)\n lines.push(` MaxMessages = ${config.messages.maxInFlight || 3}`);\n lines.push(` MaxTabId = ${config.messages.maxTabs || 1}`);\n lines.push(\" TimeoutLimit = 3\");\n\n // State bounds from config\n for (const [field, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig === \"object\" && fieldConfig !== null) {\n if (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) {\n const constName = this.fieldToConstName(field);\n lines.push(` ${constName}_MaxLength = ${fieldConfig.maxLength}`);\n }\n if (\"max\" in fieldConfig && fieldConfig.max !== null) {\n const constName = this.fieldToConstName(field);\n lines.push(` ${constName}_Max = ${fieldConfig.max}`);\n }\n if (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null) {\n const constName = this.fieldToConstName(field);\n lines.push(` ${constName}_MaxSize = ${fieldConfig.maxSize}`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\"\\\\* Invariants to check\");\n lines.push(\"INVARIANTS\");\n lines.push(\" TypeOK\");\n lines.push(\" NoRoutingLoops\");\n lines.push(\" UserStateTypeInvariant\");\n lines.push(\"\");\n lines.push(\"\\\\* State constraint\");\n lines.push(\"CONSTRAINT\");\n lines.push(\" StateConstraint\");\n\n return lines.join(\"\\n\");\n }\n\n private addHeader(): void {\n this.line(\"------------------------- MODULE UserApp -------------------------\");\n this.line(\"(*\");\n this.line(\" Auto-generated TLA+ specification for web extension\");\n this.line(\" \");\n this.line(\" Generated from:\");\n this.line(\" - TypeScript type definitions\");\n this.line(\" - Verification configuration\");\n this.line(\" \");\n this.line(\" This spec extends MessageRouter with:\");\n this.line(\" - Application-specific state types\");\n this.line(\" - Message type definitions\");\n this.line(\" - State transition actions\");\n this.line(\"*)\");\n this.line(\"\");\n }\n\n private addExtends(): void {\n this.line(\"EXTENDS MessageRouter\");\n this.line(\"\");\n }\n\n private addConstants(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n // MessageRouter already defines: Contexts, MaxMessages, MaxTabId, TimeoutLimit\n // We only add application-specific constants\n\n const hasCustomConstants = Object.entries(config.state).some(([field, fieldConfig]) => {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) return false;\n return (\n (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) ||\n (\"max\" in fieldConfig && fieldConfig.max !== null) ||\n (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null)\n );\n });\n\n if (!hasCustomConstants) {\n // No custom constants needed\n return;\n }\n\n this.line(\"\\\\* Application-specific constants\");\n this.line(\"CONSTANTS\");\n this.indent++;\n\n let first = true;\n for (const [field, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig === \"object\" && fieldConfig !== null) {\n const constName = this.fieldToConstName(field);\n\n if (\"maxLength\" in fieldConfig && fieldConfig.maxLength !== null) {\n this.line(`${first ? \"\" : \",\"}${constName}_MaxLength \\\\* Max length for ${field}`);\n first = false;\n }\n if (\"max\" in fieldConfig && fieldConfig.max !== null) {\n this.line(`${first ? \"\" : \",\"}${constName}_Max \\\\* Max value for ${field}`);\n first = false;\n }\n if (\"maxSize\" in fieldConfig && fieldConfig.maxSize !== null) {\n this.line(`${first ? \"\" : \",\"}${constName}_MaxSize \\\\* Max size for ${field}`);\n first = false;\n }\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private addStateType(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n // Define Value type for generic sequences and maps\n // Use a finite set for model checking\n this.line(\"\\\\* Generic value type for sequences and maps\");\n this.line(\"\\\\* Bounded to allow model checking\");\n this.line('Value == {\"v1\", \"v2\", \"v3\"}');\n this.line(\"\");\n\n // Define Keys type for map domains\n this.line(\"\\\\* Generic key type for maps\");\n this.line(\"\\\\* Bounded to allow model checking\");\n this.line('Keys == {\"k1\", \"k2\", \"k3\"}');\n this.line(\"\");\n\n this.line(\"\\\\* Application state type definition\");\n this.line(\"State == [\");\n this.indent++;\n\n const stateFields: string[] = [];\n\n for (const [fieldPath, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n const fieldName = this.sanitizeFieldName(fieldPath);\n const tlaType = this.fieldConfigToTLAType(fieldPath, fieldConfig, config);\n\n stateFields.push(`${fieldName}: ${tlaType}`);\n }\n\n for (let i = 0; i < stateFields.length; i++) {\n const field = stateFields[i];\n const suffix = i < stateFields.length - 1 ? \",\" : \"\";\n this.line(`${field}${suffix}`);\n }\n\n this.indent--;\n this.line(\"]\");\n this.line(\"\");\n }\n\n private addMessageTypes(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n if (analysis.messageTypes.length === 0) {\n // No message types found, skip\n return;\n }\n\n this.line(\"\\\\* Message types from application\");\n const messageTypeSet = analysis.messageTypes.map((t) => `\"${t}\"`).join(\", \");\n this.line(`UserMessageTypes == {${messageTypeSet}}`);\n this.line(\"\");\n }\n\n private addVariables(): void {\n // MessageRouter already defines: ports, messages, pendingRequests, delivered, routingDepth, time\n // We add: contextStates for application state\n\n this.line(\"\\\\* Application state per context\");\n this.line(\"VARIABLE contextStates\");\n this.line(\"\");\n this.line(\"\\\\* All variables (extending MessageRouter vars)\");\n this.line(\n \"allVars == <<ports, messages, pendingRequests, delivered, routingDepth, time, contextStates>>\"\n );\n this.line(\"\");\n }\n\n private addInit(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n // Generate InitialState first\n this.line(\"\\\\* Initial application state\");\n this.line(\"InitialState == [\");\n this.indent++;\n\n const fields: string[] = [];\n for (const [fieldPath, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) continue;\n\n const fieldName = this.sanitizeFieldName(fieldPath);\n const initialValue = this.getInitialValue(fieldConfig);\n fields.push(`${fieldName} |-> ${initialValue}`);\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const suffix = i < fields.length - 1 ? \",\" : \"\";\n this.line(`${field}${suffix}`);\n }\n\n this.indent--;\n this.line(\"]\");\n this.line(\"\");\n\n // Init extends MessageRouter's Init\n this.line(\"\\\\* Initial state (extends MessageRouter)\");\n this.line(\"UserInit ==\");\n this.indent++;\n this.line(\"/\\\\ Init \\\\* MessageRouter's init\");\n this.line(\"/\\\\ contextStates = [c \\\\in Contexts |-> InitialState]\");\n this.indent--;\n this.line(\"\");\n }\n\n private addActions(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Application-specific actions\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n if (analysis.handlers.length === 0) {\n // No handlers found, keep the stub\n this.line(\"\\\\* No message handlers found in codebase\");\n this.line(\"\\\\* State remains unchanged for all messages\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n this.line(\"UNCHANGED contextStates\");\n this.indent--;\n this.line(\"\");\n return;\n }\n\n // Generate state transition actions for each handler\n this.line(\"\\\\* State transitions extracted from message handlers\");\n this.line(\"\");\n\n // Group handlers by message type\n const handlersByType = new Map<string, typeof analysis.handlers>();\n for (const handler of analysis.handlers) {\n if (!handlersByType.has(handler.messageType)) {\n handlersByType.set(handler.messageType, []);\n }\n handlersByType.get(handler.messageType)!.push(handler);\n }\n\n // Generate an action for each message type\n for (const [messageType, handlers] of handlersByType.entries()) {\n this.generateHandlerAction(messageType, handlers, config);\n }\n\n // Generate the main StateTransition action that dispatches to specific handlers\n this.line(\"\\\\* Main state transition action\");\n this.line(\"StateTransition(ctx, msgType) ==\");\n this.indent++;\n\n const messageTypes = Array.from(handlersByType.keys());\n for (let i = 0; i < messageTypes.length; i++) {\n const msgType = messageTypes[i];\n const actionName = this.messageTypeToActionName(msgType);\n\n if (i === 0) {\n this.line(`IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n } else if (i === messageTypes.length - 1) {\n this.line(`ELSE IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n this.line(\"ELSE UNCHANGED contextStates \\\\* Unknown message type\");\n } else {\n this.line(`ELSE IF msgType = \"${msgType}\" THEN ${actionName}(ctx)`);\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private generateHandlerAction(\n messageType: string,\n handlers: MessageHandler[],\n config: VerificationConfig\n ): void {\n const actionName = this.messageTypeToActionName(messageType);\n\n this.line(`\\\\* Handler for ${messageType}`);\n this.line(`${actionName}(ctx) ==`);\n this.indent++;\n\n // Collect all preconditions from all handlers\n const allPreconditions = handlers.flatMap((h) => h.preconditions);\n\n // Collect all assignments from all handlers for this message type\n const allAssignments = handlers.flatMap((h) => h.assignments);\n\n // Collect all postconditions from all handlers\n const allPostconditions = handlers.flatMap((h) => h.postconditions);\n\n // Emit preconditions first\n if (allPreconditions.length > 0) {\n for (const precondition of allPreconditions) {\n const tlaExpr = this.tsExpressionToTLA(precondition.expression);\n const comment = precondition.message ? ` \\\\* ${precondition.message}` : \"\";\n this.line(`/\\\\ ${tlaExpr}${comment}`);\n }\n }\n\n // Filter out null assignments and map them to valid values\n const validAssignments = allAssignments\n .filter((a) => {\n if (a.value === null) {\n // For null values, check if we can map to a valid value based on field config\n const fieldConfig = config.state[a.field];\n if (\n fieldConfig &&\n typeof fieldConfig === \"object\" &&\n \"values\" in fieldConfig &&\n fieldConfig.values\n ) {\n // Use the last value as the \"null\" value (often \"guest\", \"none\", etc.)\n return true;\n }\n // Skip null assignments if we can't map them\n return false;\n }\n return true;\n })\n .map((a) => {\n if (a.value === null) {\n const fieldConfig = config.state[a.field];\n if (\n fieldConfig &&\n typeof fieldConfig === \"object\" &&\n \"values\" in fieldConfig &&\n fieldConfig.values\n ) {\n // Use the last value as the \"null\" value\n const nullValue = fieldConfig.values[fieldConfig.values.length - 1];\n return { ...a, value: nullValue };\n }\n }\n return a;\n });\n\n if (validAssignments.length === 0) {\n // Handler exists but makes no state changes\n if (allPreconditions.length === 0) {\n this.line(\"\\\\* No state changes in handler\");\n }\n this.line(\"/\\\\ UNCHANGED contextStates\");\n } else {\n // Generate state updates\n this.line(\"/\\\\ contextStates' = [contextStates EXCEPT\");\n this.indent++;\n\n for (let i = 0; i < validAssignments.length; i++) {\n const assignment = validAssignments[i];\n const fieldName = this.sanitizeFieldName(assignment.field);\n const value = this.assignmentValueToTLA(assignment.value);\n const suffix = i < validAssignments.length - 1 ? \",\" : \"\";\n\n this.line(`![ctx].${fieldName} = ${value}${suffix}`);\n }\n\n this.indent--;\n this.line(\"]\");\n }\n\n // Emit postconditions last\n if (allPostconditions.length > 0) {\n for (const postcondition of allPostconditions) {\n const tlaExpr = this.tsExpressionToTLA(postcondition.expression, true);\n const comment = postcondition.message ? ` \\\\* ${postcondition.message}` : \"\";\n this.line(`/\\\\ ${tlaExpr}${comment}`);\n }\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n /**\n * Translate TypeScript expression to TLA+ syntax\n * @param expr - TypeScript expression from requires() or ensures()\n * @param isPrimed - If true, use contextStates' (for postconditions)\n */\n private tsExpressionToTLA(expr: string, isPrimed: boolean = false): string {\n let tla = expr;\n\n // Replace state references with contextStates[ctx] or contextStates'[ctx]\n const statePrefix = isPrimed ? \"contextStates'[ctx]\" : \"contextStates[ctx]\";\n\n // Replace state.field.subfield with contextStates[ctx].field_subfield\n tla = tla.replace(/state\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g, (match, path) => {\n return `${statePrefix}.${this.sanitizeFieldName(path)}`;\n });\n\n // Replace payload.field with payload.field (no change needed, but sanitize)\n tla = tla.replace(/payload\\.([a-zA-Z_][a-zA-Z0-9_.]*)/g, (match, path) => {\n return `payload.${this.sanitizeFieldName(path)}`;\n });\n\n // Replace comparison operators\n tla = tla.replace(/===/g, \"=\");\n tla = tla.replace(/!==/g, \"#\");\n tla = tla.replace(/!=/g, \"#\");\n tla = tla.replace(/==/g, \"=\");\n\n // Replace logical operators\n tla = tla.replace(/&&/g, \"/\\\\\");\n tla = tla.replace(/\\|\\|/g, \"\\\\/\");\n\n // Replace negation operator (careful with !== already handled)\n // Match ! that's not part of !== or !=\n tla = tla.replace(/!([^=])/g, \"~$1\");\n tla = tla.replace(/!$/g, \"~\"); // Handle ! at end of string\n\n // Replace boolean literals\n tla = tla.replace(/\\btrue\\b/g, \"TRUE\");\n tla = tla.replace(/\\bfalse\\b/g, \"FALSE\");\n\n // Replace null\n tla = tla.replace(/\\bnull\\b/g, \"NULL\");\n\n // Replace less than / greater than comparisons\n tla = tla.replace(/</g, \"<\");\n tla = tla.replace(/>/g, \">\");\n tla = tla.replace(/<=/g, \"<=\");\n tla = tla.replace(/>=/g, \">=\");\n\n return tla;\n }\n\n private messageTypeToActionName(messageType: string): string {\n // Convert USER_LOGIN -> HandleUserLogin\n return (\n \"Handle\" +\n messageType\n .split(\"_\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())\n .join(\"\")\n );\n }\n\n private assignmentValueToTLA(value: string | boolean | number | null): string {\n if (typeof value === \"boolean\") {\n return value ? \"TRUE\" : \"FALSE\";\n }\n if (typeof value === \"number\") {\n return String(value);\n }\n if (value === null) {\n return \"NULL\"; // Will need to handle this based on type\n }\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n return \"NULL\";\n }\n\n private addRouteWithHandlers(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Message Routing with State Transitions\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n if (analysis.handlers.length === 0) {\n // No handlers, just use base routing\n return;\n }\n\n this.line(\"\\\\* Route a message and invoke its handler\");\n this.line(\"UserRouteMessage(msgIndex) ==\");\n this.indent++;\n this.line(\"/\\\\ msgIndex \\\\in 1..Len(messages)\");\n this.line(\"/\\\\ LET msg == messages[msgIndex]\");\n this.line(' IN /\\\\ msg.status = \"pending\"');\n this.line(\" /\\\\ routingDepth' = routingDepth + 1\");\n this.line(\" /\\\\ routingDepth < 5\");\n this.line(\" /\\\\ \\\\E target \\\\in msg.targets :\");\n this.line(' /\\\\ IF target \\\\in Contexts /\\\\ ports[target] = \"connected\"');\n this.line(\" THEN \\\\* Successful delivery - route AND invoke handler\");\n this.line(\n ' /\\\\ messages\\' = [messages EXCEPT ![msgIndex].status = \"delivered\"]'\n );\n this.line(\" /\\\\ delivered' = delivered \\\\union {msg.id}\");\n this.line(\n \" /\\\\ pendingRequests' = [id \\\\in DOMAIN pendingRequests \\\\ {msg.id} |->\"\n );\n this.line(\" pendingRequests[id]]\");\n this.line(\" /\\\\ time' = time + 1\");\n this.line(\" /\\\\ StateTransition(target, msg.msgType)\");\n this.line(\" ELSE \\\\* Port not connected - message fails\");\n this.line(\n ' /\\\\ messages\\' = [messages EXCEPT ![msgIndex].status = \"failed\"]'\n );\n this.line(\n \" /\\\\ pendingRequests' = [id \\\\in DOMAIN pendingRequests \\\\ {msg.id} |->\"\n );\n this.line(\" pendingRequests[id]]\");\n this.line(\" /\\\\ time' = time + 1\");\n this.line(\" /\\\\ UNCHANGED <<delivered, contextStates>>\");\n this.line(\" /\\\\ UNCHANGED ports\");\n this.indent--;\n this.line(\"\");\n }\n\n private addNext(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* Next state relation (extends MessageRouter)\");\n this.line(\"UserNext ==\");\n this.indent++;\n\n if (analysis.handlers.length > 0) {\n // Use integrated routing + handlers\n this.line(\"\\\\/ \\\\E c \\\\in Contexts : ConnectPort(c) /\\\\ UNCHANGED contextStates\");\n this.line(\"\\\\/ \\\\E c \\\\in Contexts : DisconnectPort(c) /\\\\ UNCHANGED contextStates\");\n this.line(\n \"\\\\/ \\\\E src \\\\in Contexts : \\\\E targetSet \\\\in (SUBSET Contexts \\\\ {{}}) : \\\\E tab \\\\in 0..MaxTabId : \\\\E msgType \\\\in UserMessageTypes :\"\n );\n this.indent++;\n this.line(\"SendMessage(src, targetSet, tab, msgType) /\\\\ UNCHANGED contextStates\");\n this.indent--;\n this.line(\"\\\\/ \\\\E i \\\\in 1..Len(messages) : UserRouteMessage(i)\");\n this.line(\"\\\\/ CompleteRouting /\\\\ UNCHANGED contextStates\");\n this.line(\"\\\\/ \\\\E i \\\\in 1..Len(messages) : TimeoutMessage(i) /\\\\ UNCHANGED contextStates\");\n } else {\n // No handlers, all actions preserve contextStates\n this.line(\"\\\\/ Next /\\\\ UNCHANGED contextStates\");\n }\n\n this.indent--;\n this.line(\"\");\n }\n\n private addSpec(): void {\n this.line(\"\\\\* Specification\");\n this.line(\"UserSpec == UserInit /\\\\ [][UserNext]_allVars /\\\\ WF_allVars(UserNext)\");\n this.line(\"\");\n }\n\n private addInvariants(config: VerificationConfig, analysis: CodebaseAnalysis): void {\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\\\\* Application Invariants\");\n this.line(\"\\\\* =============================================================================\");\n this.line(\"\");\n\n this.line(\"\\\\* TypeOK and NoRoutingLoops are inherited from MessageRouter\");\n this.line(\"\");\n\n this.line(\"\\\\* Application state type invariant\");\n this.line(\"UserStateTypeInvariant ==\");\n this.indent++;\n this.line(\"\\\\A ctx \\\\in Contexts :\");\n this.indent++;\n this.line(\"contextStates[ctx] \\\\in State\");\n this.indent--;\n this.indent--;\n this.line(\"\");\n\n this.line(\"\\\\* State constraint to bound state space\");\n this.line(\"StateConstraint ==\");\n this.indent++;\n this.line(\"Len(messages) <= MaxMessages\");\n this.indent--;\n this.line(\"\");\n\n this.line(\"=============================================================================\");\n }\n\n private fieldConfigToTLAType(\n fieldPath: string,\n fieldConfig: any,\n config: VerificationConfig\n ): string {\n if (\"type\" in fieldConfig) {\n if (fieldConfig.type === \"boolean\") {\n return \"BOOLEAN\";\n }\n if (fieldConfig.type === \"enum\" && fieldConfig.values) {\n const values = fieldConfig.values.map((v: string) => `\"${v}\"`).join(\", \");\n return `{${values}}`;\n }\n }\n\n if (\"maxLength\" in fieldConfig) {\n // Array type - represented as sequence with bounded length\n const constName = this.fieldToConstName(fieldPath);\n return `Seq(Value)`; // Simplified - would need element type\n }\n\n if (\"min\" in fieldConfig && \"max\" in fieldConfig) {\n // Number type\n const constName = this.fieldToConstName(fieldPath);\n const min = fieldConfig.min || 0;\n const max = fieldConfig.max || 100;\n return `${min}..${max}`;\n }\n\n if (\"values\" in fieldConfig) {\n if (fieldConfig.values && Array.isArray(fieldConfig.values)) {\n // String with concrete values\n const values = fieldConfig.values.map((v: string) => `\"${v}\"`).join(\", \");\n return `{${values}}`;\n }\n if (fieldConfig.abstract) {\n // Abstract string\n return \"STRING\";\n }\n // Needs configuration\n return \"STRING\";\n }\n\n if (\"maxSize\" in fieldConfig) {\n // Map with bounded key set\n return \"[Keys -> Value]\";\n }\n\n return \"Value\"; // Generic fallback\n }\n\n private getInitialValue(fieldConfig: any): string {\n if (\"type\" in fieldConfig) {\n if (fieldConfig.type === \"boolean\") {\n return \"FALSE\";\n }\n if (fieldConfig.type === \"enum\" && fieldConfig.values && fieldConfig.values.length > 0) {\n return `\"${fieldConfig.values[0]}\"`;\n }\n }\n\n if (\"maxLength\" in fieldConfig) {\n return \"<<>>\"; // Empty sequence\n }\n\n if (\"min\" in fieldConfig) {\n return String(fieldConfig.min || 0);\n }\n\n if (\"values\" in fieldConfig && fieldConfig.values && fieldConfig.values.length > 0) {\n return `\"${fieldConfig.values[0]}\"`;\n }\n\n if (\"maxSize\" in fieldConfig) {\n // Map with all keys mapped to default value\n return '[k \\\\in Keys |-> \"v1\"]';\n }\n\n return \"0\"; // Default fallback\n }\n\n private fieldToConstName(fieldPath: string): string {\n return fieldPath.replace(/\\./g, \"_\").toUpperCase();\n }\n\n private sanitizeFieldName(fieldPath: string): string {\n return fieldPath.replace(/\\./g, \"_\");\n }\n\n private line(content: string): void {\n if (content === \"\") {\n this.lines.push(\"\");\n } else {\n const indentation = \" \".repeat(this.indent);\n this.lines.push(indentation + content);\n }\n }\n}\n\nexport function generateTLA(\n config: VerificationConfig,\n analysis: CodebaseAnalysis\n): { spec: string; cfg: string } {\n const generator = new TLAGenerator();\n return generator.generate(config, analysis);\n}\n",
|
|
6
6
|
"// Docker container management for TLA+ verification\n\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport * as os from \"node:os\";\n\nexport type DockerRunResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport class DockerRunner {\n private containerName = \"web-ext-tla-verify\";\n\n /**\n * Check if Docker is available\n */\n async isDockerAvailable(): Promise<boolean> {\n try {\n const result = await this.runCommand(\"docker\", [\"--version\"]);\n return result.exitCode === 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Check if TLA+ image exists\n */\n async hasImage(): Promise<boolean> {\n try {\n const result = await this.runCommand(\"docker\", [\"images\", \"-q\", \"talex5/tla\"]);\n return result.stdout.trim().length > 0;\n } catch {\n return false;\n }\n }\n\n /**\n * Pull TLA+ image\n */\n async pullImage(onProgress?: (line: string) => void): Promise<void> {\n await this.runCommandStreaming(\"docker\", [\"pull\", \"talex5/tla:latest\"], onProgress);\n }\n\n /**\n * Run TLC model checker on a spec\n */\n async runTLC(\n specPath: string,\n options?: {\n workers?: number;\n timeout?: number;\n }\n ): Promise<TLCResult> {\n // Ensure spec file exists\n if (!fs.existsSync(specPath)) {\n throw new Error(`Spec file not found: ${specPath}`);\n }\n\n const specDir = path.dirname(specPath);\n const specName = path.basename(specPath, \".tla\");\n const cfgPath = path.join(specDir, `${specName}.cfg`);\n\n // Ensure cfg file exists\n if (!fs.existsSync(cfgPath)) {\n throw new Error(`Config file not found: ${cfgPath}`);\n }\n\n // Run TLC in Docker\n // Use sh -c to cd into /specs directory so TLC can find imported modules\n const args = [\n \"run\",\n \"--rm\",\n \"-v\",\n `${specDir}:/specs`,\n \"talex5/tla\",\n \"sh\",\n \"-c\",\n `cd /specs && tlc -workers ${options?.workers || 1} ${specName}.tla`,\n ];\n\n const result = await this.runCommand(\"docker\", args, {\n timeout: options?.timeout || 60000,\n });\n\n return this.parseTLCOutput(result);\n }\n\n /**\n * Parse TLC output\n */\n private parseTLCOutput(result: DockerRunResult): TLCResult {\n const output = result.stdout + result.stderr;\n\n // Check for violations\n const violationMatch = output.match(/Error: Invariant (.*?) is violated/);\n if (violationMatch) {\n return {\n success: false,\n violation: {\n type: \"invariant\",\n name: violationMatch[1],\n trace: this.extractTrace(output),\n },\n output,\n };\n }\n\n // Check for errors\n if (result.exitCode !== 0 || output.includes(\"Error:\")) {\n return {\n success: false,\n error: this.extractError(output),\n output,\n };\n }\n\n // Success\n const statesMatch = output.match(/(\\d+) states generated/);\n const distinctMatch = output.match(/(\\d+) distinct states/);\n\n return {\n success: true,\n stats: {\n statesGenerated: statesMatch ? Number.parseInt(statesMatch[1]) : 0,\n distinctStates: distinctMatch ? Number.parseInt(distinctMatch[1]) : 0,\n },\n output,\n };\n }\n\n /**\n * Extract error trace from TLC output\n */\n private extractTrace(output: string): string[] {\n const lines = output.split(\"\\n\");\n const trace: string[] = [];\n let inTrace = false;\n\n for (const line of lines) {\n if (line.includes(\"State \") && line.includes(\":\")) {\n inTrace = true;\n trace.push(line);\n } else if (inTrace) {\n if (line.trim() === \"\" || line.startsWith(\"Error:\")) {\n break;\n }\n trace.push(line);\n }\n }\n\n return trace;\n }\n\n /**\n * Extract error message from TLC output\n */\n private extractError(output: string): string {\n const errorMatch = output.match(/Error: (.*?)(?:\\n|$)/);\n if (errorMatch) {\n return errorMatch[1];\n }\n\n // Look for common error patterns\n if (output.includes(\"Parse Error\")) {\n return \"TLA+ syntax error in specification\";\n }\n if (output.includes(\"Semantic Error\")) {\n return \"Semantic error in specification\";\n }\n\n return \"Unknown error occurred during model checking\";\n }\n\n /**\n * Run a command and return output\n */\n private runCommand(\n command: string,\n args: string[],\n options?: { timeout?: number }\n ): Promise<DockerRunResult> {\n return new Promise((resolve, reject) => {\n const proc = spawn(command, args);\n\n let stdout = \"\";\n let stderr = \"\";\n\n proc.stdout.on(\"data\", (data) => {\n stdout += data.toString();\n });\n\n proc.stderr.on(\"data\", (data) => {\n stderr += data.toString();\n });\n\n const timeout = options?.timeout\n ? setTimeout(() => {\n proc.kill();\n reject(new Error(`Command timed out after ${options.timeout}ms`));\n }, options.timeout)\n : null;\n\n proc.on(\"close\", (exitCode) => {\n if (timeout) clearTimeout(timeout);\n\n resolve({\n exitCode: exitCode || 0,\n stdout,\n stderr,\n });\n });\n\n proc.on(\"error\", (error) => {\n if (timeout) clearTimeout(timeout);\n reject(error);\n });\n });\n }\n\n /**\n * Run a command with streaming output\n */\n private runCommandStreaming(\n command: string,\n args: string[],\n onOutput?: (line: string) => void\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const proc = spawn(command, args);\n\n proc.stdout.on(\"data\", (data) => {\n if (onOutput) {\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n onOutput(line.trim());\n }\n }\n }\n });\n\n proc.stderr.on(\"data\", (data) => {\n if (onOutput) {\n const lines = data.toString().split(\"\\n\");\n for (const line of lines) {\n if (line.trim()) {\n onOutput(line.trim());\n }\n }\n }\n });\n\n proc.on(\"close\", (exitCode) => {\n if (exitCode === 0) {\n resolve();\n } else {\n reject(new Error(`Command failed with exit code ${exitCode}`));\n }\n });\n\n proc.on(\"error\", reject);\n });\n }\n}\n\nexport type TLCResult = {\n success: boolean;\n violation?: {\n type: \"invariant\" | \"property\" | \"deadlock\";\n name?: string;\n trace: string[];\n };\n error?: string;\n stats?: {\n statesGenerated: number;\n distinctStates: number;\n };\n output: string;\n};\n",
|
|
7
7
|
"#!/usr/bin/env bun\n// CLI for verification system\n\nimport * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport { analyzeCodebase } from \"./extract/types\"\nimport { generateConfig } from \"./codegen/config\"\nimport { validateConfig } from \"./config/parser\"\n\nconst COLORS = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n gray: \"\\x1b[90m\",\n}\n\nfunction color(text: string, colorCode: string): string {\n return `${colorCode}${text}${COLORS.reset}`\n}\n\nasync function main() {\n const args = process.argv.slice(2)\n const command = args[0]\n\n switch (command) {\n case \"--setup\":\n case \"setup\":\n await setupCommand()\n break\n\n case \"--validate\":\n case \"validate\":\n await validateCommand()\n break\n\n case \"--help\":\n case \"help\":\n showHelp()\n break\n\n default:\n await verifyCommand()\n }\n}\n\nasync function setupCommand() {\n console.log(color(\"\\nš Analyzing codebase...\\n\", COLORS.blue))\n\n try {\n // Find tsconfig\n const tsConfigPath = findTsConfig()\n if (!tsConfigPath) {\n console.error(color(\"ā Could not find tsconfig.json\", COLORS.red))\n console.error(\" Run this command from your project root\")\n process.exit(1)\n }\n\n console.log(color(` Using: ${tsConfigPath}`, COLORS.gray))\n\n // Analyze codebase\n const analysis = await analyzeCodebase({\n tsConfigPath,\n stateFilePath: findStateFile()\n })\n\n if (!analysis.stateType) {\n console.log(color(\"\\nā ļø Could not find state type definition\", COLORS.yellow))\n console.log(\" Expected to find a type named 'AppState' or 'State'\")\n console.log(\" in a file matching **/state*.ts\")\n console.log()\n console.log(\" You can still generate a config template:\")\n console.log(\" It will be empty and you'll need to fill it in manually.\")\n console.log()\n } else {\n console.log(color(`ā Found state type with ${analysis.fields.length} field(s)`, COLORS.green))\n }\n\n console.log(color(`ā Found ${analysis.messageTypes.length} message type(s)`, COLORS.green))\n\n // Show analysis summary\n if (analysis.fields.length > 0) {\n console.log(color(\"\\nš Configuration Summary:\\n\", COLORS.blue))\n\n const table = [\n [\"Field\", \"Type\", \"Status\"],\n [\"ā\".repeat(30), \"ā\".repeat(20), \"ā\".repeat(20)],\n ]\n\n for (const field of analysis.fields) {\n const status = field.confidence === \"high\"\n ? color(\"ā Auto-configured\", COLORS.green)\n : field.confidence === \"medium\"\n ? color(\"ā Review needed\", COLORS.yellow)\n : color(\"ā Manual config\", COLORS.red)\n\n table.push([field.path, field.type.kind, status])\n }\n\n for (const row of table) {\n console.log(` ${row[0].padEnd(32)} ${row[1].padEnd(22)} ${row[2]}`)\n }\n }\n\n // Generate config\n const configContent = generateConfig(analysis)\n const configPath = path.join(process.cwd(), \"specs\", \"verification.config.ts\")\n\n // Ensure directory exists\n const configDir = path.dirname(configPath)\n if (!fs.existsSync(configDir)) {\n fs.mkdirSync(configDir, { recursive: true })\n }\n\n // Write config\n fs.writeFileSync(configPath, configContent, \"utf-8\")\n\n console.log(color(\"\\nā
Configuration generated!\\n\", COLORS.green))\n console.log(` File: ${color(configPath, COLORS.blue)}`)\n console.log()\n console.log(color(\"š Next steps:\", COLORS.blue))\n console.log()\n console.log(\" 1. Review the generated configuration file\")\n console.log(\" 2. Fill in values marked with /* CONFIGURE */\")\n console.log(\" 3. Run 'bun verify' to check your configuration\")\n console.log()\n console.log(color(\"š” Tip:\", COLORS.gray))\n console.log(color(\" Look for comments explaining what each field needs.\", COLORS.gray))\n console.log()\n\n } catch (error) {\n console.error(color(\"\\nā Setup failed:\", COLORS.red))\n console.error(` ${error instanceof Error ? error.message : String(error)}`)\n process.exit(1)\n }\n}\n\nasync function validateCommand() {\n const configPath = path.join(process.cwd(), \"specs\", \"verification.config.ts\")\n\n console.log(color(\"\\nš Validating configuration...\\n\", COLORS.blue))\n\n const result = validateConfig(configPath)\n\n if (result.valid) {\n console.log(color(\"ā
Configuration is complete and valid!\\n\", COLORS.green))\n console.log(\" You can now run 'bun verify' to start verification.\")\n console.log()\n return\n }\n\n // Show errors\n const errors = result.issues.filter(i => i.severity === \"error\")\n const warnings = result.issues.filter(i => i.severity === \"warning\")\n\n if (errors.length > 0) {\n console.log(color(`ā Found ${errors.length} error(s):\\n`, COLORS.red))\n\n for (const error of errors) {\n console.log(color(` ⢠${error.message}`, COLORS.red))\n if (error.field) {\n console.log(color(` Field: ${error.field}`, COLORS.gray))\n }\n if (error.location) {\n console.log(color(` Location: line ${error.location.line}`, COLORS.gray))\n }\n console.log(color(` ā ${error.suggestion}`, COLORS.yellow))\n console.log()\n }\n }\n\n if (warnings.length > 0) {\n console.log(color(`ā ļø Found ${warnings.length} warning(s):\\n`, COLORS.yellow))\n\n for (const warning of warnings) {\n console.log(color(` ⢠${warning.message}`, COLORS.yellow))\n if (warning.field) {\n console.log(color(` Field: ${warning.field}`, COLORS.gray))\n }\n console.log(color(` ā ${warning.suggestion}`, COLORS.gray))\n console.log()\n }\n }\n\n console.log(color(\"Configuration incomplete. Please fix the errors above.\\n\", COLORS.red))\n process.exit(1)\n}\n\nasync function verifyCommand() {\n const configPath = path.join(process.cwd(), \"specs\", \"verification.config.ts\")\n\n console.log(color(\"\\nš Running verification...\\n\", COLORS.blue))\n\n // First validate config\n const validation = validateConfig(configPath)\n\n if (!validation.valid) {\n const errors = validation.issues.filter(i => i.severity === \"error\")\n console.log(color(`ā Configuration incomplete (${errors.length} error(s))\\n`, COLORS.red))\n\n for (const error of errors.slice(0, 3)) {\n console.log(color(` ⢠${error.message}`, COLORS.red))\n if (error.field) {\n console.log(color(` Field: ${error.field}`, COLORS.gray))\n }\n console.log()\n }\n\n if (errors.length > 3) {\n console.log(color(` ... and ${errors.length - 3} more error(s)`, COLORS.gray))\n console.log()\n }\n\n console.log(\" Run 'bun verify --validate' to see all issues\")\n console.log(\" Run 'bun verify --setup' to regenerate configuration\")\n console.log()\n process.exit(1)\n }\n\n console.log(color(\"ā Configuration valid\", COLORS.green))\n console.log()\n\n // Run full verification\n try {\n await runFullVerification(configPath)\n } catch (error) {\n console.error(color(\"\\nā Verification failed:\", COLORS.red))\n console.error(` ${error instanceof Error ? error.message : String(error)}`)\n process.exit(1)\n }\n}\n\nasync function runFullVerification(configPath: string) {\n const { generateTLA } = await import(\"./codegen/tla\")\n const { DockerRunner } = await import(\"./runner/docker\")\n\n // Load config\n delete require.cache[require.resolve(path.resolve(configPath))]\n const configModule = require(path.resolve(configPath))\n const config = configModule.default || configModule\n\n // Analyze codebase\n console.log(color(\"š Analyzing codebase...\", COLORS.blue))\n const tsConfigPath = findTsConfig()\n if (!tsConfigPath) {\n throw new Error(\"Could not find tsconfig.json\")\n }\n\n const analysis = await analyzeCodebase({\n tsConfigPath,\n stateFilePath: findStateFile()\n })\n\n console.log(color(\"ā Analysis complete\", COLORS.green))\n console.log()\n\n // Generate TLA+ specs\n console.log(color(\"š Generating TLA+ specification...\", COLORS.blue))\n const { spec, cfg } = generateTLA(config, analysis)\n\n // Write specs to temp directory\n const specDir = path.join(process.cwd(), \"specs\", \"tla\", \"generated\")\n if (!fs.existsSync(specDir)) {\n fs.mkdirSync(specDir, { recursive: true })\n }\n\n const specPath = path.join(specDir, \"UserApp.tla\")\n const cfgPath = path.join(specDir, \"UserApp.cfg\")\n\n fs.writeFileSync(specPath, spec)\n fs.writeFileSync(cfgPath, cfg)\n\n // Copy base MessageRouter spec to generated directory so TLC can find it\n // Try multiple locations to find MessageRouter.tla:\n // 1. User's specs/tla/MessageRouter.tla (if they've customized it)\n // 2. Package's bundled specs/tla/MessageRouter.tla (when installed via npm)\n // 3. External polly directory (when using git submodule or manual clone)\n const possiblePaths = [\n // User's custom version\n path.join(process.cwd(), \"specs\", \"tla\", \"MessageRouter.tla\"),\n\n // Package's bundled version (when installed as npm package)\n // CLI runs from dist/cli.js, so specs/ is at ../specs/\n path.join(__dirname, \"..\", \"specs\", \"tla\", \"MessageRouter.tla\"),\n\n // When running from source in development\n path.join(__dirname, \"..\", \"..\", \"specs\", \"tla\", \"MessageRouter.tla\"),\n\n // External polly directory (common in monorepos or git submodules)\n path.join(process.cwd(), \"external\", \"polly\", \"packages\", \"verify\", \"specs\", \"tla\", \"MessageRouter.tla\"),\n\n // Node modules (scoped package)\n path.join(process.cwd(), \"node_modules\", \"@fairfox\", \"polly-verify\", \"specs\", \"tla\", \"MessageRouter.tla\"),\n ]\n\n let baseSpecPath: string | null = null\n for (const candidatePath of possiblePaths) {\n if (fs.existsSync(candidatePath)) {\n baseSpecPath = candidatePath\n break\n }\n }\n\n if (baseSpecPath) {\n const destSpecPath = path.join(specDir, \"MessageRouter.tla\")\n fs.copyFileSync(baseSpecPath, destSpecPath)\n console.log(color(\"ā Copied MessageRouter.tla\", COLORS.green))\n } else {\n console.log(color(\"ā ļø Warning: MessageRouter.tla not found, verification may fail\", COLORS.yellow))\n console.log(color(` Searched in:`, COLORS.gray))\n for (const searchPath of possiblePaths) {\n console.log(color(` - ${searchPath}`, COLORS.gray))\n }\n }\n\n console.log(color(\"ā Specification generated\", COLORS.green))\n console.log(color(` ${specPath}`, COLORS.gray))\n console.log()\n\n // Check Docker\n console.log(color(\"š³ Checking Docker...\", COLORS.blue))\n const docker = new DockerRunner()\n\n if (!(await docker.isDockerAvailable())) {\n throw new Error(\"Docker is not available. Please install Docker and try again.\")\n }\n\n if (!(await docker.hasImage())) {\n console.log(color(\" Pulling TLA+ image (this may take a moment)...\", COLORS.gray))\n await docker.pullImage((line) => {\n console.log(color(` ${line}`, COLORS.gray))\n })\n }\n\n console.log(color(\"ā Docker ready\", COLORS.green))\n console.log()\n\n // Run TLC\n console.log(color(\"āļø Running TLC model checker...\", COLORS.blue))\n console.log(color(\" This may take a minute...\", COLORS.gray))\n console.log()\n\n const result = await docker.runTLC(specPath, {\n workers: 2,\n timeout: 120000 // 2 minutes\n })\n\n // Display results\n if (result.success) {\n console.log(color(\"ā
Verification passed!\\n\", COLORS.green))\n console.log(color(\"Statistics:\", COLORS.blue))\n console.log(color(` States explored: ${result.stats?.statesGenerated || 0}`, COLORS.gray))\n console.log(color(` Distinct states: ${result.stats?.distinctStates || 0}`, COLORS.gray))\n console.log()\n } else {\n console.log(color(\"ā Verification failed!\\n\", COLORS.red))\n\n if (result.violation) {\n console.log(color(`Invariant violated: ${result.violation.name}\\n`, COLORS.red))\n console.log(color(\"Trace to violation:\", COLORS.yellow))\n for (const line of result.violation.trace.slice(0, 20)) {\n console.log(color(` ${line}`, COLORS.gray))\n }\n if (result.violation.trace.length > 20) {\n console.log(color(` ... (${result.violation.trace.length - 20} more lines)`, COLORS.gray))\n }\n } else if (result.error) {\n console.log(color(`Error: ${result.error}`, COLORS.red))\n }\n\n console.log()\n console.log(color(\"Full output saved to:\", COLORS.gray))\n console.log(color(` ${path.join(specDir, \"tlc-output.log\")}`, COLORS.gray))\n fs.writeFileSync(path.join(specDir, \"tlc-output.log\"), result.output)\n\n process.exit(1)\n }\n}\n\nfunction showHelp() {\n console.log(`\n${color(\"bun verify\", COLORS.blue)} - Formal verification for web extensions\n\n${color(\"Commands:\", COLORS.blue)}\n\n ${color(\"bun verify\", COLORS.green)}\n Run verification (validates config, generates specs, runs TLC)\n\n ${color(\"bun verify --setup\", COLORS.green)}\n Analyze codebase and generate configuration file\n\n ${color(\"bun verify --validate\", COLORS.green)}\n Validate existing configuration without running verification\n\n ${color(\"bun verify --help\", COLORS.green)}\n Show this help message\n\n${color(\"Getting Started:\", COLORS.blue)}\n\n 1. Run ${color(\"bun verify --setup\", COLORS.green)} to generate configuration\n 2. Review ${color(\"specs/verification.config.ts\", COLORS.blue)} and fill in marked fields\n 3. Run ${color(\"bun verify --validate\", COLORS.green)} to check your configuration\n 4. Run ${color(\"bun verify\", COLORS.green)} to start verification\n\n${color(\"Configuration Help:\", COLORS.blue)}\n\n The generated config file uses special markers:\n\n ${color(\"/* CONFIGURE */\", COLORS.yellow)} - Replace with your value\n ${color(\"/* REVIEW */\", COLORS.yellow)} - Check auto-generated value\n ${color(\"null\", COLORS.yellow)} - Must be replaced with concrete value\n\n${color(\"Learn More:\", COLORS.blue)}\n\n Documentation: https://github.com/fairfox/web-ext\n TLA+ Resources: https://learntla.com\n`)\n}\n\nfunction findTsConfig(): string | null {\n const locations = [\n path.join(process.cwd(), \"tsconfig.json\"),\n path.join(process.cwd(), \"packages\", \"web-ext\", \"tsconfig.json\"),\n ]\n\n for (const loc of locations) {\n if (fs.existsSync(loc)) {\n return loc\n }\n }\n\n return null\n}\n\nfunction findStateFile(): string | undefined {\n const locations = [\n path.join(process.cwd(), \"types\", \"state.ts\"),\n path.join(process.cwd(), \"src\", \"types\", \"state.ts\"),\n path.join(process.cwd(), \"packages\", \"web-ext\", \"src\", \"shared\", \"state\", \"app-state.ts\"),\n ]\n\n for (const loc of locations) {\n if (fs.existsSync(loc)) {\n return loc\n }\n }\n\n return undefined\n}\n\nmain().catch((error) => {\n console.error(color(\"\\nā Fatal error:\", COLORS.red))\n console.error(` ${error instanceof Error ? error.message : String(error)}`)\n if (error instanceof Error && error.stack) {\n console.error(color(\"\\nStack trace:\", COLORS.gray))\n console.error(color(error.stack, COLORS.gray))\n }\n process.exit(1)\n})\n",
|
|
8
8
|
"// Type extraction from TypeScript using ts-morph\n\nimport { Project, SourceFile, Type, TypeFormatFlags } from \"ts-morph\"\nimport type { TypeInfo, TypeKind, FieldAnalysis, Confidence, CodebaseAnalysis } from \"../types\"\nimport { HandlerExtractor } from \"./handlers\"\n\nexport class TypeExtractor {\n private project: Project\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n })\n }\n\n /**\n * Analyze the codebase and extract state types and message types\n */\n async analyzeCodebase(stateFilePath?: string): Promise<CodebaseAnalysis> {\n // Find state type\n const stateType = stateFilePath\n ? this.extractStateType(stateFilePath)\n : this.findStateType()\n\n // Find message types\n const messageTypes = this.findMessageTypes()\n\n // Analyze fields\n const fields = stateType ? this.analyzeFields(stateType) : []\n\n // Extract message handlers\n const configFilePath = this.project.getCompilerOptions().configFilePath\n const tsConfigPath = typeof configFilePath === \"string\" ? configFilePath : \"tsconfig.json\"\n const handlerExtractor = new HandlerExtractor(tsConfigPath)\n const handlerAnalysis = handlerExtractor.extractHandlers()\n\n return {\n stateType,\n messageTypes: Array.from(new Set([...messageTypes, ...handlerAnalysis.messageTypes])),\n fields,\n handlers: handlerAnalysis.handlers,\n }\n }\n\n /**\n * Extract state type from a specific file\n */\n private extractStateType(filePath: string): TypeInfo | null {\n const sourceFile = this.project.getSourceFile(filePath)\n if (!sourceFile) {\n return null\n }\n\n // Look for type alias named \"AppState\" or similar\n const typeAlias = sourceFile.getTypeAlias(\"AppState\")\n || sourceFile.getTypeAlias(\"State\")\n || sourceFile.getTypeAliases()[0]\n\n if (!typeAlias) {\n return null\n }\n\n const type = typeAlias.getType()\n return this.convertType(type, typeAlias.getName())\n }\n\n /**\n * Find state type by searching common patterns\n */\n private findStateType(): TypeInfo | null {\n // Search for files with \"state\" in the name\n const stateFiles = this.project.getSourceFiles(\"**/state*.ts\")\n\n for (const file of stateFiles) {\n const typeAlias = file.getTypeAlias(\"AppState\")\n || file.getTypeAlias(\"State\")\n\n if (typeAlias) {\n const type = typeAlias.getType()\n return this.convertType(type, typeAlias.getName())\n }\n }\n\n return null\n }\n\n /**\n * Find message types by searching for type unions\n */\n private findMessageTypes(): string[] {\n const messageTypes: string[] = []\n\n // Search for files with \"message\" in the name\n const messageFiles = this.project.getSourceFiles(\"**/message*.ts\")\n\n for (const file of messageFiles) {\n // Look for type aliases that are unions\n for (const typeAlias of file.getTypeAliases()) {\n const type = typeAlias.getType()\n if (type.isUnion()) {\n // Extract message type literals\n for (const unionType of type.getUnionTypes()) {\n if (unionType.isObject()) {\n const typeProperty = unionType.getProperty(\"type\")\n if (typeProperty) {\n const typeType = typeProperty.getTypeAtLocation(file)\n if (typeType.isStringLiteral()) {\n messageTypes.push(typeType.getLiteralValue() as string)\n }\n }\n }\n }\n }\n }\n }\n\n return [...new Set(messageTypes)] // Dedupe\n }\n\n /**\n * Convert ts-morph Type to our TypeInfo\n */\n private convertType(type: Type, name: string): TypeInfo {\n // Check for null/undefined\n const nullable = type.isNullable()\n\n // Boolean\n if (type.isBoolean() || type.isBooleanLiteral()) {\n return { name, kind: \"boolean\", nullable }\n }\n\n // Union types\n if (type.isUnion()) {\n const unionTypes = type.getUnionTypes()\n\n // Check for string literal union (enum)\n const allStringLiterals = unionTypes.every(t => t.isStringLiteral())\n if (allStringLiterals) {\n const enumValues = unionTypes.map(t => t.getLiteralValue() as string)\n return {\n name,\n kind: \"enum\",\n nullable,\n enumValues\n }\n }\n\n // Check for nullable type (T | null | undefined)\n const nonNullTypes = unionTypes.filter(t => !t.isNull() && !t.isUndefined())\n\n if (nonNullTypes.length === 1) {\n // This is a nullable type: T | null or T | undefined\n const baseType = this.convertType(nonNullTypes[0], name)\n return {\n ...baseType,\n nullable: true\n }\n }\n\n // Generic union - keep as-is\n return {\n name,\n kind: \"union\",\n nullable,\n unionTypes: unionTypes.map((t, i) => this.convertType(t, `${name}_${i}`))\n }\n }\n\n // String\n if (type.isString() || type.isStringLiteral()) {\n return { name, kind: \"string\", nullable }\n }\n\n // Number\n if (type.isNumber() || type.isNumberLiteral()) {\n return { name, kind: \"number\", nullable }\n }\n\n // Array\n if (type.isArray()) {\n const elementType = type.getArrayElementType()\n return {\n name,\n kind: \"array\",\n nullable,\n elementType: elementType\n ? this.convertType(elementType, `${name}_element`)\n : { name: \"unknown\", kind: \"unknown\", nullable: false }\n }\n }\n\n // Map/Set detection - must come before generic object handling\n const symbol = type.getSymbol()\n if (symbol) {\n const symbolName = symbol.getName()\n\n // Map<K, V>\n if (symbolName === \"Map\") {\n const typeArgs = type.getTypeArguments()\n return {\n name,\n kind: \"map\",\n nullable,\n // Extract value type from Map<K, V>\n valueType: typeArgs && typeArgs[1]\n ? this.convertType(typeArgs[1], `${name}_value`)\n : undefined\n }\n }\n\n // Set<T>\n if (symbolName === \"Set\") {\n const typeArgs = type.getTypeArguments()\n return {\n name,\n kind: \"set\",\n nullable,\n elementType: typeArgs && typeArgs[0]\n ? this.convertType(typeArgs[0], `${name}_element`)\n : undefined\n }\n }\n }\n\n // Object\n if (type.isObject()) {\n const properties: Record<string, TypeInfo> = {}\n\n for (const prop of type.getProperties()) {\n const propName = prop.getName()\n const propType = prop.getTypeAtLocation(this.project.getSourceFiles()[0])\n properties[propName] = this.convertType(propType, propName)\n }\n\n return {\n name,\n kind: \"object\",\n nullable,\n properties\n }\n }\n\n // Null\n if (type.isNull()) {\n return { name, kind: \"null\", nullable: true }\n }\n\n // Unknown/Any\n return { name, kind: \"unknown\", nullable }\n }\n\n /**\n * Analyze fields and determine confidence/bounds\n */\n private analyzeFields(stateType: TypeInfo, prefix = \"\"): FieldAnalysis[] {\n const fields: FieldAnalysis[] = []\n\n if (stateType.kind === \"object\" && stateType.properties) {\n for (const [key, propType] of Object.entries(stateType.properties)) {\n const path = prefix ? `${prefix}.${key}` : key\n\n // Recursively analyze nested objects (but not Map/Set - they're leaf nodes)\n if (propType.kind === \"object\") {\n // Don't add intermediate objects as fields, just recurse into them\n fields.push(...this.analyzeFields(propType, path))\n } else {\n // This is a leaf field (or Map/Set), add it for configuration\n const analysis = this.analyzeField(path, propType)\n fields.push(analysis)\n }\n }\n }\n\n return fields\n }\n\n /**\n * Analyze a single field and determine configuration needs\n */\n private analyzeField(path: string, type: TypeInfo): FieldAnalysis {\n const analysis: FieldAnalysis = {\n path,\n type,\n confidence: \"low\",\n evidence: [],\n suggestions: [],\n bounds: {}\n }\n\n // Boolean - high confidence, no config needed\n if (type.kind === \"boolean\") {\n analysis.confidence = \"high\"\n analysis.evidence.push(\"Boolean type - auto-configured\")\n return analysis\n }\n\n // Enum - high confidence\n if (type.kind === \"enum\" && type.enumValues) {\n analysis.confidence = \"high\"\n analysis.evidence.push(`Enum with ${type.enumValues.length} values`)\n analysis.bounds!.values = type.enumValues\n return analysis\n }\n\n // Array - needs manual configuration\n if (type.kind === \"array\") {\n analysis.confidence = \"low\"\n analysis.suggestions.push(\n \"Choose maxLength: 5 (fast), 10 (balanced), or 20 (thorough)\"\n )\n analysis.bounds!.maxLength = undefined\n\n // Try to find bounds in code\n const foundBound = this.findArrayBound(path)\n if (foundBound) {\n analysis.confidence = \"medium\"\n analysis.evidence.push(`Found array check: ${foundBound.evidence}`)\n analysis.bounds!.maxLength = foundBound.value\n }\n\n return analysis\n }\n\n // Number - needs manual configuration\n if (type.kind === \"number\") {\n analysis.confidence = \"low\"\n analysis.suggestions.push(\"Provide min and max values based on your application logic\")\n analysis.bounds!.min = undefined\n analysis.bounds!.max = undefined\n\n // Try to find bounds in code\n const foundBound = this.findNumberBound(path)\n if (foundBound) {\n analysis.confidence = \"high\"\n analysis.evidence.push(`Found comparison: ${foundBound.evidence}`)\n analysis.bounds = { ...analysis.bounds!, ...foundBound.bounds }\n }\n\n return analysis\n }\n\n // String - needs manual configuration\n if (type.kind === \"string\") {\n analysis.confidence = \"low\"\n analysis.suggestions.push(\n 'Provide 2-3 example values: [\"value1\", \"value2\", \"value3\"]',\n \"Or use { abstract: true } for symbolic verification\"\n )\n analysis.bounds!.values = undefined\n return analysis\n }\n\n // Map/Set - needs manual configuration\n if (type.kind === \"map\" || type.kind === \"set\") {\n analysis.confidence = \"low\"\n analysis.suggestions.push(\"Provide maxSize (recommended: 3-5)\")\n analysis.bounds!.maxSize = undefined\n return analysis\n }\n\n return analysis\n }\n\n /**\n * Try to find array bounds by searching for length checks\n */\n private findArrayBound(path: string): { value: number; evidence: string } | null {\n // TODO: Search source code for patterns like:\n // - if (array.length < N)\n // - array.slice(0, N)\n // This would require analyzing the actual usage in code\n return null\n }\n\n /**\n * Try to find number bounds by searching for comparisons\n */\n private findNumberBound(path: string): { bounds: { min?: number; max?: number }; evidence: string } | null {\n // TODO: Search source code for patterns like:\n // - if (counter < 100)\n // - if (value >= 0 && value <= 100)\n // This would require analyzing the actual usage in code\n return null\n }\n}\n\nexport async function analyzeCodebase(options: {\n tsConfigPath: string\n stateFilePath?: string\n}): Promise<CodebaseAnalysis> {\n const extractor = new TypeExtractor(options.tsConfigPath)\n return extractor.analyzeCodebase(options.stateFilePath)\n}\n",
|
|
9
|
-
"// Handler extraction from TypeScript code\n// Extracts message handlers and their state mutations\n\nimport { Project, type SourceFile, SyntaxKind, Node } from \"ts-morph\"\nimport type { MessageHandler, StateAssignment, VerificationCondition } from \"../types\"\n\nexport interface HandlerAnalysis {\n handlers: MessageHandler[]\n messageTypes: Set<string>\n}\n\nexport class HandlerExtractor {\n private project: Project\n private typeGuardCache: WeakMap<SourceFile, Map<string, string>>\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n })\n this.typeGuardCache = new WeakMap()\n }\n\n /**\n * Extract all message handlers from the codebase\n */\n extractHandlers(): HandlerAnalysis {\n const handlers: MessageHandler[] = []\n const messageTypes = new Set<string>()\n\n // Find all source files\n const sourceFiles = this.project.getSourceFiles()\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Loaded ${sourceFiles.length} source files`)\n if (sourceFiles.length <= 20) {\n // Only log file names if there aren't too many\n for (const sf of sourceFiles) {\n console.log(`[DEBUG] - ${sf.getFilePath()}`)\n }\n }\n }\n\n for (const sourceFile of sourceFiles) {\n const fileHandlers = this.extractFromFile(sourceFile)\n handlers.push(...fileHandlers)\n\n for (const handler of fileHandlers) {\n messageTypes.add(handler.messageType)\n }\n }\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Total handlers extracted: ${handlers.length}`)\n }\n\n return {\n handlers,\n messageTypes,\n }\n }\n\n /**\n * Extract handlers from a single source file\n */\n private extractFromFile(sourceFile: SourceFile): MessageHandler[] {\n const handlers: MessageHandler[] = []\n const filePath = sourceFile.getFilePath()\n\n // Determine context from file path\n const context = this.inferContext(filePath)\n\n // Find all handler patterns\n sourceFile.forEachDescendant((node) => {\n if (Node.isCallExpression(node)) {\n const expression = node.getExpression()\n\n // Pattern 1: .on() calls (bus.on, ws.on, socket.on, etc.)\n if (Node.isPropertyAccessExpression(expression)) {\n const methodName = expression.getName()\n\n if (methodName === \"on\" || methodName === \"addEventListener\") {\n const handler = this.extractHandler(node, context, filePath)\n if (handler) {\n handlers.push(handler)\n }\n }\n }\n }\n\n // Pattern 2: Switch/case message routers\n if (Node.isSwitchStatement(node)) {\n const switchHandlers = this.extractSwitchCaseHandlers(node, context, filePath)\n handlers.push(...switchHandlers)\n }\n\n // Pattern 3: Handler map patterns (const handlers = { 'EVENT': fn })\n if (Node.isVariableDeclaration(node)) {\n const mapHandlers = this.extractHandlerMapPattern(node, context, filePath)\n handlers.push(...mapHandlers)\n }\n\n // Pattern 4: Type guard if/else-if chains\n // Only process root if statements, not else-if statements (they're handled by the chain walker)\n if (Node.isIfStatement(node)) {\n const parent = node.getParent()\n const isElseIf = parent && Node.isIfStatement(parent)\n\n if (!isElseIf) {\n const typeGuardHandlers = this.extractTypeGuardHandlers(node, context, filePath)\n handlers.push(...typeGuardHandlers)\n }\n }\n })\n\n return handlers\n }\n\n /**\n * Extract handler details from a .on() call expression\n */\n private extractHandler(\n callExpr: any,\n context: string,\n filePath: string\n ): MessageHandler | null {\n const args = callExpr.getArguments()\n\n if (args.length < 2) {\n return null\n }\n\n // First argument should be the message type (string literal)\n const messageTypeArg = args[0]\n let messageType: string | null = null\n\n if (Node.isStringLiteral(messageTypeArg)) {\n messageType = messageTypeArg.getLiteralValue()\n } else if (Node.isTemplateExpression(messageTypeArg)) {\n // Handle template literals if needed\n messageType = messageTypeArg.getText().replace(/[`'\"]/g, \"\")\n }\n\n if (!messageType) {\n return null\n }\n\n // Second argument is the handler function\n const handlerArg = args[1]\n const assignments: StateAssignment[] = []\n const preconditions: VerificationCondition[] = []\n const postconditions: VerificationCondition[] = []\n\n // Parse the handler function for state assignments and verification conditions\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n this.extractAssignments(handlerArg, assignments)\n this.extractVerificationConditions(handlerArg, preconditions, postconditions)\n }\n\n const line = callExpr.getStartLineNumber()\n\n return {\n messageType,\n node: context, // Renamed from 'context' to 'node' for generalization\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line,\n },\n }\n }\n\n /**\n * Extract state assignments from a handler function\n */\n private extractAssignments(funcNode: any, assignments: StateAssignment[]): void {\n funcNode.forEachDescendant((node: any) => {\n // Look for assignment expressions: state.field = value\n if (Node.isBinaryExpression(node)) {\n const operator = node.getOperatorToken().getText()\n\n if (operator === \"=\") {\n const left = node.getLeft()\n const right = node.getRight()\n\n // Check if left side is a state property access\n if (Node.isPropertyAccessExpression(left)) {\n const fieldPath = this.getPropertyPath(left)\n\n // Check if this is a state access\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6) // Remove \"state.\" prefix\n const value = this.extractValue(right)\n\n if (value !== undefined) {\n assignments.push({\n field,\n value,\n })\n }\n }\n }\n }\n }\n })\n }\n\n /**\n * Extract verification conditions (requires/ensures) from a handler function\n */\n private extractVerificationConditions(\n funcNode: any,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n const body = funcNode.getBody()\n\n // Get all statements in the function body\n const statements = Node.isBlock(body) ? body.getStatements() : [body]\n\n statements.forEach((statement: any, index: number) => {\n // Look for expression statements that are function calls\n if (Node.isExpressionStatement(statement)) {\n const expr = statement.getExpression()\n\n if (Node.isCallExpression(expr)) {\n const callee = expr.getExpression()\n\n if (Node.isIdentifier(callee)) {\n const functionName = callee.getText()\n\n if (functionName === \"requires\") {\n // Extract precondition\n const condition = this.extractCondition(expr)\n if (condition) {\n preconditions.push(condition)\n }\n } else if (functionName === \"ensures\") {\n // Extract postcondition\n const condition = this.extractCondition(expr)\n if (condition) {\n postconditions.push(condition)\n }\n }\n }\n }\n }\n })\n }\n\n /**\n * Extract condition from a requires() or ensures() call\n */\n private extractCondition(callExpr: any): VerificationCondition | null {\n const args = callExpr.getArguments()\n\n if (args.length === 0) {\n return null\n }\n\n // First argument is the condition expression\n const conditionArg = args[0]\n const expression = conditionArg.getText()\n\n // Second argument (optional) is the message\n let message: string | undefined\n if (args.length >= 2 && Node.isStringLiteral(args[1])) {\n message = args[1].getLiteralValue()\n }\n\n const line = callExpr.getStartLineNumber()\n const column = callExpr.getStartLinePos()\n\n return {\n expression,\n message,\n location: {\n line,\n column,\n },\n }\n }\n\n /**\n * Get the full property access path (e.g., \"state.user.loggedIn\")\n */\n private getPropertyPath(node: any): string {\n const parts: string[] = []\n\n let current = node\n while (Node.isPropertyAccessExpression(current)) {\n parts.unshift(current.getName())\n current = current.getExpression()\n }\n\n // Add the base identifier\n if (Node.isIdentifier(current)) {\n parts.unshift(current.getText())\n }\n\n return parts.join(\".\")\n }\n\n /**\n * Extract a literal value from an expression\n */\n private extractValue(node: any): string | boolean | number | null | undefined {\n if (Node.isStringLiteral(node)) {\n return node.getLiteralValue()\n }\n\n if (Node.isNumericLiteral(node)) {\n return node.getLiteralValue()\n }\n\n if (node.getKind() === SyntaxKind.TrueKeyword) {\n return true\n }\n\n if (node.getKind() === SyntaxKind.FalseKeyword) {\n return false\n }\n\n if (node.getKind() === SyntaxKind.NullKeyword) {\n return null\n }\n\n // For complex expressions, return undefined (can't extract)\n return undefined\n }\n\n /**\n * Extract handlers from switch/case message router patterns\n * Detects: switch(message.type) { case 'EVENT': handler(); }\n */\n private extractSwitchCaseHandlers(\n switchNode: any,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = []\n\n try {\n // Check if switching on message.type or similar\n const expression = switchNode.getExpression()\n const expressionText = expression.getText()\n\n // Look for patterns like: message.type, data.type, msg.type, event.type\n if (!/\\.(type|kind|event|action)/.test(expressionText)) {\n return handlers\n }\n\n // Extract handlers from each case clause\n const caseClauses = switchNode.getClauses()\n for (const clause of caseClauses) {\n if (Node.isCaseClause(clause)) {\n const caseExpr = clause.getExpression()\n\n // Extract message type from case expression\n let messageType: string | null = null\n if (Node.isStringLiteral(caseExpr)) {\n messageType = caseExpr.getLiteralValue()\n }\n\n if (messageType) {\n const line = clause.getStartLineNumber()\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n })\n }\n }\n }\n } catch (error) {\n // Skip malformed switch statements\n }\n\n return handlers\n }\n\n /**\n * Extract handlers from handler map patterns\n * Detects: const handlers = { 'EVENT': handlerFn, ... }\n */\n private extractHandlerMapPattern(\n varDecl: any,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = []\n\n try {\n const initializer = varDecl.getInitializer()\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n return handlers\n }\n\n // Check if variable name suggests it's a handler map\n const varName = varDecl.getName().toLowerCase()\n if (!/(handler|listener|callback|event)s?/.test(varName)) {\n return handlers\n }\n\n // Extract handlers from object properties\n const properties = initializer.getProperties()\n for (const prop of properties) {\n if (Node.isPropertyAssignment(prop)) {\n const nameNode = prop.getNameNode()\n let messageType: string | null = null\n\n if (Node.isStringLiteral(nameNode)) {\n messageType = nameNode.getLiteralValue()\n } else if (Node.isIdentifier(nameNode)) {\n messageType = nameNode.getText()\n }\n\n if (messageType) {\n const line = prop.getStartLineNumber()\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n })\n }\n }\n }\n } catch (error) {\n // Skip malformed object literals\n }\n\n return handlers\n }\n\n /**\n * Extract handlers from type guard if/else-if patterns\n * Detects: if (isQueryMessage(msg)) { handleQuery(msg); }\n */\n private extractTypeGuardHandlers(\n ifNode: Node,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = []\n\n try {\n // Get the source file to find type predicates\n const sourceFile = ifNode.getSourceFile()\n\n // Use cached type guards or compute if not cached\n let typeGuards = this.typeGuardCache.get(sourceFile)\n if (!typeGuards) {\n typeGuards = this.findTypePredicateFunctions(sourceFile)\n this.typeGuardCache.set(sourceFile, typeGuards)\n }\n\n // DEBUG: Log local type guards found\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] File: ${sourceFile.getBaseName()}`)\n console.log(`[DEBUG] Local type guards found: ${typeGuards.size}`)\n if (typeGuards.size > 0) {\n for (const [name, type] of typeGuards.entries()) {\n console.log(`[DEBUG] - ${name} ā ${type}`)\n }\n }\n }\n\n // Don't return early - we still want to try imported type guards\n // even if no local type guards exist\n\n // Process the if statement and all else-if chains\n let currentIf: Node = ifNode\n\n while (currentIf) {\n const handler = this.extractHandlerFromIfClause(currentIf, typeGuards, context, filePath)\n if (handler) {\n handlers.push(handler)\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Found handler: ${handler.messageType} at line ${handler.location.line}`)\n }\n }\n\n // Check for else-if\n const elseStatement = currentIf.getElseStatement()\n if (elseStatement && Node.isIfStatement(elseStatement)) {\n currentIf = elseStatement\n } else {\n break\n }\n }\n } catch (error) {\n // DEBUG: Log errors\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Error in extractTypeGuardHandlers: ${error}`)\n }\n }\n\n return handlers\n }\n\n /**\n * Extract handler from a single if clause\n */\n private extractHandlerFromIfClause(\n ifNode: Node,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string\n ): MessageHandler | null {\n try {\n // Get condition expression\n const condition = ifNode.getExpression()\n\n // Check if condition is a call expression (function call)\n if (!Node.isCallExpression(condition)) {\n return null\n }\n\n // Get the function being called\n const funcExpr = condition.getExpression()\n let funcName: string | undefined\n\n if (Node.isIdentifier(funcExpr)) {\n funcName = funcExpr.getText()\n }\n\n if (process.env.POLLY_DEBUG && funcName) {\n console.log(`[DEBUG] Processing if condition with function: ${funcName}`)\n }\n\n // Try to find message type from local type guards first\n let messageType: string | undefined = undefined\n\n if (funcName && typeGuards.has(funcName)) {\n // Found in local file\n messageType = typeGuards.get(funcName)!\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Found in local type guards: ${funcName} ā ${messageType}`)\n }\n } else if (Node.isIdentifier(funcExpr)) {\n // Not found locally - try to resolve from imports\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Not found locally, trying import resolution for: ${funcName}`)\n }\n\n messageType = this.resolveImportedTypeGuard(funcExpr)\n }\n\n if (!messageType) {\n if (process.env.POLLY_DEBUG && funcName) {\n console.log(`[DEBUG] Could not resolve message type for: ${funcName}`)\n }\n return null\n }\n\n // Found a type guard call! Use the message type\n const line = ifNode.getStartLineNumber()\n\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n }\n } catch (error) {\n return null\n }\n }\n\n /**\n * Find all type predicate functions in a source file\n * Returns a map of function name ā message type\n * Uses AST-based detection for consistency with imported type guard resolution\n */\n private findTypePredicateFunctions(sourceFile: SourceFile): Map<string, string> {\n const typeGuards = new Map<string, string>()\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isFunctionDeclaration(node) || Node.isFunctionExpression(node) || Node.isArrowFunction(node)) {\n // Check the return type NODE (AST structure) for type predicate\n const returnTypeNode = node.getReturnTypeNode()\n\n if (returnTypeNode && Node.isTypePredicate(returnTypeNode)) {\n // Extract function name\n let functionName: string | undefined\n if (Node.isFunctionDeclaration(node)) {\n functionName = node.getName()\n } else if (Node.isFunctionExpression(node)) {\n const parent = node.getParent()\n if (Node.isVariableDeclaration(parent)) {\n functionName = parent.getName()\n }\n } else if (Node.isArrowFunction(node)) {\n const parent = node.getParent()\n if (Node.isVariableDeclaration(parent)) {\n functionName = parent.getName()\n }\n }\n\n if (functionName) {\n // Extract the type from the type predicate node\n const typeNode = returnTypeNode.getTypeNode()\n let messageType: string | null = null\n\n if (typeNode) {\n const typeName = typeNode.getText() // e.g., \"QueryMessage\"\n messageType = this.extractMessageTypeFromTypeName(typeName)\n }\n\n // Fallback: Analyze function body for msg.type === 'value'\n if (!messageType) {\n const body = node.getBody()\n if (body) {\n const bodyText = body.getText()\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/)\n if (typeValueMatch) {\n messageType = typeValueMatch[1]\n }\n }\n }\n\n if (messageType) {\n typeGuards.set(functionName, messageType)\n }\n }\n }\n }\n })\n\n return typeGuards\n }\n\n /**\n * Resolve type guard from imported function\n * Uses ts-morph symbol resolution to find definition across files\n * Checks AST structure, not resolved types (which can lose type predicate info)\n */\n private resolveImportedTypeGuard(identifier: any): string | null {\n try {\n const funcName = identifier.getText()\n\n // Get the definition nodes (where the function is defined)\n const definitions = identifier.getDefinitionNodes()\n\n if (definitions.length === 0) {\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] No definitions found for imported function: ${funcName}`)\n }\n return null\n }\n\n for (const def of definitions) {\n // Check if it's a function with type predicate return type\n if (Node.isFunctionDeclaration(def) ||\n Node.isFunctionExpression(def) ||\n Node.isArrowFunction(def)) {\n\n // Check the return type NODE (AST structure), not the resolved TYPE\n // This is critical: ts-morph returns \"boolean\" for type predicates when checking .getReturnType()\n // but the AST node structure preserves the actual type predicate\n const returnTypeNode = def.getReturnTypeNode()\n\n if (process.env.POLLY_DEBUG) {\n const returnType = def.getReturnType().getText()\n console.log(`[DEBUG] Function ${funcName} return type (resolved): ${returnType}`)\n console.log(`[DEBUG] Has return type node: ${!!returnTypeNode}`)\n console.log(`[DEBUG] Is type predicate node: ${returnTypeNode && Node.isTypePredicate(returnTypeNode)}`)\n }\n\n // Check if the return type node is a type predicate\n if (returnTypeNode && Node.isTypePredicate(returnTypeNode)) {\n // Extract the type from the type predicate node\n const typeNode = returnTypeNode.getTypeNode()\n\n if (typeNode) {\n const typeName = typeNode.getText() // e.g., \"QueryMessage\"\n const messageType = this.extractMessageTypeFromTypeName(typeName)\n\n if (messageType) {\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Resolved ${funcName} ā ${messageType} (from AST type predicate)`)\n }\n return messageType\n }\n }\n }\n\n // Fallback: Analyze function body for msg.type === 'value'\n const body = def.getBody()\n if (body) {\n const bodyText = body.getText()\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/)\n if (typeValueMatch) {\n const messageType = typeValueMatch[1]\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Resolved ${funcName} ā ${messageType} (from body)`)\n }\n\n return messageType\n }\n }\n }\n }\n } catch (error) {\n // DEBUG: Log errors\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Error resolving imported type guard: ${error}`)\n }\n }\n\n return null\n }\n\n /**\n * Extract message type from TypeScript type name\n * Examples:\n * QueryMessage ā query\n * CommandMessage ā command\n * SubscribeMessage ā subscribe\n */\n private extractMessageTypeFromTypeName(typeName: string): string {\n // Remove common suffixes and convert to lowercase\n const messageType = typeName\n .replace(/Message$/, '')\n .replace(/Event$/, '')\n .replace(/Request$/, '')\n .replace(/Command$/, '')\n .replace(/Query$/, '')\n .toLowerCase()\n\n return messageType\n }\n\n /**\n * Infer the context (background, content, popup, etc.) from file path\n */\n private inferContext(filePath: string): string {\n const path = filePath.toLowerCase()\n\n // Chrome extension contexts\n if (path.includes(\"/background/\") || path.includes(\"\\\\background\\\\\")) {\n return \"background\"\n }\n if (path.includes(\"/content/\") || path.includes(\"\\\\content\\\\\")) {\n return \"content\"\n }\n if (path.includes(\"/popup/\") || path.includes(\"\\\\popup\\\\\")) {\n return \"popup\"\n }\n if (path.includes(\"/devtools/\") || path.includes(\"\\\\devtools\\\\\")) {\n return \"devtools\"\n }\n if (path.includes(\"/options/\") || path.includes(\"\\\\options\\\\\")) {\n return \"options\"\n }\n if (path.includes(\"/offscreen/\") || path.includes(\"\\\\offscreen\\\\\")) {\n return \"offscreen\"\n }\n\n // WebSocket/server app contexts\n if (path.includes(\"/server/\") || path.includes(\"\\\\server\\\\\") || path.includes(\"/server.\")) {\n return \"server\"\n }\n if (path.includes(\"/client/\") || path.includes(\"\\\\client\\\\\") || path.includes(\"/client.\")) {\n return \"client\"\n }\n\n // PWA/Worker contexts\n if (path.includes(\"/worker/\") || path.includes(\"\\\\worker\\\\\") || path.includes(\"service-worker\")) {\n return \"worker\"\n }\n\n return \"unknown\"\n }\n}\n\nexport function extractHandlers(tsConfigPath: string): HandlerAnalysis {\n const extractor = new HandlerExtractor(tsConfigPath)\n return extractor.extractHandlers()\n}\n",
|
|
9
|
+
"// Handler extraction from TypeScript code\n// Extracts message handlers and their state mutations\n\nimport { Project, type SourceFile, SyntaxKind, Node } from \"ts-morph\"\nimport type { MessageHandler, StateAssignment, VerificationCondition } from \"../types\"\nimport { RelationshipExtractor } from \"./relationships\"\n\nexport interface HandlerAnalysis {\n handlers: MessageHandler[]\n messageTypes: Set<string>\n}\n\nexport class HandlerExtractor {\n private project: Project\n private typeGuardCache: WeakMap<SourceFile, Map<string, string>>\n private relationshipExtractor: RelationshipExtractor\n\n constructor(tsConfigPath: string) {\n this.project = new Project({\n tsConfigFilePath: tsConfigPath,\n })\n this.typeGuardCache = new WeakMap()\n this.relationshipExtractor = new RelationshipExtractor()\n }\n\n /**\n * Extract all message handlers from the codebase\n */\n extractHandlers(): HandlerAnalysis {\n const handlers: MessageHandler[] = []\n const messageTypes = new Set<string>()\n\n // Find all source files\n const sourceFiles = this.project.getSourceFiles()\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Loaded ${sourceFiles.length} source files`)\n if (sourceFiles.length <= 20) {\n // Only log file names if there aren't too many\n for (const sf of sourceFiles) {\n console.log(`[DEBUG] - ${sf.getFilePath()}`)\n }\n }\n }\n\n for (const sourceFile of sourceFiles) {\n const fileHandlers = this.extractFromFile(sourceFile)\n handlers.push(...fileHandlers)\n\n for (const handler of fileHandlers) {\n messageTypes.add(handler.messageType)\n }\n }\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Total handlers extracted: ${handlers.length}`)\n }\n\n return {\n handlers,\n messageTypes,\n }\n }\n\n /**\n * Extract handlers from a single source file\n */\n private extractFromFile(sourceFile: SourceFile): MessageHandler[] {\n const handlers: MessageHandler[] = []\n const filePath = sourceFile.getFilePath()\n\n // Determine context from file path\n const context = this.inferContext(filePath)\n\n // Find all handler patterns\n sourceFile.forEachDescendant((node) => {\n if (Node.isCallExpression(node)) {\n const expression = node.getExpression()\n\n // Pattern 1: .on() calls (bus.on, ws.on, socket.on, etc.)\n if (Node.isPropertyAccessExpression(expression)) {\n const methodName = expression.getName()\n\n if (methodName === \"on\" || methodName === \"addEventListener\") {\n const handler = this.extractHandler(node, context, filePath)\n if (handler) {\n handlers.push(handler)\n }\n }\n }\n }\n\n // Pattern 2: Switch/case message routers\n if (Node.isSwitchStatement(node)) {\n const switchHandlers = this.extractSwitchCaseHandlers(node, context, filePath)\n handlers.push(...switchHandlers)\n }\n\n // Pattern 3: Handler map patterns (const handlers = { 'EVENT': fn })\n if (Node.isVariableDeclaration(node)) {\n const mapHandlers = this.extractHandlerMapPattern(node, context, filePath)\n handlers.push(...mapHandlers)\n }\n\n // Pattern 4: Type guard if/else-if chains\n // Only process root if statements, not else-if statements (they're handled by the chain walker)\n if (Node.isIfStatement(node)) {\n const parent = node.getParent()\n const isElseIf = parent && Node.isIfStatement(parent)\n\n if (!isElseIf) {\n const typeGuardHandlers = this.extractTypeGuardHandlers(node, context, filePath)\n handlers.push(...typeGuardHandlers)\n }\n }\n })\n\n return handlers\n }\n\n /**\n * Extract handler details from a .on() call expression\n */\n private extractHandler(\n callExpr: any,\n context: string,\n filePath: string\n ): MessageHandler | null {\n const args = callExpr.getArguments()\n\n if (args.length < 2) {\n return null\n }\n\n // First argument should be the message type (string literal)\n const messageTypeArg = args[0]\n let messageType: string | null = null\n\n if (Node.isStringLiteral(messageTypeArg)) {\n messageType = messageTypeArg.getLiteralValue()\n } else if (Node.isTemplateExpression(messageTypeArg)) {\n // Handle template literals if needed\n messageType = messageTypeArg.getText().replace(/[`'\"]/g, \"\")\n }\n\n if (!messageType) {\n return null\n }\n\n // Second argument is the handler function\n const handlerArg = args[1]\n const assignments: StateAssignment[] = []\n const preconditions: VerificationCondition[] = []\n const postconditions: VerificationCondition[] = []\n\n // Parse the handler function for state assignments and verification conditions\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n this.extractAssignments(handlerArg, assignments)\n this.extractVerificationConditions(handlerArg, preconditions, postconditions)\n }\n\n const line = callExpr.getStartLineNumber()\n\n // Extract relationships from handler code\n const sourceFile = callExpr.getSourceFile()\n const handlerName = `${messageType}_handler`\n let relationships = undefined\n\n if (Node.isArrowFunction(handlerArg) || Node.isFunctionExpression(handlerArg)) {\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n handlerArg,\n sourceFile,\n handlerName\n )\n if (detectedRelationships.length > 0) {\n relationships = detectedRelationships\n }\n }\n\n return {\n messageType,\n node: context, // Renamed from 'context' to 'node' for generalization\n assignments,\n preconditions,\n postconditions,\n location: {\n file: filePath,\n line,\n },\n relationships,\n }\n }\n\n /**\n * Extract state assignments from a handler function\n */\n private extractAssignments(funcNode: any, assignments: StateAssignment[]): void {\n funcNode.forEachDescendant((node: any) => {\n // Look for assignment expressions: state.field = value\n if (Node.isBinaryExpression(node)) {\n const operator = node.getOperatorToken().getText()\n\n if (operator === \"=\") {\n const left = node.getLeft()\n const right = node.getRight()\n\n // Check if left side is a state property access\n if (Node.isPropertyAccessExpression(left)) {\n const fieldPath = this.getPropertyPath(left)\n\n // Check if this is a state access\n if (fieldPath.startsWith(\"state.\")) {\n const field = fieldPath.substring(6) // Remove \"state.\" prefix\n const value = this.extractValue(right)\n\n if (value !== undefined) {\n assignments.push({\n field,\n value,\n })\n }\n }\n }\n }\n }\n })\n }\n\n /**\n * Extract verification conditions (requires/ensures) from a handler function\n */\n private extractVerificationConditions(\n funcNode: any,\n preconditions: VerificationCondition[],\n postconditions: VerificationCondition[]\n ): void {\n const body = funcNode.getBody()\n\n // Get all statements in the function body\n const statements = Node.isBlock(body) ? body.getStatements() : [body]\n\n statements.forEach((statement: any, index: number) => {\n // Look for expression statements that are function calls\n if (Node.isExpressionStatement(statement)) {\n const expr = statement.getExpression()\n\n if (Node.isCallExpression(expr)) {\n const callee = expr.getExpression()\n\n if (Node.isIdentifier(callee)) {\n const functionName = callee.getText()\n\n if (functionName === \"requires\") {\n // Extract precondition\n const condition = this.extractCondition(expr)\n if (condition) {\n preconditions.push(condition)\n }\n } else if (functionName === \"ensures\") {\n // Extract postcondition\n const condition = this.extractCondition(expr)\n if (condition) {\n postconditions.push(condition)\n }\n }\n }\n }\n }\n })\n }\n\n /**\n * Extract condition from a requires() or ensures() call\n */\n private extractCondition(callExpr: any): VerificationCondition | null {\n const args = callExpr.getArguments()\n\n if (args.length === 0) {\n return null\n }\n\n // First argument is the condition expression\n const conditionArg = args[0]\n const expression = conditionArg.getText()\n\n // Second argument (optional) is the message\n let message: string | undefined\n if (args.length >= 2 && Node.isStringLiteral(args[1])) {\n message = args[1].getLiteralValue()\n }\n\n const line = callExpr.getStartLineNumber()\n const column = callExpr.getStartLinePos()\n\n return {\n expression,\n message,\n location: {\n line,\n column,\n },\n }\n }\n\n /**\n * Get the full property access path (e.g., \"state.user.loggedIn\")\n */\n private getPropertyPath(node: any): string {\n const parts: string[] = []\n\n let current = node\n while (Node.isPropertyAccessExpression(current)) {\n parts.unshift(current.getName())\n current = current.getExpression()\n }\n\n // Add the base identifier\n if (Node.isIdentifier(current)) {\n parts.unshift(current.getText())\n }\n\n return parts.join(\".\")\n }\n\n /**\n * Extract a literal value from an expression\n */\n private extractValue(node: any): string | boolean | number | null | undefined {\n if (Node.isStringLiteral(node)) {\n return node.getLiteralValue()\n }\n\n if (Node.isNumericLiteral(node)) {\n return node.getLiteralValue()\n }\n\n if (node.getKind() === SyntaxKind.TrueKeyword) {\n return true\n }\n\n if (node.getKind() === SyntaxKind.FalseKeyword) {\n return false\n }\n\n if (node.getKind() === SyntaxKind.NullKeyword) {\n return null\n }\n\n // For complex expressions, return undefined (can't extract)\n return undefined\n }\n\n /**\n * Extract handlers from switch/case message router patterns\n * Detects: switch(message.type) { case 'EVENT': handler(); }\n */\n private extractSwitchCaseHandlers(\n switchNode: any,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = []\n\n try {\n // Check if switching on message.type or similar\n const expression = switchNode.getExpression()\n const expressionText = expression.getText()\n\n // Look for patterns like: message.type, data.type, msg.type, event.type\n if (!/\\.(type|kind|event|action)/.test(expressionText)) {\n return handlers\n }\n\n // Extract handlers from each case clause\n const caseClauses = switchNode.getClauses()\n for (const clause of caseClauses) {\n if (Node.isCaseClause(clause)) {\n const caseExpr = clause.getExpression()\n\n // Extract message type from case expression\n let messageType: string | null = null\n if (Node.isStringLiteral(caseExpr)) {\n messageType = caseExpr.getLiteralValue()\n }\n\n if (messageType) {\n const line = clause.getStartLineNumber()\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n })\n }\n }\n }\n } catch (error) {\n // Skip malformed switch statements\n }\n\n return handlers\n }\n\n /**\n * Extract handlers from handler map patterns\n * Detects: const handlers = { 'EVENT': handlerFn, ... }\n */\n private extractHandlerMapPattern(\n varDecl: any,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = []\n\n try {\n const initializer = varDecl.getInitializer()\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n return handlers\n }\n\n // Check if variable name suggests it's a handler map\n const varName = varDecl.getName().toLowerCase()\n if (!/(handler|listener|callback|event)s?/.test(varName)) {\n return handlers\n }\n\n // Extract handlers from object properties\n const properties = initializer.getProperties()\n for (const prop of properties) {\n if (Node.isPropertyAssignment(prop)) {\n const nameNode = prop.getNameNode()\n let messageType: string | null = null\n\n if (Node.isStringLiteral(nameNode)) {\n messageType = nameNode.getLiteralValue()\n } else if (Node.isIdentifier(nameNode)) {\n messageType = nameNode.getText()\n }\n\n if (messageType) {\n const line = prop.getStartLineNumber()\n\n handlers.push({\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n })\n }\n }\n }\n } catch (error) {\n // Skip malformed object literals\n }\n\n return handlers\n }\n\n /**\n * Extract handlers from type guard if/else-if patterns\n * Detects: if (isQueryMessage(msg)) { handleQuery(msg); }\n */\n private extractTypeGuardHandlers(\n ifNode: Node,\n context: string,\n filePath: string\n ): MessageHandler[] {\n const handlers: MessageHandler[] = []\n\n try {\n // Get the source file to find type predicates\n const sourceFile = ifNode.getSourceFile()\n\n // Use cached type guards or compute if not cached\n let typeGuards = this.typeGuardCache.get(sourceFile)\n if (!typeGuards) {\n typeGuards = this.findTypePredicateFunctions(sourceFile)\n this.typeGuardCache.set(sourceFile, typeGuards)\n }\n\n // DEBUG: Log local type guards found\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] File: ${sourceFile.getBaseName()}`)\n console.log(`[DEBUG] Local type guards found: ${typeGuards.size}`)\n if (typeGuards.size > 0) {\n for (const [name, type] of typeGuards.entries()) {\n console.log(`[DEBUG] - ${name} ā ${type}`)\n }\n }\n }\n\n // Don't return early - we still want to try imported type guards\n // even if no local type guards exist\n\n // Process the if statement and all else-if chains\n let currentIf: Node = ifNode\n\n while (currentIf) {\n const handler = this.extractHandlerFromIfClause(currentIf, typeGuards, context, filePath)\n if (handler) {\n handlers.push(handler)\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Found handler: ${handler.messageType} at line ${handler.location.line}`)\n }\n }\n\n // Check for else-if\n const elseStatement = currentIf.getElseStatement()\n if (elseStatement && Node.isIfStatement(elseStatement)) {\n currentIf = elseStatement\n } else {\n break\n }\n }\n } catch (error) {\n // DEBUG: Log errors\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Error in extractTypeGuardHandlers: ${error}`)\n }\n }\n\n return handlers\n }\n\n /**\n * Extract handler from a single if clause\n */\n private extractHandlerFromIfClause(\n ifNode: Node,\n typeGuards: Map<string, string>,\n context: string,\n filePath: string\n ): MessageHandler | null {\n try {\n // Get condition expression\n const condition = ifNode.getExpression()\n\n // Check if condition is a call expression (function call)\n if (!Node.isCallExpression(condition)) {\n return null\n }\n\n // Get the function being called\n const funcExpr = condition.getExpression()\n let funcName: string | undefined\n\n if (Node.isIdentifier(funcExpr)) {\n funcName = funcExpr.getText()\n }\n\n if (process.env.POLLY_DEBUG && funcName) {\n console.log(`[DEBUG] Processing if condition with function: ${funcName}`)\n }\n\n // Try to find message type from local type guards first\n let messageType: string | undefined = undefined\n\n if (funcName && typeGuards.has(funcName)) {\n // Found in local file\n messageType = typeGuards.get(funcName)!\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Found in local type guards: ${funcName} ā ${messageType}`)\n }\n } else if (Node.isIdentifier(funcExpr)) {\n // Not found locally - try to resolve from imports\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Not found locally, trying import resolution for: ${funcName}`)\n }\n\n messageType = this.resolveImportedTypeGuard(funcExpr)\n }\n\n if (!messageType) {\n if (process.env.POLLY_DEBUG && funcName) {\n console.log(`[DEBUG] Could not resolve message type for: ${funcName}`)\n }\n return null\n }\n\n // Found a type guard call! Use the message type\n const line = ifNode.getStartLineNumber()\n\n // Extract relationships from the if block\n const sourceFile = ifNode.getSourceFile()\n const handlerName = `${messageType}_handler`\n let relationships = undefined\n\n const thenStatement = ifNode.getThenStatement()\n if (thenStatement) {\n const detectedRelationships = this.relationshipExtractor.extractFromHandler(\n thenStatement,\n sourceFile,\n handlerName\n )\n if (detectedRelationships.length > 0) {\n relationships = detectedRelationships\n }\n }\n\n return {\n messageType,\n node: context,\n assignments: [],\n preconditions: [],\n postconditions: [],\n location: { file: filePath, line },\n relationships,\n }\n } catch (error) {\n return null\n }\n }\n\n /**\n * Find all type predicate functions in a source file\n * Returns a map of function name ā message type\n * Uses AST-based detection for consistency with imported type guard resolution\n */\n private findTypePredicateFunctions(sourceFile: SourceFile): Map<string, string> {\n const typeGuards = new Map<string, string>()\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isFunctionDeclaration(node) || Node.isFunctionExpression(node) || Node.isArrowFunction(node)) {\n // Check the return type NODE (AST structure) for type predicate\n const returnTypeNode = node.getReturnTypeNode()\n\n if (returnTypeNode && Node.isTypePredicate(returnTypeNode)) {\n // Extract function name\n let functionName: string | undefined\n if (Node.isFunctionDeclaration(node)) {\n functionName = node.getName()\n } else if (Node.isFunctionExpression(node)) {\n const parent = node.getParent()\n if (Node.isVariableDeclaration(parent)) {\n functionName = parent.getName()\n }\n } else if (Node.isArrowFunction(node)) {\n const parent = node.getParent()\n if (Node.isVariableDeclaration(parent)) {\n functionName = parent.getName()\n }\n }\n\n if (functionName) {\n // Extract the type from the type predicate node\n const typeNode = returnTypeNode.getTypeNode()\n let messageType: string | null = null\n\n if (typeNode) {\n const typeName = typeNode.getText() // e.g., \"QueryMessage\"\n messageType = this.extractMessageTypeFromTypeName(typeName)\n }\n\n // Fallback: Analyze function body for msg.type === 'value'\n if (!messageType) {\n const body = node.getBody()\n if (body) {\n const bodyText = body.getText()\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/)\n if (typeValueMatch) {\n messageType = typeValueMatch[1]\n }\n }\n }\n\n if (messageType) {\n typeGuards.set(functionName, messageType)\n }\n }\n }\n }\n })\n\n return typeGuards\n }\n\n /**\n * Resolve type guard from imported function\n * Uses ts-morph symbol resolution to find definition across files\n * Checks AST structure, not resolved types (which can lose type predicate info)\n */\n private resolveImportedTypeGuard(identifier: any): string | null {\n try {\n const funcName = identifier.getText()\n\n // Get the definition nodes (where the function is defined)\n const definitions = identifier.getDefinitionNodes()\n\n if (definitions.length === 0) {\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] No definitions found for imported function: ${funcName}`)\n }\n return null\n }\n\n for (const def of definitions) {\n // Check if it's a function with type predicate return type\n if (Node.isFunctionDeclaration(def) ||\n Node.isFunctionExpression(def) ||\n Node.isArrowFunction(def)) {\n\n // Check the return type NODE (AST structure), not the resolved TYPE\n // This is critical: ts-morph returns \"boolean\" for type predicates when checking .getReturnType()\n // but the AST node structure preserves the actual type predicate\n const returnTypeNode = def.getReturnTypeNode()\n\n if (process.env.POLLY_DEBUG) {\n const returnType = def.getReturnType().getText()\n console.log(`[DEBUG] Function ${funcName} return type (resolved): ${returnType}`)\n console.log(`[DEBUG] Has return type node: ${!!returnTypeNode}`)\n console.log(`[DEBUG] Is type predicate node: ${returnTypeNode && Node.isTypePredicate(returnTypeNode)}`)\n }\n\n // Check if the return type node is a type predicate\n if (returnTypeNode && Node.isTypePredicate(returnTypeNode)) {\n // Extract the type from the type predicate node\n const typeNode = returnTypeNode.getTypeNode()\n\n if (typeNode) {\n const typeName = typeNode.getText() // e.g., \"QueryMessage\"\n const messageType = this.extractMessageTypeFromTypeName(typeName)\n\n if (messageType) {\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Resolved ${funcName} ā ${messageType} (from AST type predicate)`)\n }\n return messageType\n }\n }\n }\n\n // Fallback: Analyze function body for msg.type === 'value'\n const body = def.getBody()\n if (body) {\n const bodyText = body.getText()\n const typeValueMatch = bodyText.match(/\\.type\\s*===?\\s*['\"](\\w+)['\"]/)\n if (typeValueMatch) {\n const messageType = typeValueMatch[1]\n\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Resolved ${funcName} ā ${messageType} (from body)`)\n }\n\n return messageType\n }\n }\n }\n }\n } catch (error) {\n // DEBUG: Log errors\n if (process.env.POLLY_DEBUG) {\n console.log(`[DEBUG] Error resolving imported type guard: ${error}`)\n }\n }\n\n return null\n }\n\n /**\n * Extract message type from TypeScript type name\n * Examples:\n * QueryMessage ā query\n * CommandMessage ā command\n * SubscribeMessage ā subscribe\n */\n private extractMessageTypeFromTypeName(typeName: string): string {\n // Remove common suffixes and convert to lowercase\n const messageType = typeName\n .replace(/Message$/, '')\n .replace(/Event$/, '')\n .replace(/Request$/, '')\n .replace(/Command$/, '')\n .replace(/Query$/, '')\n .toLowerCase()\n\n return messageType\n }\n\n /**\n * Infer the context (background, content, popup, etc.) from file path\n */\n private inferContext(filePath: string): string {\n const path = filePath.toLowerCase()\n\n // Chrome extension contexts\n if (path.includes(\"/background/\") || path.includes(\"\\\\background\\\\\")) {\n return \"background\"\n }\n if (path.includes(\"/content/\") || path.includes(\"\\\\content\\\\\")) {\n return \"content\"\n }\n if (path.includes(\"/popup/\") || path.includes(\"\\\\popup\\\\\")) {\n return \"popup\"\n }\n if (path.includes(\"/devtools/\") || path.includes(\"\\\\devtools\\\\\")) {\n return \"devtools\"\n }\n if (path.includes(\"/options/\") || path.includes(\"\\\\options\\\\\")) {\n return \"options\"\n }\n if (path.includes(\"/offscreen/\") || path.includes(\"\\\\offscreen\\\\\")) {\n return \"offscreen\"\n }\n\n // WebSocket/server app contexts\n if (path.includes(\"/server/\") || path.includes(\"\\\\server\\\\\") || path.includes(\"/server.\")) {\n return \"server\"\n }\n if (path.includes(\"/client/\") || path.includes(\"\\\\client\\\\\") || path.includes(\"/client.\")) {\n return \"client\"\n }\n\n // PWA/Worker contexts\n if (path.includes(\"/worker/\") || path.includes(\"\\\\worker\\\\\") || path.includes(\"service-worker\")) {\n return \"worker\"\n }\n\n return \"unknown\"\n }\n}\n\nexport function extractHandlers(tsConfigPath: string): HandlerAnalysis {\n const extractor = new HandlerExtractor(tsConfigPath)\n return extractor.extractHandlers()\n}\n",
|
|
10
|
+
"// Component relationship extraction from TypeScript code\n// Detects function calls, imports, and dependencies between components\n\nimport { Node, type SourceFile, SyntaxKind, type CallExpression } from \"ts-morph\";\n\n/**\n * Represents a relationship between components detected from code analysis\n */\nexport interface DetectedRelationship {\n\t/** Source component (handler, service, etc.) */\n\tfrom: string;\n\t/** Target component being called/used */\n\tto: string;\n\t/** Description of the relationship */\n\tdescription: string;\n\t/** Technology/method used (e.g., \"Function Call\", \"Import\", \"SQL\", \"HTTP\") */\n\ttechnology?: string;\n\t/** Confidence level of this detection */\n\tconfidence: \"high\" | \"medium\" | \"low\";\n\t/** Evidence supporting this detection */\n\tevidence: string[];\n}\n\n/**\n * Extracts component relationships from handler code\n */\nexport class RelationshipExtractor {\n\t/**\n\t * Extract relationships from a function/handler body\n\t */\n\textractFromHandler(\n\t\thandlerNode: Node,\n\t\tsourceFile: SourceFile,\n\t\thandlerName: string\n\t): DetectedRelationship[] {\n\t\tconst relationships: DetectedRelationship[] = [];\n\t\tconst visited = new Set<string>(); // Prevent infinite recursion\n\n\t\tthis.extractFromNode(handlerNode, sourceFile, handlerName, relationships, visited);\n\n\t\treturn this.deduplicateRelationships(relationships);\n\t}\n\n\t/**\n\t * Recursively extract relationships from a node and follow function calls\n\t */\n\tprivate extractFromNode(\n\t\tnode: Node,\n\t\tsourceFile: SourceFile,\n\t\thandlerName: string,\n\t\trelationships: DetectedRelationship[],\n\t\tvisited: Set<string>\n\t): void {\n\t\t// Pattern 1: Function calls within the handler\n\t\tnode.forEachDescendant((descendant) => {\n\t\t\tif (Node.isCallExpression(descendant)) {\n\t\t\t\tconst expr = descendant.getExpression();\n\n\t\t\t\t// Check if this is a local or imported function call that we should follow\n\t\t\t\tif (Node.isIdentifier(expr)) {\n\t\t\t\t\tconst functionName = expr.getText();\n\n\t\t\t\t\t// Try to find the function definition in the same file first\n\t\t\t\t\tlet functionDecl = sourceFile.getFunction(functionName);\n\t\t\t\t\tlet targetSourceFile = sourceFile;\n\n\t\t\t\t\t// If not in same file, try to resolve from imports (cross-file analysis)\n\t\t\t\t\tif (!functionDecl) {\n\t\t\t\t\t\tconst resolved = this.resolveImportedFunction(functionName, sourceFile);\n\t\t\t\t\t\tif (resolved) {\n\t\t\t\t\t\t\tfunctionDecl = resolved.functionDecl;\n\t\t\t\t\t\t\ttargetSourceFile = resolved.sourceFile;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (functionDecl && !visited.has(functionName)) {\n\t\t\t\t\t\t// Mark as visited to prevent infinite recursion\n\t\t\t\t\t\tvisited.add(functionName);\n\n\t\t\t\t\t\t// Recursively extract relationships from the called function\n\t\t\t\t\t\tconst body = functionDecl.getBody();\n\t\t\t\t\t\tif (body) {\n\t\t\t\t\t\t\tthis.extractFromNode(body, targetSourceFile, handlerName, relationships, visited);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Don't add this as a relationship itself - we're following the call\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// If we couldn't resolve the function, check if it looks like a service call\n\t\t\t\t\t// This catches patterns like getDatabase(), createRepositories()\n\t\t\t\t\tif (!functionDecl) {\n\t\t\t\t\t\tconst componentFromName = this.inferComponentFromFunctionName(functionName);\n\t\t\t\t\t\tif (componentFromName) {\n\t\t\t\t\t\t\trelationships.push({\n\t\t\t\t\t\t\t\tfrom: this.toComponentId(handlerName),\n\t\t\t\t\t\t\t\tto: componentFromName,\n\t\t\t\t\t\t\t\tdescription: `Calls ${functionName}()`,\n\t\t\t\t\t\t\t\ttechnology: \"Function Call\",\n\t\t\t\t\t\t\t\tconfidence: \"medium\",\n\t\t\t\t\t\t\t\tevidence: [`Function call: ${functionName}`],\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Check if this call expression has a property access expression\n\t\t\t\t// (e.g., userService.listUsers())\n\t\t\t\tif (Node.isPropertyAccessExpression(expr)) {\n\t\t\t\t\tconst rel = this.extractFromPropertyAccess(expr, handlerName);\n\t\t\t\t\tif (rel) {\n\t\t\t\t\t\trelationships.push(rel);\n\t\t\t\t\t\treturn; // Don't process further for this call expression\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Not a local function or property access - try to extract as a relationship\n\t\t\t\tconst rel = this.extractFromFunctionCall(descendant, handlerName, sourceFile);\n\t\t\t\tif (rel) {\n\t\t\t\t\trelationships.push(rel);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Pattern 3: Database queries (await db.query, await db.execute)\n\t\t\tif (Node.isAwaitExpression(descendant)) {\n\t\t\t\tconst rel = this.extractFromDatabaseCall(descendant, handlerName);\n\t\t\t\tif (rel) {\n\t\t\t\t\trelationships.push(rel);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Pattern 4: Fetch/HTTP calls\n\t\t\tif (\n\t\t\t\tNode.isCallExpression(descendant) &&\n\t\t\t\tdescendant.getExpression().getText() === \"fetch\"\n\t\t\t) {\n\t\t\t\tconst rel = this.extractFromFetchCall(descendant, handlerName);\n\t\t\t\tif (rel) {\n\t\t\t\t\trelationships.push(rel);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Extract relationship from a function call\n\t */\n\tprivate extractFromFunctionCall(\n\t\tcallExpr: CallExpression,\n\t\thandlerName: string,\n\t\tsourceFile: SourceFile\n\t): DetectedRelationship | null {\n\t\tconst expr = callExpr.getExpression();\n\t\tconst exprText = expr.getText();\n\n\t\t// Skip common utility functions and built-ins\n\t\tconst skipList = [\n\t\t\t\"console.\",\n\t\t\t\"JSON.\",\n\t\t\t\"Math.\",\n\t\t\t\"Object.\",\n\t\t\t\"Array.\",\n\t\t\t\"String.\",\n\t\t\t\"Number.\",\n\t\t\t\"Date.\",\n\t\t\t\"Promise.\",\n\t\t\t\"setTimeout\",\n\t\t\t\"setInterval\",\n\t\t\t\"clearTimeout\",\n\t\t\t\"clearInterval\",\n\t\t];\n\n\t\tif (skipList.some((skip) => exprText.startsWith(skip))) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Extract function name\n\t\tlet functionName = exprText;\n\t\tlet targetComponent: string | null = null;\n\n\t\t// Handle property access (e.g., db.getConnection() -> db_client)\n\t\tif (Node.isPropertyAccessExpression(expr)) {\n\t\t\tconst objectExpr = expr.getExpression();\n\t\t\tconst objectName = objectExpr.getText();\n\t\t\tconst methodName = expr.getName();\n\n\t\t\t// Map common patterns to component names\n\t\t\ttargetComponent = this.inferComponentFromCall(objectName, methodName);\n\n\t\t\tif (!targetComponent) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tfunctionName = methodName;\n\t\t} else {\n\t\t\t// Direct function call - try to resolve from imports\n\t\t\ttargetComponent = this.resolveComponentFromImport(\n\t\t\t\texprText,\n\t\t\t\tsourceFile\n\t\t\t);\n\n\t\t\tif (!targetComponent) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tfrom: this.toComponentId(handlerName),\n\t\t\tto: targetComponent,\n\t\t\tdescription: `Calls ${functionName}()`,\n\t\t\ttechnology: \"Function Call\",\n\t\t\tconfidence: \"high\",\n\t\t\tevidence: [`Function call: ${exprText}`],\n\t\t};\n\t}\n\n\t/**\n\t * Extract relationship from property access chain\n\t * Handles both simple (obj.method) and nested (obj.prop.method) patterns\n\t */\n\tprivate extractFromPropertyAccess(\n\t\tpropAccess: Node,\n\t\thandlerName: string\n\t): DetectedRelationship | null {\n\t\tif (!Node.isPropertyAccessExpression(propAccess)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst fullChain = propAccess.getText();\n\t\tconst methodName = propAccess.getName();\n\n\t\t// Extract the root object from potentially nested property access\n\t\t// e.g., repositories.users.create -> repositories\n\t\tlet rootObject = propAccess.getExpression();\n\t\twhile (Node.isPropertyAccessExpression(rootObject)) {\n\t\t\trootObject = rootObject.getExpression();\n\t\t}\n\n\t\tconst objectName = rootObject.getText();\n\n\t\t// Map object name to component name\n\t\tconst targetComponent = this.inferComponentFromCall(objectName, methodName);\n\n\t\tif (!targetComponent) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn {\n\t\t\tfrom: this.toComponentId(handlerName),\n\t\t\tto: targetComponent,\n\t\t\tdescription: `Calls ${methodName}()`,\n\t\t\ttechnology: \"Function Call\",\n\t\t\tconfidence: \"high\",\n\t\t\tevidence: [`Property access: ${fullChain}`],\n\t\t};\n\t}\n\n\t/**\n\t * Extract relationship from database call\n\t */\n\tprivate extractFromDatabaseCall(\n\t\tawaitExpr: Node,\n\t\thandlerName: string\n\t): DetectedRelationship | null {\n\t\tif (!Node.isAwaitExpression(awaitExpr)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst innerExpr = awaitExpr.getExpression();\n\t\tif (!Node.isCallExpression(innerExpr)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst callExpr = innerExpr.getExpression().getText();\n\n\t\t// Detect database patterns\n\t\tif (\n\t\t\tcallExpr.includes(\"db.query\") ||\n\t\t\tcallExpr.includes(\"db.execute\") ||\n\t\t\tcallExpr.includes(\"db.select\") ||\n\t\t\tcallExpr.includes(\"db.insert\") ||\n\t\t\tcallExpr.includes(\"db.update\") ||\n\t\t\tcallExpr.includes(\"db.delete\")\n\t\t) {\n\t\t\tconst operation = this.inferDatabaseOperation(callExpr);\n\n\t\t\treturn {\n\t\t\t\tfrom: this.toComponentId(handlerName),\n\t\t\t\tto: \"database\",\n\t\t\t\tdescription: operation,\n\t\t\t\ttechnology: \"SQL\",\n\t\t\t\tconfidence: \"high\",\n\t\t\t\tevidence: [`Database call: ${callExpr}`],\n\t\t\t};\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Extract relationship from fetch/HTTP call\n\t */\n\tprivate extractFromFetchCall(\n\t\tcallExpr: CallExpression,\n\t\thandlerName: string\n\t): DetectedRelationship | null {\n\t\tconst args = callExpr.getArguments();\n\t\tif (args.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst urlArg = args[0].getText();\n\n\t\t// Try to extract API name from URL\n\t\tlet apiName = \"external_api\";\n\t\tif (urlArg.includes(\"openai\")) {\n\t\t\tapiName = \"openai_api\";\n\t\t} else if (urlArg.includes(\"anthropic\")) {\n\t\t\tapiName = \"anthropic_api\";\n\t\t}\n\n\t\treturn {\n\t\t\tfrom: this.toComponentId(handlerName),\n\t\t\tto: apiName,\n\t\t\tdescription: \"Calls external API\",\n\t\t\ttechnology: \"HTTP/REST\",\n\t\t\tconfidence: \"high\",\n\t\t\tevidence: [`fetch() call to: ${urlArg}`],\n\t\t};\n\t}\n\n\t/**\n\t * Infer component name from object.method pattern\n\t */\n\tprivate inferComponentFromCall(\n\t\tobjectName: string,\n\t\tmethodName: string\n\t): string | null {\n\t\tconst mappings: Record<string, string> = {\n\t\t\tdb: \"db_client\",\n\t\t\tdatabase: \"database\",\n\t\t\trepos: \"repositories\",\n\t\t\trepository: \"repositories\",\n\t\t\trepositories: \"repositories\",\n\t\t\tcache: \"cache\",\n\t\t\tstorage: \"storage\",\n\t\t\tai: \"ai_service\",\n\t\t\tauth: \"auth_service\",\n\t\t\tauthservice: \"auth_service\",\n\t\t\tuser: \"user_service\",\n\t\t\tuserservice: \"user_service\",\n\t\t\tlogger: \"logger\",\n\t\t\tqueue: \"queue_service\",\n\t\t};\n\n\t\tconst normalized = objectName.toLowerCase();\n\t\treturn mappings[normalized] || null;\n\t}\n\n\t/**\n\t * Infer component name from function name patterns\n\t * Detects patterns like getDatabase(), createRepositories(), etc.\n\t */\n\tprivate inferComponentFromFunctionName(functionName: string): string | null {\n\t\tconst normalized = functionName.toLowerCase();\n\n\t\t// Pattern 1: getXxx() or createXxx()\n\t\tif (normalized.startsWith(\"get\") || normalized.startsWith(\"create\")) {\n\t\t\tconst suffix = functionName.substring(normalized.startsWith(\"get\") ? 3 : 6);\n\t\t\tconst suffixLower = suffix.toLowerCase();\n\n\t\t\t// Database patterns\n\t\t\tif (\n\t\t\t\tsuffixLower.includes(\"database\") ||\n\t\t\t\tsuffixLower === \"db\" ||\n\t\t\t\tsuffixLower.includes(\"dbconnection\") ||\n\t\t\t\tsuffixLower.includes(\"connection\")\n\t\t\t) {\n\t\t\t\treturn \"db_client\";\n\t\t\t}\n\n\t\t\t// Repository patterns\n\t\t\tif (\n\t\t\t\tsuffixLower.includes(\"repositories\") ||\n\t\t\t\tsuffixLower.includes(\"repos\") ||\n\t\t\t\tsuffixLower.includes(\"repository\")\n\t\t\t) {\n\t\t\t\treturn \"repositories\";\n\t\t\t}\n\n\t\t\t// Service patterns\n\t\t\tif (suffixLower.includes(\"service\")) {\n\t\t\t\t// Extract service type (e.g., createAuthService -> auth_service)\n\t\t\t\tconst serviceMatch = suffix.match(/^(.+?)Service/i);\n\t\t\t\tif (serviceMatch) {\n\t\t\t\t\treturn this.toComponentId(`${serviceMatch[1]}_service`);\n\t\t\t\t}\n\t\t\t\treturn \"service\";\n\t\t\t}\n\n\t\t\t// Cache patterns\n\t\t\tif (suffixLower.includes(\"cache\")) {\n\t\t\t\treturn \"cache\";\n\t\t\t}\n\n\t\t\t// Storage patterns\n\t\t\tif (suffixLower.includes(\"storage\")) {\n\t\t\t\treturn \"storage\";\n\t\t\t}\n\n\t\t\t// AI/LLM patterns\n\t\t\tif (suffixLower.includes(\"ai\") || suffixLower.includes(\"llm\")) {\n\t\t\t\treturn \"ai_service\";\n\t\t\t}\n\n\t\t\t// Logger patterns\n\t\t\tif (suffixLower.includes(\"logger\")) {\n\t\t\t\treturn \"logger\";\n\t\t\t}\n\t\t}\n\n\t\t// Pattern 2: initXxx() or setupXxx()\n\t\tif (normalized.startsWith(\"init\") || normalized.startsWith(\"setup\")) {\n\t\t\t// These often initialize services, treat similarly to get/create\n\t\t\tconst suffix = functionName.substring(normalized.startsWith(\"init\") ? 4 : 5);\n\t\t\tconst suffixLower = suffix.toLowerCase();\n\n\t\t\tif (suffixLower.includes(\"database\") || suffixLower === \"db\") {\n\t\t\t\treturn \"db_client\";\n\t\t\t}\n\t\t\tif (suffixLower.includes(\"cache\")) {\n\t\t\t\treturn \"cache\";\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Resolve component from import statement\n\t */\n\tprivate resolveComponentFromImport(\n\t\tfunctionName: string,\n\t\tsourceFile: SourceFile\n\t): string | null {\n\t\t// Look through imports to find where this function comes from\n\t\tfor (const importDecl of sourceFile.getImportDeclarations()) {\n\t\t\tconst namedImports = importDecl.getNamedImports();\n\n\t\t\tfor (const namedImport of namedImports) {\n\t\t\t\tif (namedImport.getName() === functionName) {\n\t\t\t\t\tconst modulePath = importDecl.getModuleSpecifierValue();\n\n\t\t\t\t\t// Infer component from module path\n\t\t\t\t\tif (modulePath.includes(\"/db/\") || modulePath.includes(\"/database/\")) {\n\t\t\t\t\t\treturn \"db_client\";\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tmodulePath.includes(\"/repos\") ||\n\t\t\t\t\t\tmodulePath.includes(\"/repositories\")\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn \"repositories\";\n\t\t\t\t\t}\n\t\t\t\t\tif (\n\t\t\t\t\t\tmodulePath.includes(\"/service\") ||\n\t\t\t\t\t\tmodulePath.includes(\"/services\")\n\t\t\t\t\t) {\n\t\t\t\t\t\t// Extract service name from path\n\t\t\t\t\t\tconst match = modulePath.match(/\\/([^/]+)\\.ts$/);\n\t\t\t\t\t\tif (match) {\n\t\t\t\t\t\t\treturn this.toComponentId(match[1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Resolve imported function to its declaration in another file\n\t * This enables cross-file relationship detection for architectures where\n\t * handlers are separated from routing logic\n\t */\n\tprivate resolveImportedFunction(\n\t\tfunctionName: string,\n\t\tsourceFile: SourceFile\n\t): { functionDecl: any; sourceFile: SourceFile } | null {\n\t\ttry {\n\t\t\t// Look through imports to find where this function comes from\n\t\t\tfor (const importDecl of sourceFile.getImportDeclarations()) {\n\t\t\t\tconst namedImports = importDecl.getNamedImports();\n\n\t\t\t\tfor (const namedImport of namedImports) {\n\t\t\t\t\tif (namedImport.getName() === functionName) {\n\t\t\t\t\t\t// Resolve the import to the actual source file\n\t\t\t\t\t\tconst moduleSpecifier = importDecl.getModuleSpecifierSourceFile();\n\t\t\t\t\t\tif (!moduleSpecifier) continue;\n\n\t\t\t\t\t\t// Find the function in the imported file\n\t\t\t\t\t\tconst functionDecl = moduleSpecifier.getFunction(functionName);\n\t\t\t\t\t\tif (functionDecl) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tfunctionDecl,\n\t\t\t\t\t\t\t\tsourceFile: moduleSpecifier,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Also check for exported arrow functions or const declarations\n\t\t\t\t\t\tconst variableDecl = moduleSpecifier\n\t\t\t\t\t\t\t.getVariableDeclaration(functionName);\n\t\t\t\t\t\tif (variableDecl) {\n\t\t\t\t\t\t\tconst initializer = variableDecl.getInitializer();\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tinitializer &&\n\t\t\t\t\t\t\t\t(Node.isArrowFunction(initializer) ||\n\t\t\t\t\t\t\t\t\tNode.isFunctionExpression(initializer))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\tfunctionDecl: initializer,\n\t\t\t\t\t\t\t\t\tsourceFile: moduleSpecifier,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Silently fail on resolution errors (e.g., missing files, parse errors)\n\t\t\t// This ensures the extractor is resilient to incomplete projects\n\t\t\treturn null;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Infer database operation type\n\t */\n\tprivate inferDatabaseOperation(callExpr: string): string {\n\t\tif (callExpr.includes(\"query\") || callExpr.includes(\"select\")) {\n\t\t\treturn \"Reads from database\";\n\t\t}\n\t\tif (\n\t\t\tcallExpr.includes(\"execute\") ||\n\t\t\tcallExpr.includes(\"insert\") ||\n\t\t\tcallExpr.includes(\"update\") ||\n\t\t\tcallExpr.includes(\"delete\")\n\t\t) {\n\t\t\treturn \"Writes to database\";\n\t\t}\n\t\treturn \"Accesses database\";\n\t}\n\n\t/**\n\t * Convert name to component ID format\n\t */\n\tprivate toComponentId(name: string): string {\n\t\treturn name\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/g, \"_\")\n\t\t\t.replace(/^_|_$/g, \"\");\n\t}\n\n\t/**\n\t * Remove duplicate relationships\n\t */\n\tprivate deduplicateRelationships(\n\t\trelationships: DetectedRelationship[]\n\t): DetectedRelationship[] {\n\t\tconst seen = new Set<string>();\n\t\tconst unique: DetectedRelationship[] = [];\n\n\t\tfor (const rel of relationships) {\n\t\t\tconst key = `${rel.from}->${rel.to}`;\n\t\t\tif (!seen.has(key)) {\n\t\t\t\tseen.add(key);\n\t\t\t\tunique.push(rel);\n\t\t\t}\n\t\t}\n\n\t\treturn unique;\n\t}\n}\n",
|
|
10
11
|
"// Configuration file generator with smart comments\n\nimport type { FieldAnalysis, CodebaseAnalysis, TypeInfo } from \"../types\";\n\nexport class ConfigGenerator {\n private lines: string[] = [];\n private indent = 0;\n\n generate(analysis: CodebaseAnalysis): string {\n this.lines = [];\n this.indent = 0;\n\n this.addHeader();\n this.addImports();\n this.addExport();\n this.addStateConfig(analysis.fields);\n this.addMessagesConfig();\n this.addBehaviorConfig();\n this.closeExport();\n\n return this.lines.join(\"\\n\");\n }\n\n private addHeader(): void {\n this.line(\"// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n this.line(\"// Verification Configuration\");\n this.line(\"// āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\");\n this.line(\"//\");\n this.line(\"// This file configures TLA+ verification for your extension.\");\n this.line(\"// Some values are auto-configured, others need your input.\");\n this.line(\"//\");\n this.line(\"// Look for:\");\n this.line(\"// ⢠/* CONFIGURE */ - Replace with your value\");\n this.line(\"// ⢠/* REVIEW */ - Check the auto-generated value\");\n this.line(\"// ⢠null - Must be replaced with a concrete value\");\n this.line(\"//\");\n this.line(\"// Run 'bun verify' to check for incomplete configuration.\");\n this.line(\"// Run 'bun verify --setup' for interactive help.\");\n this.line(\"//\");\n this.line(\"\");\n }\n\n private addImports(): void {\n this.line(\"import { defineVerification } from '@fairfox/polly/verify'\");\n this.line(\"\");\n }\n\n private addExport(): void {\n this.line(\"export default defineVerification({\");\n this.indent++;\n }\n\n private closeExport(): void {\n this.indent--;\n this.line(\"})\");\n }\n\n private addStateConfig(fields: FieldAnalysis[]): void {\n this.line(\"state: {\");\n this.indent++;\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n\n // Add blank line between fields\n if (i > 0) {\n this.line(\"\");\n }\n\n this.addFieldConfig(field);\n }\n\n this.indent--;\n this.line(\"},\");\n this.line(\"\");\n }\n\n private addFieldConfig(field: FieldAnalysis): void {\n // Generate comment block\n this.addFieldComment(field);\n\n // Generate configuration line\n const config = this.generateFieldConfig(field);\n this.line(`\"${field.path}\": ${config},`);\n }\n\n private addFieldComment(field: FieldAnalysis): void {\n const separator = \"ā\".repeat(60);\n\n // Header\n this.line(`// ${separator}`);\n this.line(`// ${field.path}: ${this.formatTypeName(field.type)}`);\n this.line(`// ${separator}`);\n\n // High confidence: auto-configured\n if (field.confidence === \"high\") {\n this.line(\"// ā Auto-configured from code analysis\");\n if (field.evidence.length > 0) {\n for (const evidence of field.evidence) {\n this.line(`// ${evidence}`);\n }\n }\n this.line(\"//\");\n return;\n }\n\n // Medium confidence: needs review\n if (field.confidence === \"medium\") {\n this.line(\"// ā ļø Please review this auto-generated value\");\n if (field.evidence.length > 0) {\n for (const evidence of field.evidence) {\n this.line(`// Found: ${evidence}`);\n }\n }\n this.line(\"//\");\n this.line(\"// REVIEW: Adjust if needed\");\n this.line(\"//\");\n return;\n }\n\n // Low confidence: manual configuration required\n this.line(\"// ā ļø Manual configuration required\");\n this.line(\"//\");\n\n // Type-specific guidance\n this.addTypeGuidance(field);\n\n // Suggestions\n if (field.suggestions.length > 0) {\n this.line(\"//\");\n for (const suggestion of field.suggestions) {\n this.line(`// ${suggestion}`);\n }\n }\n\n this.line(\"//\");\n this.line(\"// CONFIGURE: Fill in the value below\");\n this.line(\"//\");\n }\n\n private addTypeGuidance(field: FieldAnalysis): void {\n switch (field.type.kind) {\n case \"array\":\n this.line(\"// This array has no bounds in your code. Choose a maximum\");\n this.line(\"// length for verification. Tradeoffs:\");\n this.line(\"// ⢠Small (3-5): Fast, catches basic bugs\");\n this.line(\"// ⢠Medium (10-15): Balanced, catches most bugs\");\n this.line(\"// ⢠Large (20+): Thorough, much slower\");\n break;\n\n case \"string\":\n this.line(\"// Strings need concrete values for precise verification.\");\n this.line(\"// Provide 2-3 representative values from your app.\");\n if (field.type.nullable) {\n this.line(\"//\");\n this.line(\"// Note: This field is nullable (can be null)\");\n }\n this.line(\"//\");\n this.line(\"// Examples:\");\n this.line('// [\"user_abc123\", \"user_xyz789\", \"guest_000\"]');\n this.line('// [\"active\", \"inactive\", \"pending\"]');\n this.line(\"//\");\n this.line(\"// Alternative: Use abstract verification (less precise, faster)\");\n this.line(\"// { abstract: true }\");\n break;\n\n case \"number\":\n this.line(\"// Numbers need a range. Choose min and max values based on\");\n this.line(\"// realistic bounds in your application.\");\n if (field.type.nullable) {\n this.line(\"//\");\n this.line(\"// Note: This field is nullable (can be null)\");\n }\n this.line(\"//\");\n this.line(\"// Examples:\");\n this.line(\"// { min: 0, max: 100 } // Counter\");\n this.line(\"// { min: 0, max: 999999 } // Timestamp\");\n break;\n\n case \"map\":\n case \"set\":\n this.line(`// ${field.type.kind} needs a maximum size. How many entries`);\n this.line(\"// do you need to model to catch bugs?\");\n this.line(\"//\");\n this.line(\"// Recommended: 3-5 for most cases\");\n break;\n\n case \"object\":\n this.line(\"// Complex nested object. Configure each field separately.\");\n break;\n\n default:\n this.line(`// ${field.type.kind} type requires configuration.`);\n }\n }\n\n private generateFieldConfig(field: FieldAnalysis): string {\n switch (field.type.kind) {\n case \"boolean\":\n return \"{ type: 'boolean' }\";\n\n case \"enum\":\n if (field.type.enumValues) {\n const values = field.type.enumValues.map((v) => `\"${v}\"`).join(\", \");\n return `{ type: \"enum\", values: [${values}] }`;\n }\n return \"{ type: 'enum', values: /* CONFIGURE */ null }\";\n\n case \"array\":\n if (field.bounds?.maxLength !== undefined && field.bounds.maxLength !== null) {\n if (field.confidence === \"medium\") {\n return `{ maxLength: /* REVIEW */ ${field.bounds.maxLength} }`;\n }\n return `{ maxLength: ${field.bounds.maxLength} }`;\n }\n return \"{ maxLength: /* CONFIGURE */ null }\";\n\n case \"number\":\n if (field.bounds?.min !== undefined && field.bounds?.max !== undefined) {\n const minStr = field.bounds.min !== null ? field.bounds.min : \"/* CONFIGURE */\";\n const maxStr = field.bounds.max !== null ? field.bounds.max : \"/* CONFIGURE */\";\n\n if (field.confidence === \"high\") {\n return `{ min: ${minStr}, max: ${maxStr} }`;\n }\n return `{ min: /* REVIEW */ ${minStr}, max: /* REVIEW */ ${maxStr} }`;\n }\n return \"{ min: /* CONFIGURE */ null, max: /* CONFIGURE */ null }\";\n\n case \"string\":\n return \"{ values: /* CONFIGURE */ null }\";\n\n case \"map\":\n case \"set\":\n return \"{ maxSize: /* CONFIGURE */ null }\";\n\n default:\n return \"{ /* CONFIGURE */ }\";\n }\n }\n\n private addMessagesConfig(): void {\n this.line(\"messages: {\");\n this.indent++;\n\n this.line(\"// Maximum messages in flight simultaneously across all contexts.\");\n this.line(\"// Higher = more realistic concurrency, but exponentially slower.\");\n this.line(\"//\");\n this.line(\"// Recommended values:\");\n this.line(\"// ⢠2-3: Fast verification (< 10 seconds)\");\n this.line(\"// ⢠4-6: Balanced (10-60 seconds)\");\n this.line(\"// ⢠8+: Thorough but slow (minutes)\");\n this.line(\"//\");\n this.line(\"// WARNING: State space grows exponentially! Start small.\");\n this.line(\"maxInFlight: 3,\");\n this.line(\"\");\n this.line(\"// Maximum tab IDs to model (content scripts are per-tab).\");\n this.line(\"//\");\n this.line(\"// Recommended:\");\n this.line(\"// ⢠0-1: Most extensions (single tab or tab-agnostic)\");\n this.line(\"// ⢠2-3: Multi-tab coordination\");\n this.line(\"//\");\n this.line(\"// Start with 0 or 1 for faster verification.\");\n this.line(\"maxTabs: 1,\");\n\n this.indent--;\n this.line(\"},\");\n this.line(\"\");\n }\n\n private addBehaviorConfig(): void {\n this.line(\"// Verification behavior\");\n this.line(\"// āāāāāāāāāāāāāāāāāāāāā\");\n this.line(\"//\");\n this.line(\"// onBuild: What to do during development builds\");\n this.line(\"// ⢠'warn' - Show warnings but don't fail (recommended)\");\n this.line(\"// ⢠'error' - Fail the build on violations\");\n this.line(\"// ⢠'off' - Skip verification\");\n this.line(\"//\");\n this.line(\"onBuild: 'warn',\");\n this.line(\"\");\n this.line(\"// onRelease: What to do during production builds\");\n this.line(\"// ⢠'error' - Fail the build on violations (recommended)\");\n this.line(\"// ⢠'warn' - Show warnings but don't fail\");\n this.line(\"// ⢠'off' - Skip verification\");\n this.line(\"//\");\n this.line(\"onRelease: 'error',\");\n }\n\n private formatTypeName(type: TypeInfo): string {\n let typeName: string;\n\n switch (type.kind) {\n case \"boolean\":\n typeName = \"boolean\";\n break;\n case \"string\":\n typeName = \"string\";\n break;\n case \"number\":\n typeName = \"number\";\n break;\n case \"enum\":\n if (type.enumValues) {\n typeName = type.enumValues.map((v) => `\"${v}\"`).join(\" | \");\n } else {\n typeName = \"enum\";\n }\n break;\n case \"array\":\n if (type.elementType) {\n typeName = `${this.formatTypeName(type.elementType)}[]`;\n } else {\n typeName = \"array\";\n }\n break;\n case \"object\":\n typeName = \"object\";\n break;\n case \"map\":\n typeName = \"Map\";\n break;\n case \"set\":\n typeName = \"Set\";\n break;\n case \"null\":\n typeName = \"null\";\n break;\n default:\n typeName = \"unknown\";\n }\n\n // Append \" | null\" if type is nullable\n if (type.nullable && type.kind !== \"null\") {\n typeName += \" | null\";\n }\n\n return typeName;\n }\n\n private line(content: string): void {\n if (content === \"\") {\n this.lines.push(\"\");\n } else {\n const indentation = \" \".repeat(this.indent);\n this.lines.push(indentation + content);\n }\n }\n}\n\nexport function generateConfig(analysis: CodebaseAnalysis): string {\n const generator = new ConfigGenerator();\n return generator.generate(analysis);\n}\n",
|
|
11
12
|
"// Configuration validator - detects incomplete configuration\n\nimport type { ValidationResult, ConfigIssue, VerificationConfig } from \"../types\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport class ConfigValidator {\n private issues: ConfigIssue[] = [];\n\n validate(configPath: string): ValidationResult {\n this.issues = [];\n\n if (!fs.existsSync(configPath)) {\n this.issues.push({\n type: \"incomplete\",\n severity: \"error\",\n message: \"Configuration file does not exist\",\n suggestion: \"Run 'bun verify --setup' to generate configuration\",\n });\n\n return {\n valid: false,\n issues: this.issues,\n };\n }\n\n // Read the source file\n const configSource = fs.readFileSync(configPath, \"utf-8\");\n\n // Check for CONFIGURE markers\n this.checkConfigureMarkers(configSource);\n\n // Check for REVIEW markers (warnings only)\n this.checkReviewMarkers(configSource);\n\n // Load and validate the actual config\n try {\n const config = this.loadConfig(configPath);\n this.validateConfig(config);\n } catch (error) {\n this.issues.push({\n type: \"invalid_value\",\n severity: \"error\",\n message: `Failed to load configuration: ${error instanceof Error ? error.message : String(error)}`,\n suggestion: \"Check for syntax errors in the configuration file\",\n });\n }\n\n const hasErrors = this.issues.some((i) => i.severity === \"error\");\n\n return {\n valid: !hasErrors,\n issues: this.issues,\n };\n }\n\n private checkConfigureMarkers(source: string): void {\n const configureRegex = /\\/\\*\\s*CONFIGURE\\s*\\*\\//g;\n const matches = [...source.matchAll(configureRegex)];\n\n if (matches.length > 0) {\n // Find line numbers for each match\n const lines = source.split(\"\\n\");\n const locations: Array<{ line: number; column: number; context: string }> = [];\n\n for (const match of matches) {\n const position = match.index!;\n const lineNumber = source.substring(0, position).split(\"\\n\").length;\n const line = lines[lineNumber - 1];\n\n // Extract field name from context\n const fieldMatch = line.match(/\"([^\"]+)\":\\s*{/);\n const fieldName = fieldMatch ? fieldMatch[1] : \"unknown\";\n\n locations.push({\n line: lineNumber,\n column: match.index! - source.lastIndexOf(\"\\n\", position),\n context: fieldName,\n });\n }\n\n this.issues.push({\n type: \"incomplete\",\n severity: \"error\",\n message: `Found ${matches.length} incomplete configuration marker(s)`,\n suggestion: \"Replace all /* CONFIGURE */ markers with actual values\",\n });\n\n // Add individual issues for each marker\n for (const loc of locations) {\n this.issues.push({\n type: \"incomplete\",\n severity: \"error\",\n field: loc.context,\n location: { line: loc.line, column: loc.column },\n message: `Incomplete configuration at line ${loc.line}`,\n suggestion: `Fill in value for \"${loc.context}\"`,\n });\n }\n }\n }\n\n private checkReviewMarkers(source: string): void {\n const reviewRegex = /\\/\\*\\s*REVIEW\\s*\\*\\//g;\n const matches = [...source.matchAll(reviewRegex)];\n\n if (matches.length > 0) {\n this.issues.push({\n type: \"incomplete\",\n severity: \"warning\",\n message: `Found ${matches.length} value(s) that should be reviewed`,\n suggestion: \"Review auto-generated values marked with /* REVIEW */\",\n });\n }\n }\n\n private loadConfig(configPath: string): VerificationConfig {\n // Dynamic import of the config file\n // Note: In production, this would use proper module loading\n delete require.cache[require.resolve(path.resolve(configPath))];\n const module = require(path.resolve(configPath));\n return module.default || module;\n }\n\n private validateConfig(config: VerificationConfig): void {\n // Check for null values\n this.findNullPlaceholders(config.state, \"state\");\n this.findNullPlaceholders(config.messages, \"messages\");\n\n // Validate bounds\n this.validateBounds(config);\n }\n\n private findNullPlaceholders(obj: any, path: string): void {\n if (obj === null || obj === undefined) {\n this.issues.push({\n type: \"null_placeholder\",\n severity: \"error\",\n field: path,\n message: `Configuration incomplete: ${path}`,\n suggestion: \"Replace null with a concrete value\",\n });\n return;\n }\n\n if (typeof obj !== \"object\") {\n return;\n }\n\n for (const [key, value] of Object.entries(obj)) {\n const fullPath = `${path}.${key}`;\n\n if (value === null) {\n this.issues.push({\n type: \"null_placeholder\",\n severity: \"error\",\n field: fullPath,\n message: `Configuration incomplete: ${fullPath}`,\n suggestion: \"Replace null with a concrete value\",\n });\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n this.findNullPlaceholders(value, fullPath);\n }\n }\n }\n\n private validateBounds(config: VerificationConfig): void {\n // Check messages config\n if (config.messages.maxInFlight !== null) {\n if (config.messages.maxInFlight < 1) {\n this.issues.push({\n type: \"invalid_value\",\n severity: \"error\",\n field: \"messages.maxInFlight\",\n message: \"maxInFlight must be at least 1\",\n suggestion: \"Use a value between 4-10 for most cases\",\n });\n }\n\n if (config.messages.maxInFlight > 20) {\n this.issues.push({\n type: \"unrealistic_bound\",\n severity: \"warning\",\n field: \"messages.maxInFlight\",\n message: \"Very high maxInFlight (>20) will slow verification significantly\",\n suggestion: \"Use 4-10 for development, up to 20 for thorough verification\",\n });\n }\n }\n\n if (config.messages.maxTabs !== null) {\n if (config.messages.maxTabs < 1) {\n this.issues.push({\n type: \"invalid_value\",\n severity: \"error\",\n field: \"messages.maxTabs\",\n message: \"maxTabs must be at least 1\",\n suggestion: \"Use 2-3 for most cases\",\n });\n }\n\n if (config.messages.maxTabs > 10) {\n this.issues.push({\n type: \"unrealistic_bound\",\n severity: \"warning\",\n field: \"messages.maxTabs\",\n message: \"Very high maxTabs (>10) will slow verification significantly\",\n suggestion: \"Use 2-3 for most cases\",\n });\n }\n }\n\n // Check state field bounds\n for (const [fieldName, fieldConfig] of Object.entries(config.state)) {\n if (typeof fieldConfig !== \"object\" || fieldConfig === null) {\n continue;\n }\n\n // Array bounds\n if (\"maxLength\" in fieldConfig) {\n const maxLength = (fieldConfig as any).maxLength;\n if (maxLength !== null) {\n if (maxLength < 0) {\n this.issues.push({\n type: \"invalid_value\",\n severity: \"error\",\n field: `state.${fieldName}.maxLength`,\n message: \"maxLength cannot be negative\",\n suggestion: \"Use a positive number\",\n });\n }\n\n if (maxLength > 50) {\n this.issues.push({\n type: \"unrealistic_bound\",\n severity: \"warning\",\n field: `state.${fieldName}.maxLength`,\n message: `Very large maxLength (${maxLength}) will slow verification`,\n suggestion: \"Use 10-20 for most cases\",\n });\n }\n }\n }\n\n // Number bounds\n if (\"min\" in fieldConfig && \"max\" in fieldConfig) {\n const min = (fieldConfig as any).min;\n const max = (fieldConfig as any).max;\n\n if (min !== null && max !== null && min > max) {\n this.issues.push({\n type: \"invalid_value\",\n severity: \"error\",\n field: `state.${fieldName}`,\n message: `Invalid range: min (${min}) > max (${max})`,\n suggestion: \"Ensure min is less than or equal to max\",\n });\n }\n\n if (min !== null && max !== null && max - min > 1000) {\n this.issues.push({\n type: \"unrealistic_bound\",\n severity: \"warning\",\n field: `state.${fieldName}`,\n message: `Very large number range (${max - min}) will slow verification`,\n suggestion: \"Use smaller ranges when possible\",\n });\n }\n }\n\n // Map/Set bounds\n if (\"maxSize\" in fieldConfig) {\n const maxSize = (fieldConfig as any).maxSize;\n if (maxSize !== null) {\n if (maxSize < 0) {\n this.issues.push({\n type: \"invalid_value\",\n severity: \"error\",\n field: `state.${fieldName}.maxSize`,\n message: \"maxSize cannot be negative\",\n suggestion: \"Use a positive number\",\n });\n }\n\n if (maxSize > 20) {\n this.issues.push({\n type: \"unrealistic_bound\",\n severity: \"warning\",\n field: `state.${fieldName}.maxSize`,\n message: `Very large maxSize (${maxSize}) will slow verification`,\n suggestion: \"Use 3-5 for most cases\",\n });\n }\n }\n }\n }\n }\n}\n\nexport function validateConfig(configPath: string): ValidationResult {\n const validator = new ConfigValidator();\n return validator.validate(configPath);\n}\n"
|
|
12
13
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
14
|
+
"mappings": "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",
|
|
15
|
+
"debugId": "C40ED4F55177D0FC64756E2164756E21",
|
|
15
16
|
"names": []
|
|
16
17
|
}
|