first commit

This commit is contained in:
2025-10-26 23:10:15 +08:00
commit 8f0345b7be
14961 changed files with 2356381 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
import { ApplicationError, type ReportingOptions } from '@n8n/errors';
import type { Functionality, IDataObject, JsonObject } from '../../interfaces';
interface ExecutionBaseErrorOptions extends ReportingOptions {
cause?: Error;
errorResponse?: JsonObject;
}
export declare abstract class ExecutionBaseError extends ApplicationError {
description: string | null | undefined;
cause?: Error;
errorResponse?: JsonObject;
timestamp: number;
context: IDataObject;
lineNumber: number | undefined;
functionality: Functionality;
constructor(message: string, options?: ExecutionBaseErrorOptions);
toJSON?(): {
message: string;
lineNumber: number | undefined;
timestamp: number;
name: string;
description: string | null | undefined;
context: IDataObject;
cause: Error | undefined;
};
}
export {};
//# sourceMappingURL=execution-base.error.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"execution-base.error.d.ts","sourceRoot":"","sources":["../../../../src/errors/abstract/execution-base.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE/E,UAAU,yBAA0B,SAAQ,gBAAgB;IAC3D,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,aAAa,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,8BAAsB,kBAAmB,SAAQ,gBAAgB;IAChE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAE9B,KAAK,CAAC,EAAE,KAAK,CAAC;IAEvB,aAAa,CAAC,EAAE,UAAU,CAAC;IAE3B,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,EAAE,WAAW,CAAM;IAE1B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,aAAa,EAAE,aAAa,CAAa;gBAE7B,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,yBAA8B;IAgBpE,MAAM,CAAC;;;;;;;;;CAWP"}

View File

@@ -0,0 +1,50 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "@n8n/errors"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExecutionBaseError = void 0;
const errors_1 = require("@n8n/errors");
class ExecutionBaseError extends errors_1.ApplicationError {
description;
cause;
errorResponse;
timestamp;
context = {};
lineNumber;
functionality = 'regular';
constructor(message, options = {}) {
super(message, options);
this.name = this.constructor.name;
this.timestamp = Date.now();
const { cause, errorResponse } = options;
if (cause instanceof ExecutionBaseError) {
this.context = cause.context;
}
else if (cause && !(cause instanceof Error)) {
this.cause = cause;
}
if (errorResponse)
this.errorResponse = errorResponse;
}
toJSON() {
return {
message: this.message,
lineNumber: this.lineNumber,
timestamp: this.timestamp,
name: this.name,
description: this.description,
context: this.context,
cause: this.cause,
};
}
}
exports.ExecutionBaseError = ExecutionBaseError;
});
//# sourceMappingURL=execution-base.error.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"execution-base.error.js","sourceRoot":"","sources":["../../../../src/errors/abstract/execution-base.error.ts"],"names":[],"mappings":";;;;;;;;;;;;IAAA,wCAAsE;IAStE,MAAsB,kBAAmB,SAAQ,yBAAgB;QAChE,WAAW,CAA4B;QAE9B,KAAK,CAAS;QAEvB,aAAa,CAAc;QAE3B,SAAS,CAAS;QAElB,OAAO,GAAgB,EAAE,CAAC;QAE1B,UAAU,CAAqB;QAE/B,aAAa,GAAkB,SAAS,CAAC;QAEzC,YAAY,OAAe,EAAE,UAAqC,EAAE;YACnE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAExB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAClC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE5B,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;YACzC,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;gBACzC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;YAC9B,CAAC;iBAAM,IAAI,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACpB,CAAC;YAED,IAAI,aAAa;gBAAE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACvD,CAAC;QAED,MAAM;YACL,OAAO;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;aACjB,CAAC;QACH,CAAC;KACD;IA1CD,gDA0CC"}

View File

