-
Notifications
You must be signed in to change notification settings - Fork 100
/
Copy patheslint.config.mjs
109 lines (104 loc) · 2.96 KB
/
eslint.config.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import { readFileSync } from 'fs';
import { dirname, join, relative } from 'path';
import { includeIgnoreFile } from '@eslint/compat';
import eslintConfigSeek from 'eslint-config-seek';
import fastGlob from 'fast-glob';
import { load as loadYaml } from 'js-yaml';
const { isDynamicPattern, globSync } = fastGlob; // eslint-disable-line import-x/no-named-as-default-member -- commonjs module, will move to built in with node 22.
/**
* Ignore linting for all files that are gitignored across all workspaces.
*/
const rootDir = dirname(import.meta.filename);
const { packages: workspaces } = loadYaml(
readFileSync(join(rootDir, 'pnpm-workspace.yaml'), 'utf8'),
);
const gitIgnoresFromWorkspaces = workspaces
// Resolve workspace directories
.reduce((acc, workspace) => {
const pathFromRoot = join(rootDir, workspace);
const resolvedWorkspaceDirectories = isDynamicPattern(pathFromRoot)
? globSync(pathFromRoot, {
onlyDirectories: true,
})
: [pathFromRoot];
return [...acc, ...resolvedWorkspaceDirectories];
}, [])
// Resolve ignore paths from workspace gitignores and make paths root relative
.map((workspacePath) => {
try {
const { ignores } = includeIgnoreFile(join(workspacePath, '.gitignore'));
return {
ignores: ignores.map((ignorePath) =>
join(relative(rootDir, workspacePath), ignorePath),
),
};
} catch (e) {
if (e.code !== 'ENOENT') {
throw e;
}
}
})
// Filter out workspaces that didn't have a gitignore file
.filter(Boolean);
export default [
...gitIgnoresFromWorkspaces,
...eslintConfigSeek,
{
rules: {
'import-x/no-cycle': 'warn',
'import-x/no-relative-packages': 'error',
'import-x/order': [
'error',
{
'newlines-between': 'always',
alphabetize: { order: 'asc' },
groups: [
'builtin',
'external',
'internal',
'parent',
'sibling',
'index',
],
pathGroups: [
{
pattern: '*.css',
group: 'index',
position: 'after',
patternOptions: { matchBase: true },
},
],
},
],
},
},
// Prevent importing via project paths, with exception for site-related files
{
files: ['**/*.{js,ts,tsx}'],
ignores: [
'packages/braid-design-system/**/*.{docs,gallery,screenshots,stories}.tsx',
'site/**/*.{ts,tsx}',
],
rules: {
'no-restricted-imports': [
'error',
{
patterns: ['braid-src/**', 'site/**', '**/site/**'],
},
],
},
},
// Lint non-project ts files, e.g. jest and storybook config
{
languageOptions: {
parserOptions: {
projectService: {
allowDefaultProject: [
'jest/setupTests.ts',
'packages/braid-design-system/.storybook/*.ts',
],
},
},
},
},
];