Skip to content

Commit a168371

Browse files
authored
Merge pull request #62 from mizdra/update-project-config
Update project config
2 parents 8152c37 + 5e14634 commit a168371

19 files changed

+1098
-1144
lines changed

.eslintignore

-1
This file was deleted.

.eslintrc.cjs

-31
This file was deleted.

.vscode/extensions.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
"recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "ZixuanChen.vitest-explorer"]
2+
"recommendations": ["esbenp.prettier-vscode", "dbaeumer.vscode-eslint", "vitest.explorer"]
33
}

docs/api/inline-fixture-files.createiff.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Create fixtures in the specified directory.
99
**Signature:**
1010

1111
```typescript
12-
export type CreateIFF = <const T extends Directory, U extends Directory = {}>(directory: T, options?: CreateIFFOptions | undefined, __INTERNAL__prevIFF?: CreateIFFResult<U>) => Promise<CreateIFFResult<MergeDirectory<U, T>>>;
12+
export type CreateIFF = <const T extends Directory, U extends Directory = {}>(directory: T, options?: CreateIFFOptions, __INTERNAL__prevIFF?: CreateIFFResult<U>) => Promise<CreateIFFResult<MergeDirectory<U, T>>>;
1313
```
1414
**References:** [Directory](./inline-fixture-files.directory.md)<!-- -->, [CreateIFFOptions](./inline-fixture-files.createiffoptions.md)<!-- -->, [CreateIFFResult](./inline-fixture-files.createiffresult.md)
1515

docs/api/inline-fixture-files.createiffresult.fork.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ Change the root directory and take over the fixture you created.
99
**Signature:**
1010

1111
```typescript
12-
fork<const U extends Directory>(additionalDirectory: U, forkOptions?: ForkOptions | undefined): Promise<CreateIFFResult<MergeDirectory<T, U>>>;
12+
fork<const U extends Directory>(additionalDirectory: U, forkOptions?: ForkOptions): Promise<CreateIFFResult<MergeDirectory<T, U>>>;
1313
```
1414
1515
## Parameters
1616
1717
| Parameter | Type | Description |
1818
| --- | --- | --- |
1919
| additionalDirectory | U | The definition of fixtures to be added. |
20-
| forkOptions | [ForkOptions](./inline-fixture-files.forkoptions.md) \| undefined | _(Optional)_ The fork options. |
20+
| forkOptions | [ForkOptions](./inline-fixture-files.forkoptions.md) | _(Optional)_ The fork options. |
2121
2222
**Returns:**
2323

eslint.config.js

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import mizdra from '@mizdra/eslint-config-mizdra';
2+
import tsdoc from 'eslint-plugin-tsdoc';
3+
4+
/** @type {import('eslint').Linter.Config[]} */
5+
export default [
6+
{ ignores: ['**/dist'] },
7+
{ plugins: { tsdoc } },
8+
...mizdra.baseConfigs,
9+
...mizdra.typescriptConfigs,
10+
...mizdra.nodeConfigs,
11+
{
12+
files: ['**/*.{ts,tsx,cts,mts}', '**/*.{js,jsx,cjs,mjs}'],
13+
rules: {
14+
'simple-import-sort/imports': ['error', { groups: [['^\\u0000', '^node:', '^@?\\w', '^', '^\\.']] }],
15+
'n/no-unsupported-features/es-syntax': 'off', // temporary
16+
'n/no-unsupported-features/node-builtins': 'off', // temporary
17+
},
18+
},
19+
{
20+
files: ['**/*.{ts,tsx,cts,mts}'],
21+
rules: {
22+
'tsdoc/syntax': 'error',
23+
// In tsdoc, if you define a method type in a property style, it will not be determined as a method.
24+
// Therefore, it forces methods to be defined in method shorthand syntax.
25+
'@typescript-eslint/method-signature-style': ['error', 'method'],
26+
// In tsdoc, properties of a type defined with `interface` are included in the document,
27+
// whereas those defined with `type` are omitted from the document.
28+
// So we force types to be defined with `interface` whenever possible.
29+
'@typescript-eslint/consistent-type-definitions': ['error', 'interface'],
30+
},
31+
},
32+
mizdra.prettierConfig,
33+
];

example/01-basic.test.ts

+19-10
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import { rm } from 'node:fs/promises';
33
import { tmpdir } from 'node:os';
44
import { join } from 'node:path';
55
import dedent from 'dedent';
6-
import { ESLint } from 'eslint';
6+
import { loadESLint } from 'eslint';
77
import { expect, test } from 'vitest';
88
import { defineIFFCreator } from '../src/index.js';
99

