mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
🚀 Release 0.222.0 (#5786)
This commit is contained in:
committed by
GitHub
parent
dd20127961
commit
e92a993694
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "n8n-workflow",
|
||||
"version": "0.142.0",
|
||||
"version": "0.143.0",
|
||||
"description": "Workflow base code of n8n",
|
||||
"license": "SEE LICENSE IN LICENSE.md",
|
||||
"homepage": "https://n8n.io",
|
||||
|
||||
@@ -1,5 +1,26 @@
|
||||
import type { IDataObject } from './Interfaces';
|
||||
import util from 'util';
|
||||
|
||||
const augmentedObjects = new WeakSet<object>();
|
||||
function augment<T>(value: T): T {
|
||||
if (
|
||||
typeof value !== 'object' ||
|
||||
value === null ||
|
||||
value instanceof RegExp ||
|
||||
augmentedObjects.has(value)
|
||||
)
|
||||
return value;
|
||||
|
||||
// Track augmented objects to prevent infinite recursion in cases where an object contains circular references
|
||||
augmentedObjects.add(value);
|
||||
|
||||
if (value instanceof Date) return new Date(value.valueOf()) as T;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
||||
if (Array.isArray(value)) return augmentArray(value) as T;
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
||||
return augmentObject(value) as T;
|
||||
}
|
||||
|
||||
export function augmentArray<T>(data: T[]): T[] {
|
||||
let newData: unknown[] | undefined = undefined;
|
||||
@@ -17,24 +38,12 @@ export function augmentArray<T>(data: T[]): T[] {
|
||||
},
|
||||
get(target, key: string, receiver): unknown {
|
||||
const value = Reflect.get(newData !== undefined ? newData : target, key, receiver) as unknown;
|
||||
|
||||
if (typeof value === 'object') {
|
||||
if (value === null || util.types.isProxy(value)) {
|
||||
return value;
|
||||
}
|
||||
|
||||
const newValue = augment(value);
|
||||
if (newValue !== value) {
|
||||
newData = getData();
|
||||
|
||||
if (Array.isArray(value)) {
|
||||
Reflect.set(newData, key, augmentArray(value));
|
||||
} else {
|
||||
// eslint-disable-next-line @typescript-eslint/no-use-before-define
|
||||
Reflect.set(newData, key, augmentObject(value as IDataObject));
|
||||
}
|
||||
|
||||
return Reflect.get(newData, key);
|
||||
Reflect.set(newData, key, newValue);
|
||||
return newValue;
|
||||
}
|
||||
|
||||
return value;
|
||||
},
|
||||
getOwnPropertyDescriptor(target, key) {
|
||||
@@ -83,18 +92,13 @@ export function augmentObject<T extends object>(data: T): T {
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
||||
const value = Reflect.get(target, key, receiver);
|
||||
|
||||
if (value !== null && typeof value === 'object') {
|
||||
if (Array.isArray(value)) {
|
||||
newData[key] = augmentArray(value);
|
||||
} else {
|
||||
newData[key] = augmentObject(value as IDataObject);
|
||||
}
|
||||
|
||||
return newData[key];
|
||||
const newValue = augment(value);
|
||||
if (newValue !== value) {
|
||||
Object.assign(newData, { [key]: newValue });
|
||||
return newValue;
|
||||
}
|
||||
|
||||
return value as string;
|
||||
return value;
|
||||
},
|
||||
deleteProperty(target, key: string) {
|
||||
if (key in newData) {
|
||||
|
||||
@@ -1547,7 +1547,7 @@ export interface IRun {
|
||||
data: IRunExecutionData;
|
||||
finished?: boolean;
|
||||
mode: WorkflowExecuteMode;
|
||||
waitTill?: Date;
|
||||
waitTill?: Date | null;
|
||||
startedAt: Date;
|
||||
stoppedAt?: Date;
|
||||
status: ExecutionStatus;
|
||||
|
||||
@@ -64,27 +64,23 @@ export const jsonParse = <T>(jsonString: string, options?: JSONParseOptions<T>):
|
||||
|
||||
type JSONStringifyOptions = {
|
||||
replaceCircularRefs?: boolean;
|
||||
circularRefReplacement?: string;
|
||||
};
|
||||
|
||||
const getReplaceCircularReferencesFn = (options: JSONStringifyOptions) => {
|
||||
const knownObjects = new WeakSet();
|
||||
return (key: any, value: any) => {
|
||||
if (typeof value === 'object' && value !== null) {
|
||||
if (knownObjects.has(value)) {
|
||||
return options?.circularRefReplacement ?? '[Circular Reference]';
|
||||
}
|
||||
knownObjects.add(value);
|
||||
}
|
||||
return value;
|
||||
};
|
||||
const replaceCircularReferences = <T>(value: T, knownObjects = new WeakSet()): T => {
|
||||
if (typeof value !== 'object' || value === null || value instanceof RegExp) return value;
|
||||
if ('toJSON' in value && typeof value.toJSON === 'function') return value.toJSON() as T;
|
||||
if (knownObjects.has(value)) return '[Circular Reference]' as T;
|
||||
knownObjects.add(value);
|
||||
const copy = (Array.isArray(value) ? [] : {}) as T;
|
||||
for (const key in value) {
|
||||
copy[key] = replaceCircularReferences(value[key], knownObjects);
|
||||
}
|
||||
knownObjects.delete(value);
|
||||
return copy;
|
||||
};
|
||||
|
||||
export const jsonStringify = (obj: unknown, options: JSONStringifyOptions = {}): string => {
|
||||
const replacer = options?.replaceCircularRefs
|
||||
? getReplaceCircularReferencesFn(options)
|
||||
: undefined;
|
||||
return JSON.stringify(obj, replacer);
|
||||
return JSON.stringify(options?.replaceCircularRefs ? replaceCircularReferences(obj) : obj);
|
||||
};
|
||||
|
||||
export const sleep = async (ms: number): Promise<void> =>
|
||||
|
||||
@@ -193,11 +193,15 @@ describe('AugmentObject', () => {
|
||||
|
||||
describe('augmentObject', () => {
|
||||
test('should work with simple values on first level', () => {
|
||||
const date = new Date(1680089084200);
|
||||
const regexp = new RegExp('^test$', 'ig');
|
||||
const originalObject: IDataObject = {
|
||||
1: 11,
|
||||
2: '22',
|
||||
a: 111,
|
||||
b: '222',
|
||||
d: date,
|
||||
r: regexp,
|
||||
};
|
||||
const copyOriginal = JSON.parse(JSON.stringify(originalObject));
|
||||
|
||||
@@ -221,7 +225,7 @@ describe('AugmentObject', () => {
|
||||
|
||||
augmentedObject.c = 3;
|
||||
|
||||
expect(originalObject).toEqual(copyOriginal);
|
||||
expect({ ...originalObject, d: date.toJSON(), r: {} }).toEqual(copyOriginal);
|
||||
|
||||
expect(augmentedObject).toEqual({
|
||||
1: 911,
|
||||
@@ -229,6 +233,8 @@ describe('AugmentObject', () => {
|
||||
a: 9111,
|
||||
b: '9222',
|
||||
c: 3,
|
||||
d: date,
|
||||
r: regexp,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ describe('jsonParse', () => {
|
||||
});
|
||||
|
||||
describe('jsonStringify', () => {
|
||||
const source: any = { a: 1, b: 2 };
|
||||
const source: any = { a: 1, b: 2, d: new Date(1680089084200), r: new RegExp('^test$', 'ig') };
|
||||
source.c = source;
|
||||
|
||||
it('should throw errors on circular references by default', () => {
|
||||
@@ -27,7 +27,15 @@ describe('jsonStringify', () => {
|
||||
|
||||
it('should break circular references when requested', () => {
|
||||
expect(jsonStringify(source, { replaceCircularRefs: true })).toEqual(
|
||||
'{"a":1,"b":2,"c":"[Circular Reference]"}',
|
||||
'{"a":1,"b":2,"d":"2023-03-29T11:24:44.200Z","r":{},"c":"[Circular Reference]"}',
|
||||
);
|
||||
});
|
||||
|
||||
it('should not detect duplicates as circular references', () => {
|
||||
const y = { z: 5 };
|
||||
const x = [y, y, { y }];
|
||||
expect(jsonStringify(x, { replaceCircularRefs: true })).toEqual(
|
||||
'[{"z":5},{"z":5},{"y":{"z":5}}]',
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user