Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled
49 lines
1.2 KiB
TypeScript
49 lines
1.2 KiB
TypeScript
import { isJsonParseCall, isJsonStringifyCall } from '../utils/json.js';
|
|
import { ESLintUtils, TSESTree } from '@typescript-eslint/utils';
|
|
|
|
export const NoJsonParseJsonStringifyRule = ESLintUtils.RuleCreator.withoutDocs({
|
|
meta: {
|
|
type: 'problem',
|
|
docs: {
|
|
description:
|
|
'Calls to `JSON.parse(JSON.stringify(arg))` must be replaced with `deepCopy(arg)` from `n8n-workflow`.',
|
|
},
|
|
schema: [],
|
|
messages: {
|
|
noJsonParseJsonStringify: 'Replace with `deepCopy({{ argText }})`',
|
|
},
|
|
fixable: 'code',
|
|
},
|
|
defaultOptions: [],
|
|
create(context) {
|
|
return {
|
|
CallExpression(node) {
|
|
if (isJsonParseCall(node) && isJsonStringifyCall(node)) {
|
|
const [callExpression] = node.arguments;
|
|
|
|
if (callExpression.type !== TSESTree.AST_NODE_TYPES.CallExpression) {
|
|
return;
|
|
}
|
|
|
|
const { arguments: args } = callExpression;
|
|
|
|
if (!Array.isArray(args) || args.length !== 1) return;
|
|
|
|
const [arg] = args;
|
|
|
|
if (!arg) return;
|
|
|
|
const argText = context.sourceCode.getText(arg);
|
|
|
|
context.report({
|
|
messageId: 'noJsonParseJsonStringify',
|
|
node,
|
|
data: { argText },
|
|
fix: (fixer) => fixer.replaceText(node, `deepCopy(${argText})`),
|
|
});
|
|
}
|
|
},
|
|
};
|
|
},
|
|
});
|