Files
SpacetimeDB/eslint.config.js
Noa cc73953787 Typescript views (#3584)
# Description of Changes

Currently need changes from both #3548 and #3527, and the latter is
merged into master but the former isn't rebased on top of it. so we stay
silly for the moment

I'd like to pull out my first commit into its own PR, but that's not
really possible until #3548 rebases onto master.

# Expected complexity level and risk

2 - pretty straightforward translation of the wasm/Rust view
implementation to typescript.

# Testing

- [ ] <!-- maybe a test you want to do -->
- [ ] <!-- maybe a test you want a reviewer to do, so they can check it
off when they're satisfied. -->
2025-11-07 21:10:43 +00:00

82 lines
2.7 KiB
JavaScript

import js from '@eslint/js';
import globals from 'globals';
import tseslint from 'typescript-eslint';
import reactHooks from 'eslint-plugin-react-hooks';
import reactRefresh from 'eslint-plugin-react-refresh';
import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
const __dirname = dirname(fileURLToPath(import.meta.url));
export default tseslint.config(
{
ignores: ['**/dist/**', '**/build/**', '**/coverage/**'],
},
js.configs.recommended,
{
files: ['**/*.{js,cjs,mjs}'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: globals.node,
parserOptions: {
project: false,
tsconfigRootDir: __dirname,
},
},
},
...tseslint.configs.recommended,
{
files: ['**/*.{ts,tsx}'],
languageOptions: {
parser: tseslint.parser,
ecmaVersion: 'latest',
sourceType: 'module',
globals: { ...globals.browser, ...globals.node },
parserOptions: {
project: [
'./tsconfig.json',
'./crates/bindings-typescript/tsconfig.json',
'./crates/bindings-typescript/test-app/tsconfig.json',
'./crates/bindings-typescript/examples/basic-react/tsconfig.json',
'./crates/bindings-typescript/examples/empty/tsconfig.json',
'./crates/bindings-typescript/examples/quickstart-chat/tsconfig.json',
'./docs/tsconfig.json',
],
projectService: true,
tsconfigRootDir: __dirname,
},
},
linterOptions: {
reportUnusedDisableDirectives: "off",
},
plugins: {
'@typescript-eslint': tseslint.plugin,
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-namespace': 'error',
"@typescript-eslint/no-unused-vars": [
"error",
{
"argsIgnorePattern": "^_",
"varsIgnorePattern": "^_",
"destructuredArrayIgnorePattern": "^_",
"caughtErrorsIgnorePattern": "^_"
}
],
'no-restricted-syntax': [
'error',
{ selector: 'TSEnumDeclaration', message: 'Do not use enums; stick to JS-compatible types.' },
{ selector: 'TSEnumDeclaration[const=true]', message: 'Do not use const enum; use unions or objects.' },
{ selector: 'Decorator', message: 'Do not use decorators.' },
],
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
"eslint-comments/no-unused-disable": "off",
"@typescript-eslint/no-empty-object-type": ['error', { allowObjectTypes: 'always' }],
},
}
);