@checkdigit/eslint-plugin 6.5.0 → 6.6.0-PR.75-a2cc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-cjs/index.cjs +236 -91
- package/dist-cjs/metafile.json +36 -6
- package/dist-mjs/index.mjs +8 -4
- package/dist-mjs/no-fixture.mjs +231 -0
- package/dist-types/index.d.ts +3 -0
- package/dist-types/no-fixture.d.ts +4 -0
- package/package.json +1 -85
- package/src/index.ts +4 -0
- package/src/no-fixture.ts +313 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
// src/no-fixture.ts
|
|
2
|
+
import { strict as assert } from "node:assert";
|
|
3
|
+
import getDocumentationUrl from "./get-documentation-url.mjs";
|
|
4
|
+
var ruleId = "no-fixture";
|
|
5
|
+
function getParent(node) {
|
|
6
|
+
return node.parent;
|
|
7
|
+
}
|
|
8
|
+
function analyze(call, results) {
|
|
9
|
+
const parent = getParent(call);
|
|
10
|
+
assert.ok(parent, "parent should exist for fixture/supertest call node");
|
|
11
|
+
let nextCall;
|
|
12
|
+
if (parent.type === "AwaitExpression") {
|
|
13
|
+
results.root = parent;
|
|
14
|
+
} else if (parent.type === "MemberExpression" && parent.property.type === "Identifier") {
|
|
15
|
+
if (parent.property.name === "expect") {
|
|
16
|
+
const assertionCall = getParent(parent);
|
|
17
|
+
assert.ok(assertionCall && assertionCall.type === "CallExpression");
|
|
18
|
+
results.assertions = [...results.assertions ?? [], assertionCall.arguments];
|
|
19
|
+
nextCall = assertionCall;
|
|
20
|
+
} else if (parent.property.name === "send") {
|
|
21
|
+
const sendRequestBodyCall = getParent(parent);
|
|
22
|
+
assert.ok(sendRequestBodyCall && sendRequestBodyCall.type === "CallExpression");
|
|
23
|
+
results.requestBody = sendRequestBodyCall.arguments[0];
|
|
24
|
+
nextCall = sendRequestBodyCall;
|
|
25
|
+
} else if (parent.property.name === "set") {
|
|
26
|
+
const setRequestHeaderCall = getParent(parent);
|
|
27
|
+
assert.ok(setRequestHeaderCall && setRequestHeaderCall.type === "CallExpression");
|
|
28
|
+
const [name, value] = setRequestHeaderCall.arguments;
|
|
29
|
+
results.requestHeaders = [...results.requestHeaders ?? [], { name, value }];
|
|
30
|
+
nextCall = setRequestHeaderCall;
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
throw new Error(`Unexpected expression in fixture/supertest call ${String(parent)}`);
|
|
34
|
+
}
|
|
35
|
+
if (nextCall) {
|
|
36
|
+
analyze(nextCall, results);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function replaceEndpointUrlPrefixWithBasePath(url) {
|
|
40
|
+
return url.replace(/`\/\w+(?<parts>-\w+)*\/v\d+\//u, "`${BASE_PATH}/");
|
|
41
|
+
}
|
|
42
|
+
function isValidPropertyName(name) {
|
|
43
|
+
return typeof name === "string" && /^[a-zA-Z_$][a-zA-Z_$0-9]*$/u.test(name);
|
|
44
|
+
}
|
|
45
|
+
function appendAssertions(expects, sourceCode, variableName) {
|
|
46
|
+
const assertions = [];
|
|
47
|
+
for (const expectArguments of expects) {
|
|
48
|
+
if (expectArguments.length === 1) {
|
|
49
|
+
const [assertionArgument] = expectArguments;
|
|
50
|
+
assert.ok(assertionArgument);
|
|
51
|
+
if (assertionArgument.type === "MemberExpression" && assertionArgument.object.type === "Identifier" && assertionArgument.object.name === "StatusCodes") {
|
|
52
|
+
assertions.push(`assert.equal(${variableName}.status, ${sourceCode.getText(assertionArgument)})`);
|
|
53
|
+
} else if (assertionArgument.type === "ArrowFunctionExpression") {
|
|
54
|
+
assertions.push(`assert.ok(${sourceCode.getText(assertionArgument)})`);
|
|
55
|
+
} else if (assertionArgument.type === "Identifier") {
|
|
56
|
+
assertions.push(`assert.ok(${sourceCode.getText(assertionArgument)}(${variableName}))`);
|
|
57
|
+
} else if (assertionArgument.type === "ObjectExpression") {
|
|
58
|
+
assertions.push(`assert.deepEqual(${variableName}.body, ${sourceCode.getText(assertionArgument)})`);
|
|
59
|
+
} else {
|
|
60
|
+
throw new Error(`Unexpected assertion argument: ${sourceCode.getText(assertionArgument)}`);
|
|
61
|
+
}
|
|
62
|
+
} else if (expectArguments.length === 2) {
|
|
63
|
+
const [headerName, headerValue] = expectArguments;
|
|
64
|
+
assert.ok(headerName && headerValue);
|
|
65
|
+
if (headerValue.type === "Literal" && headerValue.value instanceof RegExp) {
|
|
66
|
+
assertions.push(
|
|
67
|
+
`assert.ok(${variableName}.headers.get(${sourceCode.getText(headerName)}).match(${sourceCode.getText(headerValue)}))`
|
|
68
|
+
);
|
|
69
|
+
} else {
|
|
70
|
+
assertions.push(
|
|
71
|
+
`assert.equal(${variableName}.headers.get(${sourceCode.getText(headerName)}), ${sourceCode.getText(headerValue)})`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return assertions;
|
|
77
|
+
}
|
|
78
|
+
function getAncestor(node, matchType, quitType) {
|
|
79
|
+
const parent = getParent(node);
|
|
80
|
+
if (!parent || parent.type === quitType) {
|
|
81
|
+
return void 0;
|
|
82
|
+
} else if (parent.type === matchType) {
|
|
83
|
+
return parent;
|
|
84
|
+
}
|
|
85
|
+
return getAncestor(parent, matchType, quitType);
|
|
86
|
+
}
|
|
87
|
+
function analyzeReferences(fixtureCallAwait, scopeManager) {
|
|
88
|
+
const results = {
|
|
89
|
+
responseBodyReferences: [],
|
|
90
|
+
responseHeadersReferences: []
|
|
91
|
+
};
|
|
92
|
+
const variableDeclaration = getAncestor(fixtureCallAwait, "VariableDeclaration", "FunctionDeclaration");
|
|
93
|
+
if (variableDeclaration && variableDeclaration.type === "VariableDeclaration") {
|
|
94
|
+
const [responseVariable] = scopeManager.getDeclaredVariables(variableDeclaration);
|
|
95
|
+
assert.ok(responseVariable);
|
|
96
|
+
results.responseVariableName = responseVariable.name;
|
|
97
|
+
results.responseBodyReferences = responseVariable.references.map((responseBodyReference) => getParent(responseBodyReference.identifier)).filter(
|
|
98
|
+
(node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && node.property.name === "body"
|
|
99
|
+
);
|
|
100
|
+
results.responseHeadersReferences = responseVariable.references.map((responseHeadersReference) => getParent(responseHeadersReference.identifier)).filter(
|
|
101
|
+
(node) => node !== null && node !== void 0 && node.type === "MemberExpression" && node.property.type === "Identifier" && (node.property.name === "header" || node.property.name === "headers")
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return results;
|
|
105
|
+
}
|
|
106
|
+
function getIndentation(node, sourceCode) {
|
|
107
|
+
assert.ok(node.loc);
|
|
108
|
+
const line = sourceCode.lines[node.loc.start.line - 1];
|
|
109
|
+
assert.ok(line);
|
|
110
|
+
const indentMatch = line.match(/^\s*/u);
|
|
111
|
+
return indentMatch ? indentMatch[0] : "";
|
|
112
|
+
}
|
|
113
|
+
var rule = {
|
|
114
|
+
meta: {
|
|
115
|
+
type: "suggestion",
|
|
116
|
+
docs: {
|
|
117
|
+
description: "Prefer native fetch API over customized fixture API.",
|
|
118
|
+
url: getDocumentationUrl(ruleId)
|
|
119
|
+
},
|
|
120
|
+
messages: {
|
|
121
|
+
preferNativeFetch: "Prefer native fetch API over customized fixture API.",
|
|
122
|
+
unknownError: "Unknown error occurred: {{ error }}. Please manually convert the fixture API call to fetch API call."
|
|
123
|
+
},
|
|
124
|
+
fixable: "code",
|
|
125
|
+
schema: []
|
|
126
|
+
},
|
|
127
|
+
create(context) {
|
|
128
|
+
const sourceCode = context.sourceCode;
|
|
129
|
+
const scopeManager = sourceCode.scopeManager;
|
|
130
|
+
let variableCounter = 0;
|
|
131
|
+
return {
|
|
132
|
+
'CallExpression[callee.object.object.name="fixture"][callee.object.property.name="api"]': (fixtureCall) => {
|
|
133
|
+
try {
|
|
134
|
+
assert.ok(fixtureCall.type === "CallExpression");
|
|
135
|
+
const fixtureFunction = fixtureCall.callee;
|
|
136
|
+
assert.ok(fixtureFunction.type === "MemberExpression");
|
|
137
|
+
const methodNode = fixtureFunction.property;
|
|
138
|
+
assert.ok(methodNode.type === "Identifier");
|
|
139
|
+
const indentation = getIndentation(fixtureCall, sourceCode);
|
|
140
|
+
const [urlArgumentNode] = fixtureCall.arguments;
|
|
141
|
+
assert.ok(urlArgumentNode !== void 0);
|
|
142
|
+
const fixtureCallInformation = {};
|
|
143
|
+
analyze(fixtureCall, fixtureCallInformation);
|
|
144
|
+
const { responseVariableName, responseBodyReferences, responseHeadersReferences } = analyzeReferences(
|
|
145
|
+
fixtureCallInformation.root,
|
|
146
|
+
scopeManager
|
|
147
|
+
);
|
|
148
|
+
let variableNameToUse;
|
|
149
|
+
let isResponseVariableDeclared = false;
|
|
150
|
+
if (responseVariableName === void 0) {
|
|
151
|
+
variableNameToUse = `response${variableCounter === 0 ? "" : variableCounter.toString()}`;
|
|
152
|
+
variableCounter++;
|
|
153
|
+
} else {
|
|
154
|
+
isResponseVariableDeclared = true;
|
|
155
|
+
variableNameToUse = responseVariableName;
|
|
156
|
+
}
|
|
157
|
+
const fixtureApiCallText = sourceCode.getText(fixtureCall);
|
|
158
|
+
const fixtureMethodText = sourceCode.getText(fixtureFunction);
|
|
159
|
+
let replacedText = fixtureApiCallText.replace(fixtureMethodText, "await fetch");
|
|
160
|
+
const fixtureArgumentText = sourceCode.getText(urlArgumentNode);
|
|
161
|
+
let fetchArgumentText = replaceEndpointUrlPrefixWithBasePath(fixtureArgumentText);
|
|
162
|
+
if (methodNode.name !== "get" || fixtureCallInformation.requestBody !== void 0 || fixtureCallInformation.requestHeaders !== void 0) {
|
|
163
|
+
fetchArgumentText += [
|
|
164
|
+
", {",
|
|
165
|
+
` method: '${methodNode.name.toUpperCase()}',`,
|
|
166
|
+
...fixtureCallInformation.requestBody ? [` body: JSON.stringify(${sourceCode.getText(fixtureCallInformation.requestBody)}),`] : [],
|
|
167
|
+
...fixtureCallInformation.requestHeaders ? [
|
|
168
|
+
` headers: {`,
|
|
169
|
+
...fixtureCallInformation.requestHeaders.map(
|
|
170
|
+
({ name, value }) => (
|
|
171
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions, no-nested-ternary, sonarjs/no-nested-template-literals
|
|
172
|
+
` ${name.type === "Literal" ? isValidPropertyName(name.value) ? name.value : `'${name.value}'` : `[${sourceCode.getText(name)}]`}: ${sourceCode.getText(value)},`
|
|
173
|
+
)
|
|
174
|
+
),
|
|
175
|
+
` },`
|
|
176
|
+
] : [],
|
|
177
|
+
"}"
|
|
178
|
+
].join(`
|
|
179
|
+
${indentation}`);
|
|
180
|
+
}
|
|
181
|
+
replacedText = replacedText.replace(fixtureArgumentText, fetchArgumentText);
|
|
182
|
+
if (fixtureCallInformation.assertions) {
|
|
183
|
+
if (!isResponseVariableDeclared) {
|
|
184
|
+
replacedText = `const ${variableNameToUse} = ${replacedText}`;
|
|
185
|
+
}
|
|
186
|
+
replacedText = [
|
|
187
|
+
replacedText,
|
|
188
|
+
...appendAssertions(fixtureCallInformation.assertions, sourceCode, variableNameToUse)
|
|
189
|
+
].join(`;
|
|
190
|
+
${indentation}`);
|
|
191
|
+
}
|
|
192
|
+
context.report({
|
|
193
|
+
node: fixtureCall,
|
|
194
|
+
messageId: "preferNativeFetch",
|
|
195
|
+
*fix(fixer) {
|
|
196
|
+
yield fixer.replaceText(fixtureCallInformation.root, replacedText);
|
|
197
|
+
for (const responseBodyReference of responseBodyReferences) {
|
|
198
|
+
yield fixer.replaceText(responseBodyReference, `await ${variableNameToUse}.json()`);
|
|
199
|
+
}
|
|
200
|
+
for (const responseHeadersReference of responseHeadersReferences) {
|
|
201
|
+
const parent = getParent(responseHeadersReference);
|
|
202
|
+
assert.ok(parent?.type === "MemberExpression");
|
|
203
|
+
const headerNameNode = parent.property;
|
|
204
|
+
const headerName = (
|
|
205
|
+
// eslint-disable-next-line no-nested-ternary, @typescript-eslint/restrict-template-expressions
|
|
206
|
+
parent.computed ? sourceCode.getText(headerNameNode) : `'${sourceCode.getText(headerNameNode)}'`
|
|
207
|
+
);
|
|
208
|
+
assert.ok(headerName);
|
|
209
|
+
yield fixer.replaceText(parent, `${variableNameToUse}.headers.get(${headerName})`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
} catch (error) {
|
|
214
|
+
context.report({
|
|
215
|
+
node: fixtureCall,
|
|
216
|
+
messageId: "unknownError",
|
|
217
|
+
data: {
|
|
218
|
+
error: String(error)
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
var no_fixture_default = rule;
|
|
227
|
+
export {
|
|
228
|
+
no_fixture_default as default,
|
|
229
|
+
ruleId
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,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
|
package/dist-types/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ declare const _default: {
|
|
|
11
11
|
'object-literal-response': import("eslint").Rule.RuleModule;
|
|
12
12
|
"invalid-json-stringify": import("eslint").Rule.RuleModule;
|
|
13
13
|
"no-promise-instance-method": import("eslint").Rule.RuleModule;
|
|
14
|
+
"no-fixture": import("eslint").Rule.RuleModule;
|
|
14
15
|
};
|
|
15
16
|
configs: {
|
|
16
17
|
all: {
|
|
@@ -26,6 +27,7 @@ declare const _default: {
|
|
|
26
27
|
'@checkdigit/no-test-import': string;
|
|
27
28
|
"@checkdigit/invalid-json-stringify": string;
|
|
28
29
|
"@checkdigit/no-promise-instance-method": string;
|
|
30
|
+
"@checkdigit/no-fixture": string;
|
|
29
31
|
};
|
|
30
32
|
};
|
|
31
33
|
recommended: {
|
|
@@ -41,6 +43,7 @@ declare const _default: {
|
|
|
41
43
|
'@checkdigit/no-test-import': string;
|
|
42
44
|
"@checkdigit/invalid-json-stringify": string;
|
|
43
45
|
"@checkdigit/no-promise-instance-method": string;
|
|
46
|
+
"@checkdigit/no-fixture": string;
|
|
44
47
|
};
|
|
45
48
|
};
|
|
46
49
|
};
|
package/package.json
CHANGED
|
@@ -1,85 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@checkdigit/eslint-plugin",
|
|
3
|
-
"version": "6.5.0",
|
|
4
|
-
"description": "Check Digit eslint plugins",
|
|
5
|
-
"keywords": [
|
|
6
|
-
"eslint",
|
|
7
|
-
"eslintplugin"
|
|
8
|
-
],
|
|
9
|
-
"homepage": "https://github.com/checkdigit/eslint-plugin#readme",
|
|
10
|
-
"bugs": {
|
|
11
|
-
"url": "https://github.com/checkdigit/eslint-plugin/issues"
|
|
12
|
-
},
|
|
13
|
-
"repository": {
|
|
14
|
-
"type": "git",
|
|
15
|
-
"url": "https://github.com/checkdigit/eslint-plugin"
|
|
16
|
-
},
|
|
17
|
-
"license": "MIT",
|
|
18
|
-
"author": "Check Digit, LLC",
|
|
19
|
-
"sideEffects": false,
|
|
20
|
-
"type": "module",
|
|
21
|
-
"exports": {
|
|
22
|
-
".": {
|
|
23
|
-
"types": "./dist-types/index.d.ts",
|
|
24
|
-
"require": "./dist-cjs/index.cjs",
|
|
25
|
-
"import": "./dist-mjs/index.mjs",
|
|
26
|
-
"default": "./dist-mjs/index.mjs"
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
"files": [
|
|
30
|
-
"src",
|
|
31
|
-
"dist-types",
|
|
32
|
-
"dist-cjs",
|
|
33
|
-
"dist-mjs",
|
|
34
|
-
"!src/**/*.test.ts",
|
|
35
|
-
"!src/**/*.spec.ts",
|
|
36
|
-
"!dist-types/**/*.test.d.ts",
|
|
37
|
-
"!dist-types/**/*.spec.d.ts",
|
|
38
|
-
"!dist-cjs/**/*.test.cjs",
|
|
39
|
-
"!dist-cjs/**/*.spec.cjs",
|
|
40
|
-
"!dist-mjs/**/*.test.mjs",
|
|
41
|
-
"!dist-mjs/**/*.spec.mjs",
|
|
42
|
-
"SECURITY.md"
|
|
43
|
-
],
|
|
44
|
-
"scripts": {
|
|
45
|
-
"build:dist-cjs": "rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs && node dist-cjs/index.cjs",
|
|
46
|
-
"build:dist-mjs": "rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs",
|
|
47
|
-
"build:dist-types": "rimraf dist-types && npx builder --type=types --outDir=dist-types",
|
|
48
|
-
"ci:compile": "tsc --noEmit",
|
|
49
|
-
"ci:coverage": "NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true",
|
|
50
|
-
"ci:lint": "npm run lint",
|
|
51
|
-
"ci:style": "npm run prettier",
|
|
52
|
-
"ci:test": "NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false",
|
|
53
|
-
"lint": "eslint --max-warnings 0 --ignore-path .gitignore .",
|
|
54
|
-
"lint:fix": "eslint --ignore-path .gitignore . --fix",
|
|
55
|
-
"prepublishOnly": "npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs",
|
|
56
|
-
"prettier": "prettier --ignore-path .gitignore --list-different .",
|
|
57
|
-
"prettier:fix": "prettier --ignore-path .gitignore --write .",
|
|
58
|
-
"test": "npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"
|
|
59
|
-
},
|
|
60
|
-
"prettier": "@checkdigit/prettier-config",
|
|
61
|
-
"jest": {
|
|
62
|
-
"preset": "@checkdigit/jest-config"
|
|
63
|
-
},
|
|
64
|
-
"devDependencies": {
|
|
65
|
-
"@checkdigit/jest-config": "^6.0.2",
|
|
66
|
-
"@checkdigit/prettier-config": "^5.5.0",
|
|
67
|
-
"@checkdigit/typescript-config": "6.0.0",
|
|
68
|
-
"@types/eslint": "^8.56.10",
|
|
69
|
-
"@typescript-eslint/eslint-plugin": "^7.16.0",
|
|
70
|
-
"@typescript-eslint/parser": "^7.16.0",
|
|
71
|
-
"eslint-config-prettier": "^9.1.0",
|
|
72
|
-
"eslint-plugin-eslint-plugin": "^6.2.0",
|
|
73
|
-
"eslint-plugin-import": "^2.29.1",
|
|
74
|
-
"eslint-plugin-no-only-tests": "^3.1.0",
|
|
75
|
-
"eslint-plugin-no-secrets": "^1.0.2",
|
|
76
|
-
"eslint-plugin-node": "^11.1.0",
|
|
77
|
-
"eslint-plugin-sonarjs": "0.24.0"
|
|
78
|
-
},
|
|
79
|
-
"peerDependencies": {
|
|
80
|
-
"eslint": ">=8 <9"
|
|
81
|
-
},
|
|
82
|
-
"engines": {
|
|
83
|
-
"node": ">=20.13"
|
|
84
|
-
}
|
|
85
|
-
}
|
|
1
|
+
{"name":"@checkdigit/eslint-plugin","version":"6.6.0-PR.75-a2cc","description":"Check Digit eslint plugins","keywords":["eslint","eslintplugin"],"homepage":"https://github.com/checkdigit/eslint-plugin#readme","bugs":{"url":"https://github.com/checkdigit/eslint-plugin/issues"},"repository":{"type":"git","url":"https://github.com/checkdigit/eslint-plugin"},"license":"MIT","author":"Check Digit, LLC","sideEffects":false,"type":"module","exports":{".":{"types":"./dist-types/index.d.ts","require":"./dist-cjs/index.cjs","import":"./dist-mjs/index.mjs","default":"./dist-mjs/index.mjs"}},"files":["src","dist-types","dist-cjs","dist-mjs","!src/**/*.test.ts","!src/**/*.spec.ts","!dist-types/**/*.test.d.ts","!dist-types/**/*.spec.d.ts","!dist-cjs/**/*.test.cjs","!dist-cjs/**/*.spec.cjs","!dist-mjs/**/*.test.mjs","!dist-mjs/**/*.spec.mjs","SECURITY.md"],"scripts":{"build:dist-cjs":"rimraf dist-cjs && npx builder --type=commonjs --sourceMap --entryPoint=index.ts --outDir=dist-cjs --outFile=index.cjs && echo \"module.exports = module.exports.default;\" >> dist-cjs/index.cjs && node dist-cjs/index.cjs","build:dist-mjs":"rimraf dist-mjs && npx builder --type=module --sourceMap --outDir=dist-mjs && node dist-mjs/index.mjs","build:dist-types":"rimraf dist-types && npx builder --type=types --outDir=dist-types","ci:compile":"tsc --noEmit","ci:coverage":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=true","ci:lint":"npm run lint","ci:style":"npm run prettier","ci:test":"NODE_OPTIONS=\"--disable-warning ExperimentalWarning --experimental-vm-modules\" jest --coverage=false","lint":"eslint --max-warnings 0 --ignore-path .gitignore .","lint:fix":"eslint --ignore-path .gitignore . --fix","prepublishOnly":"npm run build:dist-types && npm run build:dist-cjs && npm run build:dist-mjs","prettier":"prettier --ignore-path .gitignore --list-different .","prettier:fix":"prettier --ignore-path .gitignore --write .","test":"npm run ci:compile && npm run ci:test && npm run ci:lint && npm run ci:style"},"prettier":"@checkdigit/prettier-config","jest":{"preset":"@checkdigit/jest-config"},"devDependencies":{"@checkdigit/jest-config":"^6.0.2","@checkdigit/prettier-config":"^5.5.0","@checkdigit/typescript-config":"6.0.0","@types/eslint":"^8.56.10","@typescript-eslint/eslint-plugin":"^7.16.1","@typescript-eslint/parser":"^7.16.1","eslint-config-prettier":"^9.1.0","eslint-plugin-eslint-plugin":"^6.2.0","eslint-plugin-import":"^2.29.1","eslint-plugin-no-only-tests":"^3.1.0","eslint-plugin-no-secrets":"^1.0.2","eslint-plugin-node":"^11.1.0","eslint-plugin-sonarjs":"0.24.0"},"peerDependencies":{"eslint":">=8 <9"},"engines":{"node":">=20.14"}}
|
package/src/index.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import invalidJsonStringify, { ruleId as invalidJsonStringifyRuleId } from './invalid-json-stringify';
|
|
10
|
+
import noFixture, { ruleId as noFixtureRuleId } from './no-fixture';
|
|
10
11
|
import noPromiseInstanceMethod, { ruleId as noPromiseInstanceMethodRuleId } from './no-promise-instance-method';
|
|
11
12
|
import filePathComment from './file-path-comment';
|
|
12
13
|
import noCardNumbers from './no-card-numbers';
|
|
@@ -31,6 +32,7 @@ export default {
|
|
|
31
32
|
'object-literal-response': objectLiteralResponse,
|
|
32
33
|
[invalidJsonStringifyRuleId]: invalidJsonStringify,
|
|
33
34
|
[noPromiseInstanceMethodRuleId]: noPromiseInstanceMethod,
|
|
35
|
+
[noFixtureRuleId]: noFixture,
|
|
34
36
|
},
|
|
35
37
|
configs: {
|
|
36
38
|
all: {
|
|
@@ -46,6 +48,7 @@ export default {
|
|
|
46
48
|
'@checkdigit/no-test-import': 'error',
|
|
47
49
|
[`@checkdigit/${invalidJsonStringifyRuleId}`]: 'error',
|
|
48
50
|
[`@checkdigit/${noPromiseInstanceMethodRuleId}`]: 'error',
|
|
51
|
+
[`@checkdigit/${noFixtureRuleId}`]: 'error',
|
|
49
52
|
},
|
|
50
53
|
},
|
|
51
54
|
recommended: {
|
|
@@ -61,6 +64,7 @@ export default {
|
|
|
61
64
|
'@checkdigit/no-test-import': 'error',
|
|
62
65
|
[`@checkdigit/${invalidJsonStringifyRuleId}`]: 'error',
|
|
63
66
|
[`@checkdigit/${noPromiseInstanceMethodRuleId}`]: 'error',
|
|
67
|
+
[`@checkdigit/${noFixtureRuleId}`]: 'error',
|
|
64
68
|
},
|
|
65
69
|
},
|
|
66
70
|
},
|