Vigia

将 execa 从 9.x 升级到 10.x

根据 TypeScript 类型自动比较 execa 9.6.1 与 10.2.1 的公开 API。签名变化表示可能存在不兼容变更,并非确定结论。

概要

已删除的导入路径0
已删除的导出2
已修改的签名8
已删除的类或接口成员0
已修改的类或接口成员10
新增弃用0
要求变化(engines、peer 依赖)1
新增导出0

已删除的导出

importexportkind之前
execaexecaCommandvariable<NewOptionsType extends Options = {}>(options: NewOptionsType): ExecaCommandMethod<{} & NewOptionsType> | (templateString_0: TemplateStringsArray, templateString_1?: string | undefined): ResultPromise<{}> | <NewOptionsType extends Options = {}>(command: string, options?: NewOptionsType | undefined): ResultPromise<{} & NewOptionsType>
execaexecaCommandSyncvariable<NewOptionsType extends SyncOptions = {}>(options: NewOptionsType): ExecaCommandSyncMethod<{} & NewOptionsType> | (templateString_0: TemplateStringsArray, templateString_1?: string | undefined): SyncResult<{}> | <NewOptionsType extends SyncOptions = {}>(command: string, options?: NewOptionsType | undefined): SyncResult<{} & NewOptionsType>

已修改的签名

