@metamask-previews/platform-api-docs 0.1.0-preview-a302de5c3 → 0.1.0-preview-e12b5ece6

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/extraction.cjs +1 -27
  3. package/dist/extraction.cjs.map +1 -1
  4. package/dist/extraction.d.cts +0 -10
  5. package/dist/extraction.d.cts.map +1 -1
  6. package/dist/extraction.d.mts +0 -10
  7. package/dist/extraction.d.mts.map +1 -1
  8. package/dist/extraction.mjs +1 -26
  9. package/dist/extraction.mjs.map +1 -1
  10. package/dist/generate.cjs +102 -59
  11. package/dist/generate.cjs.map +1 -1
  12. package/dist/generate.d.cts.map +1 -1
  13. package/dist/generate.d.mts.map +1 -1
  14. package/dist/generate.mjs +103 -60
  15. package/dist/generate.mjs.map +1 -1
  16. package/dist/root-messenger-discovery.cjs +5 -26
  17. package/dist/root-messenger-discovery.cjs.map +1 -1
  18. package/dist/root-messenger-discovery.d.cts.map +1 -1
  19. package/dist/root-messenger-discovery.d.mts.map +1 -1
  20. package/dist/root-messenger-discovery.mjs +6 -27
  21. package/dist/root-messenger-discovery.mjs.map +1 -1
  22. package/dist/ts-project.cjs +33 -0
  23. package/dist/ts-project.cjs.map +1 -0
  24. package/dist/ts-project.d.cts +12 -0
  25. package/dist/ts-project.d.cts.map +1 -0
  26. package/dist/ts-project.d.mts +12 -0
  27. package/dist/ts-project.d.mts.map +1 -0
  28. package/dist/ts-project.mjs +29 -0
  29. package/dist/ts-project.mjs.map +1 -0
  30. package/package.json +2 -3
  31. package/dist/discovery.cjs +0 -53
  32. package/dist/discovery.cjs.map +0 -1
  33. package/dist/discovery.d.cts +0 -22
  34. package/dist/discovery.d.cts.map +0 -1
  35. package/dist/discovery.d.mts +0 -22
  36. package/dist/discovery.d.mts.map +0 -1
  37. package/dist/discovery.mjs +0 -48
  38. package/dist/discovery.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"extraction.mjs","sourceRoot":"","sources":["../src/extraction.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\nimport type {\n Identifier,\n InterfaceDeclaration,\n JSDocableNode,\n JSDocTag,\n MethodDeclaration,\n Node as TsMorphNode,\n PropertySignature,\n SourceFile,\n TypeAliasDeclaration,\n TypeElementTypes,\n TypeNode,\n TypeReferenceNode,\n} from 'ts-morph';\nimport { Node as NodeGuards, Project, ts } from 'ts-morph';\n\nimport type {\n MessengerCapabilityPacket,\n DocumentedParameter,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// NOTE: `ts-morph` is used heavily in this file to parse and extract\n// information from TypeScript files. Although this library is not well\n// documented, it wraps the TypeScript AST fairly well, and you can get a good\n// sense of the AST by using this website: <https://ts-ast-viewer.com>\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// JSDoc utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Convert `{@link X}` references inside a JSDoc comment string to plain\n * backtick code spans and escape any remaining (out-of-backtick) curly braces.\n * This way the output is safe to render in a MDX document.\n *\n * @param text - The raw text to normalize.\n * @returns The text with `@link` resolved and stray braces escaped.\n */\nfunction escapeJsDocTextForMdx(text: string): string {\n const withLinksResolved = text.replace(/\\{@link\\s+([^}]+)\\}/gu, '`$1`');\n // Escape the characters MDX reads as syntax rather than text: `{` and `}`\n // open an expression, and `<` opens a JSX tag — so an unescaped return type\n // like `Promise<Foo[]>` fails the site build. Content already inside a code\n // span is left alone.\n return withLinksResolved.replace(\n /`[^`]*`|([{}<])/gu,\n (match, special: string | undefined) =>\n special === undefined ? match : `\\\\${special}`,\n );\n}\n\n/**\n * Extract the comment text of a JSDoc tag — the part that comes after the tag\n * and any identifier, e.g. \"Some param\" in \"@param foo Some param\" —\n * normalizing whitespace to a single space so we can better control how it's\n * rendered within the site.\n *\n * @param tag - The JSDoc tag.\n * @returns The flattened comment text.\n */\nfunction extractJsDocTagComment(tag: JSDocTag): string {\n return (tag.getCommentText() ?? '').replace(/\\s+/gu, ' ').trim();\n}\n\n/**\n * Strip the conventional `- ` separator from the start of a `@param` tag's\n * comment.\n *\n * @param comment - The flattened comment text from a `@param` tag.\n * @returns The comment with any leading `- ` (or `– `, `— `) removed.\n */\nfunction stripJsDocParamSeparator(comment: string): string {\n return comment.replace(/^[-–—]\\s*/u, '');\n}\n\n/**\n * Extract JSDoc from a TypeScript AST node and decompose it into the parts we\n * need to render docs:\n *\n * - `description` — the body above the first tag, with `@deprecated` comments\n * appended as `**Deprecated:** <comment>` lines and normalized for MDX\n * (curly braces escaped, `{@link}` resolved),\n * - `params` — every `@param` tag in source order, with name and description,\n * - `returns` — the `@returns` tag's comment, or empty string if absent.\n *\n * Other tags (`@see`, `@throws`, `@template`, `@example`) are dropped.\n *\n * @param node - The AST node to extract JSDoc from (e.g. a type or a method).\n * @returns The decomposed JSDoc; empty strings/arrays when the node has no JSDoc.\n */\nfunction extractJsDoc(node: JSDocableNode): {\n description: string;\n params: DocumentedParameter[];\n returns: string;\n} {\n const jsDocs = node.getJsDocs();\n if (jsDocs.length === 0) {\n return { description: '', params: [], returns: '' };\n }\n\n const jsDoc = jsDocs[0];\n const descriptionBody = jsDoc.getDescription().trim();\n\n const deprecatedLines: string[] = [];\n const params: DocumentedParameter[] = [];\n let returns = '';\n\n for (const tag of jsDoc.getTags()) {\n const tagName = tag.getTagName();\n if (tagName === 'deprecated') {\n const comment = extractJsDocTagComment(tag);\n deprecatedLines.push(\n comment ? `**Deprecated:** ${comment}` : '**Deprecated:**',\n );\n } else if (tagName === 'param' && NodeGuards.isJSDocParameterTag(tag)) {\n const nameNode = tag.getNameNode();\n const paramName = nameNode.getText();\n if (!paramName) {\n continue;\n }\n const comment = extractJsDocTagComment(tag);\n params.push({\n name: paramName,\n description: escapeJsDocTextForMdx(stripJsDocParamSeparator(comment)),\n });\n } else if (tagName === 'returns' || tagName === 'return') {\n const comment = extractJsDocTagComment(tag);\n returns = escapeJsDocTextForMdx(comment);\n }\n }\n\n const description = escapeJsDocTextForMdx(\n [descriptionBody, ...deprecatedLines]\n .filter((line) => line.length > 0)\n .join('\\n'),\n );\n\n return { description, params, returns };\n}\n\n/**\n * Check whether a node has an `@deprecated` JSDoc tag.\n *\n * @param node - The AST node to check.\n * @returns True if the node has an `@deprecated` tag.\n */\nfunction hasDeprecatedJsDocTag(node: JSDocableNode): boolean {\n return node\n .getJsDocs()\n .flatMap((jsDoc) => jsDoc.getTags())\n .some((tag) => tag.getTagName() === 'deprecated');\n}\n\n// ---------------------------------------------------------------------------\n// Type-resolution helpers (powered by ts-morph's type checker)\n// ---------------------------------------------------------------------------\n\n/**\n * Locates the type that represents a method on a class (e.g.\n * `Class['method']`), which itself comes from a messenger action handler.\n *\n * @param typeNode - The node that represents the indexed access.\n * @returns The found method declaration, or null.\n */\nfunction findClassMethodDeclaration(\n typeNode: TypeNode | undefined,\n): MethodDeclaration | null {\n // Fundamental check: if we don't have `Class['method']`, we can't do anything.\n if (!NodeGuards.isIndexedAccessTypeNode(typeNode)) {\n return null;\n }\n\n // The type that represents the class being accessed.\n // EXAMPLE:\n // FooController['someMethod']\n // ^^^^^^^^^^^^^\n const objectType = typeNode.getObjectTypeNode();\n // The type that represents the property being accessed.\n // EXAMPLE:\n // FooController['someMethod']\n // ^^^^^^^^^^^^\n const indexType = typeNode.getIndexTypeNode();\n\n // To access a property on a type, it must be a type we can access properties of.\n if (\n !NodeGuards.isTypeReference(objectType) ||\n !NodeGuards.isLiteralTypeNode(indexType)\n ) {\n return null;\n }\n const indexLiteral = indexType.getLiteral();\n // Names of methods must be static strings; they cannot be template strings.\n if (\n !NodeGuards.isStringLiteral(indexLiteral) &&\n !NodeGuards.isNoSubstitutionTemplateLiteral(indexLiteral)\n ) {\n return null;\n }\n const methodName = indexLiteral.getLiteralValue();\n\n // Reject qualified-name type names, as we need a plain identifier to\n // resolve the symbol.\n // EXAMPLE:\n // import * as somePackage from '....js';\n // somePackage.FooController['someMethod']\n // ^^^^^^^^^^^^^^^^^^^^^^^^^\n const classNameNode = objectType.getTypeName();\n if (!NodeGuards.isIdentifier(classNameNode)) {\n return null;\n }\n\n // Since we know we have a type reference, we can assume that we have a symbol.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const localSymbol = classNameNode.getSymbol()!;\n // If we have a type imported from another file, ensure that when we access\n // the declaration, it's the type declaration in the other file, not the\n // import declaration in this file.\n // EXAMPLE:\n // import { FooController } from '@metamask/foo-controller';\n // FooController['someMethod']\n // ^^^^^^^^^^^^^\n const symbol = localSymbol.getAliasedSymbol() ?? localSymbol;\n\n for (const declaration of symbol.getDeclarations()) {\n // We must have a class to treat the property on the object type as a\n // method.\n if (NodeGuards.isClassDeclaration(declaration)) {\n const method = declaration.getMethod(methodName);\n if (method) {\n return method;\n }\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Method info\n// ---------------------------------------------------------------------------\n\n/**\n * Build the textual signature of a class method — its parameter list and\n * return type expressed as a TypeScript function type — so a handler that\n * references `Class['method']` can be rendered as `(arg: T) => R` instead of\n * the bare indexed-access syntax.\n *\n * @param method - The method declaration.\n * @returns The signature, e.g. `(id: number) => Promise<string>`.\n */\nfunction buildMethodSignature(method: MethodDeclaration): string {\n const signatureParams = method\n .getParameters()\n .map((param) => {\n const rest = param.isRestParameter() ? '...' : '';\n const paramName = param.getNameNode().getText();\n const optional = param.hasQuestionToken() ? '?' : '';\n const typeNode = param.getTypeNode();\n const paramType = typeNode ? typeNode.getText() : 'unknown';\n return `${rest}${paramName}${optional}: ${paramType}`;\n })\n .join(', ');\n\n const returnTypeNode = method.getReturnTypeNode();\n const returnType = returnTypeNode ? returnTypeNode.getText() : 'void';\n // For async methods, the declared return type already includes `Promise<>`,\n // so we don't need to wrap again.\n return `(${signatureParams}) => ${returnType}`;\n}\n\n// ---------------------------------------------------------------------------\n// Messenger discovery\n// ---------------------------------------------------------------------------\n\n/**\n * A messenger capability type whose body invokes a capability-type-constructor\n * utility such as `ControllerGetStateAction<...>` or\n * `ControllerStateChangeEvent<...>`. The walker classifies the body once when\n * it captures the declaration so the extractor can read the body's type name\n * and type arguments without re-running the AST guards.\n */\ntype ConstructorMessengerCapabilityTypeDeclaration = {\n bodyShape: 'constructor';\n kind: 'action' | 'event';\n declaration: TypeAliasDeclaration;\n body: TypeReferenceNode;\n typeName: Identifier;\n};\n\n/**\n * A messenger capability type whose declaration carries the action/event\n * shape directly — either an interface or a type alias for a type literal.\n * The extractor reads `type`, `handler`, and `payload` from the members.\n */\ntype ObjectMessengerCapabilityTypeDeclaration = {\n bodyShape: 'object';\n kind: 'action' | 'event';\n declaration: TypeAliasDeclaration | InterfaceDeclaration;\n};\n\n/**\n * Represents a type declaration (type alias or interface) for an individual\n * messenger action or event, tagged with the body shape the walker\n * identified.\n */\ntype MessengerCapabilityTypeDeclaration =\n | ConstructorMessengerCapabilityTypeDeclaration\n | ObjectMessengerCapabilityTypeDeclaration;\n\n/**\n * Tag a capability type declaration with the body shape it has, so the right\n * extractor can read it: 'constructor' for a capability-type-constructor\n * invocation such as `ControllerGetStateAction<...>`, 'object' otherwise.\n *\n * Callers must resolve unions and bare type references first, so that the\n * declaration reaching here is a leaf.\n *\n * @param declaration - The type alias or interface to classify.\n * @param kind - Whether to tag the declaration as 'action' or 'event'.\n * @returns The tagged declaration, or null for a qualified-name reference.\n */\nexport function classifyMessengerCapabilityTypeDeclaration(\n declaration: TypeAliasDeclaration | InterfaceDeclaration,\n kind: 'action' | 'event',\n): MessengerCapabilityTypeDeclaration | null {\n // Interfaces always carry their members directly.\n // EXAMPLE:\n // interface FooControllerSomeAction { ... }\n if (NodeGuards.isInterfaceDeclaration(declaration)) {\n return { bodyShape: 'object', kind, declaration };\n }\n\n const body = declaration.getTypeNode();\n\n // A TypeReference body is a capability-type-constructor invocation (e.g.\n // `ControllerGetStateAction<typeof name, State>`). Tag it so the constructor\n // extractor can read `body` directly without re-checking its shape.\n // EXAMPLE:\n // type FooControllerSomeAction = ControllerGetStateAction<...>\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (body && NodeGuards.isTypeReference(body)) {\n // Reject qualified-name constructor type names, as we need a plain\n // identifier to match the constructor by name.\n // EXAMPLE:\n // import * as somePackage from '....js';\n // type FooControllerSomeAction = somePackage.ControllerGetStateAction<...>\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n const constructorTypeName = body.getTypeName();\n if (!NodeGuards.isIdentifier(constructorTypeName)) {\n return null;\n }\n\n return {\n bodyShape: 'constructor',\n kind,\n declaration,\n body,\n typeName: constructorTypeName,\n };\n }\n\n // Anything else (a type literal, intersection, conditional, …) goes to the\n // literal extractor, which knows how to read members off a type literal and\n // rejects exotic shapes.\n // EXAMPLE:\n // type FooControllerSomeAction = { ... }\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n return { bodyShape: 'object', kind, declaration };\n}\n\n/**\n * Represents a type alias for a messenger. Only includes nodes representing the\n * `Actions` and `Events` type parameters.\n */\ntype ParsedMessengerTypeAlias = {\n actionsTypeParameter: TypeNode;\n eventsTypeParameter: TypeNode;\n};\n\n/**\n * Looks for Messenger types in the source file (that is, those that are type\n * aliases whose names end with \"Messenger\"), then extracts the `Actions` and\n * `Events` parameters from these types.\n *\n * @param sourceFile - The TypeScript source file to scan.\n * @returns A list of objects that represent messenger types.\n */\nfunction findMessengerTypeAliases(\n sourceFile: SourceFile,\n): ParsedMessengerTypeAlias[] {\n const parsedMessengerTypeAliases: ParsedMessengerTypeAlias[] = [];\n\n for (const typeAlias of sourceFile.getTypeAliases()) {\n if (!typeAlias.getName().endsWith('Messenger')) {\n continue;\n }\n\n const body = typeAlias.getTypeNode();\n // Basic check\n if (!body || !NodeGuards.isTypeReference(body)) {\n continue;\n }\n\n const typeArgs = body.getTypeArguments();\n // Messenger types always have 3 type parameters\n // (e.g. `Messenger<'FooController', Actions, Events>`)\n if (typeArgs.length < 3) {\n continue;\n }\n\n parsedMessengerTypeAliases.push({\n actionsTypeParameter: typeArgs[1],\n eventsTypeParameter: typeArgs[2],\n });\n }\n\n return parsedMessengerTypeAliases;\n}\n\n/**\n * Walks the `Actions` and `Events` type parameters of the given messenger\n * types, extracted in a previous step, to find all type declarations (i.e.,\n * statements) that represent individual messenger actions or events.\n *\n * @param parsedMessengerTypeAliases - The list of objects representing\n * messenger types, parsed in a previous step.\n * @returns The list of type aliases that represent messenger capabilities among\n * the given messenger types.\n */\nfunction findAllMessengerCapabilityTypeDeclarations(\n parsedMessengerTypeAliases: ParsedMessengerTypeAlias[],\n): MessengerCapabilityTypeDeclaration[] {\n const allCapabilityTypeDeclarations: MessengerCapabilityTypeDeclaration[] =\n [];\n let allVisitedTypeDeclarations: Set<TsMorphNode> = new Set();\n\n for (const {\n actionsTypeParameter,\n eventsTypeParameter,\n } of parsedMessengerTypeAliases) {\n for (const [typeParameter, kind] of [\n [actionsTypeParameter, 'action'],\n [eventsTypeParameter, 'event'],\n ] as const) {\n const result = recursivelyFindMessengerCapabilityTypeDeclarations(\n typeParameter,\n kind,\n allVisitedTypeDeclarations,\n );\n allCapabilityTypeDeclarations.push(...result.capabilityTypeDeclarations);\n allVisitedTypeDeclarations = result.visitedTypeDeclarations;\n }\n }\n\n return allCapabilityTypeDeclarations;\n}\n\n/**\n * Recursively walks a `ts-morph` AST node — at first the `Actions` or `Events`\n * type parameter of a messenger type, and then a node within that parameter —\n * to find all type aliases that represent individual messenger actions or\n * events, no matter how deeply the type aliases exist in the tree or in which\n * file they are located.\n *\n * @param node - The `ts-morph` AST node to walk.\n * @param kind - Whether to tag found type aliases as 'action' or 'event'.\n * @param visitedTypeDeclarations - A variable that tracks visited type aliases\n * and prevents duplicates.\n * @returns The list of extracted messenger capability type aliases as well as\n * an updated version of `visitedTypeDeclarations`.\n */\nfunction recursivelyFindMessengerCapabilityTypeDeclarations(\n node: TsMorphNode,\n kind: 'action' | 'event',\n visitedTypeDeclarations: Set<TsMorphNode>,\n): {\n capabilityTypeDeclarations: MessengerCapabilityTypeDeclaration[];\n visitedTypeDeclarations: Set<TsMorphNode>;\n} {\n const result: {\n capabilityTypeDeclarations: MessengerCapabilityTypeDeclaration[];\n visitedTypeDeclarations: Set<TsMorphNode>;\n } = {\n capabilityTypeDeclarations: [],\n visitedTypeDeclarations: new Set([...visitedTypeDeclarations]),\n };\n\n // If `node` is a union type, walk each type within it.\n // EXAMPLES:\n // type Actions = FooControllerSomeAction | FooControllerSomeOtherAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type FooControllerActions = FooControllerSomeAction | FooControllerSomeOtherAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (NodeGuards.isUnionTypeNode(node)) {\n for (const typeNode of node.getTypeNodes()) {\n const innerResult = recursivelyFindMessengerCapabilityTypeDeclarations(\n typeNode,\n kind,\n result.visitedTypeDeclarations,\n );\n result.capabilityTypeDeclarations.push(\n ...innerResult.capabilityTypeDeclarations,\n );\n for (const typeDeclaration of innerResult.visitedTypeDeclarations) {\n result.visitedTypeDeclarations.add(typeDeclaration);\n }\n }\n return result;\n }\n\n // If `node` is not a type reference, don't walk it.\n // EXAMPLE:\n // // Bad\n // type Actions = { ... }\n // ^^^^^^^\n // // Good\n // type Actions = FooControllerSomeAction;\n // ^^^^^^^^^^^^^^^^^^^^^^^\n // // Good\n // type Actions = ControllerGetStateAction<...>;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (!NodeGuards.isTypeReference(node)) {\n return result;\n }\n\n const nameNode = node.getTypeName();\n\n // Reject qualified-name type names, as we need a plain identifier to\n // resolve the symbol.\n // EXAMPLE:\n // import * as somePackage from '....js';\n // type Actions = somePackage.FooControllerSomeAction;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (!NodeGuards.isIdentifier(nameNode)) {\n return result;\n }\n\n // Since we know we have a type reference, we can assume that we have a symbol.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const localSymbol = nameNode.getSymbol()!;\n // If we have a type imported from another file, ensure that when we access\n // the declaration, it's the type declaration in the other file, not the\n // import declaration in this file.\n // EXAMPLE:\n // import { FooControllerSomeAction } from '@metamask/foo-controller';\n // type Actions = FooControllerSomeAction;\n // ^^^^^^^^^^^^^^^^^^^^^^^\n const symbol = localSymbol.getAliasedSymbol() ?? localSymbol;\n\n // At this point, we have a type *reference*, but we need to find the type\n // *declaration*.\n // For instance, if we have `FooControllerSomeAction`, we need to find\n // the full `type FooControllerSomeAction = ...` statement.\n for (const declaration of symbol.getDeclarations()) {\n // Prevent duplicates\n if (result.visitedTypeDeclarations.has(declaration)) {\n continue;\n }\n result.visitedTypeDeclarations.add(declaration);\n\n // If we have a type alias, then we have to handle a few scenarios.\n // EXAMPLES:\n // type FooControllerMethodActions = ...\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type FooControllerSomeAction = ...\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (NodeGuards.isTypeAliasDeclaration(declaration)) {\n const body = declaration.getTypeNode();\n\n // If the body is a union type or a plain type reference (not a utility\n // type), walk it.\n // EXAMPLES:\n // type FooControllerMethodActions = FooControllerSomeAction | FooControllerSomeOtherAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type DelegationControllerMethodActions = DelegationControllerSignDelegationAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (\n body &&\n (NodeGuards.isUnionTypeNode(body) ||\n (NodeGuards.isTypeReference(body) &&\n body.getTypeArguments().length === 0))\n ) {\n const innerResult = recursivelyFindMessengerCapabilityTypeDeclarations(\n body,\n kind,\n result.visitedTypeDeclarations,\n );\n result.capabilityTypeDeclarations.push(\n ...innerResult.capabilityTypeDeclarations,\n );\n for (const typeDeclaration of innerResult.visitedTypeDeclarations) {\n result.visitedTypeDeclarations.add(typeDeclaration);\n }\n continue;\n }\n\n // Everything else is a leaf capability type — a capability-type-\n // constructor invocation (e.g. `ControllerGetStateAction<typeof name,\n // State>`) or a literal object type. Tag it so the matching extractor\n // can read it without re-checking its shape.\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<...>\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type FooControllerSomeAction = { ... }\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n const classified = classifyMessengerCapabilityTypeDeclaration(\n declaration,\n kind,\n );\n if (classified) {\n result.capabilityTypeDeclarations.push(classified);\n }\n }\n\n // Interfaces always carry their members directly — tag for the literal\n // extractor.\n // EXAMPLE:\n // interface FooControllerSomeAction { ... }\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n else if (NodeGuards.isInterfaceDeclaration(declaration)) {\n result.capabilityTypeDeclarations.push({\n bodyShape: 'object',\n kind,\n declaration,\n });\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Per-statement extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Given the declaration of a messenger capability type, extract information\n * about it (action/event type string, handler/payload arguments and return\n * type, etc.)\n *\n * @param capabilityTypeDeclaration - The statement that declared the type for a\n * messenger action or event, extracted in a previous step.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns Information that may be extracted from the messenger capability type\n * (may be `null` if the type is ineligible for extraction).\n */\nexport function extractFromMessengerCapabilityTypeDeclaration(\n capabilityTypeDeclaration: MessengerCapabilityTypeDeclaration,\n projectPath: string,\n): MessengerCapabilityPacket | null {\n if (capabilityTypeDeclaration.bodyShape === 'constructor') {\n return tryToExtractFromCapabilityTypeConstructor(\n capabilityTypeDeclaration,\n projectPath,\n );\n }\n return tryToExtractFromMessengerCapabilityTypeLiteral(\n capabilityTypeDeclaration,\n projectPath,\n );\n}\n\n/**\n * If a messenger capability type is a type alias or interface and its body is\n * a literal object type — i.e. one of:\n *\n * - `{ type: '...'; handler: ... }` (action)\n * - `{ type: '...'; payload: ... }` (event)\n *\n * then this function extracts information about the type (action/event type\n * string, handler/payload arguments and return type, etc.)\n *\n * @param capabilityTypeDeclaration - The statement that declared the type for a\n * messenger action or event, extracted in a previous step.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns The extracted capability packet, or null if the shape of the type\n * doesn't match.\n */\nfunction tryToExtractFromMessengerCapabilityTypeLiteral(\n capabilityTypeDeclaration: ObjectMessengerCapabilityTypeDeclaration,\n projectPath: string,\n): MessengerCapabilityPacket | null {\n const { declaration, kind } = capabilityTypeDeclaration;\n\n // We must have a object type alias or an interface, and the body must not be empty.\n // EXAMPLES:\n // // Good\n // type FooControllerSomeAction = {\n // type: 'FooController:getState';\n // handler: FooController['getState'];\n // }\n // // Good\n // interface FooControllerSomeAction {\n // type: 'FooController:getState';\n // handler: FooController['getState'];\n // }\n // // Bad\n // type FooControllerSomeAction = {};\n // // Bad\n // interface FooControllerSomeAction {};\n let members: TypeElementTypes[] | undefined;\n if (NodeGuards.isTypeAliasDeclaration(declaration)) {\n const body = declaration.getTypeNode();\n if (body && NodeGuards.isTypeLiteral(body)) {\n members = body.getMembers();\n }\n } else {\n members = declaration.getMembers();\n }\n if (!members) {\n return null;\n }\n\n const propertySignatures = members.filter(\n NodeGuards.isPropertySignature.bind(NodeGuards),\n );\n\n // Actions and events must have a `type`, and it must be a string.\n const typeString = getMessengerCapabilityTypeString(propertySignatures);\n if (!typeString) {\n return null;\n }\n\n // Actions must have a `handler`, and events must have a `payload`.\n const handlerOrPayloadProperty = findProperty(\n propertySignatures,\n kind === 'action' ? 'handler' : 'payload',\n );\n if (!handlerOrPayloadProperty) {\n return null;\n }\n\n const handlerOrPayloadPropertyTypeNode =\n // We can assume the property has a type; otherwise it wouldn't compile.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n handlerOrPayloadProperty.getTypeNode()!;\n let handlerOrPayloadSignature = handlerOrPayloadPropertyTypeNode\n .getText()\n .trim();\n\n const { description: jsDoc, params, returns } = extractJsDoc(declaration);\n\n // For actions that represent methods (e.g. `Class['method']`), walk the\n // handler type to find the underlying handler signature\n // (e.g. `(id: number) => Promise<string>`).\n if (kind === 'action') {\n const methodDeclaration = findClassMethodDeclaration(\n handlerOrPayloadPropertyTypeNode,\n );\n if (methodDeclaration) {\n handlerOrPayloadSignature = buildMethodSignature(methodDeclaration);\n }\n }\n\n const sourceFile = declaration.getSourceFile();\n return {\n typeName: declaration.getName(),\n typeString,\n kind,\n jsDoc,\n params,\n returns,\n handlerOrPayload: handlerOrPayloadSignature,\n sourceFile: path.relative(projectPath, sourceFile.getFilePath()),\n line: declaration.getStartLineNumber(),\n deprecated: hasDeprecatedJsDocTag(declaration),\n };\n}\n\n/**\n * Searches the property signatures of a messenger capability type alias or\n * interface to find the value of the `type` property, and then resolves it to a\n * string (assuming it is already a string or a resolvable template literal).\n *\n * @param capabilityTypeProperties - The property signatures of the messenger\n * capability type.\n * @returns The extracted capability type string, or null if `type` cannot be\n * found in the members or it is an unexpected node.\n */\nfunction getMessengerCapabilityTypeString(\n capabilityTypeProperties: PropertySignature[],\n): string | null {\n const typeProperty = findProperty(capabilityTypeProperties, 'type');\n if (!typeProperty) {\n return null;\n }\n\n // A `type` property without an explicit type wouldn't compile.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const typeNode = typeProperty.getTypeNode()!;\n\n // Ask the type checker to resolve the value of `type`. We're looking for\n // `type` to be either a string literal or template literal.\n //\n // EXAMPLES:\n // type FooControllerSomeAction = {\n // type: 'FooController:someAction';\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^\n // }\n // type FooControllerSomeAction = {\n // type: `FooController:someAction`;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^\n // }\n // type FooControllerSomeAction = {\n // type: `${typeof CONTROLLER_NAME}:someAction`;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // }\n const resolvedType = typeNode.getType();\n if (resolvedType.isStringLiteral()) {\n // Type assertion: There aren't any type guards we can use to narrow this\n // type further.\n const literalValue = resolvedType.getLiteralValueOrThrow() as string;\n\n // Messenger action/event types need to be namespaced.\n if (literalValue.includes(':')) {\n return literalValue;\n }\n }\n\n return null;\n}\n\n/**\n * Finds a specific property in a list of property signatures for an object\n * type.\n *\n * @param propertySignatures - The property signatures of the messenger\n * capability type.\n * @param name - The property name to find.\n * @returns The property signature, or null.\n */\nfunction findProperty(\n propertySignatures: PropertySignature[],\n name: string,\n): PropertySignature | null {\n for (const property of propertySignatures) {\n const propertyNameNode = property.getNameNode();\n if (\n !NodeGuards.isIdentifier(propertyNameNode) ||\n propertyNameNode.getText() !== name\n ) {\n continue;\n }\n\n return property;\n }\n\n return null;\n}\n\n/**\n * If a messenger capability type is a type alias for either the\n * `ControllerGetStateAction` or `ControllerStateChangeEvent` type constructors,\n * then this function extracts information about the type (action/event type\n * string, handler/payload arguments and return type, etc.)\n *\n * @param capabilityTypeDeclaration - The statement that declared the type for a\n * messenger action or event, extracted in a previous step.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns The extracted capability packet, or null if the shape of the type\n * doesn't match.\n */\nfunction tryToExtractFromCapabilityTypeConstructor(\n capabilityTypeDeclaration: ConstructorMessengerCapabilityTypeDeclaration,\n projectPath: string,\n): MessengerCapabilityPacket | null {\n const { declaration, kind, body, typeName } = capabilityTypeDeclaration;\n\n // The name of the utility type should be either `ControllerGetStateAction`\n // (for actions) or `ControllerStateChangeEvent` (for events).\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<...>\n // type FooControllerSomeEvent = ControllerStateChangeEvent<...>\n const expectedConstructor =\n kind === 'action'\n ? 'ControllerGetStateAction'\n : 'ControllerStateChangeEvent';\n if (typeName.getText() !== expectedConstructor) {\n return null;\n }\n\n // The utility type should take two parameters.\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<..., ...>\n // type FooControllerSomeEvent = ControllerStateChangeEvent<..., ...>\n const typeArgs = body.getTypeArguments();\n if (typeArgs.length < 2) {\n return null;\n }\n\n const namespaceArgType = typeArgs[0].getType();\n // The first parameter should be a string literal.\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<'FooController', ...>\n // type FooControllerSomeAction = ControllerGetStateAction<typeof CONTROLLER_NAME, ...>\n if (!namespaceArgType.isStringLiteral()) {\n return null;\n }\n // Type assertion: There aren't any type guards we can use to narrow this type\n // further.\n const namespace = namespaceArgType.getLiteralValueOrThrow() as string;\n\n const typeString =\n kind === 'action' ? `${namespace}:getState` : `${namespace}:stateChange`;\n const stateArgText = typeArgs[1].getText();\n const handlerOrPayload =\n kind === 'action' ? `() => ${stateArgText}` : `[${stateArgText}, Patch[]]`;\n const { description, params, returns } = extractJsDoc(declaration);\n const sourceFile = declaration.getSourceFile();\n\n return {\n typeName: declaration.getName(),\n typeString,\n kind,\n jsDoc: description,\n params,\n returns,\n handlerOrPayload,\n sourceFile: path.relative(projectPath, sourceFile.getFilePath()),\n line: declaration.getStartLineNumber(),\n deprecated: hasDeprecatedJsDocTag(declaration),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public entry points\n// ---------------------------------------------------------------------------\n\n/**\n * Create a ts-morph Project configured for messenger-docs extraction. The\n * caller should add every source file that may be referenced (directly or\n * transitively) before calling {@link extractFromSourceFile}, so the type\n * checker can resolve cross-file references.\n *\n * @returns A new ts-morph Project.\n */\nexport function createExtractionProject(): Project {\n return new Project({\n compilerOptions: {\n allowJs: false,\n noEmit: true,\n // Match the project's permissive defaults — we just need symbol\n // resolution, not full typechecking.\n strict: false,\n skipLibCheck: true,\n // Explicit module options so cross-file symbol resolution works\n // regardless of the host process's tsconfig.\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.NodeJs,\n },\n });\n}\n\n/**\n * Extract information (action/event type string, handler/payload arguments and\n * return type, etc.) about every messenger action or event type which is\n * reachable through all of a source file's `*Messenger` type declarations.\n *\n * The caller is responsible for ensuring `sourceFile` (plus any files it\n * imports from) belongs to a `ts-morph` Project so cross-file symbol resolution\n * works.\n *\n * @param sourceFile - The TypeScript source file to extract from.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns The extracted information about actions and events.\n */\nexport function extractFromSourceFile(\n sourceFile: SourceFile,\n projectPath: string,\n): MessengerCapabilityPacket[] {\n const messengerTypeAliases = findMessengerTypeAliases(sourceFile);\n\n const capabilityTypeDeclarations =\n findAllMessengerCapabilityTypeDeclarations(messengerTypeAliases);\n\n const messengerCapabilityPackets: MessengerCapabilityPacket[] = [];\n for (const capabilityTypeDeclaration of capabilityTypeDeclarations) {\n const messengerCapabilityPacket =\n extractFromMessengerCapabilityTypeDeclaration(\n capabilityTypeDeclaration,\n projectPath,\n );\n if (messengerCapabilityPacket) {\n messengerCapabilityPackets.push(messengerCapabilityPacket);\n }\n }\n return messengerCapabilityPackets;\n}\n"]}
