@@ -0,0 +1,81 @@
|
||||
import js from '@eslint/js';
|
||||
import svelte from 'eslint-plugin-svelte';
|
||||
import globals from 'globals';
|
||||
import ts from 'typescript-eslint';
|
||||
|
||||
/**
|
||||
* Lint only. Formatting is deliberately not enforced here — there is no Prettier in
|
||||
* this project, so any stylistic rule would fight the existing hand-kept style.
|
||||
*
|
||||
* Type-aware linting is on (`projectService`), which is what makes
|
||||
* `no-floating-promises` able to see that an `async` handler's promise is dropped.
|
||||
*/
|
||||
export default ts.config(
|
||||
js.configs.recommended,
|
||||
...ts.configs.recommendedTypeChecked,
|
||||
...svelte.configs.recommended,
|
||||
{
|
||||
languageOptions: {
|
||||
globals: { ...globals.browser },
|
||||
parserOptions: {
|
||||
projectService: true,
|
||||
extraFileExtensions: ['.svelte'],
|
||||
tsconfigRootDir: import.meta.dirname
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
files: ['**/*.svelte', '**/*.svelte.ts'],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
parser: ts.parser
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
rules: {
|
||||
// The app ships no logging of its own; `hooks.client.ts` is the one exception
|
||||
// and opts in explicitly below.
|
||||
'no-console': 'error',
|
||||
/*
|
||||
* Off: this rule wants every href and goto() wrapped in `resolve()`, which
|
||||
* matters only for an app served under a base path. This one is served from
|
||||
* the root (see nginx.conf) and sets no `base`, so it would be 14 wrappers
|
||||
* buying nothing. Revisit if the app ever moves under a sub-path.
|
||||
*/
|
||||
'svelte/no-navigation-without-resolve': 'off',
|
||||
/*
|
||||
* The regex placeholders on the event pickers need a literal `{` in an
|
||||
* attribute, which in Svelte can only be written as a mustache.
|
||||
*/
|
||||
'svelte/no-useless-mustaches': ['error', { ignoreStringEscape: true }],
|
||||
// This is the rule that catches an `async` function used directly as an
|
||||
// event handler, where a rejection becomes an unhandled rejection.
|
||||
'@typescript-eslint/no-floating-promises': 'error',
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'error',
|
||||
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' }
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
files: ['src/hooks.client.ts'],
|
||||
rules: { 'no-console': 'off' }
|
||||
},
|
||||
{
|
||||
// This file and the Vite config are build tooling, outside the app's tsconfig
|
||||
// project, so type-aware rules cannot resolve them.
|
||||
files: ['eslint.config.js', 'vite.config.ts'],
|
||||
...ts.configs.disableTypeChecked
|
||||
},
|
||||
{
|
||||
// Generated from openapi.json by `npm run api:types`; not ours to lint.
|
||||
ignores: [
|
||||
'src/lib/api/schema.d.ts',
|
||||
'build/',
|
||||
'.svelte-kit/',
|
||||
'node_modules/',
|
||||
'static/config.js'
|
||||
]
|
||||
}
|
||||
);
|
||||
Reference in New Issue
Block a user