export之前之后
execa · $<NewOptionsType extends CommonOptions = {}>(options: NewOptionsType): ExecaScriptMethod<{} & NewOptionsType> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): ResultPromise<{}> | <NewOptionsType extends Options = {}>(file: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): ResultPromise<StricterOptions<{} & NewOptionsType, Options>> | <NewOptionsType extends Options = {}>(file: string | URL, options?: NewOptionsType | undefined): ResultPromise<StricterOptions<{} & NewOptionsType, Options>><NewOptionsType extends Options = {}>(options: NewOptionsType): ExecaScriptMethod<MergeOptions<{}, NewOptionsType, CommonOptions>> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): Omit<ResultPromise<{}>, "stdin" | "stdio"> & { stdin: any; stdio: any[]; } | <NewOptionsType extends Options = {}>(file: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): ScriptSubprocess<MergeOptions<{}, NewOptionsType, CommonOptions>> | <NewOptionsType extends Options = {}>(file: string | URL, options?: NewOptionsType | undefined): Sc…
execa · execa<NewOptionsType extends Options = {}>(options: NewOptionsType): ExecaMethod<{} & NewOptionsType> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): ResultPromise<{}> | <NewOptionsType extends Options = {}>(file: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): ResultPromise<{} & NewOptionsType> | <NewOptionsType extends Options = {}>(file: string | URL, options?: NewOptionsType | undefined): ResultPromise<{} & NewOptionsType><NewOptionsType extends Options = {}>(options: NewOptionsType): ExecaMethod<MergeOptions<{}, NewOptionsType, Options>> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): ResultPromise<{}> | <NewOptionsType extends Options = {}>(file: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): ResultPromise<MergeOptions<{}, NewOptionsType, Options>> | <NewOptionsType extends Options = {}>(file: string | URL, options?: NewOptionsType | undefined): ResultPromise<MergeOptions<{}, NewOptionsType, Options>>
execa · Options{ readonly preferLocal?: boolean | undefined; readonly localDir?: string | URL | undefined; readonly node?: boolean | undefined; readonly nodeOptions?: readonly string[] | undefined; readonly nodePath?: string | URL | undefined; readonly shell?: string | boolean | URL | undefined; readonly cwd?: string | URL | undefined; readonly env?: Readonly<Partial<Record<string, string>>> | undefined; readonly extendEnv?: boolean | undefined; readonly input?: any; readonly inputFile?: string | URL | undefined; readonly stdin?: any; readonly stdout?: any; readonly stderr?: any; readonly stdio?: StdioOption…TextOptions<false> | BinaryOptions<false>
execa · execaNode<NewOptionsType extends Options = {}>(options: NewOptionsType): ExecaNodeMethod<{} & NewOptionsType> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): ResultPromise<{}> | <NewOptionsType extends Options = {}>(scriptPath: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): ResultPromise<{} & NewOptionsType> | <NewOptionsType extends Options = {}>(scriptPath: string | URL, options?: NewOptionsType | undefined): ResultPromise<{} & NewOptionsType><NewOptionsType extends Options = {}>(options: NewOptionsType): ExecaNodeMethod<MergeOptions<{}, NewOptionsType, Options>> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): ResultPromise<{ readonly node: true; }> | <NewOptionsType extends Options = {}>(scriptPath: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): ResultPromise<NodeOptions<MergeOptions<{}, NewOptionsType, Options>>> | <NewOptionsType extends Options = {}>(scriptPath: string | URL, options?: NewOptionsType | undefined): ResultPromise<NodeOptions<Mer…
execa · execaSync<NewOptionsType extends SyncOptions = {}>(options: NewOptionsType): ExecaSyncMethod<{} & NewOptionsType> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): SyncResult<{}> | <NewOptionsType extends SyncOptions = {}>(file: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): SyncResult<{} & NewOptionsType> | <NewOptionsType extends SyncOptions = {}>(file: string | URL, options?: NewOptionsType | undefined): SyncResult<{} & NewOptionsType><NewOptionsType extends SyncOptions = {}>(options: NewOptionsType): ExecaSyncMethod<MergeOptions<{}, NewOptionsType, SyncOptions>> | (templateString_0: TemplateStringsArray, ...templateString: TemplateExpression[]): SyncResult<{}> | <NewOptionsType extends SyncOptions = {}>(file: string | URL, arguments?: readonly string[] | undefined, options?: NewOptionsType | undefined): SyncResult<MergeOptions<{}, NewOptionsType, SyncOptions>> | <NewOptionsType extends SyncOptions = {}>(file: string | URL, options?: NewOptionsType | undefined): SyncResult<MergeOptions<{}, NewOptionsType, SyncOptions>>
execa · SubprocessOmit<ChildProcess, "pipe" | "stdout" | "stderr" | "all" | typeof asyncIterator | "pid" | "stdin" | "stdio" | "kill" | "iterable" | "readable" | "writable" | "duplex" | keyof IpcMethods<HasIpcOption<OptionsType["ipc"], "ipcInput" extends keyof OptionsType ? OptionsType[keyof OptionsType & "ipcInput"] : undefined, "gracefulCancel" extends keyof OptionsType ? OptionsType[keyof OptionsType & "gracefulCancel"] : undefined>, OptionsType["serialization"]>> & { pid?: number | undefined; stdin: any; stdout: any; stderr: any; all: AllStream<AllIgnored<OptionsType["all"], OptionsType>>; stdio: Subprocess…SubprocessIpcMethods<OptionsType> & PipableSubprocess & SubprocessResultMethods<OptionsType> & { pid?: number | undefined; stdin: SubprocessStdioStream<"0", OptionsType>; stdout: SubprocessStdioStream<"1", OptionsType>; stderr: SubprocessStdioStream<"2", OptionsType>; stdio: [...{ -readonly [FdNumber in keyof StdioOptionNormalized<OptionsType["stdio"]>]: SubprocessStdioStream<FdNumber extends string ? FdNumber : string, OptionsType>; }, ...HasIpcOption<OptionsType["ipc"], "node" extends keyof OptionsType ? OptionsType[keyof OptionsType & "node"] : undefined, "ipcInput" extends keyof OptionsTyp…
execa · SyncOptions{ readonly preferLocal?: boolean | undefined; readonly localDir?: string | URL | undefined; readonly node?: boolean | undefined; readonly nodeOptions?: readonly string[] | undefined; readonly nodePath?: string | URL | undefined; readonly shell?: string | boolean | URL | undefined; readonly cwd?: string | URL | undefined; readonly env?: Readonly<Partial<Record<string, string>>> | undefined; readonly extendEnv?: boolean | undefined; readonly input?: any; readonly inputFile?: string | URL | undefined; readonly stdin?: any; readonly stdout?: any; readonly stderr?: any; readonly stdio?: StdioOption…TextOptions<true> | BinaryOptions<true>
execa · ResultPromiseOmit<ChildProcess, "pipe" | "stdout" | "stderr" | "all" | typeof asyncIterator | "pid" | "stdin" | "stdio" | "kill" | "iterable" | "readable" | "writable" | "duplex" | keyof IpcMethods<HasIpcOption<OptionsType["ipc"], "ipcInput" extends keyof OptionsType ? OptionsType[keyof OptionsType & "ipcInput"] : undefined, "gracefulCancel" extends keyof OptionsType ? OptionsType[keyof OptionsType & "gracefulCancel"] : undefined>, OptionsType["serialization"]>> & { pid?: number | undefined; stdin: any; stdout: any; stderr: any; all: AllStream<AllIgnored<OptionsType["all"], OptionsType>>; stdio: Subprocess…SubprocessIpcMethods<OptionsType> & PipableSubprocess & SubprocessResultMethods<OptionsType> & { pid?: number | undefined; stdin: SubprocessStdioStream<"0", OptionsType>; stdout: SubprocessStdioStream<"1", OptionsType>; stderr: SubprocessStdioStream<"2", OptionsType>; stdio: [...{ -readonly [FdNumber in keyof StdioOptionNormalized<OptionsType["stdio"]>]: SubprocessStdioStream<FdNumber extends string ? FdNumber : string, OptionsType>; }, ...HasIpcOption<OptionsType["ipc"], "node" extends keyof OptionsType ? OptionsType[keyof OptionsType & "node"] : undefined, "ipcInput" extends keyof OptionsTyp…

已删除的类或接口成员

未发现。

已修改的类或接口成员

member之前之后
ExecaError.allResultAllProperty<OptionsType["all"], OptionsType>ResultAll<OptionsType>
ExecaError.stdioMapResultStdio<StdioOptionNormalized<OptionsType["stdio"]>, OptionsType>[...MapResultStdio<StdioOptionNormalized<OptionsType["stdio"]>, OptionsType>, ...OptionsType extends unknown ? HasIpcOption<StricterOptions<OptionsType, Options>["ipc"], "node" extends keyof StricterOptions<OptionsType, Options> ? StricterOptions<OptionsType, Options>["node"] : undefined, "ipcInput"…
ExecaError.stderrResultStdioProperty<"2", "2", IgnoresResultOutput<"2", OptionsType>, OptionsType>ResultStdio<"2", "2", "2", OptionsType>
ExecaError.stdoutResultStdioProperty<"1", "1", IgnoresResultOutput<"1", OptionsType>, OptionsType>ResultStdio<"1", "1", "1", OptionsType>
ExecaError.ipcOutputResultIpcAsync<FdSpecificOption<OptionsType["buffer"], "ipc">, HasIpcOption<StricterOptions<OptionsType, Options>["ipc"], "ipcInput" extends keyof StricterOptions<OptionsType, Options> ? StricterOptions<OptionsType, Options>["ipcInput"] : undefined, "gracefulCancel" extends keyof StricterOptions<Opt…OptionsType extends unknown ? ResultIpcAsync<FdSpecificOption<OptionsType["buffer"], "ipc">, HasIpcOption<StricterOptions<OptionsType, Options>["ipc"], "node" extends keyof StricterOptions<OptionsType, Options> ? StricterOptions<OptionsType, Options>["node"] : undefined, "ipcInput" extends keyof Str…
ExecaError.pipedFromResult<Options>[](Result<Options> | ExecaError<Options>)[]
ExecaSyncError.allResultAllProperty<OptionsType["all"], OptionsType>ResultAll<OptionsType>
ExecaSyncError.stdioMapResultStdio<StdioOptionNormalized<OptionsType["stdio"]>, OptionsType>[...MapResultStdio<StdioOptionNormalized<OptionsType["stdio"]>, OptionsType>]
ExecaSyncError.stderrResultStdioProperty<"2", "2", IgnoresResultOutput<"2", OptionsType>, OptionsType>ResultStdio<"2", "2", "2", OptionsType>
ExecaSyncError.stdoutResultStdioProperty<"1", "1", IgnoresResultOutput<"1", OptionsType>, OptionsType>ResultStdio<"1", "1", "1", OptionsType>

新增弃用

未发现。

要求变化(engines、peer 依赖)

之前之后
engines.node^18.19.0 || >=20.5.0>=22

把这些数据交给你的 AI 智能体

Vigia 是免费的 MCP 服务器:你的编程智能体在写代码之前就能检查版本、不兼容变更和安全漏洞。无需注册,无需 API 密钥。

claude mcp add --transport http vigia https://vigia.coredls.cloud/mcp

添加到 Cursor添加到 VS Code★ 在 GitHub 上加星

任何其他 MCP 客户端
{ "mcpServers": { "vigia": { "url": "https://vigia.coredls.cloud/mcp" } } }

智能体技能(SKILL.md):告诉智能体何时使用 Vigia · 用于拉取请求的 GitHub Action

常见问题

将 execa 从 9 升级到 10 有哪些不兼容变更?

在 execa 9.6.1 与 10.2.1 之间,Vigia 发现 2 个已删除的导出、8 个已修改的签名,以及 10 个已删除或修改的类或接口成员。

execa 10 中弃用了哪些内容?

execa 10.2.1 中有 0 个导出或成员新被标记为弃用。

供智能体使用

GET https://vigia.coredls.cloud/v1/packages/npm/execa/upgrade?from=9.6.1&to=10.2.1