1
+ {"version":3,"file":"extraction.mjs","sourceRoot":"","sources":["../src/extraction.ts"],"names":[],"mappings":"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","sourcesContent":["import * as path from 'node:path';\nimport type {\n Identifier,\n InterfaceDeclaration,\n JSDocableNode,\n JSDocTag,\n MethodDeclaration,\n Node as TsMorphNode,\n PropertySignature,\n SourceFile,\n TypeAliasDeclaration,\n TypeElementTypes,\n TypeNode,\n TypeReferenceNode,\n} from 'ts-morph';\nimport { Node as NodeGuards } from 'ts-morph';\n\nimport type {\n MessengerCapabilityPacket,\n DocumentedParameter,\n} from './types.js';\n\n// ---------------------------------------------------------------------------\n// NOTE: `ts-morph` is used heavily in this file to parse and extract\n// information from TypeScript files. Although this library is not well\n// documented, it wraps the TypeScript AST fairly well, and you can get a good\n// sense of the AST by using this website: <https://ts-ast-viewer.com>\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// JSDoc utilities\n// ---------------------------------------------------------------------------\n\n/**\n * Convert `{@link X}` references inside a JSDoc comment string to plain\n * backtick code spans and escape any remaining (out-of-backtick) curly braces.\n * This way the output is safe to render in a MDX document.\n *\n * @param text - The raw text to normalize.\n * @returns The text with `@link` resolved and stray braces escaped.\n */\nfunction escapeJsDocTextForMdx(text: string): string {\n const withLinksResolved = text.replace(/\\{@link\\s+([^}]+)\\}/gu, '`$1`');\n // Escape the characters MDX reads as syntax rather than text: `{` and `}`\n // open an expression, and `<` opens a JSX tag — so an unescaped return type\n // like `Promise<Foo[]>` fails the site build. Content already inside a code\n // span is left alone.\n return withLinksResolved.replace(\n /`[^`]*`|([{}<])/gu,\n (match, special: string | undefined) =>\n special === undefined ? match : `\\\\${special}`,\n );\n}\n\n/**\n * Extract the comment text of a JSDoc tag — the part that comes after the tag\n * and any identifier, e.g. \"Some param\" in \"@param foo Some param\" —\n * normalizing whitespace to a single space so we can better control how it's\n * rendered within the site.\n *\n * @param tag - The JSDoc tag.\n * @returns The flattened comment text.\n */\nfunction extractJsDocTagComment(tag: JSDocTag): string {\n return (tag.getCommentText() ?? '').replace(/\\s+/gu, ' ').trim();\n}\n\n/**\n * Strip the conventional `- ` separator from the start of a `@param` tag's\n * comment.\n *\n * @param comment - The flattened comment text from a `@param` tag.\n * @returns The comment with any leading `- ` (or `– `, `— `) removed.\n */\nfunction stripJsDocParamSeparator(comment: string): string {\n return comment.replace(/^[-–—]\\s*/u, '');\n}\n\n/**\n * Extract JSDoc from a TypeScript AST node and decompose it into the parts we\n * need to render docs:\n *\n * - `description` — the body above the first tag, with `@deprecated` comments\n * appended as `**Deprecated:** <comment>` lines and normalized for MDX\n * (curly braces escaped, `{@link}` resolved),\n * - `params` — every `@param` tag in source order, with name and description,\n * - `returns` — the `@returns` tag's comment, or empty string if absent.\n *\n * Other tags (`@see`, `@throws`, `@template`, `@example`) are dropped.\n *\n * @param node - The AST node to extract JSDoc from (e.g. a type or a method).\n * @returns The decomposed JSDoc; empty strings/arrays when the node has no JSDoc.\n */\nfunction extractJsDoc(node: JSDocableNode): {\n description: string;\n params: DocumentedParameter[];\n returns: string;\n} {\n const jsDocs = node.getJsDocs();\n if (jsDocs.length === 0) {\n return { description: '', params: [], returns: '' };\n }\n\n const jsDoc = jsDocs[0];\n const descriptionBody = jsDoc.getDescription().trim();\n\n const deprecatedLines: string[] = [];\n const params: DocumentedParameter[] = [];\n let returns = '';\n\n for (const tag of jsDoc.getTags()) {\n const tagName = tag.getTagName();\n if (tagName === 'deprecated') {\n const comment = extractJsDocTagComment(tag);\n deprecatedLines.push(\n comment ? `**Deprecated:** ${comment}` : '**Deprecated:**',\n );\n } else if (tagName === 'param' && NodeGuards.isJSDocParameterTag(tag)) {\n const nameNode = tag.getNameNode();\n const paramName = nameNode.getText();\n if (!paramName) {\n continue;\n }\n const comment = extractJsDocTagComment(tag);\n params.push({\n name: paramName,\n description: escapeJsDocTextForMdx(stripJsDocParamSeparator(comment)),\n });\n } else if (tagName === 'returns' || tagName === 'return') {\n const comment = extractJsDocTagComment(tag);\n returns = escapeJsDocTextForMdx(comment);\n }\n }\n\n const description = escapeJsDocTextForMdx(\n [descriptionBody, ...deprecatedLines]\n .filter((line) => line.length > 0)\n .join('\\n'),\n );\n\n return { description, params, returns };\n}\n\n/**\n * Check whether a node has an `@deprecated` JSDoc tag.\n *\n * @param node - The AST node to check.\n * @returns True if the node has an `@deprecated` tag.\n */\nfunction hasDeprecatedJsDocTag(node: JSDocableNode): boolean {\n return node\n .getJsDocs()\n .flatMap((jsDoc) => jsDoc.getTags())\n .some((tag) => tag.getTagName() === 'deprecated');\n}\n\n// ---------------------------------------------------------------------------\n// Type-resolution helpers (powered by ts-morph's type checker)\n// ---------------------------------------------------------------------------\n\n/**\n * Locates the type that represents a method on a class (e.g.\n * `Class['method']`), which itself comes from a messenger action handler.\n *\n * @param typeNode - The node that represents the indexed access.\n * @returns The found method declaration, or null.\n */\nfunction findClassMethodDeclaration(\n typeNode: TypeNode | undefined,\n): MethodDeclaration | null {\n // Fundamental check: if we don't have `Class['method']`, we can't do anything.\n if (!NodeGuards.isIndexedAccessTypeNode(typeNode)) {\n return null;\n }\n\n // The type that represents the class being accessed.\n // EXAMPLE:\n // FooController['someMethod']\n // ^^^^^^^^^^^^^\n const objectType = typeNode.getObjectTypeNode();\n // The type that represents the property being accessed.\n // EXAMPLE:\n // FooController['someMethod']\n // ^^^^^^^^^^^^\n const indexType = typeNode.getIndexTypeNode();\n\n // To access a property on a type, it must be a type we can access properties of.\n if (\n !NodeGuards.isTypeReference(objectType) ||\n !NodeGuards.isLiteralTypeNode(indexType)\n ) {\n return null;\n }\n const indexLiteral = indexType.getLiteral();\n // Names of methods must be static strings; they cannot be template strings.\n if (\n !NodeGuards.isStringLiteral(indexLiteral) &&\n !NodeGuards.isNoSubstitutionTemplateLiteral(indexLiteral)\n ) {\n return null;\n }\n const methodName = indexLiteral.getLiteralValue();\n\n // Reject qualified-name type names, as we need a plain identifier to\n // resolve the symbol.\n // EXAMPLE:\n // import * as somePackage from '....js';\n // somePackage.FooController['someMethod']\n // ^^^^^^^^^^^^^^^^^^^^^^^^^\n const classNameNode = objectType.getTypeName();\n if (!NodeGuards.isIdentifier(classNameNode)) {\n return null;\n }\n\n // Since we know we have a type reference, we can assume that we have a symbol.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const localSymbol = classNameNode.getSymbol()!;\n // If we have a type imported from another file, ensure that when we access\n // the declaration, it's the type declaration in the other file, not the\n // import declaration in this file.\n // EXAMPLE:\n // import { FooController } from '@metamask/foo-controller';\n // FooController['someMethod']\n // ^^^^^^^^^^^^^\n const symbol = localSymbol.getAliasedSymbol() ?? localSymbol;\n\n for (const declaration of symbol.getDeclarations()) {\n // We must have a class to treat the property on the object type as a\n // method.\n if (NodeGuards.isClassDeclaration(declaration)) {\n const method = declaration.getMethod(methodName);\n if (method) {\n return method;\n }\n }\n }\n\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Method info\n// ---------------------------------------------------------------------------\n\n/**\n * Build the textual signature of a class method — its parameter list and\n * return type expressed as a TypeScript function type — so a handler that\n * references `Class['method']` can be rendered as `(arg: T) => R` instead of\n * the bare indexed-access syntax.\n *\n * @param method - The method declaration.\n * @returns The signature, e.g. `(id: number) => Promise<string>`.\n */\nfunction buildMethodSignature(method: MethodDeclaration): string {\n const signatureParams = method\n .getParameters()\n .map((param) => {\n const rest = param.isRestParameter() ? '...' : '';\n const paramName = param.getNameNode().getText();\n const optional = param.hasQuestionToken() ? '?' : '';\n const typeNode = param.getTypeNode();\n const paramType = typeNode ? typeNode.getText() : 'unknown';\n return `${rest}${paramName}${optional}: ${paramType}`;\n })\n .join(', ');\n\n const returnTypeNode = method.getReturnTypeNode();\n const returnType = returnTypeNode ? returnTypeNode.getText() : 'void';\n // For async methods, the declared return type already includes `Promise<>`,\n // so we don't need to wrap again.\n return `(${signatureParams}) => ${returnType}`;\n}\n\n// ---------------------------------------------------------------------------\n// Messenger discovery\n// ---------------------------------------------------------------------------\n\n/**\n * A messenger capability type whose body invokes a capability-type-constructor\n * utility such as `ControllerGetStateAction<...>` or\n * `ControllerStateChangeEvent<...>`. The walker classifies the body once when\n * it captures the declaration so the extractor can read the body's type name\n * and type arguments without re-running the AST guards.\n */\ntype ConstructorMessengerCapabilityTypeDeclaration = {\n bodyShape: 'constructor';\n kind: 'action' | 'event';\n declaration: TypeAliasDeclaration;\n body: TypeReferenceNode;\n typeName: Identifier;\n};\n\n/**\n * A messenger capability type whose declaration carries the action/event\n * shape directly — either an interface or a type alias for a type literal.\n * The extractor reads `type`, `handler`, and `payload` from the members.\n */\ntype ObjectMessengerCapabilityTypeDeclaration = {\n bodyShape: 'object';\n kind: 'action' | 'event';\n declaration: TypeAliasDeclaration | InterfaceDeclaration;\n};\n\n/**\n * Represents a type declaration (type alias or interface) for an individual\n * messenger action or event, tagged with the body shape the walker\n * identified.\n */\ntype MessengerCapabilityTypeDeclaration =\n | ConstructorMessengerCapabilityTypeDeclaration\n | ObjectMessengerCapabilityTypeDeclaration;\n\n/**\n * Tag a capability type declaration with the body shape it has, so the right\n * extractor can read it: 'constructor' for a capability-type-constructor\n * invocation such as `ControllerGetStateAction<...>`, 'object' otherwise.\n *\n * Callers must resolve unions and bare type references first, so that the\n * declaration reaching here is a leaf.\n *\n * @param declaration - The type alias or interface to classify.\n * @param kind - Whether to tag the declaration as 'action' or 'event'.\n * @returns The tagged declaration, or null for a qualified-name reference.\n */\nexport function classifyMessengerCapabilityTypeDeclaration(\n declaration: TypeAliasDeclaration | InterfaceDeclaration,\n kind: 'action' | 'event',\n): MessengerCapabilityTypeDeclaration | null {\n // Interfaces always carry their members directly.\n // EXAMPLE:\n // interface FooControllerSomeAction { ... }\n if (NodeGuards.isInterfaceDeclaration(declaration)) {\n return { bodyShape: 'object', kind, declaration };\n }\n\n const body = declaration.getTypeNode();\n\n // A TypeReference body is a capability-type-constructor invocation (e.g.\n // `ControllerGetStateAction<typeof name, State>`). Tag it so the constructor\n // extractor can read `body` directly without re-checking its shape.\n // EXAMPLE:\n // type FooControllerSomeAction = ControllerGetStateAction<...>\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (body && NodeGuards.isTypeReference(body)) {\n // Reject qualified-name constructor type names, as we need a plain\n // identifier to match the constructor by name.\n // EXAMPLE:\n // import * as somePackage from '....js';\n // type FooControllerSomeAction = somePackage.ControllerGetStateAction<...>\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n const constructorTypeName = body.getTypeName();\n if (!NodeGuards.isIdentifier(constructorTypeName)) {\n return null;\n }\n\n return {\n bodyShape: 'constructor',\n kind,\n declaration,\n body,\n typeName: constructorTypeName,\n };\n }\n\n // Anything else (a type literal, intersection, conditional, …) goes to the\n // literal extractor, which knows how to read members off a type literal and\n // rejects exotic shapes.\n // EXAMPLE:\n // type FooControllerSomeAction = { ... }\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n return { bodyShape: 'object', kind, declaration };\n}\n\n/**\n * Represents a type alias for a messenger. Only includes nodes representing the\n * `Actions` and `Events` type parameters.\n */\ntype ParsedMessengerTypeAlias = {\n actionsTypeParameter: TypeNode;\n eventsTypeParameter: TypeNode;\n};\n\n/**\n * Looks for Messenger types in the source file (that is, those that are type\n * aliases whose names end with \"Messenger\"), then extracts the `Actions` and\n * `Events` parameters from these types.\n *\n * @param sourceFile - The TypeScript source file to scan.\n * @returns A list of objects that represent messenger types.\n */\nfunction findMessengerTypeAliases(\n sourceFile: SourceFile,\n): ParsedMessengerTypeAlias[] {\n const parsedMessengerTypeAliases: ParsedMessengerTypeAlias[] = [];\n\n for (const typeAlias of sourceFile.getTypeAliases()) {\n if (!typeAlias.getName().endsWith('Messenger')) {\n continue;\n }\n\n const body = typeAlias.getTypeNode();\n // Basic check\n if (!body || !NodeGuards.isTypeReference(body)) {\n continue;\n }\n\n const typeArgs = body.getTypeArguments();\n // Messenger types always have 3 type parameters\n // (e.g. `Messenger<'FooController', Actions, Events>`)\n if (typeArgs.length < 3) {\n continue;\n }\n\n parsedMessengerTypeAliases.push({\n actionsTypeParameter: typeArgs[1],\n eventsTypeParameter: typeArgs[2],\n });\n }\n\n return parsedMessengerTypeAliases;\n}\n\n/**\n * Walks the `Actions` and `Events` type parameters of the given messenger\n * types, extracted in a previous step, to find all type declarations (i.e.,\n * statements) that represent individual messenger actions or events.\n *\n * @param parsedMessengerTypeAliases - The list of objects representing\n * messenger types, parsed in a previous step.\n * @returns The list of type aliases that represent messenger capabilities among\n * the given messenger types.\n */\nfunction findAllMessengerCapabilityTypeDeclarations(\n parsedMessengerTypeAliases: ParsedMessengerTypeAlias[],\n): MessengerCapabilityTypeDeclaration[] {\n const allCapabilityTypeDeclarations: MessengerCapabilityTypeDeclaration[] =\n [];\n let allVisitedTypeDeclarations: Set<TsMorphNode> = new Set();\n\n for (const {\n actionsTypeParameter,\n eventsTypeParameter,\n } of parsedMessengerTypeAliases) {\n for (const [typeParameter, kind] of [\n [actionsTypeParameter, 'action'],\n [eventsTypeParameter, 'event'],\n ] as const) {\n const result = recursivelyFindMessengerCapabilityTypeDeclarations(\n typeParameter,\n kind,\n allVisitedTypeDeclarations,\n );\n allCapabilityTypeDeclarations.push(...result.capabilityTypeDeclarations);\n allVisitedTypeDeclarations = result.visitedTypeDeclarations;\n }\n }\n\n return allCapabilityTypeDeclarations;\n}\n\n/**\n * Recursively walks a `ts-morph` AST node — at first the `Actions` or `Events`\n * type parameter of a messenger type, and then a node within that parameter —\n * to find all type aliases that represent individual messenger actions or\n * events, no matter how deeply the type aliases exist in the tree or in which\n * file they are located.\n *\n * @param node - The `ts-morph` AST node to walk.\n * @param kind - Whether to tag found type aliases as 'action' or 'event'.\n * @param visitedTypeDeclarations - A variable that tracks visited type aliases\n * and prevents duplicates.\n * @returns The list of extracted messenger capability type aliases as well as\n * an updated version of `visitedTypeDeclarations`.\n */\nfunction recursivelyFindMessengerCapabilityTypeDeclarations(\n node: TsMorphNode,\n kind: 'action' | 'event',\n visitedTypeDeclarations: Set<TsMorphNode>,\n): {\n capabilityTypeDeclarations: MessengerCapabilityTypeDeclaration[];\n visitedTypeDeclarations: Set<TsMorphNode>;\n} {\n const result: {\n capabilityTypeDeclarations: MessengerCapabilityTypeDeclaration[];\n visitedTypeDeclarations: Set<TsMorphNode>;\n } = {\n capabilityTypeDeclarations: [],\n visitedTypeDeclarations: new Set([...visitedTypeDeclarations]),\n };\n\n // If `node` is a union type, walk each type within it.\n // EXAMPLES:\n // type Actions = FooControllerSomeAction | FooControllerSomeOtherAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type FooControllerActions = FooControllerSomeAction | FooControllerSomeOtherAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (NodeGuards.isUnionTypeNode(node)) {\n for (const typeNode of node.getTypeNodes()) {\n const innerResult = recursivelyFindMessengerCapabilityTypeDeclarations(\n typeNode,\n kind,\n result.visitedTypeDeclarations,\n );\n result.capabilityTypeDeclarations.push(\n ...innerResult.capabilityTypeDeclarations,\n );\n for (const typeDeclaration of innerResult.visitedTypeDeclarations) {\n result.visitedTypeDeclarations.add(typeDeclaration);\n }\n }\n return result;\n }\n\n // If `node` is not a type reference, don't walk it.\n // EXAMPLE:\n // // Bad\n // type Actions = { ... }\n // ^^^^^^^\n // // Good\n // type Actions = FooControllerSomeAction;\n // ^^^^^^^^^^^^^^^^^^^^^^^\n // // Good\n // type Actions = ControllerGetStateAction<...>;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (!NodeGuards.isTypeReference(node)) {\n return result;\n }\n\n const nameNode = node.getTypeName();\n\n // Reject qualified-name type names, as we need a plain identifier to\n // resolve the symbol.\n // EXAMPLE:\n // import * as somePackage from '....js';\n // type Actions = somePackage.FooControllerSomeAction;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (!NodeGuards.isIdentifier(nameNode)) {\n return result;\n }\n\n // Since we know we have a type reference, we can assume that we have a symbol.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const localSymbol = nameNode.getSymbol()!;\n // If we have a type imported from another file, ensure that when we access\n // the declaration, it's the type declaration in the other file, not the\n // import declaration in this file.\n // EXAMPLE:\n // import { FooControllerSomeAction } from '@metamask/foo-controller';\n // type Actions = FooControllerSomeAction;\n // ^^^^^^^^^^^^^^^^^^^^^^^\n const symbol = localSymbol.getAliasedSymbol() ?? localSymbol;\n\n // At this point, we have a type *reference*, but we need to find the type\n // *declaration*.\n // For instance, if we have `FooControllerSomeAction`, we need to find\n // the full `type FooControllerSomeAction = ...` statement.\n for (const declaration of symbol.getDeclarations()) {\n // Prevent duplicates\n if (result.visitedTypeDeclarations.has(declaration)) {\n continue;\n }\n result.visitedTypeDeclarations.add(declaration);\n\n // If we have a type alias, then we have to handle a few scenarios.\n // EXAMPLES:\n // type FooControllerMethodActions = ...\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type FooControllerSomeAction = ...\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (NodeGuards.isTypeAliasDeclaration(declaration)) {\n const body = declaration.getTypeNode();\n\n // If the body is a union type or a plain type reference (not a utility\n // type), walk it.\n // EXAMPLES:\n // type FooControllerMethodActions = FooControllerSomeAction | FooControllerSomeOtherAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type DelegationControllerMethodActions = DelegationControllerSignDelegationAction\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n if (\n body &&\n (NodeGuards.isUnionTypeNode(body) ||\n (NodeGuards.isTypeReference(body) &&\n body.getTypeArguments().length === 0))\n ) {\n const innerResult = recursivelyFindMessengerCapabilityTypeDeclarations(\n body,\n kind,\n result.visitedTypeDeclarations,\n );\n result.capabilityTypeDeclarations.push(\n ...innerResult.capabilityTypeDeclarations,\n );\n for (const typeDeclaration of innerResult.visitedTypeDeclarations) {\n result.visitedTypeDeclarations.add(typeDeclaration);\n }\n continue;\n }\n\n // Everything else is a leaf capability type — a capability-type-\n // constructor invocation (e.g. `ControllerGetStateAction<typeof name,\n // State>`) or a literal object type. Tag it so the matching extractor\n // can read it without re-checking its shape.\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<...>\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // type FooControllerSomeAction = { ... }\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n const classified = classifyMessengerCapabilityTypeDeclaration(\n declaration,\n kind,\n );\n if (classified) {\n result.capabilityTypeDeclarations.push(classified);\n }\n }\n\n // Interfaces always carry their members directly — tag for the literal\n // extractor.\n // EXAMPLE:\n // interface FooControllerSomeAction { ... }\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n else if (NodeGuards.isInterfaceDeclaration(declaration)) {\n result.capabilityTypeDeclarations.push({\n bodyShape: 'object',\n kind,\n declaration,\n });\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Per-statement extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Given the declaration of a messenger capability type, extract information\n * about it (action/event type string, handler/payload arguments and return\n * type, etc.)\n *\n * @param capabilityTypeDeclaration - The statement that declared the type for a\n * messenger action or event, extracted in a previous step.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns Information that may be extracted from the messenger capability type\n * (may be `null` if the type is ineligible for extraction).\n */\nexport function extractFromMessengerCapabilityTypeDeclaration(\n capabilityTypeDeclaration: MessengerCapabilityTypeDeclaration,\n projectPath: string,\n): MessengerCapabilityPacket | null {\n if (capabilityTypeDeclaration.bodyShape === 'constructor') {\n return tryToExtractFromCapabilityTypeConstructor(\n capabilityTypeDeclaration,\n projectPath,\n );\n }\n return tryToExtractFromMessengerCapabilityTypeLiteral(\n capabilityTypeDeclaration,\n projectPath,\n );\n}\n\n/**\n * If a messenger capability type is a type alias or interface and its body is\n * a literal object type — i.e. one of:\n *\n * - `{ type: '...'; handler: ... }` (action)\n * - `{ type: '...'; payload: ... }` (event)\n *\n * then this function extracts information about the type (action/event type\n * string, handler/payload arguments and return type, etc.)\n *\n * @param capabilityTypeDeclaration - The statement that declared the type for a\n * messenger action or event, extracted in a previous step.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns The extracted capability packet, or null if the shape of the type\n * doesn't match.\n */\nfunction tryToExtractFromMessengerCapabilityTypeLiteral(\n capabilityTypeDeclaration: ObjectMessengerCapabilityTypeDeclaration,\n projectPath: string,\n): MessengerCapabilityPacket | null {\n const { declaration, kind } = capabilityTypeDeclaration;\n\n // We must have a object type alias or an interface, and the body must not be empty.\n // EXAMPLES:\n // // Good\n // type FooControllerSomeAction = {\n // type: 'FooController:getState';\n // handler: FooController['getState'];\n // }\n // // Good\n // interface FooControllerSomeAction {\n // type: 'FooController:getState';\n // handler: FooController['getState'];\n // }\n // // Bad\n // type FooControllerSomeAction = {};\n // // Bad\n // interface FooControllerSomeAction {};\n let members: TypeElementTypes[] | undefined;\n if (NodeGuards.isTypeAliasDeclaration(declaration)) {\n const body = declaration.getTypeNode();\n if (body && NodeGuards.isTypeLiteral(body)) {\n members = body.getMembers();\n }\n } else {\n members = declaration.getMembers();\n }\n if (!members) {\n return null;\n }\n\n const propertySignatures = members.filter(\n NodeGuards.isPropertySignature.bind(NodeGuards),\n );\n\n // Actions and events must have a `type`, and it must be a string.\n const typeString = getMessengerCapabilityTypeString(propertySignatures);\n if (!typeString) {\n return null;\n }\n\n // Actions must have a `handler`, and events must have a `payload`.\n const handlerOrPayloadProperty = findProperty(\n propertySignatures,\n kind === 'action' ? 'handler' : 'payload',\n );\n if (!handlerOrPayloadProperty) {\n return null;\n }\n\n const handlerOrPayloadPropertyTypeNode =\n // We can assume the property has a type; otherwise it wouldn't compile.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n handlerOrPayloadProperty.getTypeNode()!;\n let handlerOrPayloadSignature = handlerOrPayloadPropertyTypeNode\n .getText()\n .trim();\n\n const { description: jsDoc, params, returns } = extractJsDoc(declaration);\n\n // For actions that represent methods (e.g. `Class['method']`), walk the\n // handler type to find the underlying handler signature\n // (e.g. `(id: number) => Promise<string>`).\n if (kind === 'action') {\n const methodDeclaration = findClassMethodDeclaration(\n handlerOrPayloadPropertyTypeNode,\n );\n if (methodDeclaration) {\n handlerOrPayloadSignature = buildMethodSignature(methodDeclaration);\n }\n }\n\n const sourceFile = declaration.getSourceFile();\n return {\n typeName: declaration.getName(),\n typeString,\n kind,\n jsDoc,\n params,\n returns,\n handlerOrPayload: handlerOrPayloadSignature,\n sourceFile: path.relative(projectPath, sourceFile.getFilePath()),\n line: declaration.getStartLineNumber(),\n deprecated: hasDeprecatedJsDocTag(declaration),\n };\n}\n\n/**\n * Searches the property signatures of a messenger capability type alias or\n * interface to find the value of the `type` property, and then resolves it to a\n * string (assuming it is already a string or a resolvable template literal).\n *\n * @param capabilityTypeProperties - The property signatures of the messenger\n * capability type.\n * @returns The extracted capability type string, or null if `type` cannot be\n * found in the members or it is an unexpected node.\n */\nfunction getMessengerCapabilityTypeString(\n capabilityTypeProperties: PropertySignature[],\n): string | null {\n const typeProperty = findProperty(capabilityTypeProperties, 'type');\n if (!typeProperty) {\n return null;\n }\n\n // A `type` property without an explicit type wouldn't compile.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const typeNode = typeProperty.getTypeNode()!;\n\n // Ask the type checker to resolve the value of `type`. We're looking for\n // `type` to be either a string literal or template literal.\n //\n // EXAMPLES:\n // type FooControllerSomeAction = {\n // type: 'FooController:someAction';\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^\n // }\n // type FooControllerSomeAction = {\n // type: `FooController:someAction`;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^\n // }\n // type FooControllerSomeAction = {\n // type: `${typeof CONTROLLER_NAME}:someAction`;\n // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n // }\n const resolvedType = typeNode.getType();\n if (resolvedType.isStringLiteral()) {\n // Type assertion: There aren't any type guards we can use to narrow this\n // type further.\n const literalValue = resolvedType.getLiteralValueOrThrow() as string;\n\n // Messenger action/event types need to be namespaced.\n if (literalValue.includes(':')) {\n return literalValue;\n }\n }\n\n return null;\n}\n\n/**\n * Finds a specific property in a list of property signatures for an object\n * type.\n *\n * @param propertySignatures - The property signatures of the messenger\n * capability type.\n * @param name - The property name to find.\n * @returns The property signature, or null.\n */\nfunction findProperty(\n propertySignatures: PropertySignature[],\n name: string,\n): PropertySignature | null {\n for (const property of propertySignatures) {\n const propertyNameNode = property.getNameNode();\n if (\n !NodeGuards.isIdentifier(propertyNameNode) ||\n propertyNameNode.getText() !== name\n ) {\n continue;\n }\n\n return property;\n }\n\n return null;\n}\n\n/**\n * If a messenger capability type is a type alias for either the\n * `ControllerGetStateAction` or `ControllerStateChangeEvent` type constructors,\n * then this function extracts information about the type (action/event type\n * string, handler/payload arguments and return type, etc.)\n *\n * @param capabilityTypeDeclaration - The statement that declared the type for a\n * messenger action or event, extracted in a previous step.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns The extracted capability packet, or null if the shape of the type\n * doesn't match.\n */\nfunction tryToExtractFromCapabilityTypeConstructor(\n capabilityTypeDeclaration: ConstructorMessengerCapabilityTypeDeclaration,\n projectPath: string,\n): MessengerCapabilityPacket | null {\n const { declaration, kind, body, typeName } = capabilityTypeDeclaration;\n\n // The name of the utility type should be either `ControllerGetStateAction`\n // (for actions) or `ControllerStateChangeEvent` (for events).\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<...>\n // type FooControllerSomeEvent = ControllerStateChangeEvent<...>\n const expectedConstructor =\n kind === 'action'\n ? 'ControllerGetStateAction'\n : 'ControllerStateChangeEvent';\n if (typeName.getText() !== expectedConstructor) {\n return null;\n }\n\n // The utility type should take two parameters.\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<..., ...>\n // type FooControllerSomeEvent = ControllerStateChangeEvent<..., ...>\n const typeArgs = body.getTypeArguments();\n if (typeArgs.length < 2) {\n return null;\n }\n\n const namespaceArgType = typeArgs[0].getType();\n // The first parameter should be a string literal.\n // EXAMPLES:\n // type FooControllerSomeAction = ControllerGetStateAction<'FooController', ...>\n // type FooControllerSomeAction = ControllerGetStateAction<typeof CONTROLLER_NAME, ...>\n if (!namespaceArgType.isStringLiteral()) {\n return null;\n }\n // Type assertion: There aren't any type guards we can use to narrow this type\n // further.\n const namespace = namespaceArgType.getLiteralValueOrThrow() as string;\n\n const typeString =\n kind === 'action' ? `${namespace}:getState` : `${namespace}:stateChange`;\n const stateArgText = typeArgs[1].getText();\n const handlerOrPayload =\n kind === 'action' ? `() => ${stateArgText}` : `[${stateArgText}, Patch[]]`;\n const { description, params, returns } = extractJsDoc(declaration);\n const sourceFile = declaration.getSourceFile();\n\n return {\n typeName: declaration.getName(),\n typeString,\n kind,\n jsDoc: description,\n params,\n returns,\n handlerOrPayload,\n sourceFile: path.relative(projectPath, sourceFile.getFilePath()),\n line: declaration.getStartLineNumber(),\n deprecated: hasDeprecatedJsDocTag(declaration),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Public entry points\n// ---------------------------------------------------------------------------\n\n/**\n * Extract information (action/event type string, handler/payload arguments and\n * return type, etc.) about every messenger action or event type which is\n * reachable through all of a source file's `*Messenger` type declarations.\n *\n * The caller is responsible for ensuring `sourceFile` (plus any files it\n * imports from) belongs to a `ts-morph` Project so cross-file symbol resolution\n * works.\n *\n * @param sourceFile - The TypeScript source file to extract from.\n * @param projectPath - Project root, used for computing relative source paths.\n * @returns The extracted information about actions and events.\n */\nexport function extractFromSourceFile(\n sourceFile: SourceFile,\n projectPath: string,\n): MessengerCapabilityPacket[] {\n const messengerTypeAliases = findMessengerTypeAliases(sourceFile);\n\n const capabilityTypeDeclarations =\n findAllMessengerCapabilityTypeDeclarations(messengerTypeAliases);\n\n const messengerCapabilityPackets: MessengerCapabilityPacket[] = [];\n for (const capabilityTypeDeclaration of capabilityTypeDeclarations) {\n const messengerCapabilityPacket =\n extractFromMessengerCapabilityTypeDeclaration(\n capabilityTypeDeclaration,\n projectPath,\n );\n if (messengerCapabilityPacket) {\n messengerCapabilityPackets.push(messengerCapabilityPacket);\n }\n }\n return messengerCapabilityPackets;\n}\n"]}
package/dist/generate.cjs CHANGED
@@ -29,10 +29,10 @@ const node_child_process_1 = require("node:child_process");
29
29
  const fs = __importStar(require("node:fs/promises"));
