diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..867235dd --- /dev/null +++ b/.eslintrc @@ -0,0 +1,103 @@ +{ + "root": true, + "reportUnusedDisableDirectives": true, + "ignorePatterns": ["**/build", "**/dist"], + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "import"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:@typescript-eslint/stylistic", + "plugin:import/recommended", + "plugin:import/typescript", + "prettier", + ], + "env": { + "browser": true, + "es2020": true, + }, + "parserOptions": { + "tsconfigRootDir": ".", + "project": true, + "sourceType": "module", + "ecmaVersion": 2020, + }, + "settings": { + "import/parsers": { + "@typescript-eslint/parser": [".ts", ".tsx"], + }, + "import/resolver": { + "typescript": true, + }, + "react": { + "version": "detect", + }, + }, + "rules": { + "@typescript-eslint/array-type": "error", + "@typescript-eslint/ban-types": "error", + "@typescript-eslint/ban-ts-comment": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/consistent-type-imports": [ + "error", + { "prefer": "type-imports" }, + ], + "@typescript-eslint/explicit-module-boundary-types": "error", + "@typescript-eslint/method-signature-style": ["error", "property"], + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "typeParameter", + "format": ["PascalCase"], + "leadingUnderscore": "forbid", + "trailingUnderscore": "forbid", + "custom": { + "regex": "^(T|T[A-Z][A-Za-z]+)$", + "match": true, + }, + }, + ], + "@typescript-eslint/no-empty-function": "error", + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-explicit-any": "error", + "@typescript-eslint/no-non-null-assertion": "error", + "@typescript-eslint/no-unnecessary-condition": "error", + "@typescript-eslint/no-unnecessary-type-assertion": "error", + "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/explicit-function-return-type": "error", + "@typescript-eslint/no-inferrable-types": [ + "error", + { "ignoreParameters": true }, + ], + "import/default": "error", + "import/export": "error", + "import/namespace": "error", + "import/newline-after-import": "error", + "import/no-cycle": "error", + "import/no-duplicates": "off", + "import/no-named-as-default-member": "error", + "import/no-unused-modules": "error", + "import/order": [ + "error", + { + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling", + "index", + "object", + "type", + ], + }, + ], + "no-case-declarations": "error", + "no-empty": "error", + "no-prototype-builtins": "error", + "no-redeclare": "error", + "no-shadow": "error", + "no-undef": "error", + "sort-imports": "error", + }, +} diff --git a/eslintrc.cjs b/eslintrc.cjs deleted file mode 100644 index 54629a03..00000000 --- a/eslintrc.cjs +++ /dev/null @@ -1,108 +0,0 @@ -// @ts-check - -/** @type {import('eslint').Linter.Config} */ -const config = { - root: true, - reportUnusedDisableDirectives: true, - ignorePatterns: ['**/build', '**/dist'], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'import'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/stylistic', - 'plugin:import/recommended', - 'plugin:import/typescript', - 'prettier', - ], - env: { - browser: true, - es2020: true, - }, - parserOptions: { - tsconfigRootDir: __dirname, - project: true, - sourceType: 'module', - ecmaVersion: 2020, - }, - settings: { - 'import/parsers': { - '@typescript-eslint/parser': ['.ts', '.tsx'], - }, - 'import/resolver': { - typescript: true, - }, - react: { - version: 'detect', - }, - }, - rules: { - '@typescript-eslint/array-type': 'error', - '@typescript-eslint/ban-types': 'error', - '@typescript-eslint/ban-ts-comment': 'error', - '@typescript-eslint/consistent-type-definitions': 'error', - '@typescript-eslint/consistent-type-imports': [ - 'error', - { prefer: 'type-imports' }, - ], - '@typescript-eslint/explicit-module-boundary-types': 'error', - '@typescript-eslint/method-signature-style': ['error', 'property'], - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: 'typeParameter', - format: ['PascalCase'], - leadingUnderscore: 'forbid', - trailingUnderscore: 'forbid', - custom: { - regex: '^(T|T[A-Z][A-Za-z]+)$', - match: true, - }, - }, - ], - '@typescript-eslint/no-empty-function': 'error', - '@typescript-eslint/no-empty-interface': 'error', - '@typescript-eslint/no-explicit-any': 'error', - '@typescript-eslint/no-non-null-assertion': 'error', - '@typescript-eslint/no-unnecessary-condition': 'error', - '@typescript-eslint/no-unnecessary-type-assertion': 'error', - '@typescript-eslint/no-unused-vars': 'error', - '@typescript-eslint/explicit-function-return-type': 'error', - '@typescript-eslint/no-inferrable-types': [ - 'error', - { ignoreParameters: true }, - ], - 'import/default': 'error', - 'import/export': 'error', - 'import/namespace': 'error', - 'import/newline-after-import': 'error', - 'import/no-cycle': 'error', - 'import/no-duplicates': 'off', - 'import/no-named-as-default-member': 'error', - 'import/no-unused-modules': 'error', - 'import/order': [ - 'error', - { - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - 'sibling', - 'index', - 'object', - 'type', - ], - }, - ], - 'no-case-declarations': 'error', - 'no-empty': 'error', - 'no-prototype-builtins': 'error', - 'no-redeclare': 'error', - 'no-shadow': 'error', - 'no-undef': 'error', - 'sort-imports': 'error', - }, -} - -module.exports = config diff --git a/package.json b/package.json index 0fe5ce00..d98129d9 100644 --- a/package.json +++ b/package.json @@ -13,14 +13,15 @@ "license": "MIT", "devDependencies": { "@types/node": "^20.12.7", - "@typescript-eslint/eslint-plugin": "^6.20.0", - "@typescript-eslint/parser": "^6.20.0", + "@typescript-eslint/eslint-plugin": "^7.7.1", + "@typescript-eslint/parser": "^7.7.1", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", - "prettier": "^3.2.4" + "prettier": "^3.2.4", + "typescript": "^5.4.5" } } diff --git a/packages/vite-fs-router/package.json b/packages/vite-fs-router/package.json index ea825689..67d714bf 100644 --- a/packages/vite-fs-router/package.json +++ b/packages/vite-fs-router/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "vite dev", "build": "vite build", - "lint": "eslint --ext .ts,.tsx ./src -c ../../eslintrc.cjs", + "lint": "eslint --ext .ts,.tsx ./src -c ../../.eslintrc", "format": "prettier --ignore-unknown '**/*'", "types": "tsc --noEmit" }, diff --git a/packages/vite-fs-router/src/compiler.ts b/packages/vite-fs-router/src/compiler.ts index cf7728f8..9fbdaf93 100644 --- a/packages/vite-fs-router/src/compiler.ts +++ b/packages/vite-fs-router/src/compiler.ts @@ -1,7 +1,11 @@ -export const makeCompile = () => { +export const makeCompile = (): void => { console.log('compiling [compile fn]') } -export const splitFile = async ({}) => { - console.log('Split file [splitFile fn]') +interface SplitFileFnArgs { + code: string +} + +export const splitFile = async ({ code }: SplitFileFnArgs): Promise => { + console.log('Split file [splitFile fn]', code) } diff --git a/packages/vite-fs-router/src/index.ts b/packages/vite-fs-router/src/index.ts index 3a2243fc..b450ab79 100644 --- a/packages/vite-fs-router/src/index.ts +++ b/packages/vite-fs-router/src/index.ts @@ -1,7 +1,9 @@ -import { normalize } from 'path' import { fileURLToPath, pathToFileURL } from 'url' -import type { Plugin } from 'vite' + +import { normalize } from 'path' +// eslint-disable-next-line sort-imports import { makeCompile, splitFile } from './compiler' +import type { Plugin } from 'vite' const SPLIT_PREFIX = 'sp-' const ROUTES_DIRECTORY_PATH = 'src/routes' @@ -10,7 +12,7 @@ const DEBUG = true let lock = false export function RouterGenerator(): Plugin { - const _generate = async () => { + const _generate = async (): Promise => { if (lock) return lock = true @@ -24,7 +26,7 @@ export function RouterGenerator(): Plugin { } } - const handleFile = async (file: string) => { + const handleFile = async (file: string): Promise => { const filePath = normalize(file) if (filePath.startsWith(ROUTES_DIRECTORY_PATH)) { @@ -35,7 +37,10 @@ export function RouterGenerator(): Plugin { return { name: 'vite-plugin-fs-router-generator', - watchChange: async (file: string, context: { event: string }) => { + watchChange: async ( + file: string, + context: { event: string }, + ): Promise => { if (['create', 'update', 'delete'].includes(context.event)) { await handleFile(file) } @@ -47,13 +52,13 @@ export function RouterCodeSplitter(): Plugin { return { name: 'vite-plugin-fs-router-code-splitter', enforce: 'pre', - resolveId(source) { + resolveId(source): string { if (source.startsWith(SPLIT_PREFIX + ':')) { return source.replace(SPLIT_PREFIX + ':', '') } - return + return '' }, - async transform(code, id) { + async transform(code, id): Promise { const url = pathToFileURL(id) url.searchParams.delete('v') id = fileURLToPath(url).replace(/\\/g, '/') @@ -91,6 +96,6 @@ export function RouterCodeSplitter(): Plugin { } } -export function ViteFsRouter(): Array { +export function ViteFsRouter(): Plugin[] { return [RouterGenerator(), RouterCodeSplitter()] }