refactor(core): Move ApplicationError to @n8n/errors (#17667)

This commit is contained in:
Iván Ovejero
2025-07-28 17:48:56 +02:00
committed by GitHub
parent 6c0be292b1
commit 4cf9399432
59 changed files with 90 additions and 58 deletions

View File

@@ -21,6 +21,10 @@
"dist/**/*"
],
"devDependencies": {
"@n8n/typescript-config": "workspace:*"
"@n8n/typescript-config": "workspace:*",
"@sentry/node": "catalog:"
},
"dependencies": {
"callsites": "catalog:"
}
}

View File

@@ -1,7 +1,7 @@
import type { Event } from '@sentry/node';
import callsites from 'callsites';
import type { ErrorLevel, ReportingOptions } from './error.types';
import type { ErrorLevel, ReportingOptions } from './types';
/**
* @deprecated Use `UserError`, `OperationalError` or `UnexpectedError` instead.
@@ -26,9 +26,11 @@ export class ApplicationError extends Error {
try {
const filePath = callsites()[2].getFileName() ?? '';
// eslint-disable-next-line no-useless-escape
const match = /packages\/([^\/]+)\//.exec(filePath)?.[1];
if (match) this.tags.packageName = match;
// eslint-disable-next-line no-empty
} catch {}
}
}

View File

@@ -1 +1,2 @@
export {};
export { ApplicationError } from './application.error';
export * from './types';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class ChatTriggerAuthorizationError extends ApplicationError {
constructor(

View File

@@ -157,9 +157,9 @@
"@types/sanitize-html": "^2.11.0",
"@types/temp": "^0.9.1",
"fast-glob": "catalog:",
"jest-mock-extended": "^3.0.4",
"n8n-core": "workspace:*",
"tsup": "catalog:",
"jest-mock-extended": "^3.0.4"
"tsup": "catalog:"
},
"dependencies": {
"@aws-sdk/client-sso-oidc": "3.808.0",
@@ -190,6 +190,7 @@
"@modelcontextprotocol/sdk": "1.12.0",
"@mozilla/readability": "0.6.0",
"@n8n/client-oauth2": "workspace:*",
"@n8n/errors": "workspace:^",
"@n8n/json-schema-to-zod": "workspace:*",
"@n8n/typeorm": "0.3.20-12",
"@n8n/typescript-config": "workspace:*",

View File

@@ -36,6 +36,7 @@
"dependencies": {
"@n8n/config": "workspace:*",
"@n8n/di": "workspace:*",
"@n8n/errors": "workspace:^",
"@sentry/node": "catalog:",
"acorn": "8.14.0",
"acorn-walk": "8.3.4",

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { createServer } from 'node:http';
export class HealthCheckServer {

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { ExecutionError } from '@/js-task-runner/errors/execution-error';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class TaskCancelledError extends ApplicationError {
constructor(reason: string) {

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class TimeoutError extends ApplicationError {
description: string;

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
/**
* Error that indicates that a specific function is not available in the

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { isBuiltin } from 'node:module';
import { ExecutionError } from './errors/execution-error';

View File

@@ -27,6 +27,7 @@
"bin"
],
"devDependencies": {
"@n8n/errors": "workspace:^",
"@n8n/typescript-config": "workspace:*",
"@types/express": "catalog:",
"@types/jsonwebtoken": "catalog:",

View File

@@ -1,3 +1,3 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export abstract class BinaryDataError extends ApplicationError {}

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export abstract class FileSystemError extends ApplicationError {
constructor(message: string, filePath: string) {

View File

@@ -1,10 +1,10 @@
import { inTest, Logger } from '@n8n/backend-common';
import type { InstanceType } from '@n8n/constants';
import { Service } from '@n8n/di';
import type { ReportingOptions } from '@n8n/errors';
import type { NodeOptions } from '@sentry/node';
import type { ErrorEvent, EventHint } from '@sentry/types';
import { AxiosError } from 'axios';
import type { ReportingOptions } from 'n8n-workflow';
import { ApplicationError, ExecutionCancelledError, BaseError } from 'n8n-workflow';
import { createHash } from 'node:crypto';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class InvalidExecutionMetadataError extends ApplicationError {
constructor(

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { CONFIG_MODES } from '../binary-data/utils';

View File

@@ -1,5 +1,5 @@
import { ApplicationError } from '@n8n/errors';
import { mock } from 'jest-mock-extended';
import { ApplicationError } from 'n8n-workflow';
import type {
Workflow,
INode,

View File

@@ -1,3 +1,4 @@
import { ApplicationError } from '@n8n/errors';
import { mock } from 'jest-mock-extended';
import type {
Expression,
@@ -13,7 +14,6 @@ import type {
WorkflowActivateMode,
WorkflowExecuteMode,
} from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
import { HookContext } from '../hook-context';

View File

@@ -1,3 +1,4 @@
import { ApplicationError } from '@n8n/errors';
import type {
ICredentialDataDecryptedObject,
INode,
@@ -9,7 +10,6 @@ import type {
IWebhookData,
WebhookType,
} from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
import { NodeExecutionContext } from './node-execution-context';
import { getRequestHelperFunctions } from './utils/request-helper-functions';

View File

@@ -1,5 +1,5 @@
import { ApplicationError } from '@n8n/errors';
import type { IBinaryData, INodeExecutionData } from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
import { normalizeItems } from '../normalize-items';

View File

@@ -1,5 +1,5 @@
import { ApplicationError } from '@n8n/errors';
import type { INodeExecutionData, IDataObject } from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
/**
* Automatically put the objects under a 'json' key and don't error,

View File

@@ -1,5 +1,5 @@
import { Service } from '@n8n/di';
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type {
Workflow,
INode,

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type {
ICredentialDataDecryptedObject,
ICredentialType,

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type {
IAuthenticateGeneric,
ICredentialDataDecryptedObject,

View File

@@ -9,7 +9,7 @@ import type {
IHttpRequestMethods,
IRequestOptions,
} from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type { IAttachment, IRecord } from '../helpers/interfaces';
import { flattenOutput } from '../helpers/utils';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class ExecutionError extends ApplicationError {
description: string | null = null;

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class ValidationError extends ApplicationError {
description = '';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export type WrappableError = Record<string, unknown>;

View File

@@ -3,7 +3,7 @@ import { NodeTestHarness } from '@nodes-testing/node-test-harness';
import { anyNumber, mock } from 'jest-mock-extended';
import { normalizeItems } from 'n8n-core';
import type { IExecuteFunctions, IWorkflowDataProxyData } from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { Code } from '../Code.node';
import { ValidationError } from '../ValidationError';

View File

@@ -1,6 +1,6 @@
import { mock } from 'jest-mock-extended';
import { MqttClient } from 'mqtt';
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { createClient, type MqttCredential } from '../GenericFunctions';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type {
IDataObject,
IExecuteFunctions,

View File

@@ -10,7 +10,7 @@ import type {
INodeExecutionData,
IPairedItemData,
} from 'n8n-workflow';
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import { fuzzyCompare, preparePairedItemDataArray } from '@utils/utilities';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type {
ITriggerFunctions,
IDataObject,

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type { IExecuteFunctions, IDataObject, INodeExecutionData, JsonObject } from 'n8n-workflow';
import type pgPromise from 'pg-promise';
import type pg from 'pg-promise/typescript/pg-subset';

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export const prepareFieldsArray = (fields: string | string[], fieldName = 'Fields') => {
if (typeof fields === 'string') {

View File

@@ -1,5 +1,5 @@
import get from 'lodash/get';
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
import type {
IDataObject,
IExecuteFunctions,

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from 'n8n-workflow';
import { ApplicationError } from '@n8n/errors';
export class WebhookAuthorizationError extends ApplicationError {
constructor(

View File

@@ -882,6 +882,7 @@
"@mozilla/readability": "0.6.0",
"@n8n/config": "workspace:*",
"@n8n/di": "workspace:*",
"@n8n/errors": "workspace:^",
"@n8n/imap": "workspace:*",
"@n8n/vm2": "3.9.25",
"alasql": "4.4.0",

View File

@@ -38,8 +38,8 @@
"devDependencies": {
"@langchain/core": "catalog:",
"@n8n/config": "workspace:*",
"@n8n/vitest-config": "workspace:*",
"@n8n/typescript-config": "workspace:*",
"@n8n/vitest-config": "workspace:*",
"@types/express": "catalog:",
"@types/jmespath": "^0.15.0",
"@types/lodash": "catalog:",
@@ -50,6 +50,7 @@
"vitest-mock-extended": "catalog:"
},
"dependencies": {
"@n8n/errors": "workspace:^",
"@n8n/tournament": "1.0.6",
"ast-types": "0.15.2",
"callsites": "catalog:",

View File

@@ -1,6 +1,6 @@
import { ApplicationError, type ReportingOptions } from '@n8n/errors';
import type { Functionality, IDataObject, JsonObject } from '../../interfaces';
import { ApplicationError } from '../application.error';
import type { ReportingOptions } from '../error.types';
interface ExecutionBaseErrorOptions extends ReportingOptions {
cause?: Error;

View File

@@ -1,7 +1,7 @@
import type { Event } from '@sentry/node';
import callsites from 'callsites';
import type { ErrorTags, ErrorLevel, ReportingOptions } from '../error.types';
import type { ErrorTags, ErrorLevel, ReportingOptions } from '@n8n/errors';
export type BaseErrorOptions = { description?: string | undefined | null } & ErrorOptions &
ReportingOptions;

View File

@@ -1,4 +1,4 @@
import { ApplicationError } from './application.error';
import { ApplicationError } from '@n8n/errors';
export type DbConnectionTimeoutErrorOpts = {
configuredTimeoutInMs: number;

View File

@@ -1,9 +1,8 @@
export type * from './error.types';
export { BaseError, type BaseErrorOptions } from './base/base.error';
export { OperationalError, type OperationalErrorOptions } from './base/operational.error';
export { UnexpectedError, type UnexpectedErrorOptions } from './base/unexpected.error';
export { UserError, type UserErrorOptions } from './base/user.error';
export { ApplicationError } from './application.error';
export { ApplicationError } from '@n8n/errors';
export { ExpressionError } from './expression.error';
export { ExecutionCancelledError } from './execution-cancelled.error';
export { NodeApiError } from './node-api.error';

View File

@@ -4,7 +4,7 @@ import type { AxiosError } from 'axios';
import { parseString } from 'xml2js';
import { NodeError } from './abstract/node.error';
import type { ErrorLevel } from './error.types';
import type { ErrorLevel } from '@n8n/errors';
import {
NO_OP_NODE_TYPE,
UNKNOWN_ERROR_DESCRIPTION,

View File

@@ -1,5 +1,5 @@
import { NodeError } from './abstract/node.error';
import { ApplicationError } from './application.error';
import { ApplicationError } from '@n8n/errors';
import type { NodeOperationErrorOptions } from './node-api.error';
import type { INode, JsonObject } from '../interfaces';

View File

@@ -1,5 +1,4 @@
import { ApplicationError } from './application.error';
import type { ErrorLevel } from './error.types';
import { ApplicationError, type ErrorLevel } from '@n8n/errors';
import type { INode } from '../interfaces';
interface TriggerCloseErrorOptions extends ErrorOptions {

View File

@@ -1,5 +1,5 @@
import { ExecutionBaseError } from './abstract/execution-base.error';
import type { ApplicationError } from './application.error';
import type { ApplicationError } from '@n8n/errors';
import type { INode } from '../interfaces';
interface WorkflowActivationErrorOptions {

View File

@@ -1,6 +1,6 @@
import { DateTime, Duration, Interval } from 'luxon';
import { ApplicationError } from './errors/application.error';
import { ApplicationError } from '@n8n/errors';
import { ExpressionExtensionError } from './errors/expression-extension.error';
import { ExpressionError } from './errors/expression.error';
import { evaluateExpression, setErrorHandler } from './expression-evaluator-proxy';

View File

@@ -7,7 +7,7 @@ import get from 'lodash/get';
import isEqual from 'lodash/isEqual';
import { EXECUTE_WORKFLOW_NODE_TYPE, WORKFLOW_TOOL_LANGCHAIN_NODE_TYPE } from './constants';
import { ApplicationError } from './errors/application.error';
import { ApplicationError } from '@n8n/errors';
import { NodeConnectionTypes } from './interfaces';
import type {
FieldType,

View File

@@ -1,6 +1,6 @@
import type { DateTime } from 'luxon';
import { ApplicationError } from '../errors/application.error';
import { ApplicationError } from '@n8n/errors';
import type {
FilterConditionValue,
FilterOperatorType,

View File

@@ -22,7 +22,7 @@ import {
WEBHOOK_NODE_TYPE,
WORKFLOW_TOOL_LANGCHAIN_NODE_TYPE,
} from './constants';
import { ApplicationError } from './errors/application.error';
import { ApplicationError } from '@n8n/errors';
import type { NodeApiError } from './errors/node-api.error';
import type {
IConnection,

View File

@@ -4,7 +4,7 @@ import FormData from 'form-data';
import merge from 'lodash/merge';
import { ALPHABET } from './constants';
import { ApplicationError } from './errors/application.error';
import { ApplicationError } from '@n8n/errors';
import { ExecutionCancelledError } from './errors/execution-cancelled.error';
import type { BinaryFileType, IDisplayOptions, INodeProperties, JsonObject } from './interfaces';

View File

@@ -7,7 +7,7 @@ import { DateTime, Duration, Interval, Settings } from 'luxon';
import { augmentArray, augmentObject } from './augment-object';
import { AGENT_LANGCHAIN_NODE_TYPE, SCRIPTING_NODE_TYPES } from './constants';
import { ApplicationError } from './errors/application.error';
import { ApplicationError } from '@n8n/errors';
import {
ExpressionError,
type ExpressionErrorOptions,

View File

@@ -17,7 +17,7 @@ import {
STARTING_NODE_TYPES,
} from './constants';
import { UserError } from './errors';
import { ApplicationError } from './errors/application.error';
import { ApplicationError } from '@n8n/errors';
import { Expression } from './expression';
import { getGlobalState } from './global-state';
import type {

View File

@@ -1,5 +1,5 @@
import { ALPHABET } from '../src/constants';
import { ApplicationError } from '../src/errors/application.error';
import { ApplicationError } from '@n8n/errors';
import { ExecutionCancelledError } from '../src/errors/execution-cancelled.error';
import {
jsonParse,

22
pnpm-lock.yaml generated
View File

@@ -731,10 +731,17 @@ importers:
version: link:../typescript-config
packages/@n8n/errors:
dependencies:
callsites:
specifier: 'catalog:'
version: 3.1.0
devDependencies:
'@n8n/typescript-config':
specifier: workspace:*
version: link:../typescript-config
'@sentry/node':
specifier: 'catalog:'
version: 8.52.1
packages/@n8n/eslint-config:
dependencies:
@@ -981,6 +988,9 @@ importers:
'@n8n/client-oauth2':
specifier: workspace:*
version: link:../client-oauth2
'@n8n/errors':
specifier: workspace:^
version: link:../errors
'@n8n/json-schema-to-zod':
specifier: workspace:*
version: link:../json-schema-to-zod
@@ -1205,6 +1215,9 @@ importers:
'@n8n/di':
specifier: workspace:*
version: link:../di
'@n8n/errors':
specifier: workspace:^
version: link:../errors
'@sentry/node':
specifier: 'catalog:'
version: 8.52.1
@@ -1792,6 +1805,9 @@ importers:
specifier: 'catalog:'
version: 3.25.67
devDependencies:
'@n8n/errors':
specifier: workspace:^
version: link:../@n8n/errors
'@n8n/typescript-config':
specifier: workspace:*
version: link:../@n8n/typescript-config
@@ -2670,6 +2686,9 @@ importers:
'@n8n/di':
specifier: workspace:*
version: link:../@n8n/di
'@n8n/errors':
specifier: workspace:^
version: link:../@n8n/errors
'@n8n/imap':
specifier: workspace:*
version: link:../@n8n/imap
@@ -2983,6 +3002,9 @@ importers:
packages/workflow:
dependencies:
'@n8n/errors':
specifier: workspace:^
version: link:../@n8n/errors
'@n8n/tournament':
specifier: 1.0.6
version: 1.0.6