30
30
  const path = __importStar(require("node:path"));
31
31
  const node_util_1 = require("node:util");
32
- const discovery_js_1 = require("./discovery.cjs");
33
32
  const extraction_js_1 = require("./extraction.cjs");
34
33
  const markdown_js_1 = require("./markdown.cjs");
35
34
  const root_messenger_discovery_js_1 = require("./root-messenger-discovery.cjs");
35
+ const ts_project_js_1 = require("./ts-project.cjs");
36
36
  /** How many skipped capability types to name before summarizing the rest. */
37
37
  const MAX_SKIPPED_SHOWN = 10;
38
38
  /**
@@ -168,84 +168,127 @@ function logScanPlan(sources) {
168
168
  console.log(`Scanning ${summary.join(', ')} for Messenger action/event types...`);
169
169
  }
170
170
  /**
171
- * Run extraction against every file in a single directory, logging and
172
- * swallowing per-file failures. All files are added to the shared `project`
173
- * up front so the type checker can resolve cross-file references when the
174
- * walker descends into imported types.
171
+ * Patterns excluded when scanning TypeScript sources: build output, tests, and
172
+ * declaration files (which are only read under `node_modules/@metamask`, via
173
+ * the separate set below).
174
+ *
175
+ * Every pattern is anchored to `root` rather than written as a bare
176
+ * `!**‍/*.test.ts`. A matcher resolves an unanchored negation against the
177
+ * process's working directory, not against the pattern it accompanies, so an
178
+ * unanchored exclusion silently stops excluding anything the moment the scanned
179
+ * path falls outside the working directory — which is the normal case, since
180
+ * this runs from wherever the consumer invoked it.
181
+ *
182
+ * `contentRoot` must be the directory the matched *files* live under, not an
183
+ * ancestor of it. Anchoring at `packages/` rather than `packages/*‍/src` would
184
+ * make the first path segment a package name, so a workspace package called
185
+ * `test` or `dist` would match `test/**` and be dropped whole.
186
+ *
187
+ * @param contentRoot - Resolved directory, or directory glob, that the matched
188
+ * files live directly under.
189
+ * @returns The exclusion patterns.
190
+ */
191
+ function buildTsSourceExclusions(contentRoot) {
192
+ return [
193
+ 'node_modules/**',
194
+ 'dist/**',
195
+ '__tests__/**',
196
+ 'tests/**',
197
+ 'test/**',
198
+ '__mocks__/**',
199
+ '*.test.ts',
200
+ '*.test-d.ts',
201
+ '*.spec.ts',
202
+ '*.d.ts',
203
+ ].map((pattern) => `!${contentRoot}/**/${pattern}`);
204
+ }
205
+ /**
206
+ * Add every file matching a set of glob patterns to the project, in a stable
207
+ * order.
208
+ *
209
+ * ts-morph promises nothing about the order it returns matches in, and
210
+ * deduplication downstream keeps the first of two equally-scored items, so an
211
+ * unsorted list would let the filesystem decide which source link a capability
212
+ * gets.
213
+ *
214
+ * Ordering is by code unit rather than `localeCompare`, which collates
215
+ * differently depending on the locale the process happens to run under.
175
216
  *
176
217
  * @param project - The shared ts-morph project.
177
- * @param directory - The directory to scan.
178
- * @param projectPath - The project root, used for relative path display.
179
- * @param findFiles - The function used to enumerate files in the directory.
180
- * @returns The list of extracted messenger items.
218
+ * @param patterns - Glob patterns to match, including `!` exclusions.
219
+ * @returns The added source files, sorted by path.
181
220
  */