10-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
10+
const LegacyESLint = await loadESLint({ useFlatConfig: false });
11+
1112
const fixtureDir = join(tmpdir(), 'your-app-name', process.env['VITEST_POOL_ID']!);
1213
const createIFF = defineIFFCreator({ generateRootDir: () => join(fixtureDir, randomUUID()) });
1314

@@ -26,13 +27,21 @@ test('eslint reports lint errors', async () => {
2627
// 'src/semi.js': dedent`...`,
2728
});
2829

29-
const eslint = new ESLint({ cwd: iff.rootDir, useEslintrc: true });
30+
const eslint = new LegacyESLint({ cwd: iff.rootDir, useEslintrc: true });
3031
const results = await eslint.lintFiles([iff.paths['src/semi.js']]);
31-
const formatter = await eslint.loadFormatter('unix');
32-
const resultText = formatter.format(results);
33-
expect(resultText).toStrictEqual(dedent`
34-
${iff.paths['src/semi.js']}:2:25: Missing semicolon. [Error/semi]
35-
36-
1 problem
37-
`);
32+
const formatter = await eslint.loadFormatter('json');
33+
const resultText = await formatter.format(results);
34+
expect(JSON.parse(resultText)).toStrictEqual([
35+
expect.objectContaining({
36+
filePath: iff.paths['src/semi.js'],
37+
messages: [
38+
expect.objectContaining({
39+
ruleId: 'semi',
40+
message: 'Missing semicolon.',
41+
line: 2,
42+
column: 25,
43+
}),
44+
],
45+
}),
46+
]);
3847
});

example/02-share-fixtures-with-test-cases.test.ts

+21-12
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ import { readFile, rm } from 'node:fs/promises';
33
import { tmpdir } from 'node:os';
44
import { join } from 'node:path';
55
import dedent from 'dedent';
6-
import { ESLint } from 'eslint';
6+
import { loadESLint } from 'eslint';
77
import { describe, expect, it } from 'vitest';
88
import { defineIFFCreator } from '../src/index.js';
99

10-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
10+
const LegacyESLint = await loadESLint({ useFlatConfig: false });
11+
1112
const fixtureDir = join(tmpdir(), 'your-app-name', process.env['VITEST_POOL_ID']!);
1213
const createIFF = defineIFFCreator({ generateRootDir: () => join(fixtureDir, randomUUID()) });
1314

@@ -28,15 +29,23 @@ describe('eslint', async () => {
2829
`,
2930
},
3031
});
31-
const eslint = new ESLint({ cwd: iff.rootDir, useEslintrc: true });
32+
const eslint = new LegacyESLint({ cwd: iff.rootDir, useEslintrc: true });
3233
const results = await eslint.lintFiles([iff.paths['src/semi.js']]);
33-
const formatter = await eslint.loadFormatter('unix');
34-
const resultText = formatter.format(results);
35-
expect(resultText).toStrictEqual(dedent`
36-
${iff.paths['src/semi.js']}:2:25: Missing semicolon. [Error/semi]
37-
38-
1 problem
39-
`);
34+
const formatter = await eslint.loadFormatter('json');
35+
const resultText = await formatter.format(results);
36+
expect(JSON.parse(resultText)).toStrictEqual([
37+
expect.objectContaining({
38+
filePath: iff.paths['src/semi.js'],
39+
messages: [
40+
expect.objectContaining({
41+
ruleId: 'semi',
42+
message: 'Missing semicolon.',
43+
line: 2,
44+
column: 25,
45+
}),
46+
],
47+
}),
48+
]);
4049
});
4150
it('fix lint errors', async () => {
4251
const iff = await baseIFF.fork({
@@ -46,11 +55,11 @@ describe('eslint', async () => {
4655
`,
4756
},
4857
});
49-
const eslint = new ESLint({ cwd: iff.rootDir, useEslintrc: true, fix: true });
58+
const eslint = new LegacyESLint({ cwd: iff.rootDir, useEslintrc: true, fix: true });
5059
const results = await eslint.lintFiles([iff.paths['src/semi.js']]);
5160

5261
expect(await readFile(iff.paths['src/semi.js'], 'utf8')).toMatchInlineSnapshot('"var withoutSemicolon = 2"');
53-
await ESLint.outputFixes(results);
62+
await LegacyESLint.outputFixes(results);
5463
expect(await readFile(iff.paths['src/semi.js'], 'utf8')).toMatchInlineSnapshot('"var withoutSemicolon = 2;"');
5564
});
5665
});

0 commit comments

Comments
 (0)