@@ -0,0 +1,48 @@
import { ExecutionBaseError } from './execution-base.error';
import type { INode, JsonObject } from '../../interfaces';
/**
* Base class for specific NodeError-types, with functionality for finding
* a value recursively inside an error object.
*/
export declare abstract class NodeError extends ExecutionBaseError {
readonly node: INode;
messages: string[];
constructor(node: INode, error: Error | JsonObject);
/**
* Finds property through exploration based on potential keys and traversal keys.
* Depth-first approach.
*
* This method iterates over `potentialKeys` and, if the value at the key is a
* truthy value, the type of the value is checked:
* (1) if a string or number, the value is returned as a string; or
* (2) if an array,
* its string or number elements are collected as a long string,
* its object elements are traversed recursively (restart this function
* with each object as a starting point), or
* (3) if it is an object, it traverses the object and nested ones recursively
* based on the `potentialKeys` and returns a string if found.
*
* If nothing found via `potentialKeys` this method iterates over `traversalKeys` and
* if the value at the key is a traversable object, it restarts with the object as the
* new starting point (recursion).
* If nothing found for any of the `traversalKeys`, exploration continues with remaining
* `traversalKeys`.
*
* Otherwise, if all the paths have been exhausted and no value is eligible, `null` is
* returned.
*
*/
protected findProperty(jsonError: JsonObject, potentialKeys: string[], traversalKeys?: string[]): string | null;
/**
* Preserve the original error message before setting the new one
*/
protected addToMessages(message: string): void;
/**
* Set descriptive error message if code is provided or if message contains any of the common errors,
* update description to include original message plus the description
*/
protected setDescriptiveErrorMessage(message: string, messages: string[], code?: string | null, messageMapping?: {
[key: string]: string;
}): [string, string[]];
}
//# sourceMappingURL=node.error.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"node.error.d.ts","sourceRoot":"","sources":["../../../../src/errors/abstract/node.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAe,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA+BvE;;;GAGG;AACH,8BAAsB,SAAU,SAAQ,kBAAkB;IAIxD,QAAQ,CAAC,IAAI,EAAE,KAAK;IAHrB,QAAQ,EAAE,MAAM,EAAE,CAAM;gBAGd,IAAI,EAAE,KAAK,EACpB,KAAK,EAAE,KAAK,GAAG,UAAU;IAY1B;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,SAAS,CAAC,YAAY,CACrB,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,MAAM,EAAE,EACvB,aAAa,GAAE,MAAM,EAAO,GAC1B,MAAM,GAAG,IAAI;IAqDhB;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM9C;;;OAGG;IACH,SAAS,CAAC,0BAA0B,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,cAAc,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GACxC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAkCrB"}

View File