182
- async function extractFromDirectory(project, directory, projectPath, findFiles) {
183
- const items = [];
184
- const files = await findFiles(directory);
185
- for (const file of files) {
186
- try {
187
- const sourceFile = project.getSourceFile(file) ?? project.addSourceFileAtPath(file);
188
- items.push(...(0, extraction_js_1.extractFromSourceFile)(sourceFile, projectPath));
189
- }
190
- catch (error) {
191
- console.warn(`Warning: failed to parse ${path.relative(projectPath, file)}`);
192
- console.warn(error);
193
- }
194
- }
195
- return items;
221
+ function addSourceFiles(project, patterns) {
222
+ return project.addSourceFilesAtPaths(patterns).sort((fileA, fileB) =>
223
+ // Subtracting the two comparisons keeps this branchless, so it reads
224
+ // the same whichever order the matcher happened to return.
225
+ Number(fileA.getFilePath() > fileB.getFilePath()) -
226
+ Number(fileA.getFilePath() < fileB.getFilePath()));
196
227
  }
197
228
  /**
198
- * Enumerate the subdirectories of a parent directory that match the expected
199
- * layout (e.g., `packages/*‍/src` or `node_modules/@metamask/*‍/dist`), keeping
200
- * only those that actually exist.
229
+ * Build a glob pattern from a directory path.
230
+ *
231
+ * Two things have to be true of the result. Glob syntax is always
232
+ * forward-slashed, including on Windows, where `path.join` would produce
233
+ * backslashes that a matcher reads as escapes. And the path must be fully
234
+ * resolved: the matcher does not follow a symlinked *ancestor* of the pattern,
235
+ * so a project under `/tmp` or `/var` on macOS (both symlinks) would match
236
+ * nothing at all.
201
237
  *
202
- * @param parentDir - The parent directory to enumerate.
203
- * @param subPath - The trailing path component appended to each entry.
204
- * @param includeSymlinks - Whether to include symbolic links (true for
205
- * node_modules where workspaces are symlinked).
206
- * @returns The list of absolute paths to existing target subdirectories.
238
+ * @param segments - Path segments to join.
239
+ * @returns The joined, resolved path with forward slashes.
207
240
  */
208
- async function listTargetSubdirectories(parentDir, subPath, includeSymlinks) {
209
- const entries = await fs.readdir(parentDir, { withFileTypes: true });
210
- const candidates = entries
211
- .filter((entry) => entry.isDirectory() || (includeSymlinks && entry.isSymbolicLink()))
212
- .map((entry) => path.join(parentDir, entry.name, subPath));
213
- const existing = [];
214
- for (const candidate of candidates) {
215
- if (await (0, node_1.directoryExists)(candidate)) {
216
- existing.push(candidate);
217
- }
218
- }
219
- return existing;
241
+ async function toGlobPath(...segments) {
242
+ // Safe to resolve without a fallback: `discoverScanSources` has already
243
+ // confirmed every directory reaching this point exists.
244
+ const resolved = await fs.realpath(path.join(...segments));
245
+ return resolved.replace(/\\/gu, '/');
220
246
  }
221
247
  /**
222
- * Scan every source location described by `sources` and return all extracted
223
- * messenger items. A single ts-morph Project is shared across every file so
224
- * the type checker can resolve cross-file references (e.g. a `*Messenger`
225
- * declaration in one file walking through an imported umbrella union into
226
- * an auto-generated `*-method-action-types.ts` sibling).
248
+ * Scan every source location described by `sources` (scan directories first,
249
+ * then workspace packages, then published declaration files) and return all
250
+ * extracted messenger items.
251
+ *
252
+ * A single ts-morph Project is shared across every file so the type checker can
253
+ * resolve cross-file references (e.g. a `*Messenger` declaration in one file
254
+ * walking through an imported umbrella union into an auto-generated
255
+ * `*-method-action-types.ts` sibling).
227
256
  *
228
257
  * @param projectPath - The project root path.
229
258
  * @param sources - The set of source locations to scan.
230
259
  * @returns A flat list of all extracted messenger items.
231
260
  */
232
261
  async function scanSources(projectPath, sources) {
233
- const project = (0, extraction_js_1.createExtractionProject)();
234
- const allItems = [];
262
+ const project = (0, ts_project_js_1.createProject)();
263
+ const sourceFiles = [];
235
264
  for (const dir of sources.scanDirs) {
236
- allItems.push(...(await extractFromDirectory(project, path.join(projectPath, dir), projectPath, discovery_js_1.findTsFiles)));
265
+ const root = await toGlobPath(projectPath, dir);
266
+ sourceFiles.push(...addSourceFiles(project, [
267
+ `${root}/**/*.ts`,
268
+ ...buildTsSourceExclusions(root),
269
+ ]));
237
270
  }
238
271
  if (sources.packagesDir) {
239
- const srcDirs = await listTargetSubdirectories(sources.packagesDir, 'src', false);
240
- for (const srcDir of srcDirs) {
241
- allItems.push(...(await extractFromDirectory(project, srcDir, projectPath, discovery_js_1.findTsFiles)));
242
- }
272
+ const root = await toGlobPath(sources.packagesDir);
273
+ // Anchored at each package's `src`, not at `packages` itself, so a package
274
+ // whose name collides with an exclusion (`test`, `dist`) isn't dropped.
275
+ const contentRoot = `${root}/*/src`;
276
+ sourceFiles.push(...addSourceFiles(project, [
277
+ `${contentRoot}/**/*.ts`,
278
+ ...buildTsSourceExclusions(contentRoot),
279
+ ]));
243
280
  }
244
281
  if (sources.nodeModulesDir) {
245
- const distDirs = await listTargetSubdirectories(sources.nodeModulesDir, 'dist', true);
246
- for (const distDir of distDirs) {
247
- allItems.push(...(await extractFromDirectory(project, distDir, projectPath, discovery_js_1.findDtsFiles)));
248
- }
282
+ const root = await toGlobPath(sources.nodeModulesDir);
283
+ sourceFiles.push(...addSourceFiles(project, [`${root}/*/dist/**/*.d.cts`]));
284
+ }
285
+ // Matched paths are fully resolved, so the root they are made relative to
286
+ // has to be resolved the same way or every source link becomes a `../..`
287
+ // walk out of the project.
288
+ const resolvedProjectPath = await fs.realpath(projectPath);
289
+ const allItems = [];
290
+ for (const sourceFile of sourceFiles) {
291
+ allItems.push(...(0, extraction_js_1.extractFromSourceFile)(sourceFile, resolvedProjectPath));
249
292
  }
250
293
  return allItems;
251
294
  }