DatoCMS CMA 客户端分析
静态分析设施 @datocms/cma-client-node,以 TypeScript 编译器 API 为主. 检查 Client 类可以提取方法签名,解析引用类型,并生成即时到发TypeScript片段——用于生成 API 参考道克,AI 工具,或 CMA 客户端表面的任何内向.
安装
npm install @datocms/cma-client-analysis @datocms/cma-client-node @datocms/rest-api-reference typescript
@datocms/cma-client-node, (中文(简体) ), @datocms/rest-api-reference,以及 typescript 属于对等的依赖性 —— 包的内观, 无论哪个版本安装在您的树上, 所以输出总是与您实际运行的客户端同步 .
使用量
import {
getCmaClientProgram,
extractAllMethodNames,
extractMethodSignature,
extractResourcesEndpointMethods,
extractTypeDependencies,
} from '@datocms/cma-client-analysis';
// Build a TypeScript program over @datocms/cma-client-node's .d.ts entry.
// Expensive (~hundreds of ms): build once, thread through every extract* call.
const { program, checker, clientClass } = getCmaClientProgram();
// All method names available on a resource.
extractAllMethodNames(checker, clientClass, 'items');
// → ['list', 'find', 'create', 'rawList', 'rawFind', 'rawCreate', ...]
// Full signature for one method, including referenced type symbols.
const signature = extractMethodSignature(checker, clientClass, 'items', 'create');
// → { methodName, parameters, returnType, referencedTypeSymbols, ... }
// All client methods that implement a given REST endpoint, matched by docUrl.
import { findResourcesEntityByNamespace, findResourcesEndpointByRel, parseResourcesSchema } from '@datocms/rest-api-reference';
import resourcesJson from '@datocms/cma-client/resources.json';
const resourcesSchema = parseResourcesSchema(resourcesJson);
const entity = findResourcesEntityByNamespace(resourcesSchema, 'menuItems');
const endpoint = findResourcesEndpointByRel(entity!, 'create');
const methods = extractResourcesEndpointMethods(checker, clientClass, endpoint!);
// → [
// { name: 'create', functionDefinition: 'create(body: MenuItemCreateSchema): Promise<MenuItem>', referencedTypes: Set { ... } },
// { name: 'rawCreate', functionDefinition: 'rawCreate(body: MenuItemCreateSchema): Promise<MenuItemCreateTargetSchema>', referencedTypes: Set { ... } },
// ]
// Inline TypeScript declarations for a set of referenced types, walking up to a depth.
const { expandedTypes, notExpandedTypes } = extractTypeDependencies(
checker,
program,
Array.from(signature!.referencedTypeSymbols.keys()),
signature!.referencedTypeSymbols,
{ maxDepth: 2 },
);
缓存
getCmaClientProgram() 实值 没有 被缓存——每个呼叫都会重建程序. 成本( 分析全部客户端) .d.ts 图)是非三角性的,因此:
- 一发式进程 (CLI,脚本):启动时拨打一次,将结果接通.
- 长期运行的进程 (服务器,MCP):在你自己的回忆中包好电话.
这使得终生决定权掌握在消费者手中,而不是将其钉入模块级状态.