@@ -0,0 +1,177 @@
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports", "./execution-base.error", "../../utils"], factory);
}
})(function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.NodeError = void 0;
const execution_base_error_1 = require("./execution-base.error");
const utils_1 = require("../../utils");
/**
* Descriptive messages for common errors.
*/
const COMMON_ERRORS = {
// nodeJS errors
ECONNREFUSED: 'The service refused the connection - perhaps it is offline',
ECONNRESET: 'The connection to the server was closed unexpectedly, perhaps it is offline. You can retry the request immediately or wait and retry later.',
ENOTFOUND: 'The connection cannot be established, this usually occurs due to an incorrect host (domain) value',
ETIMEDOUT: "The connection timed out, consider setting the 'Retry on Fail' option in the node settings",
ERRADDRINUSE: 'The port is already occupied by some other application, if possible change the port or kill the application that is using it',
EADDRNOTAVAIL: 'The address is not available, ensure that you have the right IP address',
ECONNABORTED: 'The connection was aborted, perhaps the server is offline',
EHOSTUNREACH: 'The host is unreachable, perhaps the server is offline',
EAI_AGAIN: 'The DNS server returned an error, perhaps the server is offline',
ENOENT: 'The file or directory does not exist',
EISDIR: 'The file path was expected but the given path is a directory',
ENOTDIR: 'The directory path was expected but the given path is a file',
EACCES: 'Forbidden by access permissions, make sure you have the right permissions',
EEXIST: 'The file or directory already exists',
EPERM: 'Operation not permitted, make sure you have the right permissions',
// other errors
GETADDRINFO: 'The server closed the connection unexpectedly',
};
/**
* Base class for specific NodeError-types, with functionality for finding
* a value recursively inside an error object.
*/
class NodeError extends execution_base_error_1.ExecutionBaseError {
node;
messages = [];
constructor(node, error) {
const isError = error instanceof Error;
const message = isError ? error.message : '';
const options = isError ? { cause: error } : { errorResponse: error };
super(message, options);
this.node = node;
if (error instanceof NodeError) {
this.tags.reWrapped = true;
}
}
/**
* Finds property through exploration based on potential keys and traversal keys.
* Depth-first approach.
*
* This method iterates over `potentialKeys` and, if the value at the key is a
* truthy value, the type of the value is checked:
* (1) if a string or number, the value is returned as a string; or
* (2) if an array,
* its string or number elements are collected as a long string,
* its object elements are traversed recursively (restart this function
* with each object as a starting point), or
* (3) if it is an object, it traverses the object and nested ones recursively
* based on the `potentialKeys` and returns a string if found.
*
* If nothing found via `potentialKeys` this method iterates over `traversalKeys` and
* if the value at the key is a traversable object, it restarts with the object as the
* new starting point (recursion).
* If nothing found for any of the `traversalKeys`, exploration continues with remaining
* `traversalKeys`.
*
* Otherwise, if all the paths have been exhausted and no value is eligible, `null` is
* returned.
*
*/
findProperty(jsonError, potentialKeys, traversalKeys = []) {
for (const key of potentialKeys) {
let value = jsonError[key];
if (value) {
if (typeof value === 'string') {
try {
value = (0, utils_1.jsonParse)(value);
}
catch (error) {
return value;
}
if (typeof value === 'string')
return value;
}
if (typeof value === 'number')
return value.toString();
if (Array.isArray(value)) {
const resolvedErrors = value
.map((jsonError) => {
if (typeof jsonError === 'string')
return jsonError;
if (typeof jsonError === 'number')
return jsonError.toString();
if ((0, utils_1.isTraversableObject)(jsonError)) {
return this.findProperty(jsonError, potentialKeys);
}
return null;
})
.filter((errorValue) => errorValue !== null);
if (resolvedErrors.length === 0) {
return null;
}
return resolvedErrors.join(' | ');
}
if ((0, utils_1.isTraversableObject)(value)) {
const property = this.findProperty(value, potentialKeys);
if (property) {
return property;
}
}
}
}
for (const key of traversalKeys) {
const value = jsonError[key];
if ((0, utils_1.isTraversableObject)(value)) {
const property = this.findProperty(value, potentialKeys, traversalKeys);
if (property) {
return property;
}
}
}
return null;
}
/**
* Preserve the original error message before setting the new one
*/
addToMessages(message) {
if (message && !this.messages.includes(message)) {
this.messages.push(message);
}
}
/**
* Set descriptive error message if code is provided or if message contains any of the common errors,
* update description to include original message plus the description
*/
setDescriptiveErrorMessage(message, messages, code, messageMapping) {
let newMessage = message;
if (messageMapping) {
for (const [mapKey, mapMessage] of Object.entries(messageMapping)) {
if ((message || '').toUpperCase().includes(mapKey.toUpperCase())) {
newMessage = mapMessage;
messages.push(message);
break;
}
}
if (newMessage !== message) {
return [newMessage, messages];
}
}
// if code is provided and it is in the list of common errors set the message and return early
if (code && typeof code === 'string' && COMMON_ERRORS[code.toUpperCase()]) {
newMessage = COMMON_ERRORS[code];
messages.push(message);
return [newMessage, messages];
}
// check if message contains any of the common errors and set the message and description
for (const [errorCode, errorDescriptiveMessage] of Object.entries(COMMON_ERRORS)) {
if ((message || '').toUpperCase().includes(errorCode.toUpperCase())) {
newMessage = errorDescriptiveMessage;
messages.push(message);
break;
}
}
return [newMessage, messages];
}
}
exports.NodeError = NodeError;
});
//# sourceMappingURL=node.error.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"node.error.js","sourceRoot":"","sources":["../../../../src/errors/abstract/node.error.ts"],"names":[],"mappings":"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"}