Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epidemian
GitHub Repository: epidemian/eslint-plugin-import
Path: blob/main/tests/src/rules/no-cycle.js
829 views
1
import { test as _test, testFilePath } from '../utils';
2
3
import { RuleTester } from 'eslint';
4
import flatMap from 'array.prototype.flatmap';
5
6
const ruleTester = new RuleTester();
7
const rule = require('rules/no-cycle');
8
9
const error = message => ({ message });
10
11
const test = def => _test(Object.assign(def, {
12
filename: testFilePath('./cycles/depth-zero.js'),
13
}));
14
15
const testDialects = ['es6'];
16
17
ruleTester.run('no-cycle', rule, {
18
valid: [].concat(
19
// this rule doesn't care if the cycle length is 0
20
test({ code: 'import foo from "./foo.js"' }),
21
22
test({ code: 'import _ from "lodash"' }),
23
test({ code: 'import foo from "@scope/foo"' }),
24
test({ code: 'var _ = require("lodash")' }),
25
test({ code: 'var find = require("lodash.find")' }),
26
test({ code: 'var foo = require("./foo")' }),
27
test({ code: 'var foo = require("../foo")' }),
28
test({ code: 'var foo = require("foo")' }),
29
test({ code: 'var foo = require("./")' }),
30
test({ code: 'var foo = require("@scope/foo")' }),
31
test({ code: 'var bar = require("./bar/index")' }),
32
test({ code: 'var bar = require("./bar")' }),
33
test({
34
code: 'var bar = require("./bar")',
35
filename: '<text>',
36
}),
37
test({
38
code: 'import { foo } from "cycles/external/depth-one"',
39
options: [{ ignoreExternal: true }],
40
settings: {
41
'import/resolver': 'webpack',
42
'import/external-module-folders': ['cycles/external'],
43
},
44
}),
45
test({
46
code: 'import { foo } from "./external-depth-two"',
47
options: [{ ignoreExternal: true }],
48
settings: {
49
'import/resolver': 'webpack',
50
'import/external-module-folders': ['cycles/external'],
51
},
52
}),
53
54
flatMap(testDialects, (testDialect) => [
55
test({
56
code: `import { foo } from "./${testDialect}/depth-two"`,
57
options: [{ maxDepth: 1 }],
58
}),
59
test({
60
code: `import { foo, bar } from "./${testDialect}/depth-two"`,
61
options: [{ maxDepth: 1 }],
62
}),
63
test({
64
code: `import("./${testDialect}/depth-two").then(function({ foo }) {})`,
65
options: [{ maxDepth: 1 }],
66
parser: require.resolve('babel-eslint'),
67
}),
68
test({
69
code: `import type { FooType } from "./${testDialect}/depth-one"`,
70
parser: require.resolve('babel-eslint'),
71
}),
72
test({
73
code: `import type { FooType, BarType } from "./${testDialect}/depth-one"`,
74
parser: require.resolve('babel-eslint'),
75
}),
76
]),
77
78
test({
79
code: 'import { bar } from "./flow-types"',
80
parser: require.resolve('babel-eslint'),
81
}),
82
test({
83
code: 'import { bar } from "./flow-types-only-importing-type"',
84
parser: require.resolve('babel-eslint'),
85
}),
86
test({
87
code: 'import { bar } from "./flow-types-only-importing-multiple-types"',
88
parser: require.resolve('babel-eslint'),
89
}),
90
),
91
92
invalid: [].concat(
93
test({
94
code: 'import { bar } from "./flow-types-some-type-imports"',
95
parser: require.resolve('babel-eslint'),
96
errors: [error(`Dependency cycle detected.`)],
97
}),
98
test({
99
code: 'import { foo } from "cycles/external/depth-one"',
100
errors: [error(`Dependency cycle detected.`)],
101
settings: {
102
'import/resolver': 'webpack',
103
'import/external-module-folders': ['cycles/external'],
104
},
105
}),
106
test({
107
code: 'import { foo } from "./external-depth-two"',
108
errors: [error(`Dependency cycle via cycles/external/depth-one:1`)],
109
settings: {
110
'import/resolver': 'webpack',
111
'import/external-module-folders': ['cycles/external'],
112
},
113
}),
114
115
flatMap(testDialects, (testDialect) => [
116
test({
117
code: `import { foo } from "./${testDialect}/depth-one"`,
118
errors: [error(`Dependency cycle detected.`)],
119
}),
120
test({
121
code: `import { foo } from "./${testDialect}/depth-one"`,
122
options: [{ maxDepth: 1 }],
123
errors: [error(`Dependency cycle detected.`)],
124
}),
125
test({
126
code: `const { foo } = require("./${testDialect}/depth-one")`,
127
errors: [error(`Dependency cycle detected.`)],
128
options: [{ commonjs: true }],
129
}),
130
test({
131
code: `require(["./${testDialect}/depth-one"], d1 => {})`,
132
errors: [error(`Dependency cycle detected.`)],
133
options: [{ amd: true }],
134
}),
135
test({
136
code: `define(["./${testDialect}/depth-one"], d1 => {})`,
137
errors: [error(`Dependency cycle detected.`)],
138
options: [{ amd: true }],
139
}),
140
test({
141
code: `import { foo } from "./${testDialect}/depth-two"`,
142
errors: [error(`Dependency cycle via ./depth-one:1`)],
143
}),
144
test({
145
code: `import { foo } from "./${testDialect}/depth-two"`,
146
options: [{ maxDepth: 2 }],
147
errors: [error(`Dependency cycle via ./depth-one:1`)],
148
}),
149
test({
150
code: `const { foo } = require("./${testDialect}/depth-two")`,
151
errors: [error(`Dependency cycle via ./depth-one:1`)],
152
options: [{ commonjs: true }],
153
}),
154
test({
155
code: `import { two } from "./${testDialect}/depth-three-star"`,
156
errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)],
157
}),
158
test({
159
code: `import one, { two, three } from "./${testDialect}/depth-three-star"`,
160
errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)],
161
}),
162
test({
163
code: `import { bar } from "./${testDialect}/depth-three-indirect"`,
164
errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)],
165
}),
166
test({
167
code: `import { bar } from "./${testDialect}/depth-three-indirect"`,
168
errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)],
169
parser: require.resolve('babel-eslint'),
170
}),
171
test({
172
code: `import("./${testDialect}/depth-three-star")`,
173
errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)],
174
parser: require.resolve('babel-eslint'),
175
}),
176
test({
177
code: `import("./${testDialect}/depth-three-indirect")`,
178
errors: [error(`Dependency cycle via ./depth-two:1=>./depth-one:1`)],
179
parser: require.resolve('babel-eslint'),
180
}),
181
test({
182
code: `import { foo } from "./${testDialect}/depth-two"`,
183
options: [{ maxDepth: Infinity }],
184
errors: [error(`Dependency cycle via ./depth-one:1`)],
185
}),
186
test({
187
code: `import { foo } from "./${testDialect}/depth-two"`,
188
options: [{ maxDepth: '∞' }],
189
errors: [error(`Dependency cycle via ./depth-one:1`)],
190
}),
191
]),
192
193
test({
194
code: 'import { bar } from "./flow-types-depth-one"',
195
parser: require.resolve('babel-eslint'),
196
errors: [error(`Dependency cycle via ./flow-types-depth-two:4=>./es6/depth-one:1`)],
197
}),
198
),
199
